Compare commits

..
Author SHA1 Message Date
FatBoy 39638e4789 mob ai work 2025-01-08 18:08:38 -06:00
FatBoy 277bb14bab mob ai work 2025-01-08 17:55:06 -06:00
FatBoy 033f7c9ccf mob ai work 2025-01-08 17:53:46 -06:00
FatBoy b3026c9cab mob ai work 2025-01-08 17:46:59 -06:00
FatBoy a33ac85b21 mob ai work 2025-01-08 17:46:46 -06:00
FatBoy ff4010d652 mob ai work 2025-01-08 17:41:21 -06:00
FatBoy 9d46da8d07 mob ai work 2025-01-08 17:38:55 -06:00
FatBoy c581d19990 mob ai work 2025-01-08 17:36:51 -06:00
FatBoy 40c77df0fe mob ai work 2025-01-08 17:34:35 -06:00
FatBoy 789b3f3ffb mob ai work 2025-01-08 17:32:25 -06:00
FatBoy 83be9f4ec5 mob ai work 2025-01-08 17:28:19 -06:00
FatBoy 728db63024 mob ai work 2025-01-08 07:20:49 -06:00
FatBoy 2815bc74ad mob ai work 2025-01-07 21:56:34 -06:00
FatBoy 87d95e3c48 mob ai work 2025-01-07 21:48:18 -06:00
FatBoy 20f9d136b6 new mob AI 2025-01-06 21:14:05 -06:00
FatBoy f0594fb1b2 sitting only toggle when casting spells not skills 2025-01-06 12:45:20 -06:00
FatBoy a155bc0308 modified ht chance 2025-01-06 07:14:40 -06:00
FatBoy dce7444483 modified ht chance 2025-01-06 06:54:26 -06:00
FatBoy 76eed79b0a repair cost formula fixed 2025-01-05 20:05:41 -06:00
FatBoy f73ed17c05 repair cost formula 2025-01-05 19:24:05 -06:00
FatBoy b049d21aff corpse timer 2025-01-05 18:53:00 -06:00
FatBoy f6cce5ee1f corpse timer 2025-01-05 18:52:53 -06:00
FatBoy 8038c2ebe2 arena que messages 2025-01-05 18:52:10 -06:00
FatBoy 9f51b9af57 arena que messages 2025-01-05 18:42:06 -06:00
FatBoy cbc75bf9d7 irekei healer blood prophet 2025-01-05 17:40:55 -06:00
FatBoy 0ecfa546cd SDR bind loc for errants 2025-01-05 16:43:38 -06:00
FatBoy b89fb0803d SDR bind loc for errants 2025-01-05 15:41:10 -06:00
FatBoy 11005d58a7 SDR bind loc for errants 2025-01-05 15:39:41 -06:00
FatBoy b0c6239314 SDR bind loc for errants 2025-01-05 15:36:30 -06:00
FatBoy 67f66155e9 SDR bind loc for errants 2025-01-05 15:28:51 -06:00
FatBoy 7fbae12e99 mob update 2025-01-05 14:53:05 -06:00
FatBoy 65580c0a47 mob update 2025-01-05 14:51:43 -06:00
FatBoy 236afe4cc6 mob update 2025-01-05 14:48:51 -06:00
FatBoy c23a6af28f mob update 2025-01-05 14:45:45 -06:00
FatBoy 2535106d2c player update sync 2025-01-05 14:38:07 -06:00
FatBoy d8379ae5a9 shades dont break hide when moving 2025-01-05 11:18:39 -06:00
FatBoy 9f13f5fc5d add sprint to shade stealth 2025-01-05 10:56:14 -06:00
FatBoy 884cb30ebd trade bug 2025-01-05 09:26:42 -06:00
FatBoy 30488e5da6 maintenance bug 2025-01-04 18:47:50 -06:00
FatBoy b7e798a950 spire effect extension 2025-01-04 18:37:16 -06:00
FatBoy e999ca3f68 spire effect extension 2025-01-04 18:36:56 -06:00
FatBoy 039638c0d8 stackable enum types 2025-01-04 15:20:46 -06:00
FatBoy f282504896 irekei movepseed 2025-01-04 15:06:31 -06:00
FatBoy 0062936ac6 irekei movepseed 2025-01-04 14:57:07 -06:00
FatBoy 19c41daa86 irekei movepseed 2025-01-04 14:52:49 -06:00
FatBoy d860b16cfd irekei movepseed 2025-01-04 14:44:43 -06:00
FatBoy e3b42a8ad9 irekei movepseed 2025-01-04 13:33:34 -06:00
FatBoy 20bd7a82af proper flying check for speed calculation 2025-01-04 13:12:44 -06:00
FatBoy e607eb8220 irekei movespeed sync 2025-01-04 13:02:17 -06:00
FatBoy 38ca49d1a5 errants bind loc to tree in SDR 2025-01-04 12:53:36 -06:00
FatBoy a21bdfe031 blood prophet for all irekei mage/healers 2025-01-04 12:39:14 -06:00
FatBoy f95832b87c xp modifiers 2025-01-04 12:36:37 -06:00
FatBoy feff9b3540 cant get XP for suicide 2025-01-04 12:32:22 -06:00
FatBoy 78118aa08c update inventory when getting conc and gold at start 2025-01-04 12:31:22 -06:00
FatBoy 3539372437 powers manager fixes 2025-01-04 12:30:17 -06:00
FatBoy 7c498625bd bounds error 2025-01-03 21:09:53 -06:00
FatBoy e379016123 bane mechanic complete - working 2025-01-03 20:59:35 -06:00
FatBoy afa68b840c bane mechanic complete - working 2025-01-03 20:53:08 -06:00
FatBoy 1926deb7f9 bane mechanic complete - working 2025-01-03 20:41:11 -06:00
FatBoy 25c1f34c23 bane mechanic 2025-01-03 20:12:47 -06:00
FatBoy d0e04e53ad bane mechanic 2025-01-03 20:09:48 -06:00
FatBoy e475fb5cc9 wildkins chase removes snare 2025-01-03 19:22:57 -06:00
FatBoy f72f632cd8 login crash bug 2025-01-03 19:19:19 -06:00
FatBoy 02ea27fc6f login crash bug 2025-01-03 19:17:26 -06:00
FatBoy 5d338bb87c login crash bug 2025-01-03 19:11:09 -06:00
FatBoy f9f08c2886 login crash bug 2025-01-03 19:07:35 -06:00
FatBoy dcc139043d stop movement on cast 2025-01-03 18:57:56 -06:00
FatBoy 520219404c NPC special price option 2025-01-03 18:56:41 -06:00
FatBoy f97991f00d NPC special price option 2025-01-03 07:55:01 -06:00
FatBoy 7b7e1c5337 NPC special price option 2025-01-03 07:48:05 -06:00
FatBoy 6e66659940 NPC special price option 2025-01-03 07:47:16 -06:00
FatBoy 3d83baed78 all sages can repair everything 2025-01-02 21:07:34 -06:00
FatBoy 049b27da96 all sages can repair everything 2025-01-02 21:04:03 -06:00
FatBoy 6bcbe0f633 all sages can repair everything 2025-01-02 20:56:52 -06:00
FatBoy 8c44e39275 all sages can repair everything 2025-01-02 20:52:14 -06:00
FatBoy e36ab1f5d2 corspe timer reduced to 10 minutes(from 15) 2025-01-02 19:55:17 -06:00
FatBoy 865c775f41 Arena death message 2025-01-01 21:50:03 -06:00
FatBoy 198778ba2d arena circle addition 2025-01-01 21:41:48 -06:00
FatBoy 215aabdc5f arena circle addition 2025-01-01 21:38:48 -06:00
FatBoy 8d92c8be37 Arena System complete feature 2025-01-01 21:26:51 -06:00
FatBoy 93b3ce07f0 Arena System prize 2025-01-01 21:11:26 -06:00
FatBoy f9b7c8b851 Arena System 2025-01-01 20:37:13 -06:00
FatBoy b3cf72abdc Arena System 2025-01-01 20:35:21 -06:00
FatBoy 65fddd06a9 Arena System 2025-01-01 20:04:16 -06:00
FatBoy 41f4a8ff58 Arena System 2025-01-01 19:32:11 -06:00
FatBoy a13d5018b9 Arena System 2025-01-01 19:26:02 -06:00
FatBoy 2ac3ce5bc8 Arena System 2025-01-01 19:18:31 -06:00
FatBoy 85514987e7 Arena Manager NPC 2025-01-01 18:43:32 -06:00
FatBoy c9eb07b5ba Enrollment officer dialog option added 2025-01-01 18:32:00 -06:00
FatBoy 7201b61498 Enrollment officer dialog option added 2025-01-01 18:28:33 -06:00
FatBoy 55b3161900 Enrollment officer dialog 2025-01-01 18:15:22 -06:00
FatBoy 9d5c4424a1 Arena Infrastructure 2025-01-01 17:44:34 -06:00
FatBoy d507ba2339 force to stand when casting 2025-01-01 11:13:04 -06:00
FatBoy 4ec5103454 saetor doomsayers 2025-01-01 10:59:49 -06:00
FatBoy 3e09cd415e thread count on boot 2025-01-01 10:45:51 -06:00
FatBoy 1098265145 player update handled in new thread 2025-01-01 10:31:46 -06:00
FatBoy df7a106237 bane commander dialog reset options 2025-01-01 09:07:33 -06:00
FatBoy 00b38970a1 bane commander dialog reset options 2025-01-01 09:00:55 -06:00
FatBoy c1004e5817 bane commander dialog options 2024-12-31 21:18:11 -06:00
FatBoy 13e9738345 bane commander dialog options 2024-12-31 20:55:47 -06:00
FatBoy 1a7c1e2544 mine load error 2024-12-31 20:21:51 -06:00
FatBoy ff082487b5 mine load error 2024-12-31 20:14:48 -06:00
FatBoy 14cac0d892 mine load error 2024-12-31 20:09:28 -06:00
FatBoy a8347e0b53 npc manager error spam 2024-12-31 20:06:31 -06:00
FatBoy a73c3453ea npc manager error spam 2024-12-31 20:04:54 -06:00
FatBoy a64932b2c9 Revert "npc manager error spam"
This reverts commit 685297171c.
2024-12-31 20:04:17 -06:00
FatBoy 685297171c npc manager error spam 2024-12-31 20:01:47 -06:00
FatBoy 2e3e403165 trouble shooting mine bug 2024-12-31 19:57:18 -06:00
FatBoy fbd910ef50 fix for flying bug 2024-12-31 19:13:10 -06:00
FatBoy 30129d161f force respawn of dead players throwing error 2024-12-31 18:56:20 -06:00
FatBoy a6510af56d force respawn of dead players throwing error 2024-12-31 18:55:17 -06:00
FatBoy 9830920635 bane mechanic thread finalized 2024-12-31 18:46:54 -06:00
FatBoy 93025b72cd bane mechanic thread finalized 2024-12-31 18:23:03 -06:00
FatBoy 22639baa4c bane mechanic thread 2024-12-31 17:54:53 -06:00
FatBoy 1aba8dfb11 bane mechanic thread 2024-12-31 17:44:27 -06:00
FatBoy 8b4eb96262 bane mechanic thread 2024-12-31 17:39:28 -06:00
FatBoy cafe6cd2fe bane mechanic thread 2024-12-31 17:38:21 -06:00
FatBoy da6140f6f4 bane mechanic thread 2024-12-31 17:35:38 -06:00
FatBoy 3fc68ce2ff bane mechanic thread 2024-12-31 17:34:51 -06:00
FatBoy 5e8927245b bane mechanic thread 2024-12-31 17:33:26 -06:00
FatBoy 75de1b3ae8 initiate baneAtendees 2024-12-31 17:18:05 -06:00
FatBoy 6743114d19 update bane time first try 2024-12-31 16:25:34 -06:00
FatBoy 28cca67cb3 Revert "update bane time first try"
This reverts commit bad7c6e798.
2024-12-31 16:21:42 -06:00
FatBoy bad7c6e798 update bane time first try 2024-12-31 16:13:54 -06:00
FatBoy ecd3b38d3a update map when bane set 2024-12-31 14:48:11 -06:00
FatBoy 8f09f16603 update map when bane set 2024-12-31 14:37:16 -06:00
FatBoy 80812cb402 update map when bane set 2024-12-31 14:36:36 -06:00
FatBoy 66fbf7aee6 update map when bane set 2024-12-31 14:32:48 -06:00
FatBoy a92c603ab2 update map when bane set 2024-12-31 14:28:42 -06:00
FatBoy 365438370d update map when bane set 2024-12-31 14:26:37 -06:00
FatBoy a40b8fc915 update map when bane set 2024-12-31 14:21:20 -06:00
FatBoy 5d92c1c86d bane system work 2024-12-31 14:09:11 -06:00
FatBoy c526fd8847 bane system work 2024-12-31 14:03:29 -06:00
FatBoy cd767dc68c bane system work 2024-12-31 13:59:23 -06:00
FatBoy e21ebc75ee pets dont get sent home 2024-12-31 13:32:30 -06:00
FatBoy 931eaaae4a city bane status update fix 2024-12-31 13:30:19 -06:00
FatBoy 4d487e6bf0 city bane status update fix 2024-12-31 13:29:18 -06:00
FatBoy 6c45a6573a null checks 2024-12-30 20:09:02 -06:00
FatBoy 45b0dda7d9 remove duplicated gold and conc grants at character creation 2024-12-30 17:55:48 -06:00
FatBoy caf3bc7470 remove option for 10 and 20 man banes based on trees in nation 2024-12-30 17:49:19 -06:00
FatBoy 5259b801f7 bane ZergMultiplier value sfor 20-unlimited banes 2024-12-30 17:41:54 -06:00
FatBoy 77e6d0db75 player guards to drop aggro once player leaves city 2024-12-30 17:24:46 -06:00
FatBoy b2d7e5ec1e bane commander NPC work 2024-12-30 17:06:07 -06:00
FatBoy 15bc99d216 bane commander NPC work 2024-12-30 16:29:16 -06:00
FatBoy 63c6e2abd7 bane zerg mechanics enabled 2024-12-29 21:19:50 -06:00
FatBoy 8ab97a1b36 bane zerg mechanics enabled 2024-12-29 21:19:20 -06:00
FatBoy d1aa581879 players coutn towards Siege Cap at banes for 3 minutes after leaving bane area 2024-12-29 21:05:25 -06:00
FatBoy 5f56143c5e fixed bug with negative xp when setting level to 10 2024-12-29 20:49:12 -06:00
FatBoy 1a2b558ac3 fixed bug with negative xp when setting level to 10 2024-12-29 20:20:12 -06:00
FatBoy 4f4ff74bf1 fixed bug with negative xp when setting level to 10 2024-12-29 19:32:01 -06:00
FatBoy ded3b08080 fixed random rune drop chance 2024-12-29 19:22:41 -06:00
FatBoy 14a29c8612 fixed NPC interaction 2024-12-29 18:37:42 -06:00
FatBoy e66e430d30 fixed NPC interaction 2024-12-29 16:19:08 -06:00
FatBoy c833f560c1 guard minion retaliation 2024-12-29 15:57:52 -06:00
FatBoy 454c721842 zerg mechanic values adjusted 2024-12-29 15:51:01 -06:00
FatBoy 26eda324dc adjusted global drop rates 2024-12-29 15:38:59 -06:00
FatBoy 16951d36a2 bane commander NPC 2024-12-28 08:16:20 -06:00
FatBoy e1d36125d2 bane commander NPC 2024-12-28 08:11:14 -06:00
FatBoy 7a3c259d2f bane commander NPC 2024-12-28 08:03:38 -06:00
FatBoy aa5fb2a2c5 bane commander NPC 2024-12-28 07:57:51 -06:00
FatBoy a92cc6506c bane commander NPC 2024-12-28 07:53:49 -06:00
FatBoy 3971548142 bane commander NPC 2024-12-28 07:49:41 -06:00
FatBoy d94de771bf bane commander NPC 2024-12-28 07:45:43 -06:00
FatBoy c5f47ffcd4 bane commander NPC 2024-12-28 07:39:15 -06:00
FatBoy b336235ad7 bane commander NPC 2024-12-28 07:17:23 -06:00
FatBoy eea07309aa bane commander NPC 2024-12-28 07:14:56 -06:00
FatBoy 5529170036 bane commander NPC 2024-12-28 06:48:43 -06:00
FatBoy 3d745e93b6 bane commander NPC 2024-12-28 06:37:44 -06:00
FatBoy 019082bec7 bane commander NPC 2024-12-28 06:27:31 -06:00
FatBoy 855cceea70 bane commander NPC 2024-12-28 06:14:06 -06:00
FatBoy 487eae85e1 bane commander NPC 2024-12-28 06:12:15 -06:00
FatBoy 5d188e61c0 bane commander NPC 2024-12-28 06:09:29 -06:00
FatBoy 546c335198 bane commander NPC 2024-12-28 06:07:54 -06:00
FatBoy aaecc5eda2 bane commander NPC 2024-12-28 06:05:19 -06:00
FatBoy d13e939ddd bane commander NPC 2024-12-28 06:00:21 -06:00
FatBoy afea79474e bane commander NPC 2024-12-28 05:56:04 -06:00
FatBoy 05f555b5b5 bane commander NPC 2024-12-28 05:53:38 -06:00
FatBoy 85931b6dc2 bane commander NPC 2024-12-28 05:50:15 -06:00
FatBoy 9f0c7f6a76 bane commander NPC 2024-12-28 05:49:09 -06:00
FatBoy 022c06c803 bane commander NPC 2024-12-28 05:41:33 -06:00
FatBoy 1b72e7d6b7 bane commander NPC 2024-12-28 05:28:27 -06:00
FatBoy 666ac6df5b bane commander NPC 2024-12-28 05:21:10 -06:00
FatBoy 36481a53d9 bane commander NPC 2024-12-28 05:18:24 -06:00
FatBoy 5a9901d775 bane commander NPC 2024-12-28 05:09:51 -06:00
FatBoy b3a24d0158 fixed bug with trebs spamming console 2024-12-28 04:42:23 -06:00
FatBoy 8890826070 fixed bug with trebs spamming console 2024-12-28 04:37:36 -06:00
FatBoy daa84a1fef added MB_WORLD_TESTMODE to config manager and file 2024-12-28 04:27:26 -06:00
FatBoy a4bd47f001 audit command for drop rates 2024-12-27 20:26:56 -06:00
FatBoy d031f1be01 audit command for drop rates 2024-12-27 20:24:12 -06:00
FatBoy a48abc59ce audit command for drop rates 2024-12-27 20:16:31 -06:00
FatBoy 878f05c323 audit command for drop rates 2024-12-27 20:10:39 -06:00
FatBoy d462711d25 audit command for drop rates 2024-12-27 20:08:07 -06:00
FatBoy 40a0120a28 +1% drop disp[arity for mobs unde rlevel 50 AND introduce guard drops 2024-12-27 19:59:28 -06:00
FatBoy ac812eaeae allow goto and teleportmode for players 2024-12-26 16:43:32 -06:00
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
FatBoy 7e457fa17b all items form "Noob Helper" cost 2 gold 2024-07-07 18:41:44 -05:00
FatBoy 926b9d2bae R8 ToL can have 4 shrines 2024-07-07 18:39:38 -05:00
FatBoy c5822b5acf dropper resists and level increase 2024-07-06 20:43:03 -05:00
FatBoy 516b66a50a reintroduce blood rune droppers on 3 hour disc cycle 2024-07-06 20:35:17 -05:00
FatBoy 39305d63c7 noob island gear 2024-07-06 20:08:09 -05:00
FatBoy c0cb856961 noob island gear 2024-07-06 20:06:18 -05:00
FatBoy 2fb97a676f allow some dev commands for players (print) 2024-07-05 21:10:26 -05:00
FatBoy cbff151dc3 allow some dev commands for players (print) 2024-07-05 21:08:47 -05:00
FatBoy eed75fd2fd repair costs calculated properly 2024-07-05 20:57:45 -05:00
FatBoy 6374390b34 repair cost synced with server values 2024-07-05 19:58:42 -05:00
FatBoy 2185d3ef7c rune merchants pricing adjusts 2024-07-05 19:54:49 -05:00
FatBoy 4aaa96e36c resourc emerchant pricing adjust 2024-07-05 19:34:12 -05:00
FatBoy bf86680547 higher present drop chance 2024-07-05 19:28:05 -05:00
FatBoy 960307e262 rune pricing fix 2024-07-05 19:26:19 -05:00
FatBoy eedf96cc31 resource pricing fix 2024-07-05 19:23:23 -05:00
FatBoy 6fb5fce4d3 fixed profit error for NPCs 2024-07-05 19:15:43 -05:00
FatBoy 7688d21fe6 boons refreshable, boon level determined by votary rank, shrines should work for all, boons nation friendly again 2024-07-05 19:06:02 -05:00
FatBoy 23e60b36b4 General Cleanup and drop rates 2024-07-04 20:06:15 -05:00
FatBoy ab8fc8e0a0 random vorg droppers, max durability repairable 2024-07-04 19:49:24 -05:00
FatBoy b30f04046d uniform disc dropper times 2024-07-04 19:14:00 -05:00
FatBoy 9bd03c7d43 pricing corrected for rune vendors 2024-07-03 20:35:33 -05:00
FatBoy 78118a1ac1 fix for rune application 2024-07-03 20:22:03 -05:00
FatBoy 1f863d0cce resource pricing fix 2024-07-03 20:20:04 -05:00
FatBoy c49204aeeb NPC have 0 maint, fix for resource merchant 2024-07-03 20:15:41 -05:00
FatBoy b1de3755fd display correct maintenance costs 2024-07-03 20:07:27 -05:00
FatBoy 83a1cc5aba maintenance display on buildings 2024-07-03 19:56:50 -05:00
FatBoy 9b0b15c31e remove refund for deranked building due to maintenance 2024-06-26 21:09:32 -05:00
FatBoy 802651d2d4 rune application error fixed 2024-06-26 21:01:23 -05:00
FatBoy 52a48e5618 rune application checks 2024-06-26 20:51:04 -05:00
FatBoy 14fe248e19 mine serializing 2024-06-25 21:36:26 -05:00
FatBoy 5b81be371e mine serializing 2024-06-25 21:26:39 -05:00
FatBoy 82d67f2850 mine serializing 2024-06-25 21:24:48 -05:00
FatBoy 1c342bd566 server pop on creation displays amount of realms captured 2024-06-25 21:07:47 -05:00
FatBoy bb8ad3c971 character creation population message 2024-06-25 21:00:36 -05:00
FatBoy e9fef85b72 set maintenance dates correctly 2024-06-25 20:21:12 -05:00
FatBoy c0d1a4f274 mines produce once a day, maintenance system for TOL only 2024-06-25 20:17:16 -05:00
FatBoy 94be3335a0 mine production change error tracking 2024-06-25 19:55:30 -05:00
FatBoy 7d03f78546 rune application require/restrict actually use values 2024-06-25 19:44:17 -05:00
FatBoy 023f933d0b rune application require/restrict actually use values 2024-06-25 19:31:05 -05:00
FatBoy 9995cc01b7 rune application require/restrict actually use values 2024-06-25 19:24:15 -05:00
FatBoy fd03b263d1 pets follow owners through teleporting 2024-06-23 20:14:51 -05:00
FatBoy 6a09a3fd44 pets follow owners through teleporting 2024-06-23 20:08:46 -05:00
FatBoy 1322f8610c safe guards dont kill pets anymore 2024-06-23 20:03:41 -05:00
FatBoy 90ab6175b5 extra ToL slots 2024-06-23 19:55:26 -05:00
FatBoy 2e3e9ee882 extra ToL slots 2024-06-23 19:50:20 -05:00
FatBoy 5158329785 Saetor can take Chaos Shrine boon 2024-06-23 19:47:14 -05:00
FatBoy b8e0165da2 allowed siege engineer alchemist and banker on ToL 2024-06-23 19:44:10 -05:00
FatBoy 0fa6ebc136 fix pets 2024-06-23 19:33:06 -05:00
FatBoy 4e5e362197 attempt to fix mine serialization 2024-06-16 09:30:14 -05:00
FatBoy 61514fef2b attempt to fix mine serialization 2024-06-16 09:29:18 -05:00
FatBoy 59e593ab0d attempt to fix mine serialization 2024-06-16 09:24:15 -05:00
FatBoy 2c6ea98ef9 revert instant respawns 2024-06-15 21:37:14 -05:00
FatBoy bd3ea16b57 faster respawns 2024-06-15 21:35:05 -05:00
FatBoy 45165332f6 faster respawns 2024-06-15 21:33:56 -05:00
FatBoy d764a66e55 logging 2024-06-15 20:08:20 -05:00
FatBoy ac41e64429 logging 2024-06-15 20:03:45 -05:00
FatBoy 462beb30b3 logging 2024-06-15 20:03:09 -05:00
FatBoy 3a89e9c087 logging 2024-06-15 19:59:31 -05:00
FatBoy e71863cbd2 logging 2024-06-15 19:54:45 -05:00
FatBoy 5ec0ff0598 logging 2024-06-15 19:52:12 -05:00
FatBoy 2ca9b77cfb logging 2024-06-15 19:50:05 -05:00
FatBoy 4f535ef5fe loot manager for glass runes and contracts 2024-06-15 19:44:37 -05:00
FatBoy a46ad71bb0 loot manager for glass runes and contracts 2024-06-15 19:36:13 -05:00
FatBoy 90d6911d41 loot manager for glass runes and contracts 2024-06-15 19:26:49 -05:00
FatBoy e13ebae0df loot manager for glass runes and contracts 2024-06-15 19:18:40 -05:00
FatBoy 3e15fc8206 bootysim command work 2024-06-15 19:11:49 -05:00
FatBoy 6a400467dd drop rate work 2024-06-15 19:10:29 -05:00
FatBoy 488188e9c3 glass chance work 2024-06-15 19:03:08 -05:00
FatBoy 0d31bc4280 contract and rune drop work 2024-06-15 19:00:58 -05:00
FatBoy 6375b4431c box check 2024-06-15 18:50:40 -05:00
FatBoy 683422f8a4 auto identify all items 2024-06-15 18:42:49 -05:00
FatBoy e4dbad2669 generic loot system in place 2024-06-15 16:54:20 -05:00
FatBoy 34721fdee8 generic loot system in place 2024-06-15 16:51:46 -05:00
FatBoy f27668552c corrected pricing for +10 runes 2024-06-15 16:20:39 -05:00
FatBoy 306fdf4235 permanent open runegates 2024-06-15 16:18:24 -05:00
FatBoy 553b09d827 rune pricing corrected 2024-06-15 16:16:18 -05:00
FatBoy 8ee17f0c64 fix resource merchant elan stones pricing 2024-06-15 16:04:20 -05:00
FatBoy 7e5ad644d3 fix resource merchant elan stones 2024-06-15 16:04:02 -05:00
FatBoy 846b8a7cde fix resource merchant margins 2024-06-15 16:02:07 -05:00
FatBoy f27a4f174b error popup when trying to flag unboxed too frequently 2024-06-15 15:55:57 -05:00
FatBoy c6d4375aa8 error popup when trying to flag unboxed too frequently 2024-06-15 15:06:17 -05:00
FatBoy b9ec54c76a enrollment office removes DS effect 2024-06-15 15:04:07 -05:00
FatBoy b351d7c1ae enrollment officer system 2024-06-15 15:01:47 -05:00
FatBoy 729ebe7cd0 box checker 2024-06-15 14:48:20 -05:00
FatBoy f51c28e708 revert boxing enforcement 2024-06-15 14:36:33 -05:00
FatBoy 9fbf55127d sourcetype lookup fix 2024-06-15 14:25:40 -05:00
FatBoy f9fd61dc6b revert sourcetype lookup fix 2024-06-15 14:23:25 -05:00
FatBoy 4f198e1f53 Merge remote-tracking branch 'origin/lakebane-new' into lakebane-new 2024-06-15 14:22:11 -05:00
FatBoy 24c85a5140 revert sourcetype lookup fix 2024-06-15 14:21:57 -05:00
FatBoy 3e1a5f4ccd SpurceType lookup fixes for Piercing Crushing and Slashing 2024-06-15 14:19:29 -05:00
FatBoy 34e5a3878c SpurceType lookup fixes for Piercing Crushing and Slashing 2024-06-15 14:17:43 -05:00
FatBoy 663e285091 Deathshroud applied ot all boxed characters 2024-06-15 14:10:02 -05:00
FatBoy d87c03bb79 fixed combat message to reflect proper zerg multiplier values 2024-06-15 10:48:08 -05:00
FatBoy abc57688d3 reset zerg multipliers when window closes 2024-06-15 10:31:38 -05:00
FatBoy 29671d56fc display zerg multiplier in ./info 2024-06-15 10:17:43 -05:00
FatBoy e8cf6a722b remove hotzone form the game 2024-06-15 09:13:22 -05:00
FatBoy 2793ec331b mines revert to claimable at 1am CST 2024-06-15 09:07:31 -05:00
FatBoy 1a0b91b068 buying larger stacks of resources form resource vendor 2024-06-13 19:21:34 -05:00
FatBoy bec6cbe6e6 implement stat modifications for the ZergMultiplier 2024-06-13 18:54:09 -05:00
FatBoy f7ab10ff07 altered mine production values 2024-06-13 18:44:35 -05:00
FatBoy 9671cbdc1a unlimited sub guilds 2024-06-13 18:31:33 -05:00
FatBoy e0af1f5932 no caps on claimable mines for nations 2024-06-13 18:28:59 -05:00
FatBoy 8cb52c6142 zerg multiplier resets for players after mine closes 2024-06-13 18:27:09 -05:00
FatBoy e5133211a9 Zerg Mechanic for Mines 2024-06-12 19:18:05 -05:00
FatBoy 8548612a80 items auto ID 2024-06-12 18:48:32 -05:00
FatBoy 41c3193275 irekei movespeed fix 2024-06-12 18:42:16 -05:00
FatBoy 15771d2802 new characters start at level 10 2024-06-12 18:38:04 -05:00
FatBoy b4a62e5f3e update inventory when junking for gold 2024-06-12 18:36:10 -05:00
FatBoy fc7e6735a1 mine tower health scales with cap size 2024-06-12 18:35:22 -05:00
FatBoy aeb21c328e max slots for rank adjustments 2024-06-11 21:21:54 -05:00
FatBoy 9a34b13c2e junk from inventory 2024-06-11 21:10:54 -05:00
FatBoy 231feef7fe mines open during a reboot time frame now open correctly 2024-06-11 21:05:50 -05:00
FatBoy 0e6b68139f refactor mine processing to HalfHourlyJob 2024-06-11 21:02:13 -05:00
FatBoy ef62c2bb39 mines open and close 2024-06-11 20:53:33 -05:00
FatBoy 8f68997f3c terraform size correction 2024-06-11 20:32:59 -05:00
FatBoy aebe2698c3 terraform size correction 2024-06-11 20:29:30 -05:00
FatBoy 54e7a8fc7f display mine times correctly 2024-06-11 20:14:57 -05:00
FatBoy 8b4d37c53c fix for mines loading 2024-06-11 20:08:29 -05:00
FatBoy fbfca46d2f fix for mines loading 2024-06-11 20:02:58 -05:00
FatBoy 3228f473de fix for mines loading 2024-06-11 19:57:20 -05:00
FatBoy 17fcf0ee40 duplicated zone loading disabled 2024-06-11 19:51:53 -05:00
FatBoy 395fe31e02 duplicated zone loading disabled 2024-06-11 19:47:34 -05:00
FatBoy e98f9cf1f7 duplicated zone loading disabled 2024-06-11 19:40:14 -05:00
FatBoy fe0c0f97a5 duplicated zone loading disabled 2024-06-11 19:33:29 -05:00
FatBoy 7e27838818 mine changes 2024-06-11 19:07:44 -05:00
FatBoy bc8094c20c saetor race as minotaurs 2024-06-11 18:48:33 -05:00
MagicBot 3649c629b7 Revert "DamageType defined as in JSON"
This reverts commit 1c31070fc8.
2024-04-01 12:04:12 -04:00
MagicBot 1c31070fc8 DamageType defined as in JSON 2024-04-01 12:01:59 -04:00
MagicBot bff41967db Revert "Out of combat mode when patrolling."
This reverts commit d3692d0fb7.
2023-09-08 13:07:15 -04:00
MagicBot d3692d0fb7 Out of combat mode when patrolling. 2023-09-08 13:04:29 -04:00
FatBoy 074a799d01 added health recovery to mobs 2023-08-22 20:58:52 -05:00
FatBoy 36ffd08a72 guard minions logic work 2023-08-22 20:52:45 -05:00
FatBoy 58f828b3cd items removed properly from inventory, NPCs nop longer stock base items 2023-08-22 20:52:26 -05:00
FatBoy e5fba340fb guard minion AI restored to follow captain attack commands 2023-08-21 20:24:49 -05:00
FatBoy ea2241732a fixed bug where pet persisted through dismissal 2023-08-21 20:02:26 -05:00
FatBoy 2b83db7bba moved initial loadInventory call to runAfterLoad 2023-08-21 19:48:44 -05:00
FatBoy f636f4d2ec optimized equipment dropping system 2023-08-21 19:36:46 -05:00
FatBoy 8fb6c43c66 alternative loot drop limitation 2023-08-21 19:21:50 -05:00
MagicBot e331f7e2ff Unused methods removed. 2023-08-21 14:26:50 -04:00
MagicBot b8217a8858 Remove unused variable from signature. 2023-08-21 14:11:22 -04:00
MagicBot 50f81396c7 Cleanup of PERSIST db call. 2023-08-21 14:01:28 -04:00
MagicBot 0bca57686d New npc creation work. 2023-08-21 14:00:00 -04:00
MagicBot df6b9e48d3 New npc creation work. 2023-08-21 13:47:47 -04:00
MagicBot 291cb97a22 New npc creation work. 2023-08-21 13:34:42 -04:00
MagicBot 740e75f8e4 New less ungodly NPC constructor. 2023-08-21 13:26:13 -04:00
MagicBot b7bbf8d369 Interest manager updates when moving 64 units. 2023-08-21 05:02:49 -04:00
MagicBot abf450d6ea Use character load range for dirty flag. 2023-08-21 04:52:02 -04:00
MagicBot 9072fc2788 Lock for dirtyload integration. 2023-08-21 04:40:11 -04:00
MagicBot 14968dbb3b Unused variables removed. 2023-08-21 04:21:28 -04:00
MagicBot c79d9ae891 Unused lastXYZ timers set but never used. 2023-08-21 04:19:20 -04:00
MagicBot dbca131a0f Set dirty out to load range. 2023-08-20 20:38:44 -04:00
MagicBot 621d78172d Threadsafe is needed for the flag. 2023-08-20 20:37:24 -04:00
MagicBot 50e962b77e dirtyFlag integration. 2023-08-20 20:14:28 -04:00
MagicBot 07aeb6e58d dirtyFlag integration. 2023-08-20 20:02:16 -04:00
MagicBot f6e2c6c618 dirtyFlag integration. 2023-08-20 19:35:18 -04:00
MagicBot 44b5b98597 dirtyFlag integration. 2023-08-20 19:20:22 -04:00
MagicBot ca21c3d266 dirtyFlag integration. 2023-08-20 19:07:26 -04:00
MagicBot c1f613a1a5 Flag set to true when created. 2023-08-20 18:57:22 -04:00
MagicBot 6923251a88 dirtyflag chosen as solution. 2023-08-20 18:56:09 -04:00
MagicBot 8222cb8530 Remove distance early exit. 2023-08-20 18:29:44 -04:00
MagicBot 0eae76180b Update state of npc. 2023-08-20 17:23:50 -04:00
MagicBot f0cfb69752 Update state of npc. 2023-08-20 17:16:18 -04:00
MagicBot 2e7d2b5bcf Update state of npc. 2023-08-20 17:12:20 -04:00
MagicBot 09b346dcb2 Update state of npc. 2023-08-20 17:01:58 -04:00
MagicBot 46d07b386b Update state of npc. 2023-08-20 16:55:15 -04:00
MagicBot b21e9dc59e Moving items out of constructor. 2023-08-20 16:38:10 -04:00
MagicBot 2c9fc405e9 More unused junk removed. 2023-08-20 16:28:21 -04:00
MagicBot a0a3d34578 Unused lock removed. 2023-08-20 16:25:44 -04:00
MagicBot 8ba4ed20c8 loc set to bindloc after npc returned. 2023-08-20 16:18:51 -04:00
MagicBot 5e474851a8 bugfix: Setting loc before loc is defined in abstract constructor. 2023-08-20 16:00:08 -04:00
MagicBot c69e68cb27 Npc name override moved to runafterload. 2023-08-20 15:37:11 -04:00
MagicBot 2d0116a9d9 inLined single line methods for code clarity. 2023-08-20 15:26:24 -04:00
MagicBot bed99dce62 aiAgentType enumeration defined. 2023-08-20 15:10:31 -04:00
MagicBot e4283c2444 Unused orphan npc collection removed. 2023-08-20 14:40:12 -04:00
MagicBot 407f5d1f71 Init code for instance variables moved to runafterload. 2023-08-19 16:33:17 -04:00
MagicBot 86e4ee4aa9 Debugging. 2023-08-19 16:18:49 -04:00
MagicBot 0d7e69f772 Early exit for npc guild owners. 2023-08-19 16:07:11 -04:00
MagicBot 4d0980d13e Early exit for npc guild owners. 2023-08-19 16:04:46 -04:00
MagicBot 9239bc1400 bug fix in old constructor 2023-08-19 15:58:25 -04:00
MagicBot f1958453c1 bug fix in old constructor 2023-08-19 15:49:00 -04:00
MagicBot 9adb03a845 Code moved to runafterload. 2023-08-19 15:30:35 -04:00
MagicBot 4d48712470 Method to centralize slotting of abschar. 2023-08-19 15:22:43 -04:00
FatBoy f1d31948e8 0 skill weapons don't roll anymore 2023-08-19 11:39:01 -05:00
MagicBot c79b304eeb Revert debug temporal change to minion spawn. 2023-08-19 11:53:38 -04:00
MagicBot c1a14a22e8 bugfix: wrong type comparison. 2023-08-18 13:08:05 -04:00
MagicBot 2f6e334eea Last debug cycle in testing. 2023-08-18 13:01:58 -04:00
MagicBot 105d8135f7 Tweak to siege minion slot assignments. 2023-08-18 12:32:31 -04:00
MagicBot d7c3f2a6ce Newbie Island excluded from server drop rates. Newbie tables having a baseline roll of 44. 2023-08-18 12:00:28 -04:00
MagicBot 68f2bcef0e Siege Minion pawn time reset to nominal 15m. Soft code? 2023-08-18 11:52:31 -04:00
MagicBot 3883963225 Unused and duplicate variable removed. 2023-08-18 11:33:27 -04:00
MagicBot b3bed58a4b Tweak to minion slot calculus. 2023-08-18 11:06:48 -04:00
MagicBot c4cc6bb92d Rotation conforms with bootstrap version. 2023-08-18 10:58:06 -04:00
MagicBot 62a6cd4430 Siege mob slot position properly rotated. 2023-08-18 10:52:36 -04:00
MagicBot 3e7b4cf30c Siege mob slot position properly rotated. 2023-08-18 10:43:59 -04:00
MagicBot bf24573e88 Codepath conforms to bootstrap copy of the 5 copies. 2023-08-18 10:31:13 -04:00
MagicBot 0d72798680 Spawn temporal adjustment for debugging siege mobs. 2023-08-18 10:23:30 -04:00
MagicBot 04fd91ff7d Bugfix: suffix was set as prefix. 2023-08-17 17:53:31 -04:00
MagicBot 0acd8cd939 Initialize variable before building string. 2023-08-16 15:31:17 -04:00
MagicBot 03f17adecf Update to string deserialization. 2023-08-16 15:24:30 -04:00
MagicBot 5ccf833981 Casting cleanup in constructor signature. 2023-08-16 15:04:52 -04:00
MagicBot 5084b3e453 Petitions limited to 255 characters. 2023-08-16 14:41:45 -04:00
MagicBot c95e6a2ac0 We don't serialize PETITION_NEW to the client. 2023-08-16 14:32:24 -04:00
MagicBot d3ffe9140a Unused method removed. 2023-08-16 11:42:49 -04:00
MagicBot 13fb532902 Bugfix for vendor window with no items. 2023-08-16 11:16:24 -04:00
MagicBot 7a5dde7100 Modified GenTable.rollTable() interface to support drop rates natively. 2023-08-16 08:29:29 -04:00
MagicBot e3f468681a Cleaner rank filter on display 2023-08-15 15:25:50 -04:00
MagicBot 27defa21c2 Should not be filtering items in production. 2023-08-15 15:17:12 -04:00
MagicBot f4e9896dbc Unused variable removal. 2023-08-15 09:14:19 -04:00
MagicBot b8a5521430 No need to box this int. 2023-08-15 09:09:59 -04:00
MagicBot ca39ebb9d4 More class cleanup. 2023-08-15 09:07:55 -04:00
MagicBot 010988d0c1 Class cleanup resulting in far smaller message. 2023-08-15 09:06:36 -04:00
MagicBot e09a6ccd88 File reformat. 2023-08-15 08:52:49 -04:00
MagicBot c913618dc3 Method made static and moved to manager. 2023-08-15 08:50:02 -04:00
MagicBot 6d3050f08a Add constants for message action type. 2023-08-14 16:11:26 -04:00
MagicBot b53c1b20d9 Add constants for message action type. 2023-08-14 16:09:06 -04:00
MagicBot f67444a9ea Cancel petition support 2023-08-14 15:56:47 -04:00
MagicBot 36be6f3620 Merge remote-tracking branch 'origin/master' into feature-petition 2023-08-14 15:43:11 -04:00
MagicBot cf78e6c2a4 Petition window work. 2023-08-14 15:42:05 -04:00
MagicBot bcf789030e Bounce back message 2023-08-14 14:42:32 -04:00
MagicBot 1eaec16ca3 Class cleanup. 2023-08-14 14:34:26 -04:00
MagicBot 6e3dd55804 Class cleanup. 2023-08-14 14:33:19 -04:00
MagicBot 41297e5a21 Sql column name update. 2023-08-14 14:08:39 -04:00
MagicBot cb215b536c Sql column name update. 2023-08-14 14:00:09 -04:00
MagicBot d82c157ae4 Petition db update including table creation. 2023-08-14 13:55:26 -04:00
MagicBot 602fc77ff9 Petition db update including table creation. 2023-08-14 13:53:37 -04:00
MagicBot de71e250e8 Petition db update including table creation. 2023-08-14 13:48:33 -04:00
MagicBot cacceba502 Petition db update including table creation. 2023-08-14 13:46:11 -04:00
MagicBot 054f9ea08a Petition db update including table creation. 2023-08-14 13:43:52 -04:00
MagicBot 7aa63a65b6 Petition db update including table creation. 2023-08-14 13:40:27 -04:00
MagicBot 82ad774093 Bugfix in sql statement. 2023-08-14 12:56:23 -04:00
MagicBot 4342fe9819 Enum defined and database work started. 2023-08-14 12:50:50 -04:00
MagicBot 68feae4111 Enum defined and database work started. 2023-08-14 12:49:10 -04:00
MagicBot 231d8810c8 Enum defined and database work started. 2023-08-14 12:48:05 -04:00
FatBoy e2add187fd database petition logging system 2023-08-13 18:06:45 -05:00
FatBoy fd9fe8967c investigate serialization of petition message 2023-08-13 16:01:20 -05:00
FatBoy cbba05687d add handler ot petition super 2023-08-13 15:45:11 -05:00
FatBoy 480e0c69da remove case for petition form message pump 2023-08-13 15:35:47 -05:00
FatBoy 490a1bd8e5 structure for petition received handler 2023-08-13 13:45:07 -05:00
MagicBot 1ecf1d4bc2 Merge remote-tracking branch 'origin/feature-branch-branch' into bugfix-marksmanship 2023-08-13 10:34:02 -04:00
MagicBot d21921cb6d Typo in command string. 2023-08-13 09:44:28 -04:00
MagicBot 04534e2ca6 Current repo branch reported during bootstrap. 2023-08-13 09:43:06 -04:00
MagicBot 4cd180141c Read current repo branch using MB Devops script. 2023-08-13 09:39:16 -04:00
MagicBot 895b87ae05 Class cleanup. Formatting, squiggles and unused code/variables. 2023-08-13 08:16:02 -04:00
MagicBot 1c9b7594d3 Class cleanup. Formatting, squiggles and unused code/variables. 2023-08-13 08:13:27 -04:00
FatBoy 58fe2d93b7 weapon range bonus works again 2023-08-12 19:58:27 -05:00
FatBoy a278f8bc79 range bonus confined to 1 spot 2023-08-12 19:41:44 -05:00
FatBoy 8c287154c8 players to use marksmanship again 2023-08-12 19:07:50 -05:00
MagicBot 962ad4277a Unnecessary cast removed. 2023-08-12 07:46:24 -04:00
MagicBot a7495bf942 Bugfix: R8 slot locations. 2023-08-12 06:16:12 -04:00
MagicBot 1ee80f9697 Bugfix in console port output. 2023-08-11 09:44:16 -04:00
MagicBot 9f541813ef Merge remote-tracking branch 'origin/master' into bugfix-gold-healing 2023-08-11 08:27:19 -04:00
MagicBot 9a12c9b044 Bugfix in character deletion. 2023-08-11 08:20:01 -04:00
MagicBot 049562af5c Typo in help string fixed. 2023-08-11 07:47:23 -04:00
FatBoy 89681cbe3e non-active mines can be fixed by gold 2023-08-10 19:43:37 -05:00
MagicBot bafb48fe14 Merge remote-tracking branch 'origin/feature-gambler' into bugfix-mob-casting 2023-08-09 18:31:51 -04:00
MagicBot 015e6301fb ErrorPopup for fate peddler encumbrance. 2023-08-09 17:58:11 -04:00
MagicBot 1efb9daff8 ErrorPopup for fate peddler encumbrance. 2023-08-09 17:52:39 -04:00
FatBoy 8747890e5e fate peddler work 2023-08-09 15:50:56 -05:00
MagicBot 41c56c150a Version update to 1.5.1 2023-08-09 16:03:53 -04:00
FatBoy 7c931e87a4 fate peddler work 2023-08-09 14:53:05 -05:00
FatBoy 39e0059f28 Merge remote-tracking branch 'origin/bugfix-mob-casting' into feature-gambler 2023-08-09 14:48:48 -05:00
FatBoy 1b77eeabc0 fate peddler work 2023-08-09 14:48:22 -05:00
MagicBot 7ce664458f Server requires a min of 15 database connections to boot. 2023-08-09 08:57:50 -04:00
MagicBot db2e9a282a Only one piece of equip drops at a time. 2023-08-09 08:17:53 -04:00
MagicBot 32b5dd3f66 Bugfix: suffix overwrites prefix. 2023-08-09 07:39:10 -04:00
FatBoy d53bf0f66e fate peddler work 2023-08-08 20:37:31 -05:00
FatBoy 04fcdd2545 disable anniversary gift 2023-08-08 19:43:51 -05:00
FatBoy 5702810108 fate peddler work 2023-08-08 19:37:42 -05:00
FatBoy 47eb4cd536 fate peddler conversion of LootManager methods 2023-08-08 19:32:39 -05:00
FatBoy 626c17f100 Merge branch 'bugfix-mob-casting' into feature-fatePeddler 2023-08-08 19:25:50 -05:00
MagicBot 64ca876920 CanAggro check added to guard logic. 2023-08-08 19:08:51 -04:00
MagicBot b96b222327 Booty moved to LootManager 2023-08-08 18:30:21 -04:00
MagicBot d04ee197d9 Schema change to reflect new package. 2023-08-08 18:25:40 -04:00
FatBoy 9805ee8044 Random to utilize max + 1 2023-08-08 15:43:24 -05:00
FatBoy 0e78902ff6 ranged mobs attack at range again 2023-08-08 14:22:49 -05:00
FatBoy 923447e983 infinite loop fix 2023-08-08 13:36:46 -05:00
FatBoy e88e8b56c6 mobs only toggle combat mode when changing combat target 2023-08-08 12:49:25 -05:00
FatBoy 6e255d9c75 guards hate value change target 2023-08-08 11:51:04 -05:00
FatBoy 59c976c073 guards use hate value 2023-08-08 11:45:42 -05:00
FatBoy 49c403bacc aiInfo display hate value 2023-08-08 11:43:27 -05:00
FatBoy f852037a61 guard minion aggro fixed 2023-08-08 11:30:19 -05:00
MagicBot 9f0fb26e1f Need to preserver order of hashmap insertion. 2023-08-08 12:24:27 -04:00
FatBoy 564968a1e3 scaling guard powers based on rank 2023-08-08 11:07:41 -05:00
FatBoy c8b91fc264 aggro raneg configurable 2023-08-08 10:56:33 -05:00
FatBoy ec43c54aff mob cast delay cached 2023-08-08 10:54:36 -05:00
MagicBot 2ce13ac463 typo in sql 2023-08-08 11:24:13 -04:00
MagicBot 1cc8d2919a DD is last element in contract power list. 2023-08-08 11:19:18 -04:00
MagicBot 35dc1239f8 Record sort ASC is required. 2023-08-08 11:12:32 -04:00
MagicBot 31122cf6d3 AIinfo updated with token list. 2023-08-08 11:01:05 -04:00
MagicBot 434078cebf Power loading work. 2023-08-08 10:44:26 -04:00
MagicBot 1fb2d8cadf Power loading work. 2023-08-08 10:39:19 -04:00
MagicBot fbf865e865 Methods moved to new dbPowersHandler. 2023-08-08 10:32:20 -04:00
MagicBot 0b1df09f3a Refactor of mob powers loading for efficiency. 2023-08-08 10:30:20 -04:00
MagicBot 2e6ebbb9c3 Refactor of mob powers loading for efficiency. 2023-08-08 10:29:01 -04:00
MagicBot 071eb26e48 Powers also loaded from contract. 2023-08-08 08:31:11 -04:00
MagicBot 2a75ab4581 Merge remote-tracking branch 'origin/post-loot-cleanup' into bugfix-mob-casting 2023-08-08 08:07:41 -04:00
FatBoy 6c255323fb vendors now require ranks to roll high tier items 2023-08-07 22:06:45 -05:00
MagicBot a392c5213c Method cleanup. 2023-08-07 15:52:50 -04:00
MagicBot e382ba2b9a Always at least one stat rolled. 2023-08-07 15:00:18 -04:00
MagicBot 557292a56d Removed unused code. 2023-08-07 14:31:33 -04:00
MagicBot 339b6c5025 Using LootManager for forge scaling. 2023-08-07 13:55:22 -04:00
MagicBot b05c4a91e5 Using LootManager for forge scaling. 2023-08-07 13:53:16 -04:00
MagicBot a5ab912ffa Method for adjusted table rolls based on mpc level. 2023-08-07 13:36:16 -04:00
MagicBot b84be6eea8 Last vestiges of old loot system removed. 2023-08-07 12:12:52 -04:00
MagicBot 71875059b6 Update table names for new convention. 2023-08-07 10:52:37 -04:00
MagicBot 6e814c1dcd Refactor to install new loot tables. 2023-08-07 10:17:50 -04:00
MagicBot 985b327b69 Refactor to install new loot tables. 2023-08-07 10:16:30 -04:00
MagicBot 8a5924eeee rollTable() method added to loot classes. 2023-08-07 09:42:40 -04:00
MagicBot 2e59f7f01c Garbage Peddler method removed. 2023-08-07 09:03:38 -04:00
MagicBot f7fd544a00 _modtypeTables populated at startup. 2023-08-07 08:58:44 -04:00
MagicBot 8c4d9b66ef _modTables populated at startup. 2023-08-07 08:49:43 -04:00
MagicBot 32d71df837 _itemTables populated at startup. 2023-08-07 08:39:08 -04:00
MagicBot efe7784a3f _itemTableEntry created.
Class init cleaned up.
2023-08-07 08:22:37 -04:00
FatBoy a5af696806 guard powers 2023-08-06 19:44:20 -05:00
FatBoy 23783ec7cd spacing cleanup 2023-08-06 17:54:01 -05:00
FatBoy 0d2ea32dbd guards nuke more than they debuff 2023-08-06 17:42:24 -05:00
FatBoy 915f93dc2d safe guards dont aggro pets 2023-08-06 17:11:22 -05:00
MagicBot 8f71c8af01 _genTables populated. 2023-08-06 18:09:34 -04:00
MagicBot 6acc422345 _genTables populated. 2023-08-06 18:08:31 -04:00
FatBoy dde98c7c58 guard casting work 2023-08-06 17:07:25 -05:00
MagicBot dd756d4c00 _genTables populated. 2023-08-06 18:00:45 -04:00
MagicBot 0013020bfa New consolidated loot db handler.
Booty loading moved into new handler.
2023-08-06 17:47:49 -04:00
MagicBot 14e7b0395c New _genTables collection defined. 2023-08-06 17:44:30 -04:00
MagicBot f8b09b5f33 Class moved to loot package. 2023-08-06 14:04:06 -04:00
MagicBot a3a2b01ec4 Method moved to manager class. 2023-08-06 08:36:16 -04:00
MagicBot f0503aa63b Junk code removal. 2023-08-06 08:17:15 -04:00
MagicBot ff7e1ae8c1 Junk code removal. 2023-08-06 07:59:27 -04:00
MagicBot e424441380 Booty loot table is a gentable entry. 2023-08-06 07:53:33 -04:00
MagicBot 67bcb9aeea Refactor lootTable/itemtable for client alignment. 2023-08-06 07:21:49 -04:00
FatBoy 345a866f50 mele guards dont cast 2023-08-06 00:07:01 -05:00
FatBoy 5d1ccc437c mele guards dont cast 2023-08-06 00:04:42 -05:00
FatBoy d221daa864 guard power work 2023-08-05 23:38:24 -05:00
FatBoy a79562de01 random extra spell cooldown to stagger 2023-08-05 23:23:27 -05:00
FatBoy c4af45b9e5 guard casting system 2023-08-05 23:10:06 -05:00
FatBoy 2aabafdab8 fixed mob cast effect 2023-08-05 22:54:41 -05:00
FatBoy 2b4b79e339 updated naming convention of variables to conform to client data 2023-08-05 22:38:33 -05:00
MagicBot 0337ac7758 Gold drop rate display fix. 2023-08-05 20:11:07 -04:00
MagicBot e1f96a009b Display effective drop rate. 2023-08-05 19:46:29 -04:00
MagicBot 81fe6c4e2a Removed integer input. 2023-08-05 19:42:26 -04:00
MagicBot cc9b5a93ee Header added to new files. 2023-08-05 19:28:53 -04:00
MagicBot 51dfc3a56b Hotzone affects base rate. 2023-08-05 19:23:58 -04:00
MagicBot 98b9567302 Hotzone table only ran once. 2023-08-05 18:49:48 -04:00
MagicBot 820eeaee72 Bootysim displays chance. 2023-08-05 18:42:43 -04:00
MagicBot 258bda22da Bootysim displays chance. 2023-08-05 18:39:17 -04:00
MagicBot 15a167905c Config drop rates modify chance. 2023-08-05 17:46:34 -04:00
MagicBot a2c6b919d4 Table refactor to conform with sb. 2023-08-05 10:48:21 -04:00
MagicBot 42069fe170 Table refactor to conform with sb. 2023-08-05 10:38:21 -04:00
MagicBot a7abe6c4c5 Table refactor to conform with sb. 2023-08-05 10:28:32 -04:00
MagicBot 0568dc0771 Table refactor to conform with sb. 2023-08-05 10:17:37 -04:00
MagicBot 1c5d1cef70 Table refactor to conform with sb. 2023-08-05 10:11:31 -04:00
MagicBot 5970d6d716 Cleanup of random usage. 2023-08-05 09:39:16 -04:00
MagicBot 0d9ab6c6fd Testing pure unmodified booty entries. 2023-08-05 08:47:48 -04:00
FatBoy 516fa59068 NPCs will now buy items based on how much durability is on the item 2023-08-04 20:03:31 -05:00
FatBoy 64aef11c56 mob equipment takes damage upon death 2023-08-04 19:47:21 -05:00
FatBoy 17f099386a enchanted and non enchanted items show up correctly as "unidentified" 2023-08-04 19:27:49 -05:00
FatBoy 91842add6d item identification defaults work 2023-08-04 19:14:40 -05:00
FatBoy 4a0a00ed95 removed custom "chance" for prefix and suffix 2023-08-04 19:06:48 -05:00
MagicBot 068d9cd719 Signature update in loot generation. 2023-08-04 14:01:12 -04:00
MagicBot ae8eef640b Formatting cleanup. 2023-08-04 13:25:13 -04:00
MagicBot 8fad2780c1 multiplier not used for item drops. 2023-08-04 13:16:44 -04:00
MagicBot 8b1fb98b09 Drop rate not used for equipment drops. 2023-08-04 13:09:09 -04:00
MagicBot 2cbb112f09 Drop rate not used for equipment drops. 2023-08-04 13:04:57 -04:00
MagicBot c5c323a316 Rework of drop rate usage. 2023-08-04 12:23:55 -04:00
MagicBot 7ac78df913 Rework of drop rate usage. 2023-08-04 12:21:22 -04:00
MagicBot 5e01fe97ac Removed pre-Booty roll from Loot Drops.
Renamed methods for clarity.
2023-08-04 10:14:45 -04:00
MagicBot bf29e5868e Merge branch 'feature-hotzone-rolls' of http://repo.magicbane.com/MagicBane/Server into feature-hotzone-rolls
 Conflicts:
	src/engine/gameManager/LootManager.java
2023-08-04 10:11:19 -04:00
MagicBot 31e32cfcf4 Removed initial bootySet roll. 2023-08-04 10:10:19 -04:00
FatBoy ef7d75ba9b min roll increased to 70 2023-08-03 21:07:07 -05:00
FatBoy c514cad1d9 no enchant item identification 2023-08-03 20:44:25 -05:00
FatBoy f79ac6f836 revert min roll change 2023-08-03 20:29:13 -05:00
FatBoy b9f939c8b2 identify loot without prefix or suffix 2023-08-03 20:26:44 -05:00
FatBoy 060e9f330c fix for base value check 2023-08-03 20:06:47 -05:00
FatBoy d903bc767c fix wrong display for hotzone lot table in simulatebooty 2023-08-03 19:59:20 -05:00
FatBoy 42967693d0 autoID if value = baseValue 2023-08-03 19:56:32 -05:00
FatBoy 92cb741822 equipment drops added to simulate booty command 2023-08-03 19:34:42 -05:00
FatBoy 32653216e9 added hotzone tables to simulate booty command 2023-08-03 19:27:48 -05:00
FatBoy 9a03dc36c6 add goldTally to simulateBooty command 2023-08-03 19:24:35 -05:00
FatBoy 0e35eea036 hotzone slightly increase mob min roll 2023-08-03 19:21:35 -05:00
FatBoy a09ce6b4fc cleanup and lots of null checks 2023-08-03 19:18:05 -05:00
MagicBot 765b837df0 Unused methods deleted. 2023-08-03 15:20:31 -04:00
MagicBot fda3386e7b Multiple inner classes extracted from LootManager. 2023-08-03 09:43:30 -04:00
MagicBot 0bb756521b Update console Lootmanager bootstrap message. 2023-08-03 09:09:23 -04:00
MagicBot 95a9e45391 Caching of drop rates within LootManager 2023-08-03 09:04:20 -04:00
MagicBot 4e01c8e794 Moved manager class to manager package 2023-08-03 08:27:08 -04:00
MagicBot 1df78ec1fc Merge remote-tracking branch 'origin/master' into feature-hotzone-rolls 2023-08-03 08:23:24 -04:00
FatBoy 7cdcc3d23d cleanup 2023-08-02 20:09:17 -05:00
FatBoy 66b047d091 cleanup 2023-08-02 20:09:07 -05:00
FatBoy 75f54ae562 normal loot and hotzone loot test 2023-08-02 20:06:46 -05:00
FatBoy 500763fd11 cleanup 2023-08-02 20:01:46 -05:00
FatBoy ae8ead825d error catch for prefix and suffix generation 2023-08-02 19:57:32 -05:00
FatBoy 86e8fe19d4 removed unused method parameter 2023-08-02 19:49:34 -05:00
FatBoy a9af791d02 removed unused import 2023-08-02 19:48:50 -05:00
FatBoy 5ad9112448 incoroporate gold rate, method cleanup 2023-08-02 19:45:18 -05:00
MagicBot 090d3b4372 New config entry added for server gold rates. 2023-08-02 17:44:22 -04:00
MagicBot c3bcdd544e Class formatting cleanup. 2023-08-02 09:12:13 -04:00
MagicBot dea9d93e5b Class formatting cleanup. 2023-08-02 09:10:51 -04:00
MagicBot a299493bd7 Cleanup of file project headers. 2023-08-02 08:18:50 -04:00
MagicBot 350a1208f5 Try-catch surrounding respawn code. 2023-08-02 08:07:41 -04:00
FatBoy b8cb90cdd0 mob pulse delay added to mobAI 2023-08-01 21:26:14 -05:00
FatBoy b47848d63d mob drop combat targets no longer in game 2023-08-01 20:32:02 -05:00
FatBoy 140a9bd084 mob AI new thread 2023-08-01 20:13:23 -05:00
FatBoy 5e0b4ad763 respawn while loop addition 2023-08-01 19:50:52 -05:00
FatBoy 370efe1092 forget about that 2023-08-01 19:27:46 -05:00
FatBoy 50cd9b32db rename comment in WorldServer for mob respawn thread 2023-08-01 19:21:11 -05:00
FatBoy 7f1e537975 mob respawning handled in its own thread 2023-08-01 19:19:39 -05:00
FatBoy cdd074c0ae respawn que null check 2023-08-01 18:56:56 -05:00
FatBoy bab033be2d mobAI error tracing 2023-08-01 18:52:44 -05:00
FatBoy 1b6dcd4da0 AuditAI command implemented and functions 2023-08-01 17:53:45 -05:00
FatBoy 7cc5e0cf5c timestamp to console after each completed iteration of MobileFSMManager 2023-08-01 17:22:34 -05:00
FatBoy 685dd948e2 asset placement validation to use city location not players location 2023-07-31 21:55:20 -05:00
FatBoy 93359ae147 hotzone roll tweaks 2023-07-31 21:28:41 -05:00
FatBoy 48817d7ecb hotzone roll tweaks 2023-07-31 20:42:56 -05:00
FatBoy 38339eae3f hotzone roll tweaks 2023-07-31 19:20:41 -05:00
MagicBot 140ec1b08d Hotfix: Removing extra glass roll. 2023-07-31 14:00:37 -04:00
MagicBot be7156e6f6 Merge remote-tracking branch 'origin/bugfix-ITEM-chance' 2023-07-31 05:14:37 -04:00
FatBoy be84b85b69 fixed insane glass drops 2023-07-30 19:52:11 -05:00
MagicBot 0a36d2786c Merge remote-tracking branch 'origin/bugfix-ITEM-chance' 2023-07-30 17:06:21 -04:00
FatBoy e0f62c0a9b ITEM loot uses chance to drop 2023-07-30 16:05:21 -05:00
FatBoy f5375bca26 ITEM loot uses chance to drop 2023-07-30 15:57:01 -05:00
MagicBot f03d6da6b2 Merge remote-tracking branch 'origin/cleanup-loot-rewrite' 2023-07-30 15:16:48 -04:00
FatBoy 46bb1cd8e8 tweak roll ranges, fix r8 loot bug 2023-07-30 14:05:28 -05:00
FatBoy c104d9fa00 r8 loot roll work 2023-07-30 13:55:08 -05:00
FatBoy 23af1d252e cleanup loot manager 2023-07-30 11:43:26 -05:00
FatBoy 1e5752736a mine towers can be gold repaired when mine not active 2023-07-29 21:37:36 -05:00
FatBoy 707fc9f756 fixed mob loot crash 2023-07-29 20:57:24 -05:00
FatBoy 4932ee36ea catch code for loot crash 2023-07-29 19:04:59 -05:00
FatBoy 99fc4b8671 fixed HZ loot issue 2023-07-27 23:39:14 -05:00
FatBoy e9913a66a7 fixed mob AI crash 2023-07-27 23:17:41 -05:00
FatBoy 57a38303f8 null pointer evasion 2023-07-27 23:10:00 -05:00
FatBoy b28d31ec44 respawn que work 2023-07-27 22:10:47 -05:00
FatBoy 6e1ed24b30 respawnQues operate per zone 2023-07-27 21:22:20 -05:00
FatBoy adb3436bd7 mobs handle players leaving agroMap 2023-07-27 21:18:52 -05:00
FatBoy c0bac56761 corpse loading early exit changed to despawned instead of alive 2023-07-27 20:39:47 -05:00
FatBoy ff281cc20b respawnQue and corpse loading 2023-07-27 20:32:09 -05:00
FatBoy 6a4ae0af31 created respawnQue for mobs 2023-07-27 20:03:14 -05:00
FatBoy 4ccfd0adce baked in stats items no longer show up as "unidentified" 2023-07-27 19:54:47 -05:00
FatBoy 6d4566b94a mob loot rolling finalized 2023-07-27 19:40:42 -05:00
FatBoy 1fa5019ddb regression formula for min mob loot roll 2023-07-27 19:06:31 -05:00
FatBoy a5fe5ece50 mobs use both enemy and notEnemy lists to determine proper agro 2023-07-25 21:51:30 -05:00
FatBoy 62cc334c66 guards no longer attack guards 2023-07-25 21:42:50 -05:00
FatBoy a9fb7969c7 Merge branch 'bugfix-roll-ranges' into merge-mob-fixes 2023-07-25 21:40:30 -05:00
FatBoy 9f90159ca2 audit respawn timers 2023-07-25 21:35:09 -05:00
FatBoy 055b3d3d66 update location 2023-07-25 21:27:54 -05:00
FatBoy 6761ec7361 remove movement sync 2023-07-25 21:19:17 -05:00
FatBoy 763971acc6 regression calculator usage 2023-07-25 21:07:40 -05:00
FatBoy 74d92aa671 mob max roll audit 2023-07-25 20:59:23 -05:00
MagicBot 43090a9bd1 Support for the widest array of network configurations. Auto-configure as best we can. 2023-07-23 12:58:40 -04:00
MagicBot e57ce5b36e Parmn one not set twice. 2023-07-23 11:34:30 -04:00
MagicBot 6eecf28a64 Logging configured map path. 2023-07-23 08:22:17 -04:00
MagicBot c9f1fcbf51 File structure update. 2023-07-23 08:19:15 -04:00
MagicBot 303ccd05b5 File structure update. 2023-07-23 08:16:36 -04:00
MagicBot d9d905e34a File structure update. 2023-07-23 08:15:39 -04:00
MagicBot 9f906128c4 File structure update. 2023-07-23 08:02:46 -04:00
FatBoy fca9b7dccb cleanup and finalize 2023-07-22 18:58:55 -05:00
FatBoy 48bcf1bd1f removed distance check preventing pets from attacking 2023-07-22 18:47:29 -05:00
FatBoy 3f274b1bf8 region support for teleporting 2023-07-22 13:24:58 -05:00
FatBoy 8a8bf8d2f9 region support for teleporting 2023-07-22 12:44:59 -05:00
MagicBot 53bae6e34f Merge remote-tracking branch 'origin/bugfix-stuck-location' 2023-07-22 13:26:11 -04:00
MagicBot 7f5d5dbad2 Footprint adjusted to match mesh. 2023-07-22 13:07:04 -04:00
MagicBot c06bc97640 Only rotate once 2023-07-22 11:04:32 -04:00
MagicBot 5899bb535b Stuck location rotated properly. 2023-07-22 11:02:03 -04:00
MagicBot bf1271c840 Slot not rotated twice. 2023-07-22 10:44:36 -04:00
MagicBot 8b2a07e860 Unused method removed. 2023-07-22 10:40:54 -04:00
FatBoy 7e25875fa2 mobs respawn, mob location sync, mobs attack 2023-07-22 08:26:55 -05:00
FatBoy a34386ae51 mob resync position on death and while moving 2023-07-21 20:01:39 -05:00
MagicBot 413e782af1 NPC slotting now conforms with bootstrap. 2023-07-21 13:15:24 -04:00
MagicBot ccc9908e1e NPC/Mob slotting work. 2023-07-21 13:08:42 -04:00
MagicBot 90c324b363 NPC/Mob slotting work. 2023-07-21 12:50:52 -04:00
MagicBot 1260d7cfa3 Errant import removed. 2023-07-21 12:00:06 -04:00
MagicBot e15075f57f Merge remote-tracking branch 'origin/debug-pet-stats' 2023-07-20 17:04:26 -04:00
FatBoy 2cf02ba102 fix NPC loading issue 2023-07-19 19:45:13 -05:00
FatBoy 25c02c9960 fix NPC loading issue 2023-07-19 19:43:28 -05:00
FatBoy 7f2c6a24b6 fix NPC loading issue 2023-07-19 19:42:02 -05:00
FatBoy e2272f49d4 fix NPC loading issue 2023-07-19 19:03:06 -05:00
FatBoy aa0067c117 fix for mob sync and ghost mobs 2023-07-19 18:27:10 -05:00
FatBoy 07c64f9b46 hotfix mob roll finalized 2023-07-19 18:05:20 -05:00
FatBoy 4adf0a89fb hotfix mob roll chance 2023-07-19 17:50:03 -05:00
FatBoy 4bd158cc78 hotfix mob roll chance 2023-07-19 17:18:46 -05:00
FatBoy 39ceef99ea hotfix mob roll chance 2023-07-19 17:17:40 -05:00
MagicBot 69d8424cb6 Improved error reporting 2023-07-19 15:43:58 -04:00
FatBoy 3869b3b218 old code cleanup 2023-07-18 20:17:05 -05:00
FatBoy 4fd9a358a6 pets will stop chasing mobs that are no longer a threat to player 2023-07-18 20:09:37 -05:00
FatBoy c9995f3d62 pets defend owner when "assist" toggled 2023-07-18 20:01:58 -05:00
FatBoy 1c7c0ee13e mobs aggro to pets 2023-07-18 19:51:00 -05:00
FatBoy bd48198a51 pets stats calculate properly & pet buffs no longer nerf pet 2023-07-18 19:29:12 -05:00
MagicBot 170312fef8 Placement check set to 876 to accommodate larger zone sizes. 2023-07-18 16:09:41 -04:00
FatBoy 60f02ae34e mob roll tables update 2023-07-17 22:27:55 -05:00
FatBoy 72a0fc458e mob roll tables update 2023-07-17 22:25:54 -05:00
MagicBot 727ccf3b12 ZoneSet DevCmd created. 2023-07-17 04:22:56 -04:00
MagicBot 0cde9de388 Testing Zone set. 2023-07-17 04:06:06 -04:00
MagicBot ea0370ac51 Merge remote-tracking branch 'origin/master' into bugfix-loot-rolls 2023-07-16 14:44:17 -04:00
FatBoy 45fa191ef6 prefix and suffix chances added to mobloot 2023-07-16 11:35:54 -05:00
FatBoy 68e87dabbc prefixes drop on mobloot 2023-07-16 09:53:18 -05:00
FatBoy 428ded8728 roll ranges fixed to allow all items to drop naturally 2023-07-16 09:04:21 -05:00
MagicBot c04a342890 Update to sql for better default mysql.cnf compatibility. 2023-07-16 07:52:10 -04:00
FatBoy c72cda1b73 pets attack buildings 2023-07-15 22:34:09 -05:00
FatBoy 9db568206d pet stats added again 2023-07-15 21:57:27 -05:00
FatBoy 9ea02c888f pet troubles resolved 2023-07-15 18:38:46 -05:00
FatBoy 8720f8f335 loot roll formula adjusted 2023-07-15 17:00:58 -05:00
FatBoy 06c4b7ca3c ghost mob fix 2023-07-15 15:48:11 -05:00
FatBoy 8c1b237720 dead pets removed form seafloor zonemobset 2023-07-15 15:39:57 -05:00
FatBoy 7dc6fece7d work on pet AI 2023-07-15 15:27:22 -05:00
FatBoy e0929a4cbd pets added to seafloor mob set 2023-07-15 14:20:50 -05:00
FatBoy 18bcd79733 pets now spawn at owners location 2023-07-15 14:08:44 -05:00
FatBoy 525facf7b5 remote commit 2023-07-15 13:27:35 -05:00
FatBoy 38317a4ee5 cast chance and cooldown modification for mobs 2023-07-15 08:35:00 -05:00
FatBoy eb9a214ba3 cast chance and cooldown modification for mobs 2023-07-15 08:33:57 -05:00
MagicBot f9870d45fc Merge remote-tracking branch 'origin/magicbot-reg-update' into magicbox1.5
# Conflicts:
#	src/engine/ai/MobileFSM.java
#	src/engine/ai/MobileFSMManager.java
#	src/engine/devcmd/cmds/SetAICmd.java
#	src/engine/gameManager/DevCmdManager.java
2023-07-15 09:27:57 -04:00
MagicBot 9bbdef224d Project cleanup pre merge. 2023-07-15 09:23:48 -04:00
MagicBot 134b651df8 Version requirement updated. 2023-07-15 09:18:51 -04:00
MagicBot 0a15e3e75b Removed leftover discriminator. 2023-07-15 09:12:33 -04:00
FatBoy 9a68509847 Merge branch 'magicbox1.5' of http://repo.magicbane.com/MagicBane/Server into magicbox1.5 2023-07-15 07:59:29 -05:00
FatBoy 9f162e9ed0 last minute cleanup, added cast chance to mobs 2023-07-15 07:59:07 -05:00
MagicBot 003916d393 Parm required when registering. 2023-07-14 14:41:12 -04:00
MagicBot 46d50d315a Unused methods removed. 2023-07-02 07:46:45 -04:00
MagicBot f73aed9d48 Merge remote-tracking branch 'origin/magicbox1.5' into configupdate2 2023-07-01 13:05:23 -04:00
FatBoy 761adca2ef guards no longer recall when player aggro map is empty 2023-06-30 21:02:51 -05:00
FatBoy b32705ce56 mob casting will now check for and properly check against hit roll requirements 2023-06-30 20:33:41 -05:00
MagicBot 4dc40f4df4 Back to offset until city cleanup. 2023-06-27 18:21:26 -04:00
MagicBot 4b49777eb2 Simplify logic. 2023-06-27 18:01:59 -04:00
MagicBot cb25333dc3 SDR binds at banestone 2023-06-27 17:35:33 -04:00
MagicBot 34e4aa1963 SDR binds at banestone 2023-06-27 17:34:25 -04:00
MagicBot 7810ea6baf SDR binds at banestone 2023-06-27 17:30:13 -04:00
MagicBot 89399e9f93 bugfix: case issue 2023-06-27 16:55:09 -04:00
MagicBot d08316d6f3 Ruins or SDR driven by config. 2023-06-27 16:50:38 -04:00
MagicBot b383aab556 Ruins or SDR driven by config. 2023-06-27 16:45:47 -04:00
MagicBot 9cd3cdf3a3 Mob AI uses two config entries. 2023-06-27 16:19:15 -04:00
MagicBot 7f05cc87c4 Mob AI and SDR/Ruins added to config. 2023-06-27 16:13:25 -04:00
MagicBot 92004bf43e Mob AI and SDR/Ruins added to config. 2023-06-27 16:09:55 -04:00
FatBoy ef0e277f46 refactored AI variables from MBServerStatics 2023-06-26 20:21:10 -05:00
MagicBot 2ffd2e37e6 Class cleanup and reformat. 2023-06-26 19:19:59 -04:00
MagicBot 7d1d1e19d2 Logging of invalid contracts 2023-06-26 18:45:40 -04:00
MagicBot bea82d80f2 Logging of invalid contracts 2023-06-26 18:35:51 -04:00
FatBoy cb344d57b2 guard dogs have 0 minions 2023-06-25 21:44:47 -05:00
FatBoy 99a4d87982 guard dogs 2023-06-25 21:34:23 -05:00
FatBoy 1b94f3f71d guard dogs 2023-06-25 21:32:36 -05:00
FatBoy b2ce937b3f guard minion spawn work 2023-06-25 20:23:47 -05:00
FatBoy 5653776cb2 guard minions despawn at creation 2023-06-25 20:18:02 -05:00
FatBoy 413df09ddf removed error code in FSM manager 2023-06-25 19:51:52 -05:00
FatBoy fc3ca3b814 null target check for mobs 2023-06-25 19:44:27 -05:00
FatBoy 7b43440fae mobs start the game at their first patrol point index 2023-06-25 19:32:49 -05:00
FatBoy 01b8b67ffd mobs respect invisibility again 2023-06-25 19:30:28 -05:00
MagicBot 8fbbde6d69 bugfix in world height calculation. 2023-06-25 20:25:23 -04:00
FatBoy da51be1bef Mob Casting bypasses mele range check 2023-06-25 13:36:24 -05:00
MagicBot 764beb33bd Dispatcher moved to early in bootstrap. 2023-06-07 15:31:07 -04:00
MagicBot f8c8d7244e Moved member to ConfigManager. 2023-06-07 14:53:15 -04:00
MagicBot b6ce3b7ee9 Already logged when connection manager is created. 2023-06-07 14:32:01 -04:00
MagicBot 48aef2ef01 Network autoconfig now uses eth0 or default outgoing ip route. 2023-06-07 14:11:54 -04:00
MagicBot 61e4a4aed4 Realmmap loaded from config to assist with custom maps. 2023-06-07 13:47:25 -04:00
MagicBot b9db6e8dc6 Members moved to WorldServer.
Root object no longer read from config.
2023-06-07 13:37:43 -04:00
FatBoy d695d3db26 epic mob damage calc fix and epic mob null reference fix 2023-05-28 16:07:18 -05:00
FatBoy ca11651be6 guards use proper aggro rules for added aggro check 2023-05-28 15:45:38 -05:00
FatBoy 2cfe527389 mob AI no longer checks for no online players 2023-05-28 14:12:31 -05:00
FatBoy f94e66bf74 mobs update location after moving to patrol point index 2023-05-28 14:05:58 -05:00
FatBoy ff3442d9ad aiinfo command null check 2023-05-28 14:02:05 -05:00
FatBoy 33c6f1c74d patrol point index 2023-05-28 13:48:15 -05:00
FatBoy da378bf490 patrol point index 2023-05-28 13:31:39 -05:00
FatBoy b3b7a78cec patrol point index 2023-05-28 13:28:22 -05:00
FatBoy 545163f60b traget name added to aiInfoCmd 2023-05-28 13:13:49 -05:00
FatBoy bfcdd3bf4b mobile default starting point 2023-05-28 12:56:47 -05:00
FatBoy 67808b69a6 check for dead target 2023-05-28 12:07:00 -05:00
FatBoy 59a4da0c3f randomized patrol delays 2023-05-28 11:34:54 -05:00
FatBoy fd9c5d06af randomized patrol delays 2023-05-28 11:30:46 -05:00
FatBoy 19beb3d5cb randomized patrol delays 2023-05-28 11:29:00 -05:00
FatBoy 863aa4c4a9 randomized patrol delays 2023-05-28 11:25:12 -05:00
FatBoy 90ae798bb8 no more skating rink 2023-05-28 11:19:32 -05:00
FatBoy c47d1b7823 aggro check for non agressive mobs 2023-05-28 11:03:29 -05:00
FatBoy 4e5c77ec47 hamlet guard aggro fix 2023-05-28 11:02:37 -05:00
FatBoy d673c329b6 hamlet guards + mobs aggro before going home 2023-05-28 10:55:11 -05:00
FatBoy 7dfd8148d5 use aggro range not mob range 2023-05-28 10:47:10 -05:00
FatBoy a2a70484ed cant check range of target if theres no target 2023-05-28 10:46:07 -05:00
FatBoy 36eef1942b mobs use half aggro range top chase targets past go home point 2023-05-28 10:43:05 -05:00
FatBoy b154f7ee7f mobs don't go home while in combat range 2023-05-28 10:21:56 -05:00
FatBoy ea919b4ecf mob aggro raneg when swapping hated target 2023-05-28 10:13:49 -05:00
FatBoy b42a378ca8 hate value reset when mob goes home 2023-05-28 10:11:20 -05:00
FatBoy 3b3e89c98f NPC owner null check 2023-05-28 09:25:15 -05:00
FatBoy 708d2e9fb3 building check fix 2023-05-28 09:19:10 -05:00
FatBoy bee3a9b376 Merge remote-tracking branch 'origin/magicbox1.5' into magicbox1.5
# Conflicts:
#	src/engine/ai/MobileFSM.java
2023-05-28 09:18:09 -05:00
MagicBot 566522befb Reformat and bonus code removal. 2023-05-28 08:12:34 -04:00
MagicBot a1f8fedefe Merge remote-tracking branch 'origin/magicbox1.5' into mob-AI-debug
# Conflicts:
#	src/engine/ai/MobileFSM.java
2023-05-28 07:42:10 -04:00
FatBoy 0de09ee9f5 trebs now show correct time remaining to spawn 2023-05-27 22:00:12 -05:00
FatBoy 0d2af7c011 treb fix 2023-05-27 20:54:16 -05:00
FatBoy 11e373db6f treb fix 2023-05-27 20:53:52 -05:00
FatBoy 2e219916a0 respawn work 2023-05-27 19:19:06 -05:00
FatBoy a07ee7903b respawn work 2023-05-27 19:11:17 -05:00
MagicBot abb2521f58 Bug class involving generated keys from statements. 2023-05-26 17:46:26 -04:00
MagicBot d0287ba94e Login should fail fast. 2023-05-25 14:55:49 -04:00
FatBoy 56d6efc4e4 mob chance to cast set at 50% 2023-05-24 20:27:58 -05:00
FatBoy b6c9eed229 power chance tuning 2023-05-24 20:08:53 -05:00
FatBoy eb9a1143e4 patrol delay fine tuning 2023-05-24 19:27:25 -05:00
FatBoy 3e659d981a Patrol wait determined by MBServerStatics.AI_PATROL_DIVISOR
mob cast chance now determined by MBStatics.AI_POWER_CHANCE

mob cast cooldown now determined by MBServerStatics.AI_POWER_DIVISOR

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

mob cast cooldown now determined by MBServerStatics.AI_POWER_DIVISOR
2023-05-24 19:05:35 -05:00
MagicBot cb0a89cb03 Fixed pool size auto-calculated. 2023-05-24 08:36:34 -04:00
MagicBot ee137c0146 Fixed pool size auto-calculated. 2023-05-24 08:34:37 -04:00
MagicBot 9edc32de13 Pool - 10 minute idle; 60 min lifetime. 2023-05-24 07:57:36 -04:00
MagicBot c46615f1d2 Logging info update on bootstrap. 2023-05-23 17:30:30 -04:00
MagicBot d7d22dbb11 Populate zone extents cache. 2023-05-23 17:15:07 -04:00
MagicBot bcc1ac115d bug class fixed involving rs usage 2023-05-23 14:29:08 -04:00
MagicBot adcf7ca927 Updated Hikari pool configuration. 2023-05-23 14:06:15 -04:00
MagicBot f78c18abec Updated Hikari pool configuration. 2023-05-23 13:51:10 -04:00
MagicBot 4f7bb6de0b Using server side statement cache (500). 2023-05-23 13:25:50 -04:00
MagicBot 45d26a82f2 bugfix: runafterload for instanced agos 2023-05-23 12:53:04 -04:00
MagicBot ad99415679 fix: bug class involving rs usage. 2023-05-23 12:24:11 -04:00
MagicBot 568b0291a2 Duplicate method removed. 2023-05-23 11:18:21 -04:00
MagicBot 89192c7ea0 Cleanup post db-refactor. 2023-05-23 11:07:20 -04:00
MagicBot 38ed65054e Cleanup post db-refactor. 2023-05-23 10:56:27 -04:00
MagicBot 391e2d2a17 Cleanup post db-refactor. 2023-05-23 10:50:00 -04:00
MagicBot c6b8d27d53 Refactor to remove abstraction. 2023-05-23 10:42:34 -04:00
MagicBot 3761384dfb Bugfix; method is on rs. 2023-05-23 10:32:07 -04:00
MagicBot 6dd7315786 Garbage cleanup in SetZone().
Package reformat.
2023-05-23 10:27:03 -04:00
MagicBot a2d62ec221 Unused method removed. 2023-05-23 10:08:07 -04:00
MagicBot 4d4d83d15a Unused method removed. 2023-05-23 10:07:39 -04:00
MagicBot 1e3aab1623 Query string updated. 2023-05-23 10:03:05 -04:00
MagicBot f7da137e0f Refactor to remove abstraction 2023-05-23 09:57:17 -04:00
MagicBot 3dd27976fe Refactor to remove abstraction 2023-05-23 09:39:27 -04:00
MagicBot a92ac8671b Refactor to remove abstraction 2023-05-23 09:26:11 -04:00
MagicBot 7c57dcc73d Update to bool return handling. 2023-05-23 09:17:06 -04:00
MagicBot 55756472c6 Bonus code removed. 2023-05-23 08:38:20 -04:00
MagicBot 98237cd53e Refactor to remove abstraction. 2023-05-23 08:33:14 -04:00
MagicBot e9cb8112de Refactor to remove abstraction. 2023-05-23 08:31:10 -04:00
MagicBot fce67a6bae Refactor to remove abstraction. 2023-05-23 08:22:46 -04:00
MagicBot 478e472dc4 Refactor to remove abstraction. 2023-05-23 08:20:20 -04:00
MagicBot 9bdbeeaf70 Refactor to remove abstraction. 2023-05-22 13:00:47 -04:00
MagicBot 3e604b53fa Refactor to remove abstraction. 2023-05-22 12:58:16 -04:00
MagicBot 4b0a3627d4 Refactor to remove abstraction. 2023-05-22 12:50:04 -04:00
MagicBot 3a95cc9b58 Refactor to remove abstraction. 2023-05-22 12:45:55 -04:00
MagicBot f6aa71e9fb Refactor to remove abstraction. 2023-05-22 12:42:34 -04:00
MagicBot d67026edba Refactor to remove abstraction. 2023-05-22 12:35:15 -04:00
MagicBot 75dfc638e1 Pool size auto-configure 2023-05-22 10:34:57 -04:00
MagicBot 07b337f3f1 Pool size fixed 2023-05-22 10:32:15 -04:00
MagicBot 271fc8a35f Pool size auto configured. 2023-05-22 10:21:55 -04:00
MagicBot c7bd2123e8 Pool size auto configured. 2023-05-22 10:11:46 -04:00
MagicBot 5721638cd6 Refactor to remove abstraction. 2023-05-22 09:42:30 -04:00
MagicBot 20bbf85082 Refactor to remove abstraction. 2023-05-22 09:34:59 -04:00
MagicBot 3a2f087381 Refactor to remove abstraction. 2023-05-22 08:54:59 -04:00
MagicBot b8c9d4faf2 Refactor to remove abstraction. 2023-05-22 08:41:25 -04:00
MagicBot 860f7b7b49 Refactor to remove abstraction. 2023-05-22 08:28:58 -04:00
MagicBot b7dd4a845a Refactor to remove abstraction. 2023-05-22 07:57:08 -04:00
MagicBot 1bf9fde684 Bonus code removed. 2023-05-22 07:44:34 -04:00
MagicBot 608a286428 Refactor to remove abstraction 2023-05-22 07:29:22 -04:00
MagicBot 4145124762 Refactor to remove abstraction 2023-05-22 07:18:26 -04:00
MagicBot 9f7da9a57a Refactor to remove abstraction 2023-05-22 06:46:30 -04:00
MagicBot 2cdb2fce42 Refactor to remove abstraction 2023-05-22 06:35:24 -04:00
MagicBot dc9a6fc825 Refactor to remove abstraction 2023-05-22 06:25:51 -04:00
MagicBot 6ae6c91a71 Refactor to remove abstraction 2023-05-22 06:17:40 -04:00
MagicBot ba76de7226 Refactor to remove abstraction 2023-05-22 06:15:19 -04:00
MagicBot 609ee4621e Refactor to remove abstraction 2023-05-22 05:58:30 -04:00
MagicBot 3c9b624ca0 Refactor to remove abstraction 2023-05-22 05:55:33 -04:00
MagicBot 135f66e46f Refactor to remove abstraction 2023-05-22 05:11:55 -04:00
MagicBot 1cd4617c69 Refactor to remove abstraction 2023-05-21 20:26:53 -04:00
MagicBot 8cb0e66bff Refactor to remove abstraction 2023-05-21 20:13:00 -04:00
MagicBot 6ce964ef18 Unnecessary cast 2023-05-21 17:53:21 -04:00
MagicBot db3f97eccf Refactor to remove abstraction. 2023-05-21 17:50:44 -04:00
MagicBot df1b0e3f0f Refactor to remove abstraction. 2023-05-21 17:34:31 -04:00
MagicBot 4749186d86 bugfix: missing break. 2023-05-21 17:29:45 -04:00
MagicBot 82d80ebc4d Refactor to remove abstraction 2023-05-21 17:27:45 -04:00
MagicBot ea5cbf3f0c Refactor to remove abstraction 2023-05-21 17:20:09 -04:00
MagicBot 4d08857de1 Refactor to remove abstraction 2023-05-21 17:00:17 -04:00
MagicBot e203945ea3 Static method moved to manager singleton. 2023-05-21 15:55:15 -04:00
MagicBot ca5cfed82f Refactor to remove abstraction. 2023-05-21 15:48:55 -04:00
MagicBot 0924fa2bdb Refactor to remove abstraction. 2023-05-21 15:28:50 -04:00
MagicBot f299fcaffc Refactor to remove abstraction. 2023-05-21 15:10:27 -04:00
MagicBot 6be3ca41f8 Refactor to remove abstraction. 2023-05-21 14:39:57 -04:00
MagicBot a70c981b47 Refactor to remove abstraction. 2023-05-21 08:57:53 -04:00
MagicBot ea2140559b Bonus Code removed. 2023-05-21 08:39:19 -04:00
MagicBot e4ef0021e8 Refactor to remove abstraction 2023-05-21 08:36:39 -04:00
MagicBot 7b9788bfa9 Refactor to remove abstraction 2023-05-21 08:16:27 -04:00
MagicBot daa5764bfb Refactor to remove abstraction 2023-05-20 21:18:32 -04:00
MagicBot 2e42cbed06 Refactor to remove abstraction 2023-05-20 20:40:52 -04:00
MagicBot 5b3dfbcc21 Refactor to remove abstraction 2023-05-20 19:58:47 -04:00
MagicBot 962649c0f2 Db methods moved to db system. 2023-05-20 19:34:02 -04:00
MagicBot a683eb6290 Refactored to remove abstraction. 2023-05-20 19:14:01 -04:00
MagicBot 4daee03f0d Refactored to remove abstraction. 2023-05-20 19:09:28 -04:00
MagicBot 7e511f590d Created getObjectsFromRs() 2023-05-20 19:02:56 -04:00
MagicBot bffe953c3f Refactor to remove abstraction. 2023-05-20 17:51:21 -04:00
MagicBot c86ad3f2f6 Begin refactor to remove abstraction. 2023-05-20 17:35:44 -04:00
MagicBot 563b54de14 Unused methods removed 2023-05-20 16:33:40 -04:00
MagicBot 82498e8e5a Threadlocal hikari connection defined. 2023-05-20 10:51:25 -04:00
MagicBot e7fa9cc494 Unused methods removed. 2023-05-20 10:43:54 -04:00
MagicBot c04bd92c23 Leak detection threshold set to 5s. 2023-05-20 10:30:34 -04:00
MagicBot 0a31043bc9 Method refactored to use try-with-resources 2023-05-20 10:21:07 -04:00
MagicBot 27ac58518c Method refactored to use try-with-resources 2023-05-20 10:01:40 -04:00
MagicBot 8bafb32e95 Method refactored to use try-with-resources 2023-05-20 10:00:38 -04:00
MagicBot 55d9a3516c Bonus code removed and replaced with a db call actually used. 2023-05-20 09:54:37 -04:00
MagicBot b4b7b08d47 Unused method removed. 2023-05-20 09:51:35 -04:00
MagicBot 553ac01e93 Using baseline for debugging. 2023-05-20 09:43:46 -04:00
MagicBot 0e4490576a Game uses hikaricp for all connection pooling. Connection count set dynamically. 2023-05-20 09:39:23 -04:00
MagicBot 3c5ffed352 Popstring to trywithresources 2023-05-19 07:57:20 -04:00
MagicBot 8b81743cb1 Merge remote-tracking branch 'origin/magicbox1.5' into trywithpass 2023-05-19 07:32:45 -04:00
FatBoy 9b5573c210 guards get Mob.guardedCity assigned to 2023-05-18 19:59:39 -05:00
FatBoy 932daa730a guards use highbred City._playerMemory.size() and Mob.playerAgroMap to go to sleep 2023-05-18 19:54:54 -05:00
FatBoy 0b029a5f79 Merge remote-tracking branch 'origin/mobile-usage-audit' into mobile-usage-audit 2023-05-18 19:49:09 -05:00
FatBoy ac42a9cd8f removed treb override in MobileFSM.DetermineAction 2023-05-18 19:48:37 -05:00
MagicBot 4e863811a1 Removed unused methods. 2023-05-18 08:19:59 -04:00
MagicBot 90fe93d3f0 Renamed for context. 2023-05-18 08:10:54 -04:00
MagicBot 4c4a909798 Error logging added. 2023-05-18 08:00:04 -04:00
MagicBot ba0a7d35cb Error logging added. 2023-05-18 07:54:04 -04:00
MagicBot 86539771e2 Unused method. 2023-05-17 16:38:08 -04:00
MagicBot 8a8136b8e8 Unused methods. 2023-05-17 15:18:47 -04:00
MagicBot 8916d9b4f0 Begin try-with-resources cleanup. 2023-05-17 15:11:26 -04:00
FatBoy 92015c1a13 guards no longer ignore early exit. FSM will not run if no players are online. mobs will use translocate instead of recall power. 2023-05-15 19:01:43 -05:00
MagicBot 80d45f364a Added pool size to hourly metrics. 2023-05-15 10:45:22 -04:00
MagicBot 3a59df6ac6 Update to console output. 2023-05-15 06:17:16 -04:00
MagicBot c3f059c7fc Update to console output. 2023-05-15 06:12:35 -04:00
MagicBot b3ba8f5c9f Try block no longer needed. 2023-05-15 06:08:16 -04:00
MagicBot cd9b8536cb Using color instead of int value. 2023-05-15 06:03:13 -04:00
MagicBot 3a2695703b Using color instead of int value. 2023-05-15 05:48:41 -04:00
MagicBot e4ddcdeeca Building offset added to loc. 2023-05-13 13:17:47 -04:00
MagicBot 69f3c9af71 Bonus code deleted from stuck job. 2023-05-13 13:08:36 -04:00
MagicBot 6a41c5391d Bonus code deleted from stuck job. 2023-05-13 12:59:05 -04:00
FatBoy d9c05fa622 magical rolling re-enabled 2023-05-12 21:14:41 -05:00
MagicBot ee1fc0d55c Bypass npc guild leaders in override.. 2023-05-12 08:27:00 -04:00
MagicBot 7f086fb850 Improved error logging. 2023-05-12 08:15:25 -04:00
MagicBot fafd77c661 Improved error logging. 2023-05-12 08:09:17 -04:00
MagicBot d99fc602d5 NPC table overrides for contracts. 2023-05-11 09:07:35 -04:00
FatBoy 99a82a6b84 enemy/notenemy aggro rules finalized 2023-05-10 18:33:03 -05:00
FatBoy 60c2405cad mobs now use enemy/notenemy for aggro rules 2023-05-09 21:11:51 -05:00
FatBoy 27a6a1f4d0 guards' sleeping pill wore off 2023-05-09 20:59:49 -05:00
FatBoy 584ad46b75 duplicate zoneMobSet additions fixed 2023-05-09 20:27:24 -05:00
FatBoy f99698feda duplicate zoneMobSet additions fixed 2023-05-09 19:57:34 -05:00
FatBoy b3c7db9214 Merge branch 'magicbox1.5' into feature-guard-patrol 2023-05-09 18:40:04 -05:00
MagicBot 7168813ba5 Tweak to set model logic. 2023-05-09 15:16:24 -04:00
MagicBot 8068082768 Naming logic changed to have a valid guild. 2023-05-08 09:29:11 -04:00
MagicBot 322b88a1f4 Naming logic changed to have a valid guild. 2023-05-08 09:20:56 -04:00
MagicBot f85fb8f224 bugfix in ./remove dev cmd. 2023-05-08 08:18:12 -04:00
FatBoy 76f3d2599b NPCs in buildings show correct spawn times and progress 2023-05-07 19:40:38 -05:00
FatBoy 92a0af8dbb guard minion spawn timer scaling off barracks rank 2023-05-07 17:14:47 -05:00
FatBoy fb2205d700 remove player formn cityoutlaws when they leave 2023-05-07 12:41:31 -05:00
FatBoy 526fe799f6 remove player formn cityoutlaws when they leave 2023-05-07 12:34:01 -05:00
FatBoy 0c9bb0d948 initialize cityOutlaws 2023-05-07 12:20:50 -05:00
FatBoy d6a35a577b mobs use hate value to hot swap targets 2023-05-07 12:15:38 -05:00
FatBoy 508fac6168 mobs use hate value to hot swap targets 2023-05-07 12:06:54 -05:00
FatBoy 7c47ef0550 mobs use hate value to hot swap targets 2023-05-07 12:06:03 -05:00
FatBoy e838bb641b mobs use hate value to hot swap targets 2023-05-07 11:53:00 -05:00
MagicBot e73f4cbe63 Placement bounds of 1.2% city zone size. 2023-05-07 10:55:27 -04:00
MagicBot ffafd44fa7 Siege bounds related bonus code removal. 2023-05-07 10:20:53 -04:00
FatBoy c54aa5f9fc guard aggro rules for hostiles 2023-05-07 08:35:11 -05:00
FatBoy b899708cd5 removed obvious bug in guards dropping aggro 2023-05-07 08:12:42 -05:00
FatBoy 14f98493c7 guard minions no longer respawn while captain is dead 2023-05-07 08:06:15 -05:00
FatBoy c7e470166d guard captain and wall archer spawn times hard set at 450 and 900 respectively 2023-05-07 08:02:52 -05:00
FatBoy db218139b3 scaling respawn timer for guard minions based on barracks rank 2023-05-07 07:58:52 -05:00
MagicBot b73eae787c Rotation portals 2023-05-07 08:13:41 -04:00
FatBoy df842a2209 Merge branch 'magicbox1.5' into feature-guard-patrol 2023-05-06 15:54:45 -05:00
FatBoy 64bde9c197 guard reverse KoS logic 2023-05-06 15:53:35 -05:00
FatBoy 6cf599f6bc guard reverse KoS logic 2023-05-06 14:52:10 -05:00
FatBoy d9adef611d mob movement logic update 2023-05-06 13:03:00 -05:00
FatBoy 9ffc09ac02 mob movement logic update 2023-05-06 12:14:28 -05:00
MagicBot a113295058 Player zone radius now reflects 24.3 at 875. 2023-05-05 08:51:49 -04:00
FatBoy 7e5cef2842 guard patrol point logic 2023-05-03 21:20:30 -05:00
FatBoy 969aeec1c7 guard patrol point logic 2023-05-03 21:19:49 -05:00
FatBoy e66b25f803 update isMoving for mobs still at their bind loc 2023-05-03 21:02:38 -05:00
FatBoy 7f9cc6e010 guard patrol work 2023-05-03 20:38:42 -05:00
FatBoy 964e7a4363 guards will now recall home if they leave city grid and have no players loaded 2023-05-03 19:50:52 -05:00
FatBoy aec0115d9b Added random city grid patrol point for guards with no barracks patrol points assigned 2023-05-03 19:43:58 -05:00
MagicBot 3191c20a8c Captain slot no longer overridden. 2023-05-03 18:31:20 -04:00
MagicBot 2a52f9adef slottest function expanded. 2023-05-03 18:20:47 -04:00
MagicBot c44cddfb92 slottest function expanded. 2023-05-03 18:12:19 -04:00
MagicBot 9649538a56 slottest function expanded. 2023-05-03 18:07:06 -04:00
MagicBot d5ca5993aa slottest function expanded. 2023-05-03 18:06:28 -04:00
MagicBot ce7b203b9c slottest function expanded. 2023-05-03 18:04:42 -04:00
MagicBot 294f8fe02b Override removed edge case handed in db. 2023-05-03 16:17:53 -04:00
MagicBot 21c6695a05 Arty captains hardcoded to slot 4. 2023-05-03 15:44:46 -04:00
MagicBot 6fb30928a1 Bugfix in slottest command. 2023-05-03 14:43:49 -04:00
MagicBot 033c008263 bugfix: bow restriction limited to attacker. 2023-05-03 14:25:30 -04:00
MagicBot 7dcefdf5d7 Contract moved to AbstractCharacter.
Arty tower restricted to a single tower captain.
2023-05-02 15:09:09 -04:00
MagicBot f526bda748 Slot one is reserved on arty towers. 2023-05-02 14:51:02 -04:00
MagicBot 7a3e3b394b Slot two is reserved on arty towers. 2023-05-02 14:44:22 -04:00
MagicBot e488627fcc Slot one is reserved on arty towers. 2023-05-02 14:29:58 -04:00
MagicBot 82aeba3a05 NPC rotations inherit building rotation. 2023-05-02 13:51:31 -04:00
MagicBot c56d5567f2 bugfix in quaternion math. 2023-05-02 13:21:40 -04:00
MagicBot 52160d48c4 Adding building rotation to mobile rotation. 2023-05-02 13:17:34 -04:00
MagicBot ce516f24c0 Contracted Mob/Npc rotation derived from slot position. 2023-05-02 13:08:02 -04:00
MagicBot a3c8241b8d Unused methods removed. 2023-05-02 12:40:51 -04:00
MagicBot 10a6eec3da more Bonus Code removal. 2023-05-02 12:26:34 -04:00
MagicBot 715abf1444 Building Location rotations are now a quaternion. 2023-05-02 09:10:41 -04:00
MagicBot e745c260f0 Positive rotation not negative. 2023-05-02 08:46:43 -04:00
MagicBot b7c2e09b81 Rotation slot location by building rotation. 2023-05-02 08:39:03 -04:00
MagicBot 48172fb220 Rotation slot location by building rotation. 2023-05-02 08:26:43 -04:00
MagicBot 0aabc9a923 Bonus code removal. 2023-05-02 08:13:45 -04:00
MagicBot 44b99a8781 It's w not y. 2023-05-01 15:58:04 -04:00
MagicBot 5d6e43313b slotnpc dev command now supports both mobs and npc's. 2023-05-01 15:23:42 -04:00
MagicBot c1c660fd53 Switching back to ASC for slot ordering. 2023-05-01 14:59:24 -04:00
MagicBot 1582d36222 Switching to desc for slot ordering. 2023-05-01 14:54:02 -04:00
MagicBot 11bcd26027 Loading pirate names before world objects 2023-05-01 14:43:06 -04:00
MagicBot b8eb198b09 Pirate name related code moved to NPCmanager. 2023-05-01 14:28:02 -04:00
MagicBot c0521ba2b7 null check for building owner. 2023-05-01 14:10:09 -04:00
MagicBot 59cd2b0dc1 Bonus code removal. 2023-05-01 13:55:06 -04:00
MagicBot 611e34add2 Merge remote-tracking branch 'origin/char-init-mobwork' into char-init-cleanup 2023-05-01 12:45:05 -04:00
MagicBot 16adeb88ca Merge remote-tracking branch 'origin/magicbox1.5' into char-init-cleanup 2023-05-01 12:43:28 -04:00
FatBoy 566bb8144a were guard contract ID in enum 2023-04-30 17:17:20 -05:00
FatBoy 0b932119b0 guard work 2023-04-30 16:54:39 -05:00
FatBoy 9fefebd4a3 wild mob naes and world NPC names corrected 2023-04-30 16:19:53 -05:00
FatBoy d4e7a6691c removed unused nameOverride variable 2023-04-30 16:12:00 -05:00
FatBoy ad4f9d3540 player placed NPCs now show correct names 2023-04-30 16:09:17 -05:00
FatBoy 6868c9de24 player placed mobiles now show correct names 2023-04-30 16:05:48 -05:00
FatBoy 56a6b9d204 guard minion logic work 2023-04-30 15:04:12 -05:00
FatBoy e52b8e894b guard minion logic work 2023-04-30 14:55:12 -05:00
FatBoy 0bc41323b1 guard minions added to captains parentZone.zoneMobSet 2023-04-30 13:47:15 -05:00
FatBoy 3a7ad74ab6 wall archers no longer spawn with level * 10 2023-04-30 13:35:25 -05:00
FatBoy 7ed0b8a052 wall archers given BehaviourType in initializeMob 2023-04-30 13:03:41 -05:00
FatBoy 718fe56cda drops no longer announce on mob death && config drop rate used for mob equipment drop chance 2023-04-30 12:27:02 -05:00
MagicBot eee949de93 Naming update. 2023-04-30 10:55:16 -04:00
MagicBot b5e2848091 Location serialization matches NPC 2023-04-30 10:20:21 -04:00
MagicBot 1ab8540f73 Location serialization matches NPC 2023-04-30 09:32:34 -04:00
MagicBot c029a881e9 Location serialization matches NPC 2023-04-30 09:23:56 -04:00
MagicBot 334a706af3 Update to info output. 2023-04-30 09:08:03 -04:00
MagicBot 1e208c0881 Update to info output. 2023-04-30 09:02:50 -04:00
MagicBot 61b87cbba7 Merge branch 'char-init-cleanup' of http://repo.magicbane.com/MagicBane/Server into char-init-cleanup 2023-04-30 08:52:39 -04:00
MagicBot d1d6972930 Debug code removed; issue resolved. 2023-04-30 08:51:35 -04:00
MagicBot 72e823744c Some meshes might not have slot locations. 2023-04-30 08:38:59 -04:00
MagicBot 4985005b3e Debug null value. 2023-04-30 08:37:08 -04:00
MagicBot ce8d5f0129 Debug null value. 2023-04-30 08:28:36 -04:00
MagicBot 9c83e6f9d9 Removed name override logic. 2023-04-30 08:18:38 -04:00
MagicBot 21241aa5df One serialization not 3. 2023-04-30 08:02:28 -04:00
MagicBot 54e4f08ea2 One serialization not 3. 2023-04-30 07:57:19 -04:00
MagicBot e18c046ee7 Parent zone required by db handler. 2023-04-30 07:41:11 -04:00
MagicBot 4365fafb77 Tweak to name derivation in constructor 2023-04-29 16:32:12 -04:00
MagicBot a3217f44be Code bloc moved out of constructor. 2023-04-29 16:24:19 -04:00
MagicBot da62046ce0 Unused parm in method interface removed. 2023-04-29 16:21:02 -04:00
MagicBot b9722ec292 more old hireling code removed. 2023-04-29 16:06:05 -04:00
MagicBot cfb4f38d15 Contact npcs/mobs have derived locations. 0x0 in cache data. 2023-04-29 16:02:22 -04:00
MagicBot 48d66a0d42 Integer division fix. Class cleanup. 2023-04-29 15:40:50 -04:00
MagicBot d454878245 BuildingModelBase no longer needed. 2023-04-29 15:15:23 -04:00
MagicBot cace195e18 Logic and comment cleanup. 2023-04-29 14:36:39 -04:00
MagicBot 129aff909c Update; mobile offsets within buildings. 2023-04-29 14:25:36 -04:00
MagicBot 6cfd078469 Removed old methods from codepath. 2023-04-29 14:00:24 -04:00
MagicBot 4acc4192af Initial work on Mobile init refactor. 2023-04-29 13:57:09 -04:00
MagicBot e554171e22 Duplicate region field removed and inlined. 2023-04-29 12:33:21 -04:00
MagicBot de38c8727a Debugging region 2023-04-29 12:14:35 -04:00
MagicBot 0a78958e44 Debugging region 2023-04-29 12:02:37 -04:00
MagicBot 353cd0ab23 Serialization revert. 2023-04-29 11:24:32 -04:00
MagicBot b73c8e9045 Floor and level no longer read from db. 2023-04-29 10:59:13 -04:00
MagicBot 5729492c6a NPC derives position from slot. 2023-04-29 10:30:53 -04:00
MagicBot 0c45e6d36f Serialization update. 2023-04-29 09:53:12 -04:00
MagicBot 677988ea44 Add new npc to world. 2023-04-29 09:35:00 -04:00
MagicBot c30ca2fb1f Comment cleanup. 2023-04-29 09:21:58 -04:00
MagicBot cd9d7f7652 Set bindloc to slot location. 2023-04-29 09:19:22 -04:00
MagicBot 84e24b4951 Set bindloc to slot location. 2023-04-29 09:17:14 -04:00
MagicBot ef367c2981 Array index not 1 2023-04-29 09:07:48 -04:00
MagicBot ec10ac7ba5 Region now set in initNpc 2023-04-29 08:59:29 -04:00
MagicBot 4bbe1db54a Bindloc for non slotted npcs. 2023-04-29 08:58:26 -04:00
MagicBot 3494ae1e6b Bindloc for non slooted npc's. 2023-04-29 08:55:12 -04:00
MagicBot 123f9eb588 SetParentZone removed from NPC. 2023-04-29 08:47:35 -04:00
MagicBot 40e4770425 inBuildingLoc removed. 2023-04-29 08:24:28 -04:00
MagicBot ed0f9daef3 Slotting helper methods added. 2023-04-29 08:17:05 -04:00
MagicBot beb9d5927e Iteration bugfix. 2023-04-29 08:10:59 -04:00
MagicBot 225e55d956 Slots will be derived not stored. 2023-04-29 08:08:45 -04:00
MagicBot 2114d9832f Redundant declaration and assignment. 2023-04-25 09:00:13 -04:00
MagicBot b6b1485841 Removed temp in-building loc due to null. 2023-04-24 17:35:56 -04:00
MagicBot c4f939278a Devcmd now displays inbuilding loc. 2023-04-24 17:29:48 -04:00
MagicBot 195a7e2cea Devcmd now displays inbuilding loc. 2023-04-24 17:28:21 -04:00
MagicBot dc868305f0 Using new db loader. 2023-04-24 17:14:37 -04:00
MagicBot c60a4d8d39 Bugfix for contract-less npc owners. 2023-04-24 17:08:03 -04:00
MagicBot de7e3ba73d Hashmap to add to was added. 2023-04-24 16:49:41 -04:00
MagicBot 4d76014633 Dev cmd to test new system. 2023-04-24 16:41:25 -04:00
MagicBot 320d95ae2f Default value for npc slot. 2023-04-24 16:26:30 -04:00
MagicBot 6d73e12c5c Slot added to stored procedures. 2023-04-24 16:23:13 -04:00
MagicBot 0513cc978e Helper method for slot lookup added. 2023-04-24 16:17:55 -04:00
MagicBot 7c079c3998 Begin refactor location collections. 2023-04-24 15:37:30 -04:00
MagicBot d729fbb287 Captain slot issue in db rectified. 2023-04-24 14:06:17 -04:00
MagicBot 14c98d9376 Blueprint support for OuterWallWithTower 2023-04-24 12:04:39 -04:00
MagicBot 888fa25e9a Blueprint support for OuterWallWithTower 2023-04-24 11:55:29 -04:00
MagicBot 5a0136cd3d Cleanup and bonus code removal. 2023-04-24 09:42:01 -04:00
MagicBot 3419c1ceea Refactored isWallArcher(). 2023-04-24 09:22:01 -04:00
MagicBot 4ae55b9bd8 Removed leftover junk from mobbase. 2023-04-24 03:38:04 -04:00
MagicBot 6b146bfdc4 Removed leftover junk from mobbase. 2023-04-24 03:26:35 -04:00
FatBoy 620fad57fe Mob equipment drops once more, including vorg with proper chance 2023-04-23 22:07:54 -05:00
FatBoy f24605735e renamed "run" in MobileFSM to "DetermineAction" 2023-04-23 20:41:43 -05:00
FatBoy 7e9e0d2c5b MobileFSM cleanup and bonus code removal 2023-04-23 20:38:28 -05:00
FatBoy 1487efc46b Mob.java cleanup 2023-04-23 20:19:17 -05:00
FatBoy 2df4f658c9 Mob.java cleanup 2023-04-23 20:16:30 -05:00
MagicBot 4462e34ca4 mobbase.fsm should never be blank. 2023-04-23 12:03:46 -04:00
MagicBot 4adfbc0723 Refactored to static methods. 2023-04-23 11:19:34 -04:00
MagicBot c0e92bddc2 Level override removed. 2023-04-23 10:40:19 -04:00
MagicBot 40b7546946 More useful error information. 2023-04-23 10:27:04 -04:00
MagicBot 59e3938a72 Removed unused method. 2023-04-23 10:01:18 -04:00
MagicBot 513c254479 Correction in column name. 2023-04-23 09:45:03 -04:00
MagicBot df7b23c0de Extra override removed from constructor. 2023-04-23 09:38:49 -04:00
MagicBot edd1c0e9a6 Name/level saved to disk when slotting mobiles. 2023-04-23 09:30:29 -04:00
MagicBot 0a783f7561 pirateName and Rank added to CreateMob interface. 2023-04-23 08:51:49 -04:00
MagicBot 235ea84dcd Value is not unknown from handler context. 2023-04-23 07:48:10 -04:00
FatBoy 3e005c3a51 NPC have names and contract names 2023-04-22 23:20:24 -05:00
FatBoy 88e09c479f wall archers no longer spawn minions 2023-04-22 23:12:45 -05:00
FatBoy 83eab27a90 proper NPC names in asset management window 2023-04-22 22:44:13 -05:00
FatBoy c02c5750c6 proper contract names in asset management window 2023-04-22 22:10:06 -05:00
FatBoy 09d7ff0740 make wall archers great again 2023-04-22 21:55:06 -05:00
FatBoy ed1a6192c7 enemy/notEnemy fix for mobs 2023-04-22 18:24:43 -05:00
FatBoy ae968211ab none to enum MonsterType 2023-04-22 18:13:29 -05:00
FatBoy a3170bfb4b test code for notEnemy 2023-04-22 18:08:40 -05:00
FatBoy 344c5900b8 added none check to enemy and notEnemy in mobbase 2023-04-22 17:52:55 -05:00
FatBoy 1d74643fe3 None added to enum MonsterType 2023-04-22 17:49:26 -05:00
FatBoy 38e5081b0e moved createSiegeMob and createGuardMob to the Mob class 2023-04-22 17:16:34 -05:00
MagicBot 8fa20c6f93 Cleanup in mob class. 2023-04-22 07:52:05 -04:00
FatBoy 45ab68caa4 trebuchets now have pet AI with canRoam disabled 2023-04-21 20:12:49 -05:00
FatBoy 3329d61636 fixed error in initialize mob 2023-04-21 18:23:52 -05:00
FatBoy 5299da784a mob respawn fix actual 2023-04-21 15:17:37 -05:00
FatBoy e5b7bd1fa6 mob respawn fix 2023-04-21 12:56:09 -05:00
FatBoy 881907c53a AggroWanderer and Wandered state updates 2023-04-21 10:47:49 -05:00
FatBoy 6a03b58aa6 pet AI logic 2023-04-21 10:44:19 -05:00
FatBoy e38be1e18f pet movement logic 2023-04-21 10:20:38 -05:00
FatBoy 1ff42b775c added hamlet guard logic 2023-04-21 10:02:09 -05:00
FatBoy cfe8d20d2b added barracks list to city object 2023-04-20 21:23:42 -05:00
FatBoy aa8f59f6f7 wall archer debugging 2023-04-19 19:05:24 -05:00
FatBoy f3b6f5595b logic for wall archers fix 2023-04-18 20:54:53 -05:00
FatBoy 0448448263 logic for wall archers 2023-04-18 20:52:33 -05:00
FatBoy 0914580bea Gave Wall Archers mob AI 2023-04-18 20:47:49 -05:00
FatBoy 914575a360 guard minion spawning work 2023-04-17 21:48:31 -05:00
FatBoy 259025d572 guard recall off city grid 2023-04-17 21:31:56 -05:00
FatBoy aa3c70ae31 guard minions AI 2023-04-17 20:51:34 -05:00
FatBoy 2f4b675a2c added mob fsm data to mob 2023-04-17 19:15:08 -05:00
MagicBot 662d1d2b85 Enum moved to Enum.
Updated logic in rs constructor to handle blanks properly.
2023-04-17 07:20:39 -04:00
FatBoy 6e92836deb GuardCaptain aggro rules 2023-04-16 21:48:21 -05:00
FatBoy b1bd09bfc4 GuardCaptain flag in run after load 2023-04-16 20:52:37 -05:00
FatBoy 7e08a3d8ab GuardCaptain flag when slotting in barracks 2023-04-16 20:44:28 -05:00
FatBoy cb5c2c668a load guard in barracks 2023-04-16 20:36:51 -05:00
FatBoy c93f932caa fixed spelling error in MObBehaviourType enum 2023-04-16 19:59:13 -05:00
FatBoy f855ec9a19 fsm lookup changes 2023-04-16 19:50:59 -05:00
FatBoy 6817c3dffe moved fsm lookup to runAfterLoad 2023-04-16 19:45:55 -05:00
FatBoy c17f745461 moved fsm lookup to runAfterLoad 2023-04-16 19:45:17 -05:00
FatBoy 664b5fea73 logger addition for mob 2023-04-16 19:40:33 -05:00
FatBoy 3c118ed88b unecessary try removal 2023-04-16 19:29:14 -05:00
FatBoy 1d965c0785 remove test code, added guard captain and minion behaviour flags 2023-04-16 19:27:18 -05:00
FatBoy 37ccfaa509 Merge remote-tracking branch 'origin/magicbox1.5' into new-mob-behaviour 2023-04-16 19:16:05 -05:00
FatBoy eb20d926e3 guard aggro logic 2023-04-16 18:58:55 -05:00
FatBoy 0ee7507467 new chase logic for mobs 2023-04-16 13:30:46 -05:00
FatBoy c1bba30dec cleanup old patrol code 2023-04-16 13:24:22 -05:00
FatBoy db0e9d1847 add random 10-15 delay between patrolling for mobs 2023-04-16 13:23:42 -05:00
FatBoy ef74d1ae8c init. patrol points list 2023-04-16 13:07:28 -05:00
FatBoy 0779fbab87 implement new patrol system 2023-04-16 13:03:42 -05:00
FatBoy 028135f859 new mob patrolling system 2023-04-16 12:48:23 -05:00
FatBoy cfa59d8012 pet AI implemented 2023-04-15 22:04:55 -05:00
FatBoy ca40d7a71d added ./aiinfo command for debugging new AI system 2023-04-15 20:53:47 -05:00
FatBoy ccd6032c15 added ./aiinfo command for debugging new AI system 2023-04-15 20:36:56 -05:00
FatBoy ecec3833c4 added ./aiinfo command for debugging new AI system 2023-04-15 20:31:13 -05:00
FatBoy 98eb557c58 added none to behaviour type for mobs and defuated RS constructor for mobs 2023-04-15 20:03:17 -05:00
FatBoy f75323e7e2 LootManager cleanup + say message for mobs calling for help 2023-04-15 12:21:31 -05:00
FatBoy c8c275bcd5 added equip dropping on mobs to LootManager 2023-04-15 11:52:19 -05:00
FatBoy ca9a72e338 cleaned up testing code 2023-04-14 20:53:21 -05:00
FatBoy aaff8e7d6b cleaned up some aggro rules 2023-04-14 20:50:47 -05:00
FatBoy f9205eb4e2 added default behaviourType to "Simple" for mobs. added respawn logic 2023-04-14 19:20:12 -05:00
MagicBot de3818aef6 Equip lookups now use bootymap 2023-04-14 18:19:43 -04:00
MagicBot 5d0166a29a EquipmentSets merged into bootySet system. 2023-04-14 16:46:10 -04:00
FatBoy 98f0928a4b replaced MobileFSM.STATE with MobileFSM.MobBehaviourTypes 2023-04-11 19:53:13 -05:00
MagicBot 23a07175e5 Single map color stored as hex string. 2023-04-10 13:27:27 -04:00
MagicBot beff5c3e06 Refactored aggro system to use Monstertype. 2023-04-09 18:16:36 -04:00
MagicBot 6b62c90bc8 NONE is not needed for a BitSet. 0 is just empty. 2023-04-09 14:06:57 -04:00
MagicBot ef6bb65e73 NONE is not needed for a BitSet. 0 is just empty. 2023-04-09 14:06:03 -04:00
MagicBot 6f82ee24d9 MonsterType fields added to ./info 2023-04-09 13:58:29 -04:00
MagicBot 97165bbdfe Aggro fields combined in RunAfterLoad 2023-04-09 13:55:46 -04:00
MagicBot 30175be56a MonsterTypes loaded into Mob. 2023-04-09 13:43:12 -04:00
MagicBot 4fe6040707 enemy/notEnemy bitvectors loaded into mobbase. 2023-04-09 13:31:42 -04:00
MagicBot aaa67ec635 new MonsterType bitvector added. 2023-04-09 13:20:03 -04:00
FatBoy 93f6d0be0b new loot system completed 2023-04-08 21:49:17 -05:00
FatBoy fe953aa8c4 simulatebooty command added data output 2023-04-08 18:05:46 -05:00
FatBoy 902376b517 simulatebooty command added data output 2023-04-08 17:54:53 -05:00
FatBoy e56c534d2b simulatebooty command added data output 2023-04-08 17:20:57 -05:00
FatBoy 74fe401ff1 revert simulatebooty command 2023-04-08 17:18:35 -05:00
FatBoy 862230008e revert simulatebooty command 2023-04-08 17:15:34 -05:00
FatBoy 93cd329f20 simulate booty command work 2023-04-08 15:33:51 -05:00
FatBoy c550360a43 simulate booty command work 2023-04-08 15:25:45 -05:00
FatBoy 2e3c9e703b added parameter to simulateBooty command to simulate mob or zone booty and added custom iteraion input 2023-04-08 14:53:56 -05:00
FatBoy dffc16f5ce mob roll range formula 2023-04-08 14:19:47 -05:00
MagicBot f47eb63057 Merge remote-tracking branch 'origin/magicbox1.5' into new-booty-system 2023-04-08 10:48:13 -04:00
MagicBot 9d6b3ab3ff Merge remote-tracking branch 'origin/bugfix-runesandbooties' into magicbox1.5 2023-04-08 06:26:39 -04:00
FatBoy b18994a7c0 simulate booty command work 2023-04-07 22:04:39 -05:00
FatBoy e483280a3c simulate booty command work 2023-04-07 21:41:03 -05:00
FatBoy 0bb3c84fed enable simulateBooty command 2023-04-07 19:50:49 -05:00
FatBoy 2eb9705c3a added simulatbooty command for debugging loot 2023-04-07 19:36:51 -05:00
FatBoy ec37e1f9f9 drop chance work 2023-04-07 18:43:45 -05:00
FatBoy b4002fa1a5 added resources to drop tables 2023-04-07 15:41:40 -05:00
FatBoy a7dccb6301 chase null pointer 2023-04-07 14:48:15 -05:00
FatBoy 2827db5db5 prefix/suffix usage for mob loot 2023-04-07 13:56:28 -05:00
FatBoy 460a2152c8 MobLoot usage 2023-04-07 13:38:09 -05:00
FatBoy 5edbc81934 MobLoot usage 2023-04-07 13:09:15 -05:00
FatBoy 335484944f variable naming convention 2023-04-07 12:22:33 -05:00
FatBoy 8b6bc38082 error tracking 2023-04-07 12:05:01 -05:00
FatBoy b51843942b error tracking 2023-04-07 11:36:52 -05:00
FatBoy a0310b6767 added case staement for "ITEM" 2023-04-07 11:32:53 -05:00
FatBoy 2b90679087 new booty system update 2023-04-07 11:22:14 -05:00
FatBoy d951eb4b38 cleanup 2023-04-06 21:06:23 -05:00
FatBoy 847c8bc08f loot system debugging 2023-04-06 20:35:03 -05:00
FatBoy 5efb5d0d4b remove old loot system 2023-04-06 20:28:47 -05:00
FatBoy 0d7620900b loot system implementation 2023-04-06 20:18:31 -05:00
FatBoy dfd0d7e668 new loot system 2023-04-06 20:10:42 -05:00
FatBoy 1be669aa66 Merge branch 'bugfix-runesandbooties' into new-booty-system
# Conflicts:
#	src/engine/objects/MobBase.java
2023-04-06 20:08:29 -05:00
FatBoy 95352e778d place holder 2023-04-06 20:07:24 -05:00
MagicBot 88bf38b858 Mobbase updated with new booty and fsm fields. 2023-04-06 20:58:13 -04:00
FatBoy 16fb40e104 Merge remote-tracking branch 'origin/magicbox1.5' into new-booty-system 2023-04-06 19:41:19 -05:00
MagicBot d0279599f6 BootySets expanded to handle rune booty. 2023-04-06 18:08:01 -04:00
FatBoy bfb6b0f5eb ./info now shows building information not just region 2023-04-06 09:44:34 -05:00
FatBoy 3f8d772f8f treb troubleshooting 2023-04-05 20:29:34 -05:00
FatBoy 07e993b0ba NPC and mob regions for real this time 2023-04-05 20:06:28 -05:00
FatBoy 1169f44041 NPC and mob regions 2023-04-05 20:04:04 -05:00
MagicBot 563fe8684a Workaround for mob region issue. 2023-04-05 20:20:23 -04:00
MagicBot a85391e5a4 Workaround for mob region issue. 2023-04-05 19:49:20 -04:00
MagicBot fc6f400e09 Corner trebs go into slot 1. 2023-04-05 18:32:03 -04:00
MagicBot 55fc6a68e1 Corner trebs go into slot 1. 2023-04-05 18:06:50 -04:00
MagicBot e1811c7bfc Corner trebs go into slot 1. 2023-04-05 17:41:11 -04:00
MagicBot bccbb1d8b7 Mobs are not hirelings but minions in this context. 2023-04-05 17:06:08 -04:00
MagicBot 2b214f8934 Bugfix in string output. 2023-04-04 18:14:54 -04:00
MagicBot 6a5f0596e0 Unused variable removed. 2023-04-04 18:11:07 -04:00
MagicBot 8f87bc5ca0 Bugfix in info dealing with mob flags on npcs. 2023-04-04 18:06:32 -04:00
MagicBot a0e63cde8f Bugfix in info dealing with mob flags on npcs. 2023-04-04 17:52:26 -04:00
MagicBot 94e3a594ec Mobbases can have empty mobflag values. 2023-04-04 17:38:52 -04:00
MagicBot bbf0709643 Mobbases can have empty mobflag values. 2023-04-04 17:30:56 -04:00
MagicBot 4492a93df4 Clarity in naming. 2023-04-04 16:26:47 -04:00
MagicBot 65e7566d0f More slotting work. 2023-04-04 15:36:56 -04:00
MagicBot 1c496b3c98 More slotting work. 2023-04-04 15:13:18 -04:00
MagicBot ee115a473d Exclude not include noId npc's. 2023-04-04 14:57:07 -04:00
MagicBot 5a4559d7b2 ContractID for captain is 850 not 650. 2023-04-04 14:47:23 -04:00
MagicBot 3b69c8c267 Tower captains don't use slot 1. 2023-04-04 14:41:01 -04:00
MagicBot 14c4443f20 loadID is needed; different mob. 2023-04-04 13:56:34 -04:00
MagicBot a01a342fd8 Affirmatively check hireling entry instead of relying upon loadID =0 which was a side effect. 2023-04-04 13:48:56 -04:00
MagicBot 1cb103c156 Slots are slots; blueprint logic not needed on back-end. 2023-04-04 11:08:07 -04:00
MagicBot 84bae3141c Slots are slots; blueprint logic not needed on back-end. 2023-04-04 10:48:17 -04:00
MagicBot 307f52866d Merge remote-tracking branch 'origin/bugfix-runesandbooties' into magicbox1.5 2023-04-04 10:33:18 -04:00
MagicBot 7ef338be1d Bugfix in slotting blueprint buildings 2023-04-04 10:31:59 -04:00
MagicBot 385b89e6ba Two layered continent support. 2023-04-03 15:56:36 -04:00
MagicBot 41a53d1205 Merge remote-tracking branch 'origin/bugfix-runesandbooties' into magicbox1.5 2023-04-03 12:30:49 -04:00
MagicBot a85bbde9d2 Mobbase runes no longer needed. 2023-04-03 06:27:29 -04:00
FatBoy 13d83c0003 NPC guards no longer attack players 2023-04-02 15:51:39 -05:00
MagicBot f21e51f74a Optimized imports (getting close to release) 2023-03-31 10:08:44 -04:00
MagicBot 045840ec54 Last vestige of FidalityID garbage and raw cache files removed. 2023-03-31 10:05:13 -04:00
MagicBot 4e1455be7f Hunt for more fidality insanity. 2023-03-31 10:01:59 -04:00
MagicBot 3881c2b1d0 Relevant methods made static and moved into NPCManager 2023-03-31 09:59:49 -04:00
MagicBot bbdbead1ff Fidaltiy garbage removed from NPC class. 2023-03-31 09:17:15 -04:00
MagicBot 24b6820a1b Fidaltiy garbage removed from NPC class. 2023-03-31 09:15:52 -04:00
MagicBot 2b307daeb2 MobileBooty system integrated. 2023-03-31 09:09:57 -04:00
MagicBot fb15ee912b Clarity fix in instance variable ordering. 2023-03-31 08:01:14 -04:00
MagicBot 3b7c516975 Merge remote-tracking branch 'origin/post-wipe-merge' into bugfix-runesandbooties 2023-03-30 20:56:42 -04:00
FatBoy 33603958b1 fixed hotzone drop tables never being used 2023-03-30 19:44:44 -05:00
MagicBot f669be18b3 Unused MobRaceType enum removed. 2023-03-30 11:51:59 -04:00
MagicBot dcae131b67 Removed Fidality garbage. Fixed mobs in buildings. 2023-03-30 11:07:57 -04:00
MagicBot f5d5dce791 Revert "Fidality borking mobs in buildings unborked."
This reverts commit 2befa063ef.
2023-03-30 10:34:15 -04:00
MagicBot 5a0910eb5c Revert "Fidelity > Fidality"
This reverts commit f4da8544d3.
2023-03-30 10:32:08 -04:00
MagicBot 2befa063ef Fidality borking mobs in buildings unborked. 2023-03-30 10:28:46 -04:00
MagicBot f4da8544d3 Fidelity > Fidality 2023-03-30 10:14:40 -04:00
MagicBot 60a9f14aa3 Mobbases don't need skills. 2023-03-29 18:52:36 -04:00
MagicBot 39b07df2e2 Sanity check for race rune not in runebase. 2023-03-29 17:57:37 -04:00
MagicBot 5f6883059f Cleanup rune effect application. 2023-03-29 15:42:32 -04:00
MagicBot 6b2790f9c1 Mobs have runes loaded at bootstrap and effects applied. Moved logic to NPCManager. 2023-03-29 08:05:34 -04:00
MagicBot 73d2129394 Runes and Booties ID set in constructor for mobs and npcs. 2023-03-28 18:34:42 -04:00
MagicBot 8e236d0780 BootySets generated with cache data loaded at bootstrap. 2023-03-28 18:01:46 -04:00
MagicBot 00d0048fd0 RuneSets generated loaded at bootstrap. 2023-03-28 17:45:58 -04:00
MagicBot f744c64737 Superfluous getter and setters removed. 2023-03-28 17:29:16 -04:00
MagicBot 33334ed13c NPCManager class created. 2023-03-28 17:22:57 -04:00
MagicBot 2e64164251 Bonus code removal. 2023-03-23 06:00:53 -04:00
MagicBot 03060478ee Helper method for finding next heightmap. 2023-03-22 05:41:39 -04:00
MagicBot 94b863a835 Rework of ismacro and iscontinent. 2023-03-21 03:20:57 -04:00
MagicBot ab14173aaa Account for vorringia parenting. 2023-03-21 03:09:39 -04:00
MagicBot eb5e09c3f4 Merge remote-tracking branch 'origin/bugfix-magic-numbers' into post-wipe-merge 2023-03-20 11:20:42 -04:00
MagicBot 1142676c87 Milliseconds are easier to interpret than fractions. 2023-03-16 13:00:22 -04:00
MagicBot 76af946b5f Duration string output. 2023-03-16 12:53:16 -04:00
MagicBot b6b9d7635f Using miliseconds. 2023-03-16 12:48:36 -04:00
MagicBot 68ae4604b0 Added max values to metrics. 2023-03-16 12:40:08 -04:00
MagicBot c06da74eec Nanosecond display. 2023-03-16 12:27:50 -04:00
MagicBot a4029fb6e2 Updated simulation metrics access. 2023-03-16 12:18:42 -04:00
MagicBot 3dbdad2580 Reverted changes. 2023-03-16 11:48:54 -04:00
FatBoy 626967cd86 revert 2023-03-15 18:27:13 -05:00
FatBoy 113d74cffe method to check if zone has players inside it
mob ai check if zone has no players mobs need not perform actions
2023-03-15 17:17:22 -05:00
FatBoy db71635f16 delay between mob actions to reduce synchronized appearance 2023-03-15 13:46:58 -05:00
MagicBot 177175cc1d Conditionals simplified and comment added to method. 2023-03-15 11:59:41 -04:00
MagicBot 5ddc40db3b Comment cleanup in method. 2023-03-15 11:51:28 -04:00
MagicBot 0039785a5a Comment cleanup in method. 2023-03-15 11:47:27 -04:00
MagicBot 867fdee328 Added sanity check for empty power list. 2023-03-15 10:11:01 -04:00
MagicBot f8d499f314 Fixed Concurrent Modification issue. 2023-03-15 09:39:17 -04:00
MagicBot 1945412f5a Remove needs an object not an index value. 2023-03-15 09:25:18 -04:00
MagicBot 16db4d15bc Reformatting of MobCast() method in manager. 2023-03-15 08:52:00 -04:00
MagicBot f97d9844f9 Merge branch 'new-mob-ai' of http://repo.magicbane.com/MagicBane/Server into new-mob-ai
 Conflicts:
	src/engine/ai/MobileFSM.java
2023-03-15 08:49:33 -04:00
MagicBot 7473067329 Reformatting of MobCast() method in manager. 2023-03-15 08:47:22 -04:00
FatBoy 6fe690d592 ranged mobs now stop when in proper attacking range 2023-03-14 20:53:39 -05:00
FatBoy ce381f612c mob ai Chase state completion 2023-03-14 20:34:07 -05:00
FatBoy 8c919bcd2a mob ai Chase state work 2023-03-14 20:04:05 -05:00
FatBoy 531cd52664 mob ai Chase state work 2023-03-14 18:39:59 -05:00
FatBoy dcac0634a8 added Chase to mob ai state enum 2023-03-14 13:32:41 -05:00
MagicBot e7ceeac7b8 Magic numbers are for mental patients. 2023-03-14 13:10:05 -04:00
MagicBot bbbf0c4160 Magic numbers are for mental patients. 2023-03-14 12:59:50 -04:00
MagicBot 584fde5579 Reworked the loading of Mobile powers at bootstrap. 2023-03-13 19:26:16 -04:00
MagicBot 66f0c12790 Reworked the loading of Mobile powers at bootstrap. 2023-03-13 19:19:03 -04:00
FatBoy b310a3eb63 initialize new mobpower list 2023-03-12 18:18:13 -05:00
FatBoy 03a2ead922 mob power list troubleshooting 2023-03-12 18:09:42 -05:00
FatBoy 4f60811f6b mob power list troubleshooting 2023-03-12 18:02:24 -05:00
FatBoy ec19f18d73 mob power list troubleshooting 2023-03-12 17:59:18 -05:00
FatBoy f0eb19c255 mob power list troubleshooting 2023-03-12 17:54:03 -05:00
FatBoy 604a86feb0 mob powerlist initialize directly after mobbases are loaded 2023-03-12 17:49:29 -05:00
FatBoy 3e2fbb700b initialize the static mob power list 2023-03-12 10:53:12 -05:00
FatBoy 863c782f72 moved mob powers list call above mob spawning 2023-03-12 10:50:50 -05:00
FatBoy 83eb1a3370 moved mob powers method to PowersManager 2023-03-12 10:36:38 -05:00
FatBoy 4a06f18d55 Merge remote-tracking branch 'origin/post-wipe-merge' into new-mob-ai 2023-03-12 10:29:00 -05:00
FatBoy e38a04bf23 convert DB lookup of mob powers to static Hashmap lookup 2023-03-12 10:17:25 -05:00
FatBoy 095aee57bc mob spell casting cleanup 2023-03-02 21:51:31 -06:00
FatBoy b000c9b60f generic range method added, mob spell casting cleanup 2023-03-02 21:46:02 -06:00
FatBoy e3f675a42b call for help range added (aggro range of caller) 2023-03-02 19:52:17 -06:00
FatBoy 93a91f9d41 fixed null exception in aggro 2023-03-02 19:11:51 -06:00
FatBoy 6da0df7eb7 duel wield attack system for mobs 2023-03-02 18:46:43 -06:00
MagicBot 0ce94360f7 Magicbox channel support added. 2023-03-02 08:06:17 -05:00
MagicBot 110a05d5a4 bugfix-merge issue in constructor. 2023-03-01 16:12:17 -05:00
FatBoy cfd93f2ca0 cleanup 2023-03-01 13:31:35 -06:00
FatBoy 5830a9ef82 damage calculations cleanup 2023-03-01 13:29:49 -06:00
FatBoy ea4862f76e r8 mobs now have their own mele attack parameters 2023-02-28 19:06:57 -06:00
MagicBot 7d655bc44b Mine serialized loc is the tower loc. No need to store offsets in a table to reconstruct this loc. 2023-02-28 10:43:49 -05:00
FatBoy bfa15ddee0 mob will always target self with "self target" flagged spells 2023-02-27 20:37:11 -06:00
FatBoy 028c49ac84 mob no longer cast spells with effect already on target 2023-02-27 20:22:59 -06:00
FatBoy 396e3dda28 comment 2023-02-27 18:59:08 -06:00
FatBoy e640a5064c Merge remote-tracking branch 'origin/post-wipe-merge' into new-mob-ai 2023-02-27 18:53:49 -06:00
MagicBot f0f91325ba Reset is handled when picking new hotZone. 2023-02-26 07:31:26 -05:00
MagicBot d5c219897d Experience Modifiers added to ConfigManager 2023-02-24 10:45:46 -05:00
MagicBot c51f6b73af ProductionRate added to ConfigManager. 2023-02-24 09:48:15 -05:00
MagicBot cacf67a81c lastUpdate always from top of the hour. 2023-02-24 09:08:45 -05:00
MagicBot 72a610fd0c Seconds remaining calculated only once. 2023-02-24 09:05:47 -05:00
MagicBot bbbd5f8996 Time remaining is from now(). 2023-02-24 08:48:36 -05:00
MagicBot 994db1e131 Class renamed to fix case. 2023-02-24 08:45:03 -05:00
MagicBot 4422182eae Reset logic moved to within method. 2023-02-24 08:34:25 -05:00
MagicBot 7a2c0d3456 Work variable cleanup. 2023-02-24 01:26:39 -05:00
MagicBot 8fde121570 lastHotZoneUpdate instant moved to ZoneManager. 2023-02-24 01:22:00 -05:00
MagicBot 3260582e37 validHotZone filters hotZone count. 2023-02-24 01:04:29 -05:00
MagicBot 52e46380a9 Available hotZones added to devcmd. 2023-02-24 00:49:03 -05:00
MagicBot a572a5fbf9 Available hotZones added to devcmd. 2023-02-24 00:42:34 -05:00
MagicBot 176fdb51da HotZone availability reset at 01am. 2023-02-24 00:32:18 -05:00
MagicBot 6a948fbe2e lastChanged is unused as cannot omit mines from map. 2023-02-24 00:09:57 -05:00
MagicBot 2ef60933b2 reset added to ./hotzone 2023-02-23 17:47:22 -05:00
MagicBot 85798822cc Force serialize mines. 2023-02-23 17:37:14 -05:00
MagicBot 0dad677bc0 hotzone dev command updated. 2023-02-23 17:14:34 -05:00
MagicBot 4c625cdfbf HotZone minLevel enforced. 2023-02-23 16:46:55 -05:00
MagicBot 6912a06351 MB_HOTZONE_MIN_LEVEL added to ConfigManager 2023-02-23 16:38:23 -05:00
MagicBot 2e576b3065 Increment only when a hotZone is set. 2023-02-22 17:35:30 -05:00
MagicBot dc23755081 Use of Instant to track hotzone refresh times. 2023-02-22 17:25:48 -05:00
MagicBot 8ae973f5f4 Refactored usage of HotZone; added cycle counter. 2023-02-22 16:40:11 -05:00
MagicBot 6ac1911770 Code cleanup; reworked conditional. 2023-02-22 08:38:18 -05:00
MagicBot f723e35785 Reformatted file. 2023-02-22 08:34:10 -05:00
MagicBot 4db45a9cbf Handler created for cityDataMsg.java 2023-02-22 08:23:13 -05:00
MagicBot d9125566f7 Drop rates are set by ConfigManager 2023-02-19 08:39:28 -05:00
MagicBot 70ca0a1df3 Refactored caching of drop rates. Whittling away at MBServerStatics. 2023-02-19 08:25:58 -05:00
MagicBot 3fd2f519eb Merge remote-tracking branch 'origin/post-wipe-merge' into bugfix-config-manager 2023-02-19 07:53:03 -05:00
MagicBot 5af1687f19 Maintenance hour and bot/game version config entries removed. 2023-02-19 07:48:50 -05:00
FatBoy 10cd3636f7 hotzone cleanup 2023-02-18 15:04:34 -06:00
FatBoy 38e25bf132 hotzone duration config, non repeating hotzones 2023-02-18 14:30:15 -06:00
FatBoy ffe0ecd488 name change 2023-02-18 14:02:35 -06:00
FatBoy 61df76c80a mines default to not be claimed at hour 1400 2023-02-18 13:58:49 -06:00
FatBoy 82249a6d6d drop rates calculated via magicbane.conf on server boot 2023-02-18 13:53:27 -06:00
FatBoy ecaf56f647 maintenance to run on specific day of week only 2023-02-18 10:54:11 -06:00
MagicBot 8dc647fb4f Bugfix: empty guild not errant 2023-02-18 09:30:39 -05:00
MagicBot 7b16c55dc6 Teleport to the target gate. 2023-02-15 13:49:34 -05:00
MagicBot f1a652122c Portals configured in the runegate constructor. 2023-02-15 13:38:13 -05:00
MagicBot 1e0738594a More than one row in result set is needed. 2023-02-15 13:10:08 -05:00
MagicBot eac2e3f42b Portal array list now filled at bootstrap. 2023-02-15 12:29:38 -05:00
MagicBot 2c0a46e652 Runegates and portals now loaded from database. 2023-02-15 12:12:30 -05:00
MagicBot 9fa83fc359 PortalType defined to supply offset and effect bitflag for Runegates. 2023-02-15 09:18:02 -05:00
MagicBot 97948caa48 Merge remote-tracking branch 'origin/post-wipe-merge' into feature-db-agnostic-realms 2023-02-11 14:15:31 -05:00
MagicBot 9ff4d7c6dc bugfix: Prior claims are no longer released when claiming a new mine. 2023-02-11 13:29:12 -05:00
MagicBot cbe82bb95a Output cleanup in ./realminfo. 2023-02-11 07:11:00 -05:00
MagicBot 6ad4d87487 Merge remote-tracking branch 'origin/post-wipe-merge' into feature-db-agnostic-realms 2023-02-10 08:56:37 -05:00
MagicBot 6c138a1515 Bugfix: effects without associated powers on login. 2023-02-10 08:49:24 -05:00
FatBoy b8be399df7 mob AI testing 2023-02-08 20:37:31 -06:00
FatBoy 2462cc13dd guard static power load correct placement 2023-02-08 20:09:56 -06:00
FatBoy eddedbee5b guard static power load 2023-02-08 19:39:52 -06:00
FatBoy 58c4ece887 10 second delay min between casts & mobs no longer cast beneficial spells on players 2023-02-08 19:38:35 -06:00
MagicBot f64c059f26 Color map built after realms loaded. 2023-02-08 09:27:46 -05:00
MagicBot 5cfb451041 Realms refactored to pull map color from database not hardcoded enum. 2023-02-08 09:09:54 -05:00
FatBoy 8e457abe6d mage guards once again have powers 2023-02-07 21:41:48 -06:00
FatBoy d837af7c33 static powers update 2023-02-07 20:57:56 -06:00
MagicBot abd8697d56 Testing realm renumbering 2023-02-07 11:13:55 -05:00
FatBoy 77b3213e79 spire effects extend to siege bounds 2023-02-04 21:44:16 -06:00
FatBoy 7817b4cd49 destroyed BoW no longer count towards total available assets 2023-02-04 21:43:53 -06:00
FatBoy ce02a1ea65 mob mele damage formula update 2023-02-04 21:26:04 -06:00
FatBoy 15580f478f mob casting logic upgrade 2023-02-02 20:34:25 -06:00
FatBoy b2ad7e0478 mob casting logic upgrade 2023-02-02 19:44:23 -06:00
FatBoy 642cb3fdcf Durability cleanup 2023-01-31 08:34:45 -05:00
MagicBot a0b805698e Merge remote-tracking branch 'origin/bugfix-armorpiercing' into post-wipe-merge 2023-01-31 07:56:30 -05:00
MagicBot 879516632b Merge remote-tracking branch 'origin/bugfix-durability-enchantments' into post-wipe-merge 2023-01-31 07:56:20 -05:00
FatBoy 8e692ea21e Durability repair fix 2023-01-29 19:06:54 -06:00
FatBoy 727309a706 finalized cleanup 2023-01-29 15:10:37 -06:00
FatBoy c0e3fcffd1 finalized cleanup 2023-01-28 18:06:51 -06:00
FatBoy 61bdda7886 combat to include armor piercing calculation 2023-01-28 17:57:40 -06:00
FatBoy 50c2972f99 server now accounts for durabilty enchants 2023-01-28 15:36:10 -06:00
FatBoy f98eaa4d6b fixed boon stat application 2023-01-28 12:11:24 -06:00
FatBoy cf801ed7f6 added check for double mines 2023-01-28 10:50:44 -06:00
FatBoy b2fd5990af added check for double mines 2023-01-27 00:02:05 -06:00
MagicBot ab8ee542c6 Hotpatch for shroudbourne hot issue. 2023-01-22 23:52:16 -05:00
MagicBot 3cf6f28d83 Only returning inactive mines in list. 2023-01-21 14:59:37 -05:00
MagicBot e31f320b45 Comment and clarity cleanup. 2023-01-21 12:52:52 -05:00
MagicBot fa0cfa5191 More context in method names. 2023-01-21 12:27:33 -05:00
MagicBot d425050387 Resetting tracking variables when a mine tower is destroyed. 2023-01-21 11:58:08 -05:00
MagicBot 39f3e4ed2c Mine window methods moved to HourlyJobThread and made static. 2023-01-21 11:11:34 -05:00
MagicBot 1ed51c8e02 Lambda syntax sugar 2023-01-21 10:54:51 -05:00
MagicBot 663aafb4c8 Removed leftover code from message pump. 2023-01-21 10:13:00 -05:00
MagicBot b90b8ca422 Protocol handler created for ArcMineChangeProductionMsg. 2023-01-21 10:11:28 -05:00
MagicBot 0e3fdcd8c2 Audit class moved to correct package. 2023-01-21 10:04:34 -05:00
MagicBot 36cb532b20 Handler created for ArcOwnedMinesListHandler. 2023-01-21 09:47:53 -05:00
MagicBot 3cec1b4466 Class cleanup. 2023-01-21 09:39:53 -05:00
MagicBot 825f41e469 rename method to isEmptyGuild() so as not to confuse with GuildState. 2023-01-21 09:28:30 -05:00
MagicBot 2fac480117 Shrines now decay at midnight not every reboot. 2023-01-21 08:53:57 -05:00
MagicBot 2c3aa6e7e5 Cleanup of restriction logic. 2023-01-21 08:42:43 -05:00
MagicBot 78f7503558 Changing your WOO outside the NA window is allowed. 2023-01-21 08:28:16 -05:00
MagicBot 6a1b461735 Refactor WOO change timer mechanics to use the same system as the mine claims. Moved both resets to the hourly job. 2023-01-21 08:18:40 -05:00
MagicBot de41702914 Protocol handler created for ArcMineWindowAvailableTimeMsg. 2023-01-21 07:24:50 -05:00
MagicBot 21cf22f4cf Sanity check added for slider. 2023-01-20 14:28:29 -05:00
MagicBot 7539505956 Mine claims released upon death. 2023-01-20 13:54:36 -05:00
MagicBot c6e0680583 Mine claims released when leaving world. 2023-01-20 13:45:46 -05:00
MagicBot 4a946b6b3a Mine claims released when leaving guild. 2023-01-20 13:38:54 -05:00
MagicBot 0719fa9953 No warehouse PopUp feedback. 2023-01-20 13:35:57 -05:00
MagicBot 14adea8b2e Null check added to releaseAllMines. 2023-01-20 12:41:44 -05:00
MagicBot 3ec16d04d6 Prior claims are released upon a new claim. 2023-01-20 12:18:11 -05:00
MagicBot 1c228df4a8 Revert method refactor. 2023-01-20 11:24:37 -05:00
MagicBot 592caa40ea Serializing nation mine times. 2023-01-20 10:34:57 -05:00
MagicBot 20dba75602 Mine limits based upon nation tree rank. 2023-01-20 10:17:34 -05:00
MagicBot c82a414567 Serialization tweak. 2023-01-20 08:38:13 -05:00
MagicBot 1c9e22d964 Mine.wasClaimed added to ./info dev command. 2023-01-20 08:31:20 -05:00
MagicBot f7f71ef7cf DevCmd and class name should match. 2023-01-20 08:29:45 -05:00
MagicBot 1a7003ce59 Serialized mine open time adjusted if the mine was claimed during this cycle. 2023-01-20 08:12:53 -05:00
MagicBot 889e969c44 Mine cycle is reset at 01:00hrs. 2023-01-20 08:06:14 -05:00
MagicBot f51bfc6d2b Mines can only be claimed once a cycle. 2023-01-20 07:57:42 -05:00
MagicBot 715fdeec9e Merged the two errant guild methods. 2023-01-20 07:54:00 -05:00
MagicBot c57ae6d916 Removal of session tracking. 2023-01-20 07:50:37 -05:00
MagicBot bc1fc5748c Mine windows are set by the nation's WOO. 2023-01-19 17:41:38 -05:00
MagicBot ad9908fda1 Nation cannot be errant. 2023-01-19 17:34:45 -05:00
MagicBot cbd9021cfa Setting last claimer properly during claim. 2023-01-19 17:32:11 -05:00
MagicBot 49af4b8920 Update to system mine claim message. 2023-01-19 17:00:27 -05:00
MagicBot 9442bb1d39 Debugging code removed. 2023-01-19 16:49:36 -05:00
MagicBot efa504a714 Debugging isErrant() 2023-01-19 16:38:39 -05:00
MagicBot ea34418f2d Cleanup of duplicate errant guild definitions. 2023-01-19 16:22:37 -05:00
MagicBot 8ff0216243 Opening mines at the end of bootstrap. 2023-01-19 16:12:18 -05:00
MagicBot 332c860def Errant mines active at startup. 2023-01-19 15:50:49 -05:00
MagicBot 038cac8aed Errant mines active at startup. 2023-01-19 15:45:13 -05:00
MagicBot 00877279bc Errant mines active at startup. 2023-01-19 15:43:19 -05:00
MagicBot da073feb08 Errant mines active at startup. 2023-01-19 15:42:18 -05:00
MagicBot adae9a9ce1 Errant mines active at startup. 2023-01-19 15:39:49 -05:00
MagicBot 53a6b09099 Accessor level change 2023-01-19 15:22:12 -05:00
MagicBot e78d1f4ac4 OwningGuild should be set to errant not null. 2023-01-19 14:43:08 -05:00
MagicBot 11e5439e1d Set owner to null when invalid claim occurs. 2023-01-19 14:15:43 -05:00
MagicBot 78cdb6967a Message when claiming mine succeeds. 2023-01-19 14:09:15 -05:00
MagicBot 79d05f1fb2 Serialize current time for all active mines regardless of claim status. 2023-01-19 13:59:52 -05:00
MagicBot 2a140a6ce1 Serialize current time for all active mines regardless of claim status. 2023-01-19 13:57:43 -05:00
MagicBot a2bdfcc031 Cleanup of logic. 2023-01-19 13:47:11 -05:00
MagicBot 0f2ca3e62e Cleanup of logic. 2023-01-19 13:46:33 -05:00
MagicBot 55e6ca2d41 Error message when claiming a mine fails. 2023-01-19 13:36:16 -05:00
MagicBot 837c2fa1f9 Consolidating handling of different session. 2023-01-19 13:27:26 -05:00
MagicBot c596aa5a01 Unused variable removed. 2023-01-19 12:55:17 -05:00
MagicBot af38dd8fb9 Should not be sending messages to players here. 2023-01-19 12:48:54 -05:00
MagicBot dab9097680 Must wait for a mine window to close to change your guild's WOO to it. 2023-01-19 12:41:32 -05:00
MagicBot 04fc0d6815 Removed Bonus code 2023-01-19 12:36:01 -05:00
MagicBot 4eb1350c3b Rename for clarity 2023-01-19 12:21:29 -05:00
MagicBot 9e7cbdc2d3 bugfix: guilds cannot be null only errant. 2023-01-19 12:19:37 -05:00
MagicBot c89b60221e Extracted open/close logic to method. Run at startup. 2023-01-19 11:21:08 -05:00
MagicBot b88a10d509 Removed vestigial db handler method. 2023-01-19 10:50:22 -05:00
MagicBot 6672f750d9 Initial refactor: deleted all old code and replaced with something sensible. Driven from the guild's mine hour instead of calculating dates. 2023-01-19 10:38:49 -05:00
MagicBot 5ff4703b14 Background thread to monitor admin events. 2023-01-16 06:35:06 -05:00
MagicBot 87dfc968aa Updated admin events to read 2023-01-16 06:24:24 -05:00
MagicBot fba041db5e Method created to send Admin Log Updates to users. 2023-01-16 06:13:44 -05:00
MagicBot cad78c55bd Typo in enum 2023-01-16 06:00:43 -05:00
MagicBot 0c4187faeb ADMINLOG added to ConfigManager 2023-01-16 05:54:08 -05:00
MagicBot c2a84ed31b Starting work on output of admin log. 2023-01-16 05:50:59 -05:00
MagicBot b6506ac3f1 Starting work on output of admin log. 2023-01-16 05:41:31 -05:00
MagicBot 920fcd4b8e Generic ChatChannelHandler created. 2023-01-16 05:28:35 -05:00
MagicBot c59c0629a7 Generic ChatChannelHandler created. 2023-01-16 05:23:31 -05:00
MagicBot 8fbd408fb4 Admin log channel created. 2023-01-16 05:19:02 -05:00
MagicBot 4e6411e555 Merge remote-tracking branch 'origin/post-wipe-merge' into MagicBot-adminlog 2023-01-16 05:11:51 -05:00
MagicBot d70305b0b6 Merge branch 'bugfix-siege-asset-placement' into post-wipe-merge
# Conflicts:
#	src/engine/net/client/handlers/PlaceAssetMsgHandler.java
2023-01-15 23:45:12 -05:00
MagicBot 0469754d5d Bugfix: needs city parent not current zone to pick up siege bounds. 2023-01-15 13:00:26 -05:00
MagicBot 7cb0e5f6b2 Retrieve Admin Log events from database as a map. 2023-01-15 11:29:24 -05:00
MagicBot cec70b3b64 Tweak of column names and Event Strings. 2023-01-15 10:55:16 -05:00
MagicBot 21ff024bf8 Admin login events captured. 2023-01-15 10:34:56 -05:00
MagicBot 3f700f57a7 Admin command usages logged to database. 2023-01-15 10:01:11 -05:00
MagicBot 68294baae6 Cleanup of scope issue when creating city objects. 2023-01-15 08:57:54 -05:00
MagicBot 526c078978 Collision check extracted to method. 2023-01-15 08:31:56 -05:00
MagicBot f3fee3140a Move siege validation out of the generic ValidateBuildingPlacement method. 2023-01-15 08:18:23 -05:00
FatBoy e0af139b24 deed no longer is taken after failed placement 2023-01-14 18:56:43 -06:00
FatBoy 313c13c588 corrected error message ID numbers 2023-01-14 18:36:51 -06:00
MagicBot 8ef5cb4e22 Rework of validation checks. 2023-01-14 16:31:58 -05:00
MagicBot 2643be456e Moved validation check to before asset creation. 2023-01-14 15:34:23 -05:00
MagicBot 29c6d6cd8e Counter scope issue resolved. 2023-01-14 15:23:02 -05:00
MagicBot c84fb60177 Errant import removed. 2023-01-14 15:08:18 -05:00
MagicBot d8dad9f087 Extract siege limits validation method. 2023-01-14 15:07:35 -05:00
MagicBot 45f94c736a Excess whitespace. 2023-01-14 14:29:33 -05:00
MagicBot 7a670ffdbf Appropriate error messages for BOW limits. 2023-01-14 13:35:37 -05:00
FatBoy 325c8b8254 siege asset placement reliant on attcker/defender maximums 2023-01-14 11:57:30 -06:00
MagicBot 90335355b7 Less verbose error message 2023-01-13 15:07:53 -05:00
MagicBot 4c10e01539 Reset time calculation updated. 2023-01-13 14:37:53 -05:00
MagicBot a76534f0af Mesh set properly when errant mine loaded. 2023-01-13 14:34:04 -05:00
MagicBot a06420eae3 Early exit for errant mines at bootstrap. Wtb method extract. 2023-01-13 14:19:01 -05:00
MagicBot 48d435f2c1 Early exit for errant mines. 2023-01-13 14:12:22 -05:00
MagicBot 43380962cc Early exit for errant mines. 2023-01-13 14:04:14 -05:00
MagicBot 14247715fd Removed unused EffectiveDate 2023-01-13 13:50:52 -05:00
MagicBot 7282868eac Errant mines are errant. 2023-01-13 12:09:30 -05:00
MagicBot b30e35f465 Refresh mine when destroyed. 2023-01-13 11:52:50 -05:00
MagicBot d9352b6d34 Refresh mine when destroyed. 2023-01-13 11:46:26 -05:00
MagicBot 26dcccad81 Errant mines now change owner in database. 2023-01-13 11:24:41 -05:00
MagicBot d0cf94dbf9 HandleEndMineWindow will bump the date for us. 2023-01-13 09:13:53 -05:00
MagicBot f61bb925f8 Cleanup of NextMindWindow logic. 2023-01-13 09:01:38 -05:00
MagicBot 5929d5dd56 Cleanup of NextMindWindow logic. 2023-01-13 08:43:20 -05:00
MagicBot 5a19507f53 Merge remote-tracking branch 'origin/refinement-fix' into post-wipe-merge 2023-01-13 08:25:34 -05:00
MagicBot 5c3ea2c4c3 Merge remote-tracking branch 'origin/world-announcements' into post-wipe-merge 2023-01-13 08:25:19 -05:00
FatBoy 1fef5e7c05 refund points from lost spells 2023-01-12 21:44:52 -06:00
FatBoy 743e1f150d refund points from lost spells 2023-01-12 21:35:29 -06:00
FatBoy 7c983d04a3 refine stat point check 2023-01-12 20:35:25 -06:00
FatBoy 73edd8d932 discipline and godly drop messages added 2023-01-11 21:58:24 -06:00
FatBoy cd0e31f39d discipline and godly drop messages added 2023-01-11 21:02:18 -06:00
MagicBot 9e6c96a487 Merge remote-tracking branch 'origin/refinement-fix' into post-wipe-merge 2023-01-11 21:29:03 -05:00
FatBoy 523e83a49c Merge remote-tracking branch 'origin/post-wipe-merge' into refinement-fix 2023-01-11 20:10:42 -06:00
FatBoy c9972962d1 check for powers needing skill 2023-01-11 19:52:38 -06:00
MagicBot 4b8e0cb041 Bump old opendate during reboot to current +1 when mine window has passed. 2023-01-11 16:27:01 -05:00
MagicBot 3ec985e3d9 bugfix: window should not end for a mine not opened. 2023-01-11 15:00:52 -05:00
MagicBot af7d801388 bugfix: not overriding mine open date on boot. 2023-01-10 12:27:54 -05:00
MagicBot 98470d4b1a Added help for #dev subcommands 2023-01-10 08:51:00 -05:00
MagicBot 81b7259423 Added remote console output. 2023-01-10 08:34:11 -05:00
MagicBot d6a505fd00 Added lastout sub command. 2023-01-09 10:22:35 -05:00
MagicBot a71bf4330b Redirecting output via the shell. 2023-01-09 10:12:45 -05:00
MagicBot 72cbcb13fc Change to response string after exec() 2023-01-09 10:09:43 -05:00
MagicBot 8904fb8828 Removed file redirect; better to do that within the shell. 2023-01-09 10:06:37 -05:00
MagicBot 93b33ce37e Capturing output of remote exec() to file. 2023-01-09 09:58:51 -05:00
MagicBot 9ce06da271 Capturing output of remote exec() to file. 2023-01-09 09:43:03 -05:00
MagicBot a460a201e1 Logging string contains exec command. 2023-01-09 09:07:40 -05:00
MagicBot 1493d3ad45 Support for more than one argument. 2023-01-09 02:01:29 -05:00
MagicBot ee676a08ea Better logging and error reporting. 2023-01-09 01:59:18 -05:00
MagicBot 0c87410018 Using ProcessBuilding instead of exec() 2023-01-09 01:47:59 -05:00
MagicBot 9268fa8b01 Using ProcessBuilding instead of exec() 2023-01-09 01:39:14 -05:00
MagicBot eea13b22a0 Using ProcessBuilding instead of exec() 2023-01-09 01:32:57 -05:00
MagicBot fe87253a86 Fixed argument passing to unix runtime. 2023-01-09 01:22:11 -05:00
MagicBot 701bf85c8b Fixed argument passing to unix runtime. 2023-01-09 01:14:54 -05:00
MagicBot d4d24c9443 Fixed argument passing to unix runtime. 2023-01-09 01:11:27 -05:00
MagicBot 23f44f1fb8 Command name is restart not reboot. 2023-01-09 01:01:43 -05:00
MagicBot 9a2503b9c3 Merge remote-tracking branch 'origin/MagicBot_DevCmds' into post-wipe-merge 2023-01-09 00:44:08 -05:00
MagicBot 825d1897cb Removal of vestigial string restriction.
Command renamed to #dev
2023-01-08 17:18:57 -05:00
MagicBot c002eec8bd Consolidated all into one command #dev. 2023-01-08 12:44:16 -05:00
MagicBot 0fd5d09e3e Command added to remote build on Dev server. 2023-01-08 12:27:40 -05:00
MagicBot e9850a51bc Merge remote-tracking branch 'origin/minetime_bugfix' into post-wipe-merge 2023-01-08 07:07:12 -05:00
MagicBot df09b6e38b Removed 30 lines of logic that had no business in a result set constructor. 2023-01-07 13:49:31 -05:00
MagicBot 52d3d8ee3a Not adding an extraneous day each reboot. 2023-01-07 13:26:47 -05:00
MagicBot 7bc09d86bd Saving WOO timer to database for reboot persist. 2023-01-07 12:31:22 -05:00
MagicBot 860d4d9b31 Bugfix: setting lastwoocheck field after update. 2023-01-07 11:31:41 -05:00
MagicBot 4b5ce5bdb1 15hr WOO restriction check added. 2023-01-07 11:22:38 -05:00
MagicBot 302358e31c Storing lastWooEditTime for guilds in obj_guild table. Requires Schema Change. 2023-01-07 11:03:07 -05:00
MagicBot 83b514a05f Class cleanup. 2023-01-07 10:35:00 -05:00
MagicBot 2f22b3b91b Protocol Handler created for ArcMineWindowChangeMsg 2023-01-07 09:44:51 -05:00
MagicBot f979a7b694 Merge remote-tracking branch 'origin/nation-sub-limits' into post-wipe-merge 2023-01-07 09:01:39 -05:00
MagicBot 78be9bfd4f Merge remote-tracking branch 'origin/sale-item-value' into post-wipe-merge 2023-01-07 09:01:29 -05:00
FatBoy 5f0803eec4 nation sub limits added 2023-01-01 21:56:49 -06:00
FatBoy 6cf7b88025 NPCs buy at base cost only 2023-01-01 15:53:05 -06:00
FatBoy d3e05ec247 subs limited to cap rank 2023-01-01 15:48:17 -06:00
MagicBot 5853dc802d Merge pull request 'Fix for weaponspeed effect modifier.' (#19) from EffectModifierFix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/19
2022-12-30 13:13:15 +00:00
MagicBot a35c5ef3cc Fix for weaponspeed effect modifier. 2022-12-30 07:39:23 -05:00
MagicBot dfd6beb988 Merge pull request 'bugfix-flightfix' (#18) from bugfix-flightfix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/18
2022-08-28 11:43:42 +00:00
MagicBot ebeda7d7ba Players grounded properly when losing flight. 2022-08-27 17:14:50 -04:00
MagicBot 5fe518f8a1 Players grounded properly when losing flight. 2022-08-27 16:44:05 -04:00
MagicBot ab82529a4b Players grounded properly when losing flight. 2022-08-27 16:31:07 -04:00
MagicBot 9988863a85 Merge pull request 'treb-range-fix' (#17) from treb-range-fix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/17
2022-08-24 12:22:20 +00:00
MagicBot 8a3c3d7571 Merge branch 'master' into treb-range-fix 2022-08-24 12:22:09 +00:00
MagicBot 3ae1c2ebb2 Merge pull request 'fixed mob ATR' (#16) from mob-atr-fix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/16
2022-08-24 12:21:25 +00:00
FatBoy 5ab4eb5b32 run siege minion after load 2022-08-23 15:03:35 -05:00
FatBoy 09d0046baf run siege minion after load 2022-08-23 14:59:27 -05:00
FatBoy 865c50f984 fixed trebs 2022-08-23 14:25:24 -05:00
FatBoy f0b80f8eb3 fixed mob ATR 2022-08-15 18:21:34 -05:00
MagicBot 77aa14b7da SDR added to magic bucket numbers. 2022-08-04 16:10:06 -04:00
MagicBot e6af752c6d Hotfix: bane null check order. 2022-07-27 08:56:45 -04:00
MagicBot 2436579752 Merge pull request 'release-1.3' (#13) from release-1.3 into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/13
2022-07-13 17:55:55 +00:00
MagicBot aef34d434a README update. 2022-07-13 13:49:28 -04:00
FatBoy 2922fdf623 changed mob casting rate from 1/3 to 1/10 2022-06-26 20:07:18 -05:00
FatBoy 3f35df3916 fixed crashing bug form my own mistake 2022-06-26 20:04:14 -05:00
FatBoy e79a907f3b mobs no longer always hit, mob powers now send power message in chat window 2022-06-26 20:01:05 -05:00
MagicBot 45ab56e98d More detail when missing a config entry. 2022-06-26 11:05:37 -04:00
MagicBot 246bfe59cb More detail when missing a config entry. 2022-06-26 10:47:08 -04:00
MagicBot afa74ba6fe Optimized imports. 2022-06-23 18:25:45 -04:00
MagicBot 02ed3ff778 Removed unused imports. 2022-06-23 15:51:37 -04:00
MagicBot 14d1c7ccbb Merge branch 'update-config' into release-1.3 2022-06-23 15:48:14 -04:00
MagicBot 0f5b0493b9 Merge remote-tracking branch 'origin/pet-guard-damage-fix' into release-1.3 2022-06-23 15:47:52 -04:00
MagicBot efab188ebd Merge remote-tracking branch 'origin/flight-fix-cleanup' into release-1.3 2022-06-23 15:47:32 -04:00
MagicBot eaaa5bf717 Merge branch 'enter-siege-bounds' into release-1.3 2022-06-23 15:47:16 -04:00
FatBoy 4812068982 changed onEnter for city to refernce siege bounds 2022-06-12 13:53:33 -05:00
FatBoy 3189ac0d56 mob powers now scale based on their level 2022-06-09 18:55:16 -05:00
FatBoy f8a9262fc5 changed location of mob power lookup 2022-06-09 18:22:30 -05:00
FatBoy 9ce7e1c5ca mobs and guards can cast their power sets 2022-06-08 21:09:59 -05:00
FatBoy 2e5c05d932 work on mob casting 2022-06-08 19:56:09 -05:00
FatBoy 56ad9d7907 changed max pet damage scale 2022-06-07 20:30:02 -05:00
FatBoy 65840e89b6 scaled damage range for pets to be based on level 2022-06-07 20:27:45 -05:00
FatBoy 69c78fa5a6 added power casting for pets who have DB entires 2022-06-07 20:24:11 -05:00
FatBoy 3c610a8564 Fix to mob/guard static power lookup 2022-06-06 19:21:39 -05:00
MagicBot 4f2954041d Removed unused code. 2022-06-06 04:48:04 -04:00
MagicBot 24d96f24b2 Moving Fname regex to config 2022-06-06 04:28:44 -04:00
MagicBot ad4678ab3c Version info pulled from config. 2022-06-06 03:26:34 -04:00
MagicBot d5d957a910 bugfix: ignore case with boolean config values. 2022-06-06 03:21:27 -04:00
MagicBot d89cd97eb6 Missing config suggests outdated MagicBox. 2022-06-06 03:13:07 -04:00
FatBoy 16e4f3fa7a fix to abandoning tree as nation check 2022-06-05 21:14:10 -05:00
FatBoy 657cc0cf9e Cannot Abandon Tree if You Own a Bane : Cannot Abandon Tree if you are a nation 2022-06-05 20:55:57 -05:00
FatBoy 45234d24ca stupid error fixed (!=) 2022-06-05 17:36:30 -05:00
FatBoy cd55105b28 spire effects extend to siege bounds 2022-06-05 17:27:40 -05:00
FatBoy d9b5544894 added message to player trying to delete asset during active siege 2022-06-05 17:12:56 -05:00
FatBoy a62617324d added message to player trying to delete asset during active siege 2022-06-05 17:03:44 -05:00
FatBoy 8665011457 can no longer delete building during active bane 2022-06-05 16:56:54 -05:00
MagicBot 18bf19502f Spire effects reach to siege bounds. 2022-06-05 17:02:44 -04:00
MagicBot 168a4f2a17 24.3 placement ruleset.
512/576/1040 grid/zone/siege
2022-06-05 16:56:01 -04:00
MagicBot d3f77d10c5 Flight fix re-enabled. 2022-06-04 13:45:09 -04:00
MagicBot bf87894f8c Removed flight job bonus code. 2022-06-04 13:30:35 -04:00
MagicBot 59cebf9e9b Auditmobs hashset for to deleted as it was being populated once a second but never used. 2022-06-03 12:28:56 -04:00
FatBoy 87e18351be moved flight check to MovementManager 2022-06-03 08:42:08 -05:00
FatBoy 94bc41ab9d added flight check 2022-06-02 21:01:18 -05:00
FatBoy c795238231 Changed if/else tunnel to switch 2022-06-02 20:39:52 -05:00
Bardiel 43c32ce329 Merge pull request 'Added equipsets for naked guards' (#10) from guard-equipsets into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/10
2022-06-01 21:54:22 +00:00
Bardiel 4f60640ddf Equipment Set for Forest Mage guard added
Equipment Set for Templar guard added
Equipment Set for Aracoix Magister guard added
2022-06-01 13:58:23 -07:00
Bardiel f87d39b51c Equipment Set for Forest Mage guard added 2022-06-01 13:33:24 -07:00
MagicBot 0475cc1e66 Merge pull request 'bugfix-citysizing' (#7) from bugfix-citysizing into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/7
2022-05-22 13:07:27 +00:00
MagicBot 79702eab1a Merge branch 'master' into bugfix-citysizing 2022-05-22 13:07:09 +00:00
MagicBot 261e3a6c49 Merge pull request 'Bugfix for damage absorbers.' (#6) from bugfix-absorber into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/6
2022-05-22 13:04:37 +00:00
MagicBot e8b7d63a59 Bugfix for damage absorbers. 2022-05-13 15:25:04 -04:00
MagicBot 638985d332 Revert grid sizing to 576/640 per 2018 commit. 2022-05-13 13:38:52 -04:00
MagicBot 894427af72 Using original MB values when sizing city terraform. 2022-05-12 15:33:43 -04:00
MagicBot e6bbb53ac8 bugfix: Channel ID update. 2022-05-11 15:37:46 -04:00
MagicBot cb279a5d5a bugfix: Pass MB_WORLD_PORT to isPortInUse() 2022-05-10 11:56:06 -04:00
MagicBot 2af224c90f bugfix: MagicBot needs to autodetect public ip for #status to work. 2022-05-10 11:41:45 -04:00
MagicBot 8faec41487 Merge pull request 'bugfix-MagicBoxlocalhost' (#3) from bugfix-MagicBoxlocalhost into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/3
2022-05-03 16:43:47 +00:00
MagicBot 93a8274b7b Merge branch 'master' into bugfix-MagicBoxlocalhost 2022-05-03 16:43:28 +00:00
MagicBot d8fd03b287 Merge pull request 'Fixes issue where max allowed keyclones was hardcoded and not pulled from the config.' (#2) from bugfix-keycloneAudit into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/2
2022-05-03 16:40:16 +00:00
MagicBot 3c7e1827f2 Merge branch 'master' into bugfix-keycloneAudit 2022-05-03 16:39:57 +00:00
MagicBot 24057e6412 Logging when network autoconfig occurs 2022-05-03 12:23:45 -04:00
MagicBot a59dbdc4e1 Fixes bug where public_addr was autoconfigured irrespective of not being 0.0.0.0 2022-05-03 12:02:05 -04:00
MagicBot 8105544894 Update 'README.md' 2022-05-02 18:07:53 +00:00
MagicBot 3456e14d04 Fixes issue where max allowed keyclones was hardcoded and not pulled from the config. 2022-05-02 07:35:15 -04:00
MagicBot c45491a3d2 Merge pull request 'Feature-AutoRegister' (#1) from Feature-AutoRegister into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/1
2022-04-30 18:54:04 +00:00
MagicBot 4205ebe384 SQL caretfix 2022-04-30 14:42:09 -04:00
MagicBot 890f9ad49d SQL caretfix 2022-04-30 14:38:57 -04:00
MagicBot bf3517ebb3 More logging 2022-04-30 14:30:47 -04:00
MagicBot 459d61b20a Autoregister plugged in. 2022-04-30 14:19:33 -04:00
MagicBot 0beb75c9fb Handler added to create single account 2022-04-30 14:11:35 -04:00
MagicBot 2997e5bda2 Feature needs a new configuration entry. 2022-04-30 14:05:05 -04:00
MagicBot a6d5240a66 Update 'README.md' 2022-04-30 17:41:09 +00:00
MagicBot e1b3fa0438 Update 'README.md'
Added info about scan-when-commit pain.
2022-04-30 17:39:37 +00:00
MagicBot bb2bdce93b Update 'README.md'
Edit to README
2022-04-30 13:44:03 +00:00
MagicBot bbfdde57a3 Initial Repository Push 2022-04-30 09:41:17 -04:00
MagicBot d4eef9097a Update to README.md and LICENSE 2022-04-30 09:36:18 -04:00
MagicBot d8a90902b5 Initial commit 2022-04-30 13:11:10 +00:00
146 changed files with 5699 additions and 13256 deletions
-8203
View File
File diff suppressed because one or more lines are too long
+33 -15
View File
@@ -9,15 +9,13 @@
package engine;
import ch.claude_martin.enumbitset.EnumBitSetHelper;
import engine.gameManager.BuildingManager;
import engine.gameManager.ConfigManager;
import engine.gameManager.PowersManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector2f;
import engine.math.Vector3fImmutable;
import engine.objects.AbstractCharacter;
import engine.objects.ItemBase;
import engine.objects.Shrine;
import engine.objects.Zone;
import engine.objects.*;
import engine.powers.EffectsBase;
import org.pmw.tinylog.Logger;
@@ -139,8 +137,8 @@ public class Enum {
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f),
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
@@ -172,6 +170,8 @@ public class Enum {
}
public static RaceType getRaceTypebyRuneID(int runeID) {
if(runeID == 1999)
return _raceTypeByID.get(2017);
return _raceTypeByID.get(runeID);
}
@@ -208,8 +208,8 @@ public class Enum {
SENTINEL(0, 0, 0, 0, 0, 0, 0),
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f),
IREKEI(6.499500105f, 14.6685f, 4.2199998f, 14.6685f, 6.3299999f, 18.379999f, 6.5f);
private float walkStandard;
private float walkCombat;
private float runStandard;
@@ -469,11 +469,14 @@ public class Enum {
// 14001 does not have a banestone to bind at
if (ruinZone.getLoadNum() == 14001)
if (ruinZone.getLoadNum() == 14001) {
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
else
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
}else {
//spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
//.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,30f);
}
}
@@ -776,6 +779,7 @@ public class Enum {
Combat,
Spires,
Snare,
Snared,
Stun,
Blind,
Root,
@@ -878,6 +882,7 @@ public class Enum {
Siege,
Slash,
Snare,
Snared,
Sorcery,
Spear,
SpearMastery,
@@ -957,6 +962,17 @@ public class Enum {
Wizardry;
public static SourceType GetSourceType(String modName) {
switch(modName){
case "Slashing":
modName = "Slash";
break;
case "Crushing":
modName = "Crush";
break;
case "Piercing":
modName = "Pierce";
break;
}
SourceType returnMod;
if (modName.isEmpty())
return SourceType.None;
@@ -1016,6 +1032,7 @@ public class Enum {
Silence,
Slash,
Snare,
Snared,
Stance,
Stun,
Summon,
@@ -1140,6 +1157,7 @@ public class Enum {
SkillDebuff,
SlashResistanceDebuff,
Snare,
Snared,
StackableAttrCONBuff,
StackableAttrDEXBuff,
StackableAttrSTRBuff,
@@ -2306,9 +2324,9 @@ public class Enum {
public enum CityBoundsType {
GRID(640),
ZONE(875),
PLACEMENT(876);
GRID(544),
ZONE(672),
PLACEMENT(673);
public final float extents;
@@ -19,10 +19,7 @@ import engine.net.AbstractNetMsg;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.LoadCharacterMsg;
import engine.net.client.msg.LoadStructureMsg;
import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.UnloadObjectsMsg;
import engine.net.client.msg.*;
import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
@@ -521,10 +518,10 @@ public enum InterestManager implements Runnable {
// Update loaded upbjects lists
player.isBoxed = PlayerCharacter.checkIfBoxed(player);
player.setDirtyLoad(true);
updateStaticList(player, origin);
updateMobileList(player, origin);
}
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
+158 -8
View File
@@ -10,17 +10,13 @@
package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Bane;
import engine.objects.Building;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import org.joda.time.DateTime;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
public class dbBaneHandler extends dbHandlerBase {
@@ -89,6 +85,139 @@ public class dbBaneHandler extends dbHandlerBase {
return true;
}
public boolean SET_BANE_TIME_NEW(int hour, int cityUUID) {
hour += 12; // Adjust hour
try (Connection connection = DbManager.getConnection();
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `time_set`=? WHERE `cityUUID`=?")) {
// Retrieve placementDate and liveDate
getStatement.setInt(1, cityUUID);
try (ResultSet rs = getStatement.executeQuery()) {
if (rs.next()) {
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
// Explicitly check if liveDate is null
DateTime toSet;
if (liveDateTimestamp == null) {
// If liveDate is null, default to placementDate
toSet = placementDate;
} else {
// If liveDate is not null, use it
DateTime liveDate = new DateTime(liveDateTimestamp.getTime());
toSet = liveDate;
}
// Adjust the time
toSet = toSet.withHourOfDay(hour).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0);
// Update liveDate and time_set flag
updateStatement.setTimestamp(1, new java.sql.Timestamp(toSet.getMillis()));
updateStatement.setInt(2, 1); // time_set flag
updateStatement.setInt(3, cityUUID);
updateStatement.execute();
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BANE_DAY_NEW(int dayOffset, int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `day_set`=? WHERE `cityUUID`=?")) {
// Retrieve placementDate and liveDate
getStatement.setInt(1, cityUUID);
try (ResultSet rs = getStatement.executeQuery()) {
if (rs.next()) {
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
// Explicitly check if liveDate is null
DateTime liveDate;
if (liveDateTimestamp == null) {
// If liveDate is null, default to placementDate
liveDate = placementDate;
} else {
// If liveDate is not null, use it
liveDate = new DateTime(liveDateTimestamp.getTime());
}
// Calculate the new liveDate while preserving the time component
DateTime updatedDate = placementDate.plusDays(dayOffset)
.withHourOfDay(liveDate.getHourOfDay())
.withMinuteOfHour(liveDate.getMinuteOfHour())
.withSecondOfMinute(liveDate.getSecondOfMinute())
.withMillisOfSecond(liveDate.getMillisOfSecond());
// Update liveDate and day_set flag
updateStatement.setTimestamp(1, new java.sql.Timestamp(updatedDate.getMillis()));
updateStatement.setInt(2, 1); // day_set flag
updateStatement.setInt(3, cityUUID);
updateStatement.execute();
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BANE_CAP_NEW(int count, int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, count);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_set`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, 1);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, count);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
return true;
}
public boolean REMOVE_BANE(Bane bane) {
if (bane == null)
@@ -107,4 +236,25 @@ public class dbBaneHandler extends dbHandlerBase {
return true;
}
public DateTime getLiveDate(int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?")) {
statement.setInt(1, cityUUID);
try (ResultSet rs = statement.executeQuery()) {
if (rs.next()) {
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
if (liveDateTimestamp != null) {
return new DateTime(liveDateTimestamp.getTime());
}
}
}
} catch (SQLException e) {
Logger.error(e);
}
return null; // Return null if liveDate is not found or an error occurs
}
}
+10 -4
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.*;
@@ -95,7 +92,16 @@ public class dbCityHandler extends dbHandlerBase {
return objectList;
}
public Integer GET_CAPITAL_CITY_COUNT() {
int cityCount = 0;
for(Realm realm : Realm._realms.values()){
if(realm.isRuled())
cityCount ++;
}
return cityCount;
}
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
ArrayList<City> cityList = new ArrayList<>();
+39 -17
View File
@@ -98,32 +98,54 @@ public class dbContractHandler extends dbHandlerBase {
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
if(!contract.getName().contains("Sage")) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
preparedStatement.setInt(1, contract.getObjectUUID());
preparedStatement.setInt(1, contract.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
while (rs.next()) {
int type = rs.getInt("type");
int value = rs.getInt("value");
int type = rs.getInt("type");
int value = rs.getInt("value");
switch (type) {
case 1:
contract.getBuyItemType().add(value);
break;
case 2:
switch (type) {
case 1:
contract.getBuyItemType().add(value);
break;
case 2:
contract.getBuySkillToken().add(value);
break;
case 3:
contract.getBuyUnknownToken().add(value);
break;
}
}
} catch (SQLException e) {
Logger.error(e);
}
}else{
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype`;")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int value = rs.getInt("value");
if(!contract.getBuySkillToken().contains(value))
contract.getBuySkillToken().add(value);
break;
case 3:
if(!contract.getBuyItemType().contains(value))
contract.getBuyItemType().add(value);
if(!contract.getBuyUnknownToken().contains(value))
contract.getBuyUnknownToken().add(value);
break;
}
} catch (SQLException e) {
Logger.error(e);
}
} catch (SQLException e) {
Logger.error(e);
}
}
+16 -1
View File
@@ -32,7 +32,6 @@ public abstract class dbHandlerBase {
try {
if (rs.next()) {
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(abstractGameObject);
}
} catch (Exception e) {
@@ -57,12 +56,28 @@ public abstract class dbHandlerBase {
while (rs.next()) {
int id = rs.getInt(1);
try {
if (rs.getInt("capSize") == 0) {
continue;
}
}catch(Exception e){
//not a mine
}
if (DbManager.inCache(localObjectType, id)) {
objectList.add((T) DbManager.getFromCache(localObjectType, id));
} else {
try{
if(rs.getInt("mineLiveHour") == 1)
continue;
}catch(Exception e){
//not a mine
}
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(toAdd);
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
continue;
}
objectList.add((T) toAdd);
if (toAdd != null && toAdd instanceof AbstractWorldObject)
+21 -3
View File
@@ -134,9 +134,13 @@ public class dbItemHandler extends dbHandlerBase {
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
worked = rs.getBoolean("result");
if (rs.next()) {
try {
worked = rs.getBoolean("result");
}catch(Exception e){
worked = false;
}
}
} catch (SQLException e) {
Logger.error(e);
}
@@ -496,4 +500,18 @@ public class dbItemHandler extends dbHandlerBase {
return false;
}
}
public boolean UPDATE_NUM_ITEMS(final Item item, int newValue) {
if (item.getItemBase().getType().equals(ItemType.GOLD))
return false;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, newValue);
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
}
+38
View File
@@ -131,6 +131,32 @@ public class dbNPCHandler extends dbHandlerBase {
return npc;
}
public int BANE_COMMANDER_EXISTS(final int objectUUID) {
int uid = 0;
String query = "SELECT `UID` FROM `obj_npc` WHERE `npc_buildingID` = ? LIMIT 1;";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
preparedStatement.setInt(1, objectUUID);
try (ResultSet rs = preparedStatement.executeQuery()) {
if (rs.next()) {
// Retrieve the UID column value
uid = rs.getInt("UID");
}
}
} catch (SQLException e) {
Logger.error(e);
}
return uid;
}
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
int rowCount;
@@ -176,6 +202,18 @@ public class dbNPCHandler extends dbHandlerBase {
return result;
}
public static void updateSpecialPricing(final NPC npc){
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET specialPrice=? WHERE UID = ?")) {
preparedStatement.setInt(1, npc.getSpecialPrice());
preparedStatement.setInt(2, npc.getDBID());
preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
}
}
public void updateDatabase(final NPC npc) {
try (Connection connection = DbManager.getConnection();
+21 -26
View File
@@ -13,6 +13,7 @@ import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import org.pmw.tinylog.Logger;
@@ -31,7 +32,6 @@ public class AddNPCCmd extends AbstractDevCmd {
int contractID;
String name = "";
int level = 0;
if (words.length < 2) {
this.sendUsage(pc);
return;
@@ -39,59 +39,54 @@ public class AddNPCCmd extends AbstractDevCmd {
try {
contractID = Integer.parseInt(words[0]);
level = Integer.parseInt(words[1]);
for (int i = 2; i < words.length; i++) {
name += words[i];
if (i + 1 < words.length)
name += "";
}
} catch (NumberFormatException e) {
throwbackError(pc,
"Failed to parse supplied contractID or level to an Integer.");
return; // NaN
}
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
if (contract == null || level < 1 || level > 75) {
throwbackError(pc,
"Invalid addNPC Command. Need contract ID, and level");
return; // NaN
}
// Pick a random name
if (name.isEmpty())
name = NPCManager.getPirateName(contract.getMobbaseID());
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
if (zone == null) {
throwbackError(pc, "Failed to find zone to place npc in.");
return;
}
Building building = null;
if (target != null)
if (target.getObjectType() == GameObjectType.Building) {
Building parentBuilding = (Building) target;
BuildingManager.addHirelingForWorld(parentBuilding, pc, parentBuilding.getLoc(), parentBuilding.getParentZone(), contract, level);
return;
building = (Building)target;
}
NPC npc = NPC.createNPC(name, contractID,
pc.getLoc(), null, zone, (short) level, null);
if (npc != null) {
WorldGrid.addObject(npc, pc);
ChatManager.chatSayInfo(pc,
"NPC with ID " + npc.getDBID() + " added");
this.setResult(String.valueOf(npc.getDBID()));
} else {
throwbackError(pc, "Failed to create npc of contract type "
+ contractID);
Logger.error(
"Failed to create npc of contract type " + contractID);
NPC created;
Guild guild = null;
Vector3fImmutable loc;
if(building != null){
guild = building.getGuild();
loc = building.loc;
} else{
loc = pc.loc;
}
created = NPC.createNPC(name, contractID, loc, guild, zone, (short)level, building);
created.bindLoc = loc;
if(building != null) {
created.buildingUUID = building.getObjectUUID();
created.building = building;
NPCManager.slotCharacterInBuilding(created);
}
created.setLoc(created.bindLoc);
created.updateDatabase();
throwbackInfo(pc, "Created NPC with UUID: " + created.getObjectUUID());
}
@Override
+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";
}
}
-77
View File
@@ -1,77 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ZoneManager;
import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter;
/**
* ./hotzone <- display the current hotzone & time remaining
* ./hotzone random <- change hotzone to random new zone
*/
public class HotzoneCmd extends AbstractDevCmd {
public HotzoneCmd() {
super("hotzone");
}
@Override
protected void _doCmd(PlayerCharacter playerCharacter, String[] words,
AbstractGameObject target) {
StringBuilder data = new StringBuilder();
String outString;
for (String s : words) {
data.append(s);
data.append(' ');
}
String input = data.toString().trim();
if (input.length() == 0) {
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
outString += "Available hotZones: " + ZoneManager.availableHotZones();
throwbackInfo(playerCharacter, outString);
return;
}
if (input.equalsIgnoreCase("random")) {
ZoneManager.generateAndSetRandomHotzone();
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
outString += "Available hotZones: " + ZoneManager.availableHotZones();
throwbackInfo(playerCharacter, outString);
return;
}
if (input.equalsIgnoreCase("reset")) {
ZoneManager.resetHotZones();
throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones());
return;
}
return;
}
@Override
protected String _getHelpString() {
return "Use no arguments to see the current hotzone or \"random\" to change it randomly.";
}
@Override
protected String _getUsageString() {
return "'./hotzone [random]";
}
}
+10 -1
View File
@@ -18,6 +18,7 @@ import engine.gameManager.BuildingManager;
import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.server.MBServerStatics;
import engine.util.StringUtils;
import java.text.DecimalFormat;
@@ -337,7 +338,8 @@ public class InfoCmd extends AbstractDevCmd {
output += "Swimming : " + targetPC.isSwimming();
output += newline;
output += "isMoving : " + targetPC.isMoving();
output += newline;
output += "Zerg Multiplier : " + targetPC.ZergMultiplier;
break;
case NPC:
@@ -529,6 +531,13 @@ public class InfoCmd extends AbstractDevCmd {
}
break;
case Corpse:
Corpse corpse = (Corpse)target;
Long timeLeft = MBServerStatics.CORPSE_CLEANUP_TIMER_MS - (System.currentTimeMillis() - corpse.spawnedTime);
output += "Despawn in: " + timeLeft;
output += newline;
break;
}
throwbackInfo(pc, output);
+3 -2
View File
@@ -16,6 +16,7 @@ import engine.objects.AbstractGameObject;
import engine.objects.Building;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import engine.workthreads.HalfHourlyJobThread;
import engine.workthreads.HourlyJobThread;
/**
@@ -41,10 +42,10 @@ public class MineActiveCmd extends AbstractDevCmd {
String trigger = args[0];
switch (trigger) {
case "true":
HourlyJobThread.mineWindowOpen(mine);
HalfHourlyJobThread.mineWindowOpen(mine);
break;
case "false":
HourlyJobThread.mineWindowClose(mine);
HalfHourlyJobThread.mineWindowClose(mine);
break;
default:
this.sendUsage(pcSender);
@@ -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
+25 -3
View File
@@ -10,6 +10,8 @@ import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
public class SimulateBootyCmd extends AbstractDevCmd {
public int simCount = 250;
public SimulateBootyCmd() {
super("bootysim");
}
@@ -25,7 +27,15 @@ public class SimulateBootyCmd extends AbstractDevCmd {
String output;
output = "Booty Simulation:" + newline;
try
{
simCount = Integer.parseInt(words[0]);
}catch(Exception e)
{
}
output = "Booty Simulation: Rolls:" + simCount + newline;
Mob mob = (Mob) target;
output += "Name: " + mob.getName() + newline;
@@ -44,6 +54,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
ArrayList<Item> Resources = new ArrayList<Item>();
ArrayList<Item> Runes = new ArrayList<Item>();
ArrayList<Item> Contracts = new ArrayList<Item>();
ArrayList<Item> GuardContracts = new ArrayList<Item>();
ArrayList<Item> Offerings = new ArrayList<Item>();
ArrayList<Item> OtherDrops = new ArrayList<Item>();
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
@@ -51,14 +62,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
int failures = 0;
int goldAmount = 0;
for (int i = 0; i < 100; ++i) {
for (int i = 0; i < simCount; ++i) {
try {
mob.loadInventory();
for (Item lootItem : mob.getCharItemManager().getInventory()) {
switch (lootItem.getItemBase().getType()) {
case CONTRACT: //CONTRACT
Contracts.add(lootItem);
if(lootItem.getName().contains("Captain"))
GuardContracts.add(lootItem);
else
Contracts.add(lootItem);
break;
case OFFERING: //OFFERING
Offerings.add(lootItem);
@@ -130,9 +144,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
}
}
int baseBound = 100000;
int levelPenalty = (int) (Math.max(0, Math.abs(50 - mob.level)) * 0.01 * 100000);
int totalRange = baseBound + levelPenalty;
if(mob.level >= 50){
totalRange = baseBound;
}
output += "TOTAL ROLL POTENTIAL: " + totalRange + newline;
output += "GLASS DROPS: " + GlassItems.size() + newline;
output += "RUNE DROPS: " + Runes.size() + newline;
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
output += "GUARD CONTRACTS DROPS: " + GuardContracts.size() + newline;
output += "RESOURCE DROPS: " + Resources.size() + newline;
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
@@ -1,87 +0,0 @@
# Account Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbAccountHandler` class. The account handler manages user authentication and account-related data in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbAccountHandler.java`
**Class:** `dbAccountHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Account Table
- **Table Name:** `obj_account`
- **Description:** Core account information including login credentials, status, and account details
- **Columns:**
- UID (Primary Key)
- username
- password
- email
- accountStatus
- lastLogin
- creationDate
- isBanned
- banReason
- isDeleted
- deletedDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_account_wipe` | Account wipe history records | AccountID → obj_account.UID |
| `dyn_login_history` | Login attempt and session history | AccountID → obj_account.UID |
## Key Queries
### Get Account by ID
```sql
SELECT * FROM `obj_account` WHERE `UID`=?
```
**File:** `dbAccountHandler.java`, Line ~60
### Get Account by Username
```sql
SELECT * FROM `obj_account` WHERE `username`=?
```
**File:** `dbAccountHandler.java`, Line ~85
### Create New Account
```sql
INSERT INTO `obj_account` (`username`, `password`, `email`, `accountStatus`, `creationDate`) VALUES (?, ?, ?, ?, ?)
```
**File:** `dbAccountHandler.java`, Line ~105
### Update Account Status
```sql
UPDATE `obj_account` SET `accountStatus`=?, `lastLogin`=? WHERE `UID`=?
```
**File:** `dbAccountHandler.java`, Line ~132
### Check Username Availability
```sql
SELECT `username` FROM `obj_account` WHERE `username`=?
```
**File:** `dbAccountHandler.java`, Line ~158
## Relationships
1. **Account to Character:** One-to-many (via `obj_character.accountID` field)
2. **Account to Account Wipe History:** One-to-many (via `obj_account_wipe.AccountID`)
3. **Account to Login History:** One-to-many (via `dyn_login_history.AccountID`)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `username` | `obj_account.username` | Unique account username |
| `password` | `obj_account.password` | Encrypted password |
| `email` | `obj_account.email` | Account email address |
| `accountStatus` | `obj_account.accountStatus` | Current account status |
| `lastLogin` | `obj_account.lastLogin` | Timestamp of last login |
| `creationDate` | `obj_account.creationDate` | Account creation date |
| `isBanned` | `obj_account.isBanned` | Boolean flag for banned status |
| `banReason` | `obj_account.banReason` | Reason for ban |
| `isDeleted` | `obj_account.isDeleted` | Boolean flag for deleted status |
| `deletedDate` | `obj_account.deletedDate` | Timestamp of deletion |
@@ -1,63 +0,0 @@
# dbBaneHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBaneHandler` class. The bane handler manages special objects in cities that have specific properties and behaviors, including their ownership, location, and time-based effects.
## Handler Class
**File:** `src/engine/db/handlers/dbBaneHandler.java`
**Class:** `dbBaneHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Bane Table
- **Table Name:** `dyn_banes`
- **Description:** Stores information about bane objects placed in cities, including their owner, location, and time-based properties
- **Columns:**
- cityUUID (Primary Key)
- ownerUUID
- stoneUUID
- placementDate
- liveDate
## Key Queries
### CREATE_BANE
```sql
INSERT INTO `dyn_banes` (`cityUUID`, `ownerUUID`, `stoneUUID`, `placementDate`) VALUES(?,?,?,?)
```
**File:** `dbBaneHandler.java`, Line ~17
### LOAD_BANE
```sql
SELECT * FROM `dyn_banes` WHERE `dyn_banes`.`cityUUID` = ?
```
**File:** `dbBaneHandler.java`, Line ~30
### SET_BANE_TIME
```sql
UPDATE `dyn_banes` SET `liveDate`=? WHERE `cityUUID`=?
```
**File:** `dbBaneHandler.java`, Line ~45
### REMOVE_BANE
```sql
DELETE FROM `dyn_banes` WHERE `cityUUID` = ?
```
**File:** `dbBaneHandler.java`, Line ~57
## Relationships
1. **Bane to City:** One-to-one relationship via cityUUID (primary key) referencing obj_city.UID
2. **Bane to Owner:** Many-to-one relationship via ownerUUID referencing obj_character.UID
3. **Bane to Stone:** Many-to-one relationship via stoneUUID referencing obj_building.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `cityUUID` | `dyn_banes.cityUUID` | Unique identifier for the city where bane is placed |
| `ownerUUID` | `dyn_banes.ownerUUID` | Character UID of the owner of this bane |
| `stoneUUID` | `dyn_banes.stoneUUID` | Building UID of the stone used to create this bane |
| `placementDate` | `dyn_banes.placementDate` | Timestamp when bane was placed |
| `liveDate` | `dyn_banes.liveDate` | Timestamp for when bane becomes active |
@@ -1,73 +0,0 @@
# dbBaseClassHandler Documentation
## Overview
The `dbBaseClassHandler` is responsible for managing base class data in the Magicbane database. Base classes represent fundamental character classifications that define core attributes and capabilities. This handler manages retrieval of base class information, including fetching specific base classes by ID, retrieving base classes associated with a particular race, and getting all available base classes.
## Database Table Structure
### Table: `static_rune_baseclass`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| ID | int unsigned | NO | PRIMARY | Unique identifier for the base class |
| name | varchar(45) | NO | | Name of the base class |
| description | varchar(200) | NO | | Description of the base class |
| strMod | tinyint | NO | | Strength modifier for this base class |
| dexMod | tinyint | NO | | Dexterity modifier for this base class |
| conMod | tinyint | NO | | Constitution modifier for this base class |
| intMod | tinyint | NO | | Intelligence modifier for this base class |
| wisMod | tinyint | NO | | Wisdom modifier for this base class |
| chaMod | tinyint | NO | | Charisma modifier for this base class |
| healthMod | tinyint | NO | | Health modifier for this base class |
| manaMod | tinyint | NO | | Mana modifier for this base class |
| staminaMod | tinyint | NO | | Stamina modifier for this base class |
### Table: `static_rune_racebaseclass`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| ID | int unsigned | NO | PRIMARY | Unique identifier for the relationship |
| RaceID | int unsigned | NO | FOREIGN KEY | Reference to race in `static_rune_race` |
| BaseClassID | int unsigned | NO | FOREIGN KEY | Reference to base class in `static_rune_baseclass` |
## Java Field to Database Column Mapping
| Java Field | Database Column | Type | Description |
|------------|-----------------|------|-------------|
| baseClass.getId() | ID | int unsigned | Base class unique identifier |
| baseClass.getName() | name | varchar(45) | Base class name |
| baseClass.getDescription() | description | varchar(200) | Base class description |
| baseClass.getStrMod() | strMod | tinyint | Strength modifier |
| baseClass.getDexMod() | dexMod | tinyint | Dexterity modifier |
| baseClass.getConMod() | conMod | tinyint | Constitution modifier |
| baseClass.getIntMod() | intMod | tinyint | Intelligence modifier |
| baseClass.getWisMod() | wisMod | tinyint | Wisdom modifier |
| baseClass.getChaMod() | chaMod | tinyint | Charisma modifier |
| baseClass.getHealthMod() | healthMod | tinyint | Health modifier |
| baseClass.getManaMod() | manaMod | tinyint | Mana modifier |
| baseClass.getStaminaMod() | staminaMod | tinyint | Stamina modifier |
## Key Queries
### GET_BASE_CLASS
- **Query**: `SELECT * FROM \`static_rune_baseclass\` WHERE \`ID\`=?`
- **Parameter**: id (base class ID)
- **Note**: Fixed from original bug - was selecting from obj_account table instead of static_rune_baseclass
### GET_BASECLASS_FOR_RACE
- **Query**: `SELECT b.* FROM \`static_rune_baseclass\` b, \`static_rune_racebaseclass\` r WHERE b.\`ID\` = r.\`BaseClassID\` && r.\`RaceID\` = ?`
- **Parameter**: id (race ID)
### GET_ALL_BASE_CLASSES
- **Query**: `SELECT * FROM \`static_rune_baseclass\`;`
- **Note**: Returns all base classes from the static table
## Relationships
### Foreign Key Relationships
- `static_rune_racebaseclass.BaseClassID` references `static_rune_baseclass.ID`
- `static_rune_racebaseclass.RaceID` references `static_rune_race.ID`
### Associated Objects
- **BaseClass**: Core character classification data
- **Race**: Associated races that can use specific base classes (via `static_rune_racebaseclass`)
@@ -1,119 +0,0 @@
# dbBlueprintHandler Documentation
## Overview
The `dbBlueprintHandler` is responsible for managing building blueprint data and door number mappings in the Magicbane database. This handler loads blueprint information used for building construction and handles door mesh-to-number mappings.
## Database Table Structure
### Table: `static_building_blueprint`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| Rank0UUID | bigint unsigned | NO | PRIMARY | Unique identifier for the blueprint (rank 0) |
| MeshName | varchar(100) | NO | | Name of the mesh used for the building |
| BuildingGroup | enum | NO | | Group classification of the building type |
| MaintGroup | varchar(45) | YES | | Maintenance group associated with the building |
| Rank1UUID | bigint unsigned | YES | | UUID for rank 1 upgrade |
| Rank2UUID | bigint unsigned | YES | | UUID for rank 2 upgrade |
| Rank3UUID | bigint unsigned | YES | | UUID for rank 3 upgrade |
| Rank4UUID | bigint unsigned | YES | | UUID for rank 4 upgrade |
| Rank5UUID | bigint unsigned | YES | | UUID for rank 5 upgrade |
| Rank6UUID | bigint unsigned | YES | | UUID for rank 6 upgrade |
| Rank7UUID | bigint unsigned | YES | | UUID for rank 7 upgrade |
| UpgradeCost | int | YES | | Cost to upgrade the building |
| UpgradeTime | int | YES | | Time required to upgrade the building |
| MaxHP | int | YES | | Maximum hit points of the building |
| MaxGold | int | YES | | Maximum gold storage capacity |
| MaxLevel | int | YES | | Maximum level for this building |
| MaxRank | int | YES | | Maximum rank for this building |
| MinLevel | int | YES | | Minimum level required to build |
| Scale | float | YES | | Scale factor for the building mesh |
| SizeX | float | YES | | X dimension size |
| SizeY | float | YES | | Y dimension size |
| SizeZ | float | YES | | Z dimension size |
| DoorCount | int | YES | | Number of doors in this building |
| MaxDoorCount | int | YES | | Maximum number of doors allowed |
| IsWall | tinyint(1) | YES | | Flag indicating if building is a wall |
| IsGate | tinyint(1) | YES | | Flag indicating if building is a gate |
| IsTower | tinyint(1) | YES | | Flag indicating if building is a tower |
| IsKeep | tinyint(1) | YES | | Flag indicating if building is a keep |
| IsFortress | tinyint(1) | YES | | Flag indicating if building is a fortress |
| IsCastle | tinyint(1) | YES | | Flag indicating if building is a castle |
| IsBarracks | tinyint(1) | YES | | Flag indicating if building is barracks |
| IsChurch | tinyint(1) | YES | | Flag indicating if building is a church |
| IsForge | tinyint(1) | YES | | Flag indicating if building is a forge |
| IsSpire | tinyint(1) | YES | | Flag indicating if building is a spire |
| IsShrine | tinyint(1) | YES | | Flag indicating if building is a shrine |
| IsRunegate | tinyint(1) | YES | | Flag indicating if building is a runegate |
| IsMine | tinyint(1) | YES | | Flag indicating if building is a mine |
| IsWarehouse | tinyint(1) | YES | | Flag indicating if building is a warehouse |
### Table: `static_building_doors`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| doorMeshUUID | int | NO | PRIMARY | Unique identifier for the door mesh |
| doorNumber | int | NO | | Door number associated with this mesh |
## Java Field to Database Column Mapping
| Java Field | Database Column | Type | Description |
|------------|-----------------|------|-------------|
| blueprint.getBlueprintUUID() | Rank0UUID | bigint unsigned | Blueprint unique identifier |
| blueprint.getMeshName() | MeshName | varchar(100) | Name of the building mesh |
| blueprint.getBuildingGroup() | BuildingGroup | enum | Group classification of the building |
| blueprint.getMaintGroup() | MaintGroup | varchar(45) | Maintenance group for this building |
| blueprint.getRank1UUID() | Rank1UUID | bigint unsigned | UUID for rank 1 upgrade |
| blueprint.getRank2UUID() | Rank2UUID | bigint unsigned | UUID for rank 2 upgrade |
| blueprint.getRank3UUID() | Rank3UUID | bigint unsigned | UUID for rank 3 upgrade |
| blueprint.getRank4UUID() | Rank4UUID | bigint unsigned | UUID for rank 4 upgrade |
| blueprint.getRank5UUID() | Rank5UUID | bigint unsigned | UUID for rank 5 upgrade |
| blueprint.getRank6UUID() | Rank6UUID | bigint unsigned | UUID for rank 6 upgrade |
| blueprint.getRank7UUID() | Rank7UUID | bigint unsigned | UUID for rank 7 upgrade |
| blueprint.getUpgradeCost() | UpgradeCost | int | Cost to upgrade the building |
| blueprint.getUpgradeTime() | UpgradeTime | int | Time required to upgrade |
| blueprint.getMaxHP() | MaxHP | int | Maximum hit points |
| blueprint.getMaxGold() | MaxGold | int | Maximum gold storage |
| blueprint.getMaxLevel() | MaxLevel | int | Maximum level for this building |
| blueprint.getMaxRank() | MaxRank | int | Maximum rank |
| blueprint.getMinLevel() | MinLevel | int | Minimum level required |
| blueprint.getScale() | Scale | float | Scale factor for mesh |
| blueprint.getSizeX() | SizeX | float | X dimension size |
| blueprint.getSizeY() | SizeY | float | Y dimension size |
| blueprint.getSizeZ() | SizeZ | float | Z dimension size |
| blueprint.getDoorCount() | DoorCount | int | Number of doors |
| blueprint.getMaxDoorCount() | MaxDoorCount | int | Maximum number of doors |
| blueprint.getIsWall() | IsWall | tinyint(1) | Wall flag |
| blueprint.getIsGate() | IsGate | tinyint(1) | Gate flag |
| blueprint.getIsTower() | IsTower | tinyint(1) | Tower flag |
| blueprint.getIsKeep() | IsKeep | tinyint(1) | Keep flag |
| blueprint.getIsFortress() | IsFortress | tinyint(1) | Fortress flag |
| blueprint.getIsCastle() | IsCastle | tinyint(1) | Castle flag |
| blueprint.getIsBarracks() | IsBarracks | tinyint(1) | Barracks flag |
| blueprint.getIsChurch() | IsChurch | tinyint(1) | Church flag |
| blueprint.getIsForge() | IsForge | tinyint(1) | Forge flag |
| blueprint.getIsSpire() | IsSpire | tinyint(1) | Spire flag |
| blueprint.getIsShrine() | IsShrine | tinyint(1) | Shrine flag |
| blueprint.getIsRunegate() | IsRunegate | tinyint(1) | Runegate flag |
| blueprint.getIsMine() | IsMine | tinyint(1) | Mine flag |
| blueprint.getIsWarehouse() | IsWarehouse | tinyint(1) | Warehouse flag |
## Key Queries
### LOAD_ALL_DOOR_NUMBERS
- **Query**: `SELECT * FROM static_building_doors ORDER BY doorMeshUUID ASC`
- **Note**: Loads all door mesh-to-number mappings for building doors
### LOAD_ALL_BLUEPRINTS
- **Query**: `SELECT * FROM static_building_blueprint`
- **Note**: Loads all blueprint definitions for buildings
## Relationships
### Foreign Key Relationships
- None explicitly defined in the handler code (these are likely static lookup tables)
### Associated Objects
- **Blueprint**: Building construction data with mesh information and upgrade paths
- **Door**: Door mesh mappings used for building construction
@@ -1,43 +0,0 @@
# Boon Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBoonHandler` class. The boon system in Magicbane is used to manage item bonuses and enhancements that are associated with specific item bases.
## Handler Class
**File:** `src/engine/db/handlers/dbBoonHandler.java`
**Class:** `dbBoonHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Boon Table
- **Table Name:** `static_item_boons`
- **Description:** Contains information about boons (bonuses/enhancements) that can be applied to item bases
- **Columns:**
- UID (Primary Key)
- itemBaseID (Foreign Key to obj_itembase)
- boonType
- boonValue
- boonLevel
## Key Queries
### Get Boon Amounts for Item Base
```sql
SELECT * FROM `static_item_boons` WHERE `itemBaseID` = ?
```
**File:** `dbBoonHandler.java`, Line ~28
## Relationships
1. **Item Base to Boons:** One-to-many relationship where each item base can have multiple boons associated with it
- Foreign key: `static_item_boons.itemBaseID` references `obj_itembase.UID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `itemBaseID` | `static_item_boons.itemBaseID` | References the item base this boon belongs to |
| `boonType` | `static_item_boons.boonType` | Type of boon (e.g., damage, defense) |
| `boonValue` | `static_item_boons.boonValue` | Value of the boon |
| `boonLevel` | `static_item_boons.boonLevel` | Level of the boon |
@@ -1,98 +0,0 @@
# Building Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBuildingHandler` class. The building handler manages all aspects of building objects in Magicbane, including creation, modification, deletion, and various properties like health, protection state, and ownership.
## Handler Class
**File:** `src/engine/db/handlers/dbBuildingHandler.java`
**Class:** `dbBuildingHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Building Table
- **Table Name:** `obj_building`
- **Description:** Core building information including location, mesh, health, and ownership details
- **Columns:**
- UID (Primary Key)
- parent (Foreign Key to obj_zone)
- ownerUUID (Foreign Key to obj_character)
- name
- meshUUID (Foreign Key to static_building_mesh)
- locX, locY, locZ (Location coordinates)
- meshScale
- currentHP
- protectionState
- currentGold
- rank
- upgradeDate
- blueprintUUID (Foreign Key to static_building_blueprint)
- w, rotY (Rotation data)
- isDeleted
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_building_friendslist` | Stores friends that can access this building | BuildingID → obj_building.UID |
| `dyn_building_condemnedlist` | Stores characters/guilds marked as condemned for this building | BuildingID → obj_building.UID |
| `dyn_building_patrolpoints` | Stores patrol points for building guards | BuildingID → obj_building.UID |
| `dyn_building_regions` | Stores region information for buildings | BuildingID → obj_building.UID |
## Key Queries
### Create Building (Stored Procedure)
```sql
CALL `building_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbBuildingHandler.java`, Line ~38
### Get All Buildings for Zone
```sql
SELECT * FROM `obj_building` WHERE `parent` = ?
```
**File:** `dbBuildingHandler.java`, Line ~91
### Get Building by UUID
```sql
SELECT * FROM `obj_building` WHERE `UID` = ?
```
**File:** `dbBuildingHandler.java`, Line ~110
### Get Building by Mesh
```sql
SELECT * FROM `obj_building` WHERE `meshUUID` = ?
```
**File:** `dbBuildingHandler.java`, Line ~135
## Relationships
1. **Building to Zone:** Many-to-one relationship through `obj_building.parent` field
2. **Building to Owner:** Many-to-one relationship through `obj_building.ownerUUID` field (references obj_character.UID)
3. **Building to Blueprint:** Many-to-one relationship through `obj_building.blueprintUUID` field (references static_building_blueprint.Rank0UUID)
4. **Building to Mesh:** Many-to-one relationship through `obj_building.meshUUID` field (references static_building_mesh.UID)
5. **Building to Friends List:** One-to-many relationship through `dyn_building_friendslist.BuildingID`
6. **Building to Condemned List:** One-to-many relationship through `dyn_building_condemnedlist.BuildingID`
7. **Building to Patrol Points:** One-to-many relationship through `dyn_building_patrolpoints.BuildingID`
8. **Building to Regions:** One-to-many relationship through `dyn_building_regions.BuildingID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `parent` | `obj_building.parent` | Zone parent ID |
| `ownerUUID` | `obj_building.ownerUUID` | Owner character UID |
| `name` | `obj_building.name` | Building name |
| `meshUUID` | `obj_building.meshUUID` | Mesh identifier |
| `locX` | `obj_building.locX` | X coordinate |
| `locY` | `obj_building.locY` | Y coordinate |
| `locZ` | `obj_building.locZ` | Z coordinate |
| `meshScale` | `obj_building.meshScale` | Scale of mesh |
| `currentHP` | `obj_building.currentHP` | Current health points |
| `protectionState` | `obj_building.protectionState` | Protection state |
| `currentGold` | `obj_building.currentGold` | Current gold amount |
| `rank` | `obj_building.rank` | Building rank |
| `upgradeDate` | `obj_building.upgradeDate` | Upgrade timestamp |
| `blueprintUUID` | `obj_building.blueprintUUID` | Blueprint identifier |
| `w` | `obj_building.w` | Rotation data |
| `rotY` | `obj_building.rotY` | Y rotation angle |
@@ -1,61 +0,0 @@
# Building Location Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBuildingLocationHandler` class. This handler manages building location data, specifically loading locations for buildings based on type and slot.
## Handler Class
**File:** `src/engine/db/handlers/dbBuildingLocationHandler.java`
**Class:** `dbBuildingLocationHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `static_building_location`
- **Description:** Stores location data for building components including position and rotation information
- **Columns:**
- ID (Primary Key)
- BuildingID
- type
- slot
- unknown
- locX
- locY
- locZ
- w
- rotX
- rotY
- rotZ
## Key Queries
### Load Building Locations
```sql
SELECT `ID`, `BuildingID`, `type`, `slot`, `unknown`, `locX`, `locY`, `locZ`, `w`, `rotX`, `rotY`, `rotZ`
FROM static_building_location
WHERE type = 6 OR type = 8
GROUP BY buildingID, slot
ORDER BY buildingID, slot ASC;
```
**File:** `dbBuildingLocationHandler.java`, Line ~17
## Relationships
1. **Building Location to Building:** Many-to-one relationship via `BuildingID` field referencing `obj_building.UID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `id` | `static_building_location.ID` | Unique identifier |
| `buildingID` | `static_building_location.BuildingID` | Reference to building |
| `type` | `static_building_location.type` | Location type |
| `slot` | `static_building_location.slot` | Slot number |
| `unknown` | `static_building_location.unknown` | Unknown field |
| `locX` | `static_building_location.locX` | X coordinate |
| `locY` | `static_building_location.locY` | Y coordinate |
| `locZ` | `static_building_location.locZ` | Z coordinate |
| `w` | `static_building_location.w` | W rotation value |
| `rotX` | `static_building_location.rotX` | X rotation |
| `rotY` | `static_building_location.rotY` | Y rotation |
| `rotZ` | `static_building_location.rotZ` | Z rotation |
@@ -1,77 +0,0 @@
# dbCSSessionHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCSSessionHandler` class. The session handler manages user login sessions, tracking account activity, character associations, and session-based authentication.
## Handler Class
**File:** `src/engine/db/handlers/dbCSSessionHandler.java`
**Class:** `dbCSSessionHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Session Table
- **Table Name:** `dyn_cs_session`
- **Description:** Stores information about active and inactive user sessions, including account associations and character details
- **Columns:**
- UID (Primary Key)
- accountID
- characterID
- sessionKey
- lastLoginDate
- lastLogoutDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_account` | Accounts associated with sessions | accountID → obj_account.UID |
| `obj_character` | Characters associated with sessions | characterID → obj_character.UID |
## Key Queries
### Create Session
```sql
INSERT INTO `dyn_cs_session` (`accountID`, `characterID`, `sessionKey`, `lastLoginDate`) VALUES(?,?,?,?)
```
**File:** `dbCSSessionHandler.java`, Line ~35
### Load Session by Account
```sql
SELECT * FROM `dyn_cs_session` WHERE `accountID` = ?
```
**File:** `dbCSSessionHandler.java`, Line ~50
### Load Session by Character
```sql
SELECT * FROM `dyn_cs_session` WHERE `characterID` = ?
```
**File:** `dbCSSessionHandler.java`, Line ~65
### Update Session Last Login
```sql
UPDATE `dyn_cs_session` SET `lastLoginDate`=? WHERE `UID`=?
```
**File:** `dbCSSessionHandler.java`, Line ~80
### Update Session Last Logout
```sql
UPDATE `dyn_cs_session` SET `lastLogoutDate`=? WHERE `UID`=?
```
**File:** `dbCSSessionHandler.java`, Line ~95
## Relationships
1. **Session to Account:** Many-to-one relationship via accountID field referencing obj_account.UID
2. **Session to Character:** Many-to-one relationship via characterID field referencing obj_character.UID
3. **Session to Login History:** One-to-many relationship via session UID (via dyn_login_history table)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `accountID` | `dyn_cs_session.accountID` | Account UID associated with this session |
| `characterID` | `dyn_cs_session.characterID` | Character UID associated with this session |
| `sessionKey` | `dyn_cs_session.sessionKey` | Session identifier for authentication |
| `lastLoginDate` | `dyn_cs_session.lastLoginDate` | Timestamp of last login |
| `lastLogoutDate` | `dyn_cs_session.lastLogoutDate` | Timestamp of last logout |
@@ -1,71 +0,0 @@
# Character Power Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCharacterPowerHandler` class. This handler manages character power data, including adding, deleting, retrieving, and updating character powers.
## Handler Class
**File:** `src/engine/db/handlers/dbCharacterPowerHandler.java`
**Class:** `dbCharacterPowerHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `dyn_character_power`
- **Description:** Stores dynamic power information for characters including power token, character ID, and training levels
- **Columns:**
- UID (Primary Key)
- CharacterID
- powersBaseToken
- trains
## Key Queries
### Add Character Power
```sql
INSERT INTO `dyn_character_power` (`CharacterID`, `powersBaseToken`, `trains`) VALUES (?, ?, ?);
```
**File:** `dbCharacterPowerHandler.java`, Line ~20
### Delete Character Power
```sql
DELETE FROM `dyn_character_power` WHERE `UID` = ?
```
**File:** `dbCharacterPowerHandler.java`, Line ~41
### Get Character Power by ID
```sql
SELECT * FROM `dyn_character_power` WHERE `UID` = ?
```
**File:** `dbCharacterPowerHandler.java`, Line ~57
### Get All Powers for Character
```sql
SELECT * FROM `dyn_character_power` WHERE CharacterID = ?
```
**File:** `dbCharacterPowerHandler.java`, Line ~76
### Update Trains
```sql
UPDATE `dyn_character_power` SET `trains`=? WHERE `UID`=?
```
**File:** `dbCharacterPowerHandler.java`, Line ~98
### Update Database
```sql
UPDATE `dyn_character_power` SET `PowersBaseToken`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?
```
**File:** `dbCharacterPowerHandler.java`, Line ~115
## Relationships
1. **Character Power to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
2. **Character Power to Power Base:** Many-to-one relationship via `powersBaseToken` field referencing `static_powers_base.token`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `characterID` | `dyn_character_power.CharacterID` | Reference to character |
| `powerToken` | `dyn_character_power.powersBaseToken` | Reference to power base |
| `trains` | `dyn_character_power.trains` | Training level |
@@ -1,63 +0,0 @@
# Character Rune Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCharacterRuneHandler` class. This handler manages character rune data, including adding, retrieving, deleting, and updating character runes.
## Handler Class
**File:** `src/engine/db/handlers/dbCharacterRuneHandler.java`
**Class:** `dbCharacterRuneHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `dyn_character_rune`
- **Description:** Stores dynamic rune information for characters including character ID and rune base ID
- **Columns:**
- UID (Primary Key)
- CharacterID
- RuneBaseID
## Key Queries
### Add Character Rune
```sql
INSERT INTO `dyn_character_rune` (`CharacterID`, `RuneBaseID`) VALUES (?, ?);
```
**File:** `dbCharacterRuneHandler.java`, Line ~20
### Get Character Rune by ID
```sql
SELECT * FROM `dyn_character_rune` WHERE `UID`=?
```
**File:** `dbCharacterRuneHandler.java`, Line ~43
### Delete Character Rune
```sql
DELETE FROM `dyn_character_rune` WHERE `UID`=?;
```
**File:** `dbCharacterRuneHandler.java`, Line ~61
### Get All Runes for Character
```sql
SELECT * FROM `dyn_character_rune` WHERE `CharacterID` = ?
```
**File:** `dbCharacterRuneHandler.java`, Line ~74
### Update Database
```sql
UPDATE `dyn_character_rune` SET `CharacterID`=?, `RuneBaseID`=? WHERE `UID` = ?
```
**File:** `dbCharacterRuneHandler.java`, Line ~91
## Relationships
1. **Character Rune to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
2. **Character Rune to Rune Base:** Many-to-one relationship via `RuneBaseID` field referencing `static_rune_base.ID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `playerID` | `dyn_character_rune.CharacterID` | Reference to character |
| `runeBaseID` | `dyn_character_rune.RuneBaseID` | Reference to rune base |
@@ -1,71 +0,0 @@
# Character Skill Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCharacterSkillHandler` class. This handler manages character skill data, including adding, deleting, retrieving, and updating character skills.
## Handler Class
**File:** `src/engine/db/handlers/dbCharacterSkillHandler.java`
**Class:** `dbCharacterSkillHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `dyn_character_skill`
- **Description:** Stores dynamic skill information for characters including skill base ID, character ID, and training levels
- **Columns:**
- UID (Primary Key)
- CharacterID
- skillsBaseID
- trains
## Key Queries
### Add Skill
```sql
INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);
```
**File:** `dbCharacterSkillHandler.java`, Line ~20
### Delete Skill
```sql
DELETE FROM `dyn_character_skill` WHERE `UID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~43
### Get Skill by ID
```sql
SELECT * FROM `dyn_character_skill` WHERE `UID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~59
### Get All Skills for Character
```sql
SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~80
### Update Trains
```sql
UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~104
### Update Database
```sql
UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?
```
**File:** `dbCharacterSkillHandler.java`, Line ~123
## Relationships
1. **Character Skill to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
2. **Character Skill to Skill Base:** Many-to-one relationship via `skillsBaseID` field referencing `static_skills_base.ID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `characterID` | `dyn_character_skill.CharacterID` | Reference to character |
| `skillBaseID` | `dyn_character_skill.skillsBaseID` | Reference to skill base |
| `trains` | `dyn_character_skill.trains` | Training level |
@@ -1,97 +0,0 @@
# City Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCityHandler` class. The city handler manages city-related data including city creation, zone information, and building structures within the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbCityHandler.java`
**Class:** `dbCityHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main City Table
- **Table Name:** `obj_city`
- **Description:** Core city information including name, motto, and metadata
- **Columns:**
- UID (Primary Key)
- name
- motto
- treeOfLifeUUID
- established
- realmTaxDate
- population
- siegesWithstood
- isNpc
- isCapital
- isNoobIsle
- bindX
- bindZ
- bindRadius
- radiusType
- forceRename
- open
- hash
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_zone` | Zone information within cities | CityID → obj_city.UID |
| `obj_building` | Building information within zones | ZoneID → obj_zone.UID |
| `object` | Base object table that links to obj_city | UID → obj_city.UID |
## Key Queries
### Load City Data
```sql
SELECT * FROM `object` o
JOIN `obj_city` c ON o.`UID` = c.`UID`
WHERE o.`type` = 'city' AND o.`parent` = ?
```
**File:** `dbCityHandler.java`, Line ~45
### Load Zones for City
```sql
SELECT * FROM `object` o
JOIN `obj_zone` z ON o.`UID` = z.`UID`
WHERE o.`type` = 'zone' AND o.`parent` = ?
```
**File:** `dbCityHandler.java`, Line ~60
### Load Buildings for Zone
```sql
SELECT * FROM `object` o
JOIN `obj_building` b ON o.`UID` = b.`UID`
WHERE o.`type` = 'building' AND o.`parent` = ?
```
**File:** `dbCityHandler.java`, Line ~75
### Create New City
```sql
CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbCityHandler.java`, Line ~90
## Relationships
1. **City to Object:** One-to-one (City is a type of object)
2. **Zone to City:** Many-to-one (Multiple zones per city)
3. **Building to Zone:** Many-to-one (Multiple buildings per zone)
4. **City to Zones:** One-to-many (via `obj_zone.parent` field)
5. **Zone to Buildings:** One-to-many (via `obj_building.parent` field)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_city.name` | City name |
| `motto` | `obj_city.motto` | City motto |
| `established` | `obj_city.established` | Date established |
| `population` | `obj_city.population` | Population count |
| `isNpc` | `obj_city.isNpc` | NPC flag |
| `bindX` | `obj_city.bindX` | X binding coordinate |
| `bindZ` | `obj_city.bindZ` | Z binding coordinate |
| `bindRadius` | `obj_city.bindRadius` | Binding radius |
| `isCapital` | `obj_city.isCapital` | Capital city flag |
| `isNoobIsle` | `obj_city.isNoobIsle` | Noob island flag |
@@ -1,82 +0,0 @@
# Contract Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbContractHandler` class. This handler manages contract data for NPCs, including loading contracts, their inventory sets, and sell lists.
## Handler Class
**File:** `src/engine/db/handlers/dbContractHandler.java`
**Class:** `dbContractHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `static_npc_contract`
- **Description:** Stores static contract information for NPCs including contract ID, name, mob base ID, class ID, vendor dialog, and icon ID
- **Columns:**
- ID (Primary Key)
- contractID
- name
- mobbaseID
- classID
- vendorDialog
- iconID
- allowedBuildingTypeID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_npc_inventoryset` | Stores inventory items for contracts | inventorySet → static_npc_contract.inventorySet |
| `static_npc_contract_selltype` | Stores sell type information for contracts | contractID → static_npc_contract.ID |
## Key Queries
### Get Contract by ID
```sql
SELECT * FROM `static_npc_contract` WHERE `ID` = ?
```
**File:** `dbContractHandler.java`, Line ~17
### Load Contract Inventory
```sql
SELECT * FROM `static_npc_inventoryset` WHERE `inventorySet` = ?;
```
**File:** `dbContractHandler.java`, Line ~43
### Load Sell List for Contract
```sql
SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;
```
**File:** `dbContractHandler.java`, Line ~65
### Update Allowed Buildings
```sql
UPDATE `static_npc_contract` SET `allowedBuildingTypeID`=? WHERE `contractID`=?
```
**File:** `dbContractHandler.java`, Line ~87
### Update Database
```sql
UPDATE `static_npc_contract` SET `contractID`=?, `name`=?, `mobbaseID`=?, `classID`=?, vendorDialog=?, iconID=?, allowedBuildingTypeID=? WHERE `ID`=?
```
**File:** `dbContractHandler.java`, Line ~100
## Relationships
1. **Contract to Mob Base:** Many-to-one relationship via `mobbaseID` field referencing `obj_mobbase.ID`
2. **Contract to Vendor Dialog:** Many-to-one relationship via `vendorDialog` field referencing `obj_vendor_dialog.UID`
3. **Contract to Inventory Set:** One-to-many relationship via `inventorySet` field
4. **Contract to Sell Types:** One-to-many relationship via `contractID` field
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `contractID` | `static_npc_contract.contractID` | Contract identifier |
| `name` | `static_npc_contract.name` | Contract name |
| `mobbaseID` | `static_npc_contract.mobbaseID` | Reference to mob base |
| `classID` | `static_npc_contract.classID` | Class identifier |
| `vendorDialogID` | `static_npc_contract.vendorDialog` | Reference to vendor dialog |
| `iconID` | `static_npc_contract.iconID` | Icon identifier |
| `allowedBuildings` | `static_npc_contract.allowedBuildingTypeID` | Allowed building types |
@@ -1,57 +0,0 @@
# dbEffectsBaseHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbEffectsBaseHandler` class. This handler manages static data about power effects in Magicbane, including their base properties and modifiers.
## Handler Class
**File:** `src/engine/db/handlers/dbEffectsBaseHandler.java`
**Class:** `dbEffectsBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Effect Base Table
- **Table Name:** `static_power_effectbase`
- **Description:** Core table containing base information about power effects, including names and types
- **Columns:**
- IDString (Primary Key)
- name
- description
- effectType
### Modifier Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_power_effectmod` | Stores modifier properties for effects | EffectBaseID → static_power_effectbase.IDString |
## Key Queries
### Get All Effects Base
```sql
SELECT * FROM static_power_effectbase ORDER BY `IDString` DESC
```
**File:** `dbEffectsBaseHandler.java`, Line ~25
### Get Effect Modifiers
```sql
SELECT * FROM static_power_effectmod WHERE `effectBaseID` = ?
```
**File:** `dbEffectsBaseHandler.java`, Line ~40
## Relationships
1. **Effect Base to Modifiers:** One-to-many relationship via effectBaseID field in static_power_effectmod referencing static_power_effectbase.IDString
2. **Effect Base to Resources Cost:** Many-to-many relationship through static_power_effectcost table
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `IDString` | `static_power_effectbase.IDString` | Unique identifier for the effect |
| `name` | `static_power_effectbase.name` | Display name of the effect |
| `description` | `static_power_effectbase.description` | Description of the effect |
| `effectType` | `static_power_effectbase.effectType` | Type of effect |
| `modType` | `static_power_effectmod.modType` | Modifier type for effect modifiers |
| `modValue` | `static_power_effectmod.modValue` | Value of the modifier |
| `other fields...` | Various columns | Other properties related to effects and modifiers |
@@ -1,40 +0,0 @@
# dbEffectsResourceCostHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbEffectsResourceCostHandler` class. This handler manages the resource costs associated with power effects, including mana, health, and other resource types required to use specific powers.
## Handler Class
**File:** `src/engine/db/handlers/dbEffectsResourceCostHandler.java`
**Class:** `dbEffectsResourceCostHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Resource Cost Table
- **Table Name:** `static_power_effectcost`
- **Description:** Stores resource cost information for power effects, defining what resources are required to use specific effects
- **Columns:**
- IDString (Primary Key)
- resourceType
- resourceAmount
## Key Queries
### Get Resource Cost by Effect ID
```sql
SELECT * FROM static_power_effectcost WHERE `IDString` = ?
```
**File:** `dbEffectsResourceCostHandler.java`, Line ~25
## Relationships
1. **Effect Cost to Effect Base:** Many-to-one relationship via IDString field referencing static_power_effectbase.IDString
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `idString` | `static_power_effectcost.IDString` | Unique identifier linking to effect base |
| `resourceType` | `static_power_effectcost.resourceType` | Type of resource required (mana, health, etc.) |
| `resourceAmount` | `static_power_effectcost.resourceAmount` | Amount of resource required |
| `other fields...` | Various columns | Other properties related to resource costs |
@@ -1,46 +0,0 @@
# dbEnchantmentHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbEnchantmentHandler` class. This handler manages item enchantments, which are special properties applied to items that modify their attributes or provide additional abilities.
## Handler Class
**File:** `src/engine/db/handlers/dbEnchantmentHandler.java`
**Class:** `dbEnchantmentHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Enchantment Table
- **Table Name:** `dyn_item_enchantment`
- **Description:** Stores enchantment information for items, including the type of power action and rank level
- **Columns:**
- itemID (Primary Key)
- powerAction
- rank
## Key Queries
### Get Enchantments by Item ID
```sql
SELECT * FROM dyn_item_enchantment WHERE `itemID` = ?
```
**File:** `dbEnchantmentHandler.java`, Line ~25
### Save Enchantment
```sql
INSERT INTO `dyn_item_enchantment` (`itemID`, `powerAction`, `rank`) VALUES(?,?,?)
```
**File:** `dbEnchantmentHandler.java`, Line ~40
## Relationships
1. **Enchantment to Item:** Many-to-one relationship via itemID field referencing obj_item.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `itemID` | `dyn_item_enchantment.itemID` | Unique identifier for the item |
| `powerAction` | `dyn_item_enchantment.powerAction` | The power action associated with the enchantment |
| `rank` | `dyn_item_enchantment.rank` | The rank or strength level of the enchantment |
| `other fields...` | Various columns | Other properties related to item enchantments |
@@ -1,118 +0,0 @@
# Guild Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbGuildHandler` class. The guild system in Magicbane is complex, involving multiple related tables for managing guilds, their history, alliances, enemies, and member management.
## Handler Class
**File:** `src/engine/db/handlers/dbGuildHandler.java`
**Class:** `dbGuildHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Guild Table
- **Table Name:** `obj_guild`
- **Description:** Core guild information including name, leader, tags, charter, and ownership details
- **Columns:**
- UID (Primary Key)
- name
- leaderUID
- backgroundColor01
- backgroundColor02
- symbolColor
- backgroundDesign
- symbol
- charter
- leadershipType
- motto
- ownedCity
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_character_guildhistory` | Tracks character's guild membership history | CharacterID → obj_character.UID, GuildID → obj_guild.UID |
| `dyn_guild_allianceenemylist` | Stores alliance/enemy relationships between guilds | GuildID → obj_guild.UID, OtherGuildID → obj_guild.UID |
| `dyn_guild_banishlist` | Lists characters banned from guilds | GuildID → obj_guild.UID, CharacterID → obj_character.UID |
| `dyn_guild_characterkoslist` | Stores characters marked as KOS (Kill on Sight) for guilds | GuildID → obj_guild.UID, KOSCharacterID → obj_character.UID |
| `dyn_guild_guildkoslist` | Stores guilds marked as KOS for other guilds | GuildID → obj_guild.UID, KOSGuildID → obj_guild.UID |
| `object` | Base object table that links to obj_guild | UID → obj_guild.UID |
## Key Queries
### Get Guild by ID
```sql
SELECT `obj_guild`.*, `object`.`parent`
FROM `obj_guild`
INNER JOIN `object` ON `object`.`UID` = `obj_guild`.`UID`
WHERE `object`.`UID`=?
```
**File:** `dbGuildHandler.java`, Line ~450
### Get Guild History of Player
```sql
SELECT g.* FROM `obj_guild` g, `dyn_character_guildhistory` l
WHERE g.`UID` = l.`GuildID` && l.`CharacterID` = ?
```
**File:** `dbGuildHandler.java`, Line ~200
### Get Guild Allies
```sql
SELECT g.* FROM `obj_guild` g, `dyn_guild_allianceenemylist` l
WHERE l.isAlliance = 1 && l.OtherGuildID = g.UID && l.GuildID=?
```
**File:** `dbGuildHandler.java`, Line ~230
### Get Guild Enemies
```sql
SELECT g.* FROM `obj_guild` g, `dyn_guild_allianceenemylist` l
WHERE l.isAlliance = 0 && l.OtherGuildID = g.UID && l.GuildID=?
```
**File:** `dbGuildHandler.java`, Line ~253
### Get Guild KOS Characters
```sql
SELECT c.* FROM `obj_character` c, `dyn_guild_characterkoslist` l
WHERE c.`char_isActive` = 1 && l.`KOSCharacterID` = c.`UID` && l.`GuildID`=?
```
**File:** `dbGuildHandler.java`, Line ~273
### Get Guild KOS Guilds
```sql
SELECT g.* FROM `obj_guild` g, `dyn_guild_guildkoslist` l
WHERE l.KOSGuildID = g.UID && l.GuildID = ?
```
**File:** `dbGuildHandler.java`, Line ~295
### Save Guild (Stored Procedure)
```sql
CALL `guild_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbGuildHandler.java`, Line ~483
## Relationships
1. **Guild to Character:** Many-to-many through `obj_character.guildUID` field
2. **Guild to Guild History:** One-to-many (via `dyn_character_guildhistory.GuildID`)
3. **Guild to Alliances/Enemies:** Many-to-many (via `dyn_guild_allianceenemylist`)
4. **Guild to Bans List:** One-to-many (via `dyn_guild_banishlist.GuildID`)
5. **Guild to KOS Characters:** One-to-many (via `dyn_guild_characterkoslist.GuildID`)
6. **Guild to KOS Guilds:** One-to-many (via `dyn_guild_guildkoslist.GuildID`)
7. **Guild to Sub-Guilds:** Parent-child relationship via `object.parent` field
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_guild.name` | Guild name |
| `leaderUID` | `obj_guild.leaderUID` | Leader character UID |
| `backgroundColor01` | `obj_guild.backgroundColor01` | First background color |
| `backgroundColor02` | `obj_guild.backgroundColor02` | Second background color |
| `symbolColor` | `obj_guild.symbolColor` | Symbol color |
| `backgroundDesign` | `obj_guild.backgroundDesign` | Background design ID |
| `symbol` | `obj_guild.symbol` | Guild symbol ID |
| `charter` | `obj_guild.charter` | Charter information |
| `leadershipType` | `obj_guild.leadershipType` | Leadership type |
| `motto` | `obj_guild.motto` | Guild motto |
| `ownedCity` | `obj_guild.ownedCity` | Owned city ID |
@@ -1,42 +0,0 @@
# dbHeightMapHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbHeightMapHandler` class. This handler manages height map data for zones, which is used to determine terrain elevation in the game world.
## Handler Class
**File:** `src/engine/db/handlers/dbHeightMapHandler.java`
**Class:** `dbHeightMapHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Height Map Table
- **Table Name:** `static_zone_heightmap`
- **Description:** Stores raw height map data for zones, representing terrain elevation information
- **Columns:**
- zoneLoadID (Primary Key)
- heightMapData
- width
- height
## Key Queries
### Get Height Map by Zone Load ID
```sql
SELECT * FROM static_zone_heightmap WHERE `zoneLoadID` = ?
```
**File:** `dbHeightMapHandler.java`, Line ~25
## Relationships
1. **Height Map to Zone:** Many-to-one relationship via zoneLoadID field referencing static_zone_load.zoneLoadID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `zoneLoadID` | `static_zone_heightmap.zoneLoadID` | Unique identifier for the zone |
| `heightMapData` | `static_zone_heightmap.heightMapData` | Raw height map data for terrain elevation |
| `width` | `static_zone_size.width` | Width dimension of the zone |
| `height` | `static_zone_size.height` | Height dimension of the zone |
| `other fields...` | Various columns | Other properties related to height maps |
@@ -1,71 +0,0 @@
# dbItemBaseHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbItemBaseHandler` class. This handler manages static item base data, including item properties, stats, and appearance information.
## Handler Class
**File:** `src/engine/db/handlers/dbItemBaseHandler.java`
**Class:** `dbItemBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Item Base Table
- **Table Name:** `static_itembase`
- **Description:** Core table storing base properties of items, including names, descriptions, and appearance settings
- **Columns:**
- UID (Primary Key)
- name
- description
- itemClass
- icon
- mesh
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_item_bakedinstat` | Stores stat information for items | ItemBaseID → static_itembase.UID |
| `static_itembase_animations` | Stores animation settings for items | ItemBaseID → static_itembase.UID |
## Key Queries
### Get Item Base by UID
```sql
SELECT * FROM static_itembase WHERE `UID` = ?
```
**File:** `dbItemBaseHandler.java`, Line ~25
### Get Item Stats
```sql
SELECT * FROM static_item_bakedinstat WHERE `itemBaseID` = ?
```
**File:** `dbItemBaseHandler.java`, Line ~40
### Get Item Animations
```sql
SELECT * FROM static_itembase_animations WHERE `itemBaseID` = ?
```
**File:** `dbItemBaseHandler.java`, Line ~55
## Relationships
1. **Item Base to Stats:** One-to-many relationship via itemBaseID field in static_item_bakedinstat referencing static_itembase.UID
2. **Item Base to Animations:** One-to-many relationship via itemBaseID field in static_itembase_animations referencing static_itembase.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `static_itembase.UID` | Unique identifier for the item |
| `name` | `static_itembase.name` | Name of the item |
| `description` | `static_itembase.description` | Description of the item |
| `itemClass` | `static_itembase.itemClass` | Class of the item |
| `icon` | `static_itembase.icon` | Icon identifier for the item |
| `mesh` | `static_itembase.mesh` | Mesh identifier for the item |
| `fromUse` | `static_item_bakedinstat.fromUse` | Flag indicating if stat is from use |
| `animation` | `static_itembase_animations.animation` | Animation associated with the item |
| `rightHand` | `static_itembase_animations.rightHand` | Flag indicating right hand animation |
| `runeSet` | `static_npc_runeSet.runeSet` | NPC rune set identifier |
| `runeBase` | `static_npc_runeSet.runeBase` | Base rune identifier |
| `other fields...` | Various columns | Other properties related to item base data |
@@ -1,64 +0,0 @@
# dbItemHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbItemHandler` class. This handler manages item data in players' inventories, including item properties, location information, and ownership details.
## Handler Class
**File:** `src/engine/db/handlers/dbItemHandler.java`
**Class:** `dbItemHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Item Table
- **Table Name:** `obj_item`
- **Description:** Stores information about items in player inventories, including location, ownership, and attributes
- **Columns:**
- UID (Primary Key)
- ownerUID
- containerID
- itemBaseID
- item_container
- equipSlot
- flags
- customName
## Key Queries
### Get Item by UID
```sql
SELECT * FROM obj_item WHERE `UID` = ?
```
**File:** `dbItemHandler.java`, Line ~25
### Save Item
```sql
INSERT INTO `obj_item` (`ownerUID`, `containerID`, `itemBaseID`, `item_container`, `equipSlot`, `flags`, `customName`) VALUES(?,?,?,?,?,?,?)
```
**File:** `dbItemHandler.java`, Line ~40
### Get Items by Owner
```sql
SELECT * FROM obj_item WHERE `ownerUID` = ?
```
**File:** `dbItemHandler.java`, Line ~55
## Relationships
1. **Item to Owner:** Many-to-one relationship via ownerUID field referencing obj_character.UID
2. **Item to Container:** Many-to-one relationship via containerID field referencing obj_container.UID
3. **Item to Item Base:** Many-to-one relationship via itemBaseID field referencing static_itembase.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `obj_item.UID` | Unique identifier for the item |
| `ownerUID` | `obj_item.ownerUID` | UID of the character who owns this item |
| `containerID` | `obj_item.containerID` | Container ID where item is stored |
| `itemBaseID` | `obj_item.itemBaseID` | UID of the base item definition |
| `item_container` | `obj_item.item_container` | Container type (inventory, equip, bank, etc.) |
| `equipSlot` | `obj_item.equipSlot` | Slot where item is equipped |
| `flags` | `obj_item.flags` | Item flags for special properties |
| `customName` | `obj_item.customName` | Custom name of the item |
| `other fields...` | Various columns | Other item-specific properties |
@@ -1,54 +0,0 @@
# dbKitHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbKitHandler` class. The kit handler manages static data about game kits, which are predefined sets of items or abilities that players can obtain or use in the game.
## Handler Class
**File:** `src/engine/db/handlers/dbKitHandler.java`
**Class:** `dbKitHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Kit Table
- **Table Name:** `static_rune_validkit`
- **Description:** Stores information about valid kits available in the game, including their properties and restrictions
- **Columns:**
- UID (Primary Key)
- kitName
- description
- raceRestriction
- classRestriction
- itemLimit
- isAvailable
## Key Queries
### GET_ALL_KITS
```sql
SELECT * FROM `static_rune_validkit`
```
**File:** `dbKitHandler.java`, Line ~29
### GET_KIT_BY_NAME
```sql
SELECT * FROM `static_rune_validkit` WHERE `kitName`=?
```
**File:** `dbKitHandler.java`, Line ~45
## Relationships
1. **Kit to Race Restrictions:** Many-to-many relationship through raceRestriction field
2. **Kit to Class Restrictions:** Many-to-many relationship through classRestriction field
3. **Kit to Items:** One-to-many relationship via itemLimit referencing items in the game
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `kitName` | `static_rune_validkit.kitName` | Unique name identifier for the kit |
| `description` | `static_rune_validkit.description` | Description of the kit's purpose and benefits |
| `raceRestriction` | `static_rune_validkit.raceRestriction` | Race restriction for the kit |
| `classRestriction` | `static_rune_validkit.classRestriction` | Class restriction for the kit |
| `itemLimit` | `static_rune_validkit.itemLimit` | Maximum number of items allowed in this kit |
| `isAvailable` | `static_rune_validkit.isAvailable` | Boolean flag indicating if kit is currently available |
@@ -1,91 +0,0 @@
# dbLootHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbLootHandler` class. The loot handler manages static loot tables and item generation data used in the game's loot system, including general tables, item tables, modifier tables, and booty sets.
## Handler Class
**File:** `src/engine/db/handlers/dbLootHandler.java`
**Class:** `dbLootHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Tables
- **Table Name:** `static_loot_gen`
- **Description:** Stores general loot table entries for item generation
- **Columns:**
- genTable (Primary Key)
- itemID
- weight
- minLevel
- maxLevel
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_loot_item` | Stores item-specific loot table entries | One-to-many with genTable |
| `static_loot_mod` | Stores modifier information for loot items | One-to-many with modTable |
| `static_loot_modtype` | Defines modifier types used in loot systems | One-to-many with modType |
| `static_loot_bootySet` | Stores booty set definitions for loot generation | One-to-many with bootySet |
## Key Queries
### LOAD_GEN_ITEM_TABLES
```sql
SELECT * FROM `static_loot_gen`
```
**File:** `dbLootHandler.java`, Line ~32
### LOAD_ITEM_TABLES
```sql
SELECT * FROM `static_loot_item`
```
**File:** `dbLootHandler.java`, Line ~64
### LOAD_MOD_TABLES
```sql
SELECT * FROM `static_loot_mod`
```
**File:** `dbLootHandler.java`, Line ~96
### LOAD_MOD_TYPE_TABLES
```sql
SELECT * FROM `static_loot_modtype`
```
**File:** `dbLootHandler.java`, Line ~128
### LOAD_BOOTY_TABLES
```sql
SELECT * FROM static_loot_bootySet
```
**File:** `dbLootHandler.java`, Line ~160
### LOAD_ENCHANT_VALUES
```sql
SELECT `IDString`, `minMod` FROM `static_power_effectmod` WHERE `modType` = ?
```
**File:** `dbLootHandler.java`, Line ~192
## Relationships
1. **Loot Generation Tables:** The main loot tables are related through the genTable, itemTable, and modTable fields to form a hierarchical loot generation system
2. **Item Tables:** Connected to general tables through itemID fields for specific item definitions
3. **Modifier Tables:** Linked through modTable and modType fields for modifier definitions
4. **Booty Sets:** Connected through bootySet field for specific booty set configurations
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `genTableID` | `static_loot_gen.genTable` | Unique identifier for the loot table |
| `itemID` | `static_loot_gen.itemID` | Item ID for this loot entry |
| `weight` | `static_loot_gen.weight` | Weight for random selection |
| `minLevel` | `static_loot_gen.minLevel` | Minimum level requirement |
| `maxLevel` | `static_loot_gen.maxLevel` | Maximum level requirement |
| `itemTableID` | `static_loot_item.itemTable` | Item table identifier |
| `modTableID` | `static_loot_mod.modTable` | Modifier table identifier |
| `modTypeID` | `static_loot_modtype.modType` | Modifier type identifier |
| `bootySetID` | `static_loot_bootySet.bootySet` | Booty set identifier |
| `IDString` | `static_power_effectmod.IDString` | ID string for effect modifiers |
| `minMod` | `static_power_effectmod.minMod` | Minimum modifier value |
@@ -1,49 +0,0 @@
# dbMenuHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMenuHandler` class. The menu handler manages NPC menu options and their associated data, providing functionality to retrieve menu options based on menu IDs.
## Handler Class
**File:** `src/engine/db/handlers/dbMenuHandler.java`
**Class:** `dbMenuHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `static_npc_menuoption`
- **Description:** Stores NPC menu option data including text, actions, and relationships to parent menus
- **Columns:**
- menuID (Primary Key)
- optionText
- actionType
- actionValue
- nextMenuID
- conditionType
- conditionValue
## Key Queries
### GET_MENU_OPTIONS
```sql
SELECT * FROM `static_npc_menuoption` WHERE menuID = ?
```
**File:** `dbMenuHandler.java`, Line ~25
## Relationships
1. **Menu Options to Menu:** One-to-many relationship via menuID field referencing parent menu structure
2. **Menu Options to Next Menu:** Many-to-one relationship via nextMenuID field for navigation between menus
3. **Menu Options to Conditions:** Zero-to-many relationship via conditionType and conditionValue fields for dynamic menu display
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `menuID` | `static_npc_menuoption.menuID` | Unique identifier for the parent menu |
| `optionText` | `static_npc_menuoption.optionText` | Text displayed for this menu option |
| `actionType` | `static_npc_menuoption.actionType` | Type of action to perform when selected |
| `actionValue` | `static_npc_menuoption.actionValue` | Value associated with the action |
| `nextMenuID` | `static_npc_menuoption.nextMenuID` | ID of the menu to navigate to when selected |
| `conditionType` | `static_npc_menuoption.conditionType` | Type of condition for displaying this option |
| `conditionValue` | `static_npc_menuoption.conditionValue` | Value associated with the condition |
@@ -1,83 +0,0 @@
# dbMineHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMineHandler` class. The mine handler manages mine objects and their properties, including ownership, resource types, production types, and flags for various mine behaviors.
## Handler Class
**File:** `src/engine/db/handlers/dbMineHandler.java`
**Class:** `dbMineHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `obj_mine`
- **Description:** Stores mine-specific data including owner, resource type, production type, and flags
- **Columns:**
- UID (Primary Key)
- mine_ownerUID
- mine_resource
- mine_type
- flags
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_building` | Base building data for mines | One-to-one with obj_mine via UID |
| `object` | Generic object data including parent relationships | One-to-one with obj_mine via UID |
## Key Queries
### GET_MINE
```sql
SELECT `obj_building`.*, `object`.`parent` FROM `object` INNER JOIN `obj_building` ON `obj_building`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?
```
**File:** `dbMineHandler.java`, Line ~25
### GET_ALL_MINES_FOR_SERVER
```sql
SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`
```
**File:** `dbMineHandler.java`, Line ~43
### CHANGE_OWNER
```sql
UPDATE `obj_mine` SET `mine_ownerUID`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~57
### CHANGE_RESOURCE
```sql
UPDATE `obj_mine` SET `mine_resource`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~71
### CHANGE_TYPE
```sql
UPDATE `obj_mine` SET `mine_type`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~85
### SET_FLAGS
```sql
UPDATE `obj_mine` SET `flags`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~99
## Relationships
1. **Mine to Building:** One-to-one relationship via UID field (mine data extends building data)
2. **Mine to Owner:** Many-to-one relationship via mine_ownerUID referencing obj_character.UID
3. **Mine to Resource:** Many-to-one relationship via mine_resource field linking to resource definitions
4. **Mine to Parent Object:** One-to-one relationship through object table for parent-child hierarchies
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `mine_ownerUID` | `obj_mine.mine_ownerUID` | Character UID of the mine owner |
| `mine_resource` | `obj_mine.mine_resource` | Resource type being mined |
| `mine_type` | `obj_mine.mine_type` | Production type of the mine |
| `flags` | `obj_mine.flags` | Bit flags for mine properties |
| `UID` | `obj_mine.UID` | Unique identifier for the mine object |
@@ -1,66 +0,0 @@
# dbMobBaseHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMobBaseHandler` class. This handler manages static data about mob (monster) base properties in Magicbane, including their characteristics, stats, and behaviors.
## Handler Class
**File:** `src/engine/db/handlers/dbMobBaseHandler.java`
**Class:** `dbMobBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Mob Base Table
- **Table Name:** `static_mob_base`
- **Description:** Core table storing base properties of mobs, including names, descriptions, and basic characteristics
- **Columns:**
- UID (Primary Key)
- name
- description
- mobType
- level
- health
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_mob_stats` | Stores stat information for mobs | MobBaseID → static_mob_base.UID |
| `static_mob_loot` | Stores loot information for mobs | MobBaseID → static_mob_base.UID |
## Key Queries
### Get Mob Base by UID
```sql
SELECT * FROM static_mob_base WHERE `UID` = ?
```
**File:** `dbMobBaseHandler.java`, Line ~25
### Get Mob Stats
```sql
SELECT * FROM static_mob_stats WHERE `mobBaseID` = ?
```
**File:** `dbMobBaseHandler.java`, Line ~40
### Get Mob Loot
```sql
SELECT * FROM static_mob_loot WHERE `mobBaseID` = ?
```
**File:** `dbMobBaseHandler.java`, Line ~55
## Relationships
1. **Mob Base to Stats:** One-to-many relationship via mobBaseID field in static_mob_stats referencing static_mob_base.UID
2. **Mob Base to Loot:** One-to-many relationship via mobBaseID field in static_mob_loot referencing static_mob_base.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `static_mob_base.UID` | Unique identifier for the mob |
| `name` | `static_mob_base.name` | Name of the mob |
| `description` | `static_mob_base.description` | Description of the mob |
| `mobType` | `static_mob_base.mobType` | Type of mob |
| `level` | `static_mob_base.level` | Level of the mob |
| `health` | `static_mob_base.health` | Base health of the mob |
| `other fields...` | Various columns | Other properties related to mob base data |
@@ -1,70 +0,0 @@
# dbMobHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMobHandler` class. This handler manages dynamic mob data in the game world, including their current state, location, and behavior.
## Handler Class
**File:** `src/engine/db/handlers/dbMobHandler.java`
**Class:** `dbMobHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Mob Table
- **Table Name:** `dyn_mob`
- **Description:** Stores current state information for mobs in the game world, including location, health, and status
- **Columns:**
- UID (Primary Key)
- mobBaseID
- zoneUUID
- x
- y
- z
- health
- isAlive
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character` | Characters that may interact with mobs | OwnerUID → obj_character.UID |
## Key Queries
### Get Mob by UID
```sql
SELECT * FROM dyn_mob WHERE `UID` = ?
```
**File:** `dbMobHandler.java`, Line ~25
### Save Mob
```sql
INSERT INTO `dyn_mob` (`mobBaseID`, `zoneUUID`, `x`, `y`, `z`, `health`, `isAlive`) VALUES(?,?,?,?,?,?,?)
```
**File:** `dbMobHandler.java`, Line ~40
### Get Mobs by Zone
```sql
SELECT * FROM dyn_mob WHERE `zoneUUID` = ?
```
**File:** `dbMobHandler.java`, Line ~55
## Relationships
1. **Mob to Mob Base:** Many-to-one relationship via mobBaseID field referencing static_mob_base.UID
2. **Mob to Zone:** Many-to-one relationship via zoneUUID field referencing obj_zone.UID
3. **Mob to Owner:** Many-to-one relationship via ownerUID field referencing obj_character.UID (if applicable)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `dyn_mob.UID` | Unique identifier for the mob |
| `mobBaseID` | `dyn_mob.mobBaseID` | UID of the base mob definition |
| `zoneUUID` | `dyn_mob.zoneUUID` | Zone where the mob is located |
| `x` | `dyn_mob.x` | X coordinate of mob position |
| `y` | `dyn_mob.y` | Y coordinate of mob position |
| `z` | `dyn_mob.z` | Z coordinate of mob position |
| `health` | `dyn_mob.health` | Current health of the mob |
| `isAlive` | `dyn_mob.isAlive` | Flag indicating if mob is alive |
| `other fields...` | Various columns | Other properties related to mob state |
@@ -1,71 +0,0 @@
# dbNPCHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbNPCHandler` class. This handler manages non-player character (NPC) data, including their base properties, current state, and behaviors in the game world.
## Handler Class
**File:** `src/engine/db/handlers/dbNPCHandler.java`
**Class:** `dbNPCHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main NPC Table
- **Table Name:** `dyn_npc`
- **Description:** Stores current state information for NPCs, including location, health, and behavior flags
- **Columns:**
- UID (Primary Key)
- npcBaseID
- zoneUUID
- x
- y
- z
- health
- isAlive
- behavior
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_npc_base` | Base properties of NPCs | npcBaseID → static_npc_base.UID |
## Key Queries
### Get NPC by UID
```sql
SELECT * FROM dyn_npc WHERE `UID` = ?
```
**File:** `dbNPCHandler.java`, Line ~25
### Save NPC
```sql
INSERT INTO `dyn_npc` (`npcBaseID`, `zoneUUID`, `x`, `y`, `z`, `health`, `isAlive`, `behavior`) VALUES(?,?,?,?,?,?,?,?)
```
**File:** `dbNPCHandler.java`, Line ~40
### Get NPCs by Zone
```sql
SELECT * FROM dyn_npc WHERE `zoneUUID` = ?
```
**File:** `dbNPCHandler.java`, Line ~55
## Relationships
1. **NPC to NPC Base:** Many-to-one relationship via npcBaseID field referencing static_npc_base.UID
2. **NPC to Zone:** Many-to-one relationship via zoneUUID field referencing obj_zone.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `dyn_npc.UID` | Unique identifier for the NPC |
| `npcBaseID` | `dyn_npc.npcBaseID` | UID of the base NPC definition |
| `zoneUUID` | `dyn_npc.zoneUUID` | Zone where the NPC is located |
| `x` | `dyn_npc.x` | X coordinate of NPC position |
| `y` | `dyn_npc.y` | Y coordinate of NPC position |
| `z` | `dyn_npc.z` | Z coordinate of NPC position |
| `health` | `dyn_npc.health` | Current health of the NPC |
| `isAlive` | `dyn_npc.isAlive` | Flag indicating if NPC is alive |
| `behavior` | `dyn_npc.behavior` | Behavior type or state of the NPC |
| `other fields...` | Various columns | Other properties related to NPC state |
@@ -1,72 +0,0 @@
# dbPetitionHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPetitionHandler` class. This handler manages player petitions, which are requests or complaints submitted by players to game administrators.
## Handler Class
**File:** `src/engine/db/handlers/dbPetitionHandler.java`
**Class:** `dbPetitionHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Petition Table
- **Table Name:** `dyn_petition`
- **Description:** Stores information about player petitions, including submission details, status, and resolution
- **Columns:**
- UID (Primary Key)
- characterID
- petitionType
- description
- status
- submittedDate
- resolvedDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character` | Characters who submitted petitions | characterID → obj_character.UID |
## Key Queries
### Get Petition by UID
```sql
SELECT * FROM dyn_petition WHERE `UID` = ?
```
**File:** `dbPetitionHandler.java`, Line ~25
### Save Petition
```sql
INSERT INTO `dyn_petition` (`characterID`, `petitionType`, `description`, `status`, `submittedDate`) VALUES(?,?,?,?,?)
```
**File:** `dbPetitionHandler.java`, Line ~40
### Get Petitions by Character
```sql
SELECT * FROM dyn_petition WHERE `characterID` = ?
```
**File:** `dbPetitionHandler.java`, Line ~55
### Update Petition Status
```sql
UPDATE `dyn_petition` SET `status`=?, `resolvedDate`=? WHERE `UID`=?
```
**File:** `dbPetitionHandler.java`, Line ~70
## Relationships
1. **Petition to Character:** Many-to-one relationship via characterID field referencing obj_character.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `dyn_petition.UID` | Unique identifier for the petition |
| `characterID` | `dyn_petition.characterID` | UID of the character who submitted the petition |
| `petitionType` | `dyn_petition.petitionType` | Type or category of the petition |
| `description` | `dyn_petition.description` | Description of the petition |
| `status` | `dyn_petition.status` | Current status of the petition (open, in progress, resolved) |
| `submittedDate` | `dyn_petition.submittedDate` | Timestamp when petition was submitted |
| `resolvedDate` | `dyn_petition.resolvedDate` | Timestamp when petition was resolved |
| `other fields...` | Various columns | Other properties related to petition data |
@@ -1,149 +0,0 @@
# Player Character Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPlayerCharacterHandler` class. The player character handler manages all aspects of character data including creation, updates, and retrieval operations within the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbPlayerCharacterHandler.java`
**Class:** `dbPlayerCharacterHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Character Table
- **Table Name:** `obj_character`
- **Description:** Core character information including attributes, stats, and personal details
- **Columns:**
- UID (Primary Key)
- char_firstname
- char_lastname
- char_isActive
- char_raceID
- char_baseClassID
- char_promotionClassID
- char_strMod
- char_dexMod
- char_conMod
- char_intMod
- char_spiMod
- char_experience
- char_skinColor
- char_hairColor
- char_hairStyle
- char_beardColor
- char_beardStyle
- char_bindBuilding
- guildUID
- guild_isInnerCouncil
- guild_isRecruiter
- guild_isTaxCollector
- guild_isFullMember
- guild_title
- anniversery
- hash
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_character_ignore` | Stores character ignore lists for players | accountUID → obj_account.UID |
| `dyn_character_friends` | Manages friendship relationships between characters | CharacterID → obj_character.UID |
| `dyn_character_guildhistory` | Tracks character's guild membership history | CharacterID → obj_character.UID, GuildID → obj_guild.UID |
| `dyn_character_heraldy` | Stores heraldry information for characters | CharacterID → obj_character.UID |
| `dyn_character_killmap` | Records kill statistics for characters | CharacterID → obj_character.UID |
| `dyn_character_murdermap` | Tracks murder statistics for characters | CharacterID → obj_character.UID |
| `dyn_character_power` | Manages character powers/abilities | CharacterID → obj_character.UID |
| `dyn_character_rune` | Stores rune information for characters | CharacterID → obj_character.UID |
| `dyn_character_skill` | Manages character skills and training | CharacterID → obj_character.UID |
## Key Queries
### Create New Character
```sql
CALL `character_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbPlayerCharacterHandler.java`, Line ~35
### Get Characters for Account
```sql
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`parent`=? && `obj_character`.`char_isActive`='1';
```
**File:** `dbPlayerCharacterHandler.java`, Line ~109
### Get All Active Characters
```sql
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `obj_character`.`char_isActive`='1';
```
**File:** `dbPlayerCharacterHandler.java`, Line ~127
### Get Character by UID
```sql
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?
```
**File:** `dbPlayerCharacterHandler.java`, Line ~185
### Get Character by Name
```sql
SELECT `char_firstname` FROM `obj_character` WHERE `char_isActive`=1 && `char_firstname`=?
```
**File:** `dbPlayerCharacterHandler.java`, Line ~203
### Update Character Name
```sql
UPDATE `obj_character` SET `char_firstname`=?, `char_lastname`=? WHERE `char_firstname`=? AND `char_isActive`='1'
```
**File:** `dbPlayerCharacterHandler.java`, Line ~222
### Set Character Ignore List
```sql
INSERT INTO `dyn_character_ignore` (`accountUID`, `ignoringUID`, `characterName`) VALUES (?, ?, ?)
```
**File:** `dbPlayerCharacterHandler.java`, Line ~83
### Get Character Ignore List
```sql
SELECT * FROM `dyn_character_ignore` WHERE `accountUID` = ?
```
**File:** `dbPlayerCharacterHandler.java`, Line ~151
## Relationships
1. **Character to Account:** Many-to-one (via `obj_character.parent` field referencing `obj_account.UID`)
2. **Character to Guild:** Many-to-one (via `obj_character.guildUID` field)
3. **Character to Ignore List:** One-to-many (via `dyn_character_ignore.accountUID`)
4. **Character to Friends List:** One-to-many (via `dyn_character_friends.CharacterID`)
5. **Character to Guild History:** One-to-many (via `dyn_character_guildhistory.CharacterID`)
6. **Character to Heraldry:** One-to-one (via `dyn_character_heraldy.CharacterID`)
7. **Character to Skills:** One-to-many (via `dyn_character_skill.CharacterID`)
8. **Character to Powers:** One-to-many (via `dyn_character_power.CharacterID`)
9. **Character to Runes:** One-to-many (via `dyn_character_rune.CharacterID`)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `firstName` | `obj_character.char_firstname` | Character's first name |
| `lastName` | `obj_character.char_lastname` | Character's last name |
| `isActive` | `obj_character.char_isActive` | Boolean flag for active status |
| `race` | `obj_character.char_raceID` | Race identifier |
| `baseClass` | `obj_character.char_baseClassID` | Base class identifier |
| `promotionClass` | `obj_character.char_promotionClassID` | Promotion class identifier |
| `strMod` | `obj_character.char_strMod` | Strength modifier |
| `dexMod` | `obj_character.char_dexMod` | Dexterity modifier |
| `conMod` | `obj_character.char_conMod` | Constitution modifier |
| `intMod` | `obj_character.char_intMod` | Intelligence modifier |
| `spiMod` | `obj_character.char_spiMod` | Spirit modifier |
| `exp` | `obj_character.char_experience` | Experience points |
| `skinColor` | `obj_character.char_skinColor` | Skin color value |
| `hairColor` | `obj_character.char_hairColor` | Hair color value |
| `hairStyle` | `obj_character.char_hairStyle` | Hair style identifier |
| `beardColor` | `obj_character.char_beardColor` | Beard color value |
| `beardStyle` | `obj_character.char_beardStyle` | Beard style identifier |
| `bindBuilding` | `obj_character.char_bindBuilding` | Bind building UID |
| `guildUID` | `obj_character.guildUID` | Guild identifier |
| `isInnerCouncil` | `obj_character.guild_isInnerCouncil` | Inner council status |
| `isRecruiter` | `obj_character.guild_isRecruiter` | Recruiter status |
| `isTaxCollector` | `obj_character.guild_isTaxCollector` | Tax collector status |
| `isFullMember` | `obj_character.guild_isFullMember` | Full member status |
| `guildTitle` | `obj_character.guild_title` | Guild title identifier |
| `anniversery` | `obj_character.anniversery` | Anniversary flag |
@@ -1,81 +0,0 @@
# Power Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPowerHandler` class. The power handler manages game powers and abilities that characters can possess and use in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbPowerHandler.java`
**Class:** `dbPowerHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_power`
- **Description:** Core power information including name, description, and activation properties
- **Columns:**
- UID (Primary Key)
- name
- description
- powerType
- activationType
- cooldownTime
- duration
- maxLevel
- cost
- iconID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_power` | Tracks character-specific power levels and status | CharacterID → obj_character.UID, PowerID → obj_power.UID |
| `static_power_requirement` | Stores requirements for unlocking powers | PowerID → obj_power.UID |
## Key Queries
### Get Power by ID
```sql
SELECT * FROM `obj_power` WHERE `UID`=?
```
**File:** `dbPowerHandler.java`, Line ~60
### Get Character's Powers
```sql
SELECT p.*, cp.level, cp.isUnlocked
FROM `obj_power` p
INNER JOIN `obj_character_power` cp ON p.`UID` = cp.`PowerID`
WHERE cp.`CharacterID`=?
```
**File:** `dbPowerHandler.java`, Line ~85
### Get Power Requirements
```sql
SELECT * FROM `static_power_requirement` WHERE `PowerID`=?
```
**File:** `dbPowerHandler.java`, Line ~120
## Relationships
1. **Power to Character:** Many-to-many through `obj_character_power` table
2. **Power to Requirements:** One-to-many (via `static_power_requirement.PowerID`)
3. **Power to Static Data:** Power definitions are stored in static tables
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_power.name` | Power name |
| `description` | `obj_power.description` | Power description |
| `powerType` | `obj_power.powerType` | Type of power (active, passive) |
| `activationType` | `obj_power.activationType` | How the power is activated |
| `cooldownTime` | `obj_power.cooldownTime` | Cooldown period in seconds |
| `duration` | `obj_power.duration` | Duration of power effect |
| `maxLevel` | `obj_power.maxLevel` | Maximum level for this power |
| `cost` | `obj_power.cost` | Resource cost to use power |
| `iconID` | `obj_power.iconID` | Icon identifier for UI display |
## Notes
- The power system is designed to support both active and passive abilities
- Power requirements are stored separately to allow flexible unlocking mechanisms
- Character-specific power data is tracked in the `obj_character_power` table
@@ -1,77 +0,0 @@
# Promotion Class Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPromotionClassHandler` class. The promotion class handler manages character class promotions and advancement systems in the Magicbane emulator.
## Handler Class
**File:** `src/engine/db/handlers/dbPromotionClassHandler.java`
**Class:** `dbPromotionClassHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_promotionclass`
- **Description:** Core promotion class information including name, requirements, and advancement paths
- **Columns:**
- UID (Primary Key)
- name
- description
- baseClassID
- requiredLevel
- requiredItems
- statBonuses
- skillBonus
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_promotionclass` | Tracks character-specific promotion class status | CharacterID → obj_character.UID, PromotionClassID → obj_promotionclass.UID |
| `static_promotion_requirement` | Stores requirements for class promotions | PromotionClassID → obj_promotionclass.UID |
## Key Queries
### Get Promotion Class by ID
```sql
SELECT * FROM `obj_promotionclass` WHERE `UID`=?
```
**File:** `dbPromotionClassHandler.java`, Line ~60
### Get Character's Promotion Classes
```sql
SELECT pc.*, cpc.isUnlocked
FROM `obj_promotionclass` pc
INNER JOIN `obj_character_promotionclass` cpc ON pc.`UID` = cpc.`PromotionClassID`
WHERE cpc.`CharacterID`=?
```
**File:** `dbPromotionClassHandler.java`, Line ~85
### Get Promotion Requirements
```sql
SELECT * FROM `static_promotion_requirement` WHERE `PromotionClassID`=?
```
**File:** `dbPromotionClassHandler.java`, Line ~120
## Relationships
1. **Promotion Class to Character:** Many-to-many through `obj_character_promotionclass` table
2. **Promotion Class to Requirements:** One-to-many (via `static_promotion_requirement.PromotionClassID`)
3. **Promotion Class to Base Class:** Many-to-one relationship via baseClassID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_promotionclass.name` | Promotion class name |
| `description` | `obj_promotionclass.description` | Description of the promotion class |
| `baseClassID` | `obj_promotionclass.baseClassID` | Reference to base class |
| `requiredLevel` | `obj_promotionclass.requiredLevel` | Level required for promotion |
| `requiredItems` | `obj_promotionclass.requiredItems` | Items required for promotion |
| `statBonuses` | `obj_promotionclass.statBonuses` | Stat bonuses granted |
| `skillBonus` | `obj_promotionclass.skillBonus` | Skill bonuses granted |
## Notes
- Promotion classes are tied to base classes and provide advancement paths for characters
- The system supports both unlocked and locked promotion classes
- Requirements are stored separately to allow flexible advancement mechanics
@@ -1,45 +0,0 @@
# Race Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRaceHandler` class. The race handler manages race-related data including beard colors and styles for different races in the Magicbane emulator.
## Handler Class
**File:** `src/engine/db/handlers/dbRaceHandler.java`
**Class:** `dbRaceHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Race-related Tables
- **Table Name:** `static_rune_racebeardcolor`
- **Description:** Stores beard color information for different races
- **Columns:**
- RaceID (Foreign Key)
- color
## Key Queries
### Get Beard Colors for Race
```sql
SELECT `color` FROM `static_rune_racebeardcolor` WHERE `RaceID` = ?
```
**File:** `dbRaceHandler.java`, Line ~25
### Get Beard Styles for Race
```sql
SELECT `style` FROM `static_rune_racebeardstyle` WHERE `RaceID` = ?
```
**File:** `dbRaceHandler.java`, Line ~40
## Relationships
1. **Race to Beard Colors:** One-to-many (via `static_rune_racebeardcolor.RaceID`)
2. **Race to Beard Styles:** One-to-many (via `static_rune_racebeardstyle.RaceID`)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `RaceID` | `static_rune_racebeardcolor.RaceID` | Foreign key to race |
| `color` | `static_rune_racebeardcolor.color` | Beard color value |
@@ -1,78 +0,0 @@
# Realm Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRealmHandler` class. The realm handler manages different game realms or worlds within the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRealmHandler.java`
**Class:** `dbRealmHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_realm`
- **Description:** Core realm information including name, status, and configuration settings
- **Columns:**
- UID (Primary Key)
- name
- description
- status
- maxPlayers
- serverIP
- serverPort
- isPublic
- creationDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_realm_playerlist` | Tracks active players in each realm | RealmID → obj_realm.UID, CharacterID → obj_character.UID |
| `obj_realm_config` | Configuration settings for each realm | RealmID → obj_realm.UID |
## Key Queries
### Get Realm by ID
```sql
SELECT * FROM `obj_realm` WHERE `UID`=?
```
**File:** `dbRealmHandler.java`, Line ~60
### Get All Active Realms
```sql
SELECT * FROM `obj_realm` WHERE `status`='active'
```
**File:** `dbRealmHandler.java`, Line ~85
### Get Realm Players
```sql
SELECT c.* FROM `obj_character` c
INNER JOIN `dyn_realm_playerlist` rpl ON c.`UID` = rpl.`CharacterID`
WHERE rpl.`RealmID`=?
```
**File:** `dbRealmHandler.java`, Line ~120
## Relationships
1. **Realm to Character:** Many-to-many through `dyn_realm_playerlist` table
2. **Realm to Configuration:** One-to-one (via `obj_realm_config.RealmID`)
3. **Realm to Player Status:** Real-time tracking of active players
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_realm.name` | Realm name |
| `description` | `obj_realm.description` | Description of the realm |
| `status` | `obj_realm.status` | Current status (active, inactive) |
| `maxPlayers` | `obj_realm.maxPlayers` | Maximum number of players allowed |
| `serverIP` | `obj_realm.serverIP` | Server IP address |
| `serverPort` | `obj_realm.serverPort` | Server port number |
| `isPublic` | `obj_realm.isPublic` | Whether realm is publicly accessible |
| `creationDate` | `obj_realm.creationDate` | When the realm was created |
## Notes
- Realms represent different game worlds or instances
- Players can move between realms based on configuration
- The system tracks real-time player presence in each realm
@@ -1,69 +0,0 @@
# Resist Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbResistHandler` class. The resist handler manages character resistance values against various damage types and effects in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbResistHandler.java`
**Class:** `dbResistHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_resist`
- **Description:** Core resistance information including damage type and resistance values
- **Columns:**
- UID (Primary Key)
- resistType
- value
- description
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_resist` | Tracks character-specific resistance values | CharacterID → obj_character.UID, ResistID → obj_resist.UID |
| `static_resist_type` | Static definitions of resistance types | ResistTypeID → obj_resist.UID |
## Key Queries
### Get Resist by ID
```sql
SELECT * FROM `obj_resist` WHERE `UID`=?
```
**File:** `dbResistHandler.java`, Line ~60
### Get Character's Resistances
```sql
SELECT r.*, cr.value as characterValue
FROM `obj_resist` r
INNER JOIN `obj_character_resist` cr ON r.`UID` = cr.`ResistID`
WHERE cr.`CharacterID`=?
```
**File:** `dbResistHandler.java`, Line ~85
### Get Resist by Type
```sql
SELECT * FROM `obj_resist` WHERE `resistType`=?
```
**File:** `dbResistHandler.java`, Line ~120
## Relationships
1. **Resist to Character:** Many-to-many through `obj_character_resist` table
2. **Resist to Static Types:** One-to-many (via `static_resist_type.ResistTypeID`)
3. **Resist to Damage Types:** Direct mapping to game damage types
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `resistType` | `obj_resist.resistType` | Type of resistance (fire, ice, etc.) |
| `value` | `obj_resist.value` | Resistance value |
| `description` | `obj_resist.description` | Description of the resistance type |
## Notes
- Resistances are applied to various damage types in combat
- Character-specific resistances can be modified through equipment or abilities
- The system supports multiple resistance types for comprehensive damage mitigation
@@ -1,77 +0,0 @@
# Rune Base Attribute Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRuneBaseAttributeHandler` class. The rune base attribute handler manages the fundamental attributes and properties of rune base items in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRuneBaseAttributeHandler.java`
**Class:** `dbRuneBaseAttributeHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runebaseattribute`
- **Description:** Core rune base attribute information including name, description, and property values
- **Columns:**
- UID (Primary Key)
- name
- description
- attributeType
- minValue
- maxValue
- defaultValue
- isStackable
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_rune_baseattribute` | Links rune base items to their attributes | RuneBaseID → obj_runebase.UID, AttributeID → obj_runebaseattribute.UID |
| `static_rune_attribute_type` | Static definitions of attribute types | AttributeTypeID → obj_runebaseattribute.UID |
## Key Queries
### Get Rune Base Attribute by ID
```sql
SELECT * FROM `obj_runebaseattribute` WHERE `UID`=?
```
**File:** `dbRuneBaseAttributeHandler.java`, Line ~60
### Get Attributes for Rune Base
```sql
SELECT rba.*, rbaa.attributeValue
FROM `obj_runebaseattribute` rba
INNER JOIN `obj_rune_baseattribute` rbaa ON rba.`UID` = rbaa.`AttributeID`
WHERE rbaa.`RuneBaseID`=?
```
**File:** `dbRuneBaseAttributeHandler.java`, Line ~85
### Get Attribute by Type
```sql
SELECT * FROM `obj_runebaseattribute` WHERE `attributeType`=?
```
**File:** `dbRuneBaseAttributeHandler.java`, Line ~120
## Relationships
1. **Rune Base Attribute to Rune Base:** Many-to-many through `obj_rune_baseattribute` table
2. **Rune Base Attribute to Static Types:** One-to-many (via `static_rune_attribute_type.AttributeTypeID`)
3. **Attribute to Property Values:** Defines the range and default values for each attribute
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runebaseattribute.name` | Attribute name |
| `description` | `obj_runebaseattribute.description` | Description of the attribute |
| `attributeType` | `obj_runebaseattribute.attributeType` | Type of attribute (stat, effect, etc.) |
| `minValue` | `obj_runebaseattribute.minValue` | Minimum value allowed |
| `maxValue` | `obj_runebaseattribute.maxValue` | Maximum value allowed |
| `defaultValue` | `obj_runebaseattribute.defaultValue` | Default value for the attribute |
| `isStackable` | `obj_runebaseattribute.isStackable` | Whether the attribute can stack |
## Notes
- Rune base attributes define the core properties of rune items
- Attributes can be applied to different rune base types
- The system supports both fixed and variable attribute values
@@ -1,77 +0,0 @@
# Rune Base Effect Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRuneBaseEffectHandler` class. The rune base effect handler manages the effects and abilities that rune base items can provide in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRuneBaseEffectHandler.java`
**Class:** `dbRuneBaseEffectHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runebaseeffect`
- **Description:** Core rune base effect information including name, description, and activation properties
- **Columns:**
- UID (Primary Key)
- name
- description
- effectType
- activationType
- duration
- cooldownTime
- powerValue
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_rune_baseeffect` | Links rune base items to their effects | RuneBaseID → obj_runebase.UID, EffectID → obj_runebaseeffect.UID |
| `static_rune_effect_type` | Static definitions of effect types | EffectTypeID → obj_runebaseeffect.UID |
## Key Queries
### Get Rune Base Effect by ID
```sql
SELECT * FROM `obj_runebaseeffect` WHERE `UID`=?
```
**File:** `dbRuneBaseEffectHandler.java`, Line ~60
### Get Effects for Rune Base
```sql
SELECT rbe.*, rba.effectValue
FROM `obj_runebaseeffect` rbe
INNER JOIN `obj_rune_baseeffect` rba ON rbe.`UID` = rba.`EffectID`
WHERE rba.`RuneBaseID`=?
```
**File:** `dbRuneBaseEffectHandler.java`, Line ~85
### Get Effect by Type
```sql
SELECT * FROM `obj_runebaseeffect` WHERE `effectType`=?
```
**File:** `dbRuneBaseEffectHandler.java`, Line ~120
## Relationships
1. **Rune Base Effect to Rune Base:** Many-to-many through `obj_rune_baseeffect` table
2. **Rune Base Effect to Static Types:** One-to-many (via `static_rune_effect_type.EffectTypeID`)
3. **Effect to Activation Properties:** Defines how effects are triggered and applied
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runebaseeffect.name` | Effect name |
| `description` | `obj_runebaseeffect.description` | Description of the effect |
| `effectType` | `obj_runebaseeffect.effectType` | Type of effect (damage, healing, buff, etc.) |
| `activationType` | `obj_runebaseeffect.activationType` | How the effect is activated |
| `duration` | `obj_runebaseeffect.duration` | Duration of effect in seconds |
| `cooldownTime` | `obj_runebaseeffect.cooldownTime` | Cooldown period between activations |
| `powerValue` | `obj_runebaseeffect.powerValue` | Strength or power value of the effect |
## Notes
- Rune base effects define the abilities and powers that runes can provide
- Effects have various activation methods (passive, active, triggered)
- The system supports duration-based and cooldown-based effects
@@ -1,76 +0,0 @@
# Rune Base Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRuneBaseHandler` class. The rune base handler manages the base definitions and properties of rune items in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRuneBaseHandler.java`
**Class:** `dbRuneBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runebase`
- **Description:** Core rune base item information including name, description, and basic properties
- **Columns:**
- UID (Primary Key)
- name
- description
- itemType
- rarity
- iconID
- value
- weight
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_rune_baseattribute` | Links rune base items to their attributes | RuneBaseID → obj_runebase.UID, AttributeID → obj_runebaseattribute.UID |
| `obj_rune_baseeffect` | Links rune base items to their effects | RuneBaseID → obj_runebase.UID, EffectID → obj_runebaseeffect.UID |
| `static_rune_type` | Static definitions of rune types | RuneTypeID → obj_runebase.UID |
## Key Queries
### Get Rune Base by ID
```sql
SELECT * FROM `obj_runebase` WHERE `UID`=?
```
**File:** `dbRuneBaseHandler.java`, Line ~60
### Get All Rune Bases
```sql
SELECT * FROM `obj_runebase`
```
**File:** `dbRuneBaseHandler.java`, Line ~85
### Get Rune Base by Type
```sql
SELECT * FROM `obj_runebase` WHERE `itemType`=?
```
**File:** `dbRuneBaseHandler.java`, Line ~120
## Relationships
1. **Rune Base to Attributes:** Many-to-many through `obj_rune_baseattribute` table
2. **Rune Base to Effects:** Many-to-many through `obj_rune_baseeffect` table
3. **Rune Base to Static Types:** One-to-many (via `static_rune_type.RuneTypeID`)
4. **Rune Base to Item Properties:** Defines the core characteristics of rune items
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runebase.name` | Rune base name |
| `description` | `obj_runebase.description` | Description of the rune |
| `itemType` | `obj_runebase.itemType` | Type of rune (weapon, armor, etc.) |
| `rarity` | `obj_runebase.rarity` | Rarity level of the rune |
| `iconID` | `obj_runebase.iconID` | Icon identifier for UI display |
| `value` | `obj_runebase.value` | Value or worth of the rune |
| `weight` | `obj_runebase.weight` | Weight of the rune item |
## Notes
- Rune bases define the fundamental properties of all rune items in the game
- Each rune base can have multiple attributes and effects associated with it
- The system supports various rune types with different characteristics
@@ -1,78 +0,0 @@
# Runegate Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRunegateHandler` class. The runegate handler manages runegate structures and their properties in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRunegateHandler.java`
**Class:** `dbRunegateHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runegate`
- **Description:** Core runegate information including location, properties, and activation status
- **Columns:**
- UID (Primary Key)
- name
- description
- locationX
- locationY
- locationZ
- isActive
- activationTime
- cooldownPeriod
- destinationRealmID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_runegate_connection` | Links runegates to their destinations | SourceRunegateID → obj_runegate.UID, DestinationRunegateID → obj_runegate.UID |
| `dyn_runegate_usage` | Tracks usage history of runegates | RunegateID → obj_runegate.UID, CharacterID → obj_character.UID |
## Key Queries
### Get Runegate by ID
```sql
SELECT * FROM `obj_runegate` WHERE `UID`=?
```
**File:** `dbRunegateHandler.java`, Line ~60
### Get Active Runegates
```sql
SELECT * FROM `obj_runegate` WHERE `isActive`=1
```
**File:** `dbRunegateHandler.java`, Line ~85
### Get Runegate by Location
```sql
SELECT * FROM `obj_runegate` WHERE `locationX`=? AND `locationY`=? AND `locationZ`=?
```
**File:** `dbRunegateHandler.java`, Line ~120
## Relationships
1. **Runegate to Connections:** Many-to-many through `obj_runegate_connection` table
2. **Runegate to Usage History:** One-to-many (via `dyn_runegate_usage.RunegateID`)
3. **Runegate to Destination Realms:** Links runegates to different game realms
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runegate.name` | Runegate name |
| `description` | `obj_runegate.description` | Description of the runegate |
| `locationX` | `obj_runegate.locationX` | X coordinate of runegate location |
| `locationY` | `obj_runegate.locationY` | Y coordinate of runegate location |
| `locationZ` | `obj_runegate.locationZ` | Z coordinate of runegate location |
| `isActive` | `obj_runegate.isActive` | Whether the runegate is currently active |
| `activationTime` | `obj_runegate.activationTime` | Time when runegate was last activated |
| `cooldownPeriod` | `obj_runegate.cooldownPeriod` | Cooldown period between uses |
| `destinationRealmID` | `obj_runegate.destinationRealmID` | Realm ID for destination |
## Notes
- Runegates function as teleportation devices in the game world
- They can connect to other runegates in different locations or realms
- The system tracks usage history for balance and maintenance purposes
@@ -1,78 +0,0 @@
# Shrine Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbShrineHandler` class. The shrine handler manages shrine structures and their properties in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbShrineHandler.java`
**Class:** `dbShrineHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_shrine`
- **Description:** Core shrine information including location, properties, and effects
- **Columns:**
- UID (Primary Key)
- name
- description
- locationX
- locationY
- locationZ
- shrineType
- isActive
- effectDuration
- effectPower
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_shrine_effect` | Defines effects provided by shrines | ShrineID → obj_shrine.UID, EffectID → obj_shrineeffect.UID |
| `dyn_shrine_usage` | Tracks usage history of shrines | ShrineID → obj_shrine.UID, CharacterID → obj_character.UID |
## Key Queries
### Get Shrine by ID
```sql
SELECT * FROM `obj_shrine` WHERE `UID`=?
```
**File:** `dbShrineHandler.java`, Line ~60
### Get Active Shrines
```sql
SELECT * FROM `obj_shrine` WHERE `isActive`=1
```
**File:** `dbShrineHandler.java`, Line ~85
### Get Shrine by Location
```sql
SELECT * FROM `obj_shrine` WHERE `locationX`=? AND `locationY`=? AND `locationZ`=?
```
**File:** `dbShrineHandler.java`, Line ~120
## Relationships
1. **Shrine to Effects:** Many-to-many through `obj_shrine_effect` table
2. **Shrine to Usage History:** One-to-many (via `dyn_shrine_usage.ShrineID`)
3. **Shrine to Shrine Types:** Different types of shrines with different effects
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_shrine.name` | Shrine name |
| `description` | `obj_shrine.description` | Description of the shrine |
| `locationX` | `obj_shrine.locationX` | X coordinate of shrine location |
| `locationY` | `obj_shrine.locationY` | Y coordinate of shrine location |
| `locationZ` | `obj_shrine.locationZ` | Z coordinate of shrine location |
| `shrineType` | `obj_shrine.shrineType` | Type of shrine (healing, buff, etc.) |
| `isActive` | `obj_shrine.isActive` | Whether the shrine is currently active |
| `effectDuration` | `obj_shrine.effectDuration` | Duration of shrine effects |
| `effectPower` | `obj_shrine.effectPower` | Power level of shrine effects |
## Notes
- Shrines provide various beneficial effects to players who interact with them
- They can be healing shrines, buff shrines, or other special effect shrines
- The system tracks usage history for balance and maintenance purposes
@@ -1,81 +0,0 @@
# Skill Base Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbSkillBaseHandler` class. The skill base handler manages the fundamental definitions and properties of skills in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbSkillBaseHandler.java`
**Class:** `dbSkillBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_skillbase`
- **Description:** Core skill base information including name, description, and activation properties
- **Columns:**
- UID (Primary Key)
- name
- description
- skillType
- activationType
- cooldownTime
- duration
- maxLevel
- cost
- iconID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_skill` | Tracks character-specific skill levels and status | CharacterID → obj_character.UID, SkillID → obj_skillbase.UID |
| `static_skill_requirement` | Stores requirements for unlocking skills | SkillID → obj_skillbase.UID |
## Key Queries
### Get Skill Base by ID
```sql
SELECT * FROM `obj_skillbase` WHERE `UID`=?
```
**File:** `dbSkillBaseHandler.java`, Line ~60
### Get Character's Skills
```sql
SELECT s.*, cs.level, cs.isUnlocked
FROM `obj_skillbase` s
INNER JOIN `obj_character_skill` cs ON s.`UID` = cs.`SkillID`
WHERE cs.`CharacterID`=?
```
**File:** `dbSkillBaseHandler.java`, Line ~85
### Get Skill Requirements
```sql
SELECT * FROM `static_skill_requirement` WHERE `SkillID`=?
```
**File:** `dbSkillBaseHandler.java`, Line ~120
## Relationships
1. **Skill Base to Character:** Many-to-many through `obj_character_skill` table
2. **Skill Base to Requirements:** One-to-many (via `static_skill_requirement.SkillID`)
3. **Skill Base to Static Data:** Skill definitions are stored in static tables
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_skillbase.name` | Skill name |
| `description` | `obj_skillbase.description` | Skill description |
| `skillType` | `obj_skillbase.skillType` | Type of skill (attack, defense, support) |
| `activationType` | `obj_skillbase.activationType` | How the skill is activated |
| `cooldownTime` | `obj_skillbase.cooldownTime` | Cooldown period in seconds |
| `duration` | `obj_skillbase.duration` | Duration of skill effect |
| `maxLevel` | `obj_skillbase.maxLevel` | Maximum level for this skill |
| `cost` | `obj_skillbase.cost` | Resource cost to use skill |
| `iconID` | `obj_skillbase.iconID` | Icon identifier for UI display |
## Notes
- Skill bases define the core properties of all skills in the game
- Skills can be activated in various ways (instant, channeling, etc.)
- The system supports both unlocked and locked skill progression
@@ -1,75 +0,0 @@
# Skill Requirement Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbSkillReqHandler` class. The skill requirement handler manages the prerequisites and conditions needed to unlock or use various skills in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbSkillReqHandler.java`
**Class:** `dbSkillReqHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `static_skill_requirement`
- **Description:** Core skill requirement information including type, value, and conditions
- **Columns:**
- UID (Primary Key)
- skillID
- requirementType
- requirementValue
- prerequisiteSkillID
- prerequisiteLevel
- prerequisiteStat
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_skillbase` | Links to the skill that has requirements | SkillID → obj_skillbase.UID |
| `obj_character_skill` | Tracks character-specific skill status | CharacterID → obj_character.UID, SkillID → obj_skillbase.UID |
## Key Queries
### Get Skill Requirements by Skill ID
```sql
SELECT * FROM `static_skill_requirement` WHERE `skillID`=?
```
**File:** `dbSkillReqHandler.java`, Line ~60
### Get Specific Requirement by ID
```sql
SELECT * FROM `static_skill_requirement` WHERE `UID`=?
```
**File:** `dbSkillReqHandler.java`, Line ~85
### Get Requirements for Character Skill
```sql
SELECT sr.*, cs.level as characterLevel
FROM `static_skill_requirement` sr
LEFT JOIN `obj_character_skill` cs ON sr.`prerequisiteSkillID` = cs.`SkillID`
WHERE sr.`skillID`=?
```
**File:** `dbSkillReqHandler.java`, Line ~120
## Relationships
1. **Skill Requirement to Skill Base:** Many-to-one (via `skillID` → obj_skillbase.UID)
2. **Skill Requirement to Prerequisite Skills:** Many-to-one (via `prerequisiteSkillID` → obj_skillbase.UID)
3. **Skill Requirement to Character Skills:** One-to-many through character skill tracking
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `skillID` | `static_skill_requirement.skillID` | Reference to the skill that requires this condition |
| `requirementType` | `static_skill_requirement.requirementType` | Type of requirement (level, skill, stat) |
| `requirementValue` | `static_skill_requirement.requirementValue` | Value needed for requirement |
| `prerequisiteSkillID` | `static_skill_requirement.prerequisiteSkillID` | Prerequisite skill ID if applicable |
| `prerequisiteLevel` | `static_skill_requirement.prerequisiteLevel` | Required level of prerequisite skill |
| `prerequisiteStat` | `static_skill_requirement.prerequisiteStat` | Required stat value if applicable |
## Notes
- Skill requirements define the conditions needed to unlock or use skills
- Requirements can be based on character level, other skills, or specific stats
- The system supports complex requirement chains for advanced skill trees
@@ -1,72 +0,0 @@
# Vendor Dialog Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbVendorDialogHandler` class. The vendor dialog handler manages the dialog systems and interaction options for NPC vendors in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbVendorDialogHandler.java`
**Class:** `dbVendorDialogHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `static_npc_dialog`
- **Description:** Core vendor dialog information including text, options, and responses
- **Columns:**
- UID (Primary Key)
- npcID
- dialogText
- responseType
- nextDialogID
- isFinal
- triggerEvent
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_npc_dialog_option` | Defines available options for each dialog | DialogID → static_npc_dialog.UID |
| `obj_npc` | Links to the NPC that has this dialog system | npcID → obj_npc.UID |
## Key Queries
### Get Dialog by ID
```sql
SELECT * FROM `static_npc_dialog` WHERE `UID`=?
```
**File:** `dbVendorDialogHandler.java`, Line ~60
### Get Dialog Options for Dialog
```sql
SELECT * FROM `static_npc_dialog_option` WHERE `dialogID`=?
```
**File:** `dbVendorDialogHandler.java`, Line ~85
### Get Initial Dialog for NPC
```sql
SELECT * FROM `static_npc_dialog` WHERE `npcID`=? AND `nextDialogID` IS NULL
```
**File:** `dbVendorDialogHandler.java`, Line ~120
## Relationships
1. **Dialog to Options:** One-to-many (via `dialogID` → static_npc_dialog.UID)
2. **Dialog to NPC:** Many-to-one (via `npcID` → obj_npc.UID)
3. **Dialog to Next Dialog:** Chain of dialog progression through `nextDialogID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `npcID` | `static_npc_dialog.npcID` | Reference to the NPC this dialog belongs to |
| `dialogText` | `static_npc_dialog.dialogText` | Text displayed in the dialog |
| `responseType` | `static_npc_dialog.responseType` | Type of response expected (buy, sell, quest) |
| `nextDialogID` | `static_npc_dialog.nextDialogID` | ID of next dialog in sequence |
| `isFinal` | `static_npc_dialog.isFinal` | Whether this is the final dialog in chain |
| `triggerEvent` | `static_npc_dialog.triggerEvent` | Event that triggers this dialog |
## Notes
- Vendor dialogs provide interactive communication with NPCs
- Dialog systems support branching conversations and quest progression
- The system handles complex dialog chains with multiple options and outcomes
@@ -1,83 +0,0 @@
# Warehouse Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbWarehouseHandler` class. The warehouse handler manages storage systems and inventory management for characters in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbWarehouseHandler.java`
**Class:** `dbWarehouseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_warehouse`
- **Description:** Core warehouse information including storage capacity and location
- **Columns:**
- UID (Primary Key)
- name
- description
- characterID
- storageCapacity
- currentStorage
- locationX
- locationY
- locationZ
- isPublic
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_warehouse_item` | Tracks items stored in warehouses | WarehouseID → obj_warehouse.UID, ItemID → obj_item.UID |
| `obj_character_warehouse` | Links characters to their warehouse access | CharacterID → obj_character.UID, WarehouseID → obj_warehouse.UID |
## Key Queries
### Get Warehouse by ID
```sql
SELECT * FROM `obj_warehouse` WHERE `UID`=?
```
**File:** `dbWarehouseHandler.java`, Line ~60
### Get Character's Warehouses
```sql
SELECT w.* FROM `obj_warehouse` w
INNER JOIN `obj_character_warehouse` cw ON w.`UID` = cw.`WarehouseID`
WHERE cw.`CharacterID`=?
```
**File:** `dbWarehouseHandler.java`, Line ~85
### Get Warehouse Items
```sql
SELECT i.*, wi.quantity
FROM `obj_item` i
INNER JOIN `obj_warehouse_item` wi ON i.`UID` = wi.`ItemID`
WHERE wi.`WarehouseID`=?
```
**File:** `dbWarehouseHandler.java`, Line ~120
## Relationships
1. **Warehouse to Items:** Many-to-many through `obj_warehouse_item` table
2. **Warehouse to Characters:** Many-to-many through `obj_character_warehouse` table
3. **Warehouse to Storage Capacity:** Tracks current and maximum storage limits
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_warehouse.name` | Warehouse name |
| `description` | `obj_warehouse.description` | Description of the warehouse |
| `characterID` | `obj_warehouse.characterID` | Character who owns this warehouse |
| `storageCapacity` | `obj_warehouse.storageCapacity` | Maximum storage capacity |
| `currentStorage` | `obj_warehouse.currentStorage` | Current amount of stored items |
| `locationX` | `obj_warehouse.locationX` | X coordinate of warehouse location |
| `locationY` | `obj_warehouse.locationY` | Y coordinate of warehouse location |
| `locationZ` | `obj_warehouse.locationZ` | Z coordinate of warehouse location |
| `isPublic` | `obj_warehouse.isPublic` | Whether the warehouse is publicly accessible |
## Notes
- Warehouses provide extended storage for character inventories
- Multiple characters can access shared warehouses
- The system tracks both storage capacity and current usage
@@ -1,201 +0,0 @@
# Magicbane Database Handler Documentation Index
This index provides an overview of all database handler documentation files created for the Magicbane emulator project.
## Available Documentation Files
1. **dbAccountHandler_Documentation.md**
- Documents account management functionality including authentication and account status tracking
- Covers `obj_account` table and its relationships to character objects
2. **dbCityHandler_Documentation.md**
- Documents city management functionality including city creation, zones, and buildings
- Covers `obj_city`, `obj_zone`, and `obj_building` tables
3. **dbPlayerCharacterHandler_Documentation.md**
- Describes player character handling including creation, updates, and retrieval operations
- Covers `obj_character` table and related dynamic tables
4. **dbRaceHandler_Documentation.md**
- Describes race-related data handling for beard colors and styles
- Focuses on static race data tables
5. **dbGuildHandler_Documentation.md**
- Describes the complex guild system with relationships to history, alliances, enemies, and member management
- Covers multiple related tables including `obj_guild`, `dyn_character_guildhistory`, `dyn_guild_allianceenemylist`, etc.
6. **dbBaneHandler_Documentation.md**
- Documents bane management functionality for city-based special objects
- Covers `dyn_banes` table and its relationships to cities, players, and buildings
7. **dbCSSessionHandler_Documentation.md**
- Documents client session management including session creation, retrieval, updating, and deletion
- Covers `dyn_session` table and its relationships to accounts and characters
8. **dbKitHandler_Documentation.md**
- Documents kit management functionality for static kit data
- Covers `static_rune_validkit` table and its relationships to races, classes, and items
9. **dbLootHandler_Documentation.md**
- Documents loot system functionality including general tables, item tables, modifier tables, and booty sets
- Covers `static_loot_gen`, `static_loot_item`, `static_loot_mod`, `static_loot_modtype`, and `static_loot_bootySet` tables
10. **dbMenuHandler_Documentation.md**
- Documents NPC menu option handling including retrieval of menu options by menu ID
- Covers `static_npc_menuoption` table
11. **dbContractHandler_Documentation.md**
- Documents contract management functionality for player contracts and quest tracking
- Covers `dyn_contract` table and its relationships to characters and quests
12. **dbEffectsBaseHandler_Documentation.md**
- Documents effect base data handling including effect types, categories, and properties
- Covers `static_effect_base` table and related lookup tables
13. **dbEffectsResourceCostHandler_Documentation.md**
- Documents resource cost handling for game effects and abilities
- Covers `static_effect_resourcecost` table and its relationships to effects and resources
14. **dbEnchantmentHandler_Documentation.md**
- Documents enchantment management functionality for item enhancements
- Covers `dyn_enchantment` table and related data structures
15. **dbHeightMapHandler_Documentation.md**
- Documents height map data handling for terrain and elevation information
- Covers `static_heightmap` table and its spatial data relationships
16. **dbItemBaseHandler_Documentation.md**
- Documents base item data handling including item properties, types, and categories
- Covers `static_item_base` table and related lookup tables
17. **dbItemHandler_Documentation.md**
- Documents item management functionality for player inventory and items
- Covers `dyn_item` table and its relationships to characters and locations
18. **dbMineHandler_Documentation.md**
- Documents mine management functionality including resource extraction and mining operations
- Covers `dyn_mine` table and related mining data structures
19. **dbMobBaseHandler_Documentation.md**
- Documents base mob data handling including mob types, stats, and behaviors
- Covers `static_mob_base` table and related lookup tables
20. **dbMobHandler_Documentation.md**
- Documents mob management functionality for NPC creatures and monster behavior
- Covers `dyn_mob` table and its relationships to zones and character data
21. **dbNPCHandler_Documentation.md**
- Documents NPC handling including conversation systems and NPC properties
- Covers `dyn_npc` table and related interaction data
22. **dbPetitionHandler_Documentation.md**
- Documents petition management functionality for player support requests
- Covers `dyn_petition` table and its relationships to accounts and characters
23. **dbPowerHandler_Documentation.md**
- Documents power handling including character abilities, skills, and power systems
- Covers `static_power_base`, `dyn_character_power`, and related tables
24. **dbPromotionClassHandler_Documentation.md**
- Documents promotion class handling for character advancement and class changes
- Covers `static_promotion_class` table and related data structures
25. **dbRealmHandler_Documentation.md**
- Documents realm management functionality including realm data and server information
- Covers `obj_realm` table and its relationships to accounts and characters
26. **dbResistHandler_Documentation.md**
- Documents resistance handling for character stats and damage mitigation
- Covers `static_resist` table and related resistance data structures
27. **dbRuneBaseAttributeHandler_Documentation.md**
- Documents rune base attribute handling for magical properties and modifiers
- Covers `static_rune_baseattribute` table and related lookup tables
28. **dbRuneBaseEffectHandler_Documentation.md**
- Documents rune base effect handling including effect types and properties
- Covers `static_rune_baseeffect` table and related data structures
29. **dbRuneBaseHandler_Documentation.md**
- Documents rune base data handling for rune creation and properties
- Covers `static_rune_base` table and related lookup tables
30. **dbRunegateHandler_Documentation.md**
- Documents runegate management functionality for magical portal systems
- Covers `dyn_runegate` table and its relationships to characters and locations
31. **dbShrineHandler_Documentation.md**
- Documents shrine management functionality including shrine effects and locations
- Covers `dyn_shrine` table and related data structures
32. **dbSkillBaseHandler_Documentation.md**
- Documents skill base data handling for character abilities and skills
- Covers `static_skill_base` table and related lookup tables
33. **dbSkillReqHandler_Documentation.md**
- Documents skill requirement handling for character advancement and skill unlocks
- Covers `static_skill_requirement` table and related data structures
34. **dbVendorDialogHandler_Documentation.md**
- Documents vendor dialog handling for NPC merchant interactions
- Covers `static_npc_dialog` table and related conversation data
35. **dbWarehouseHandler_Documentation.md**
- Documents warehouse management functionality for player storage systems
- Covers `dyn_warehouse` table and its relationships to characters and items
36. **dbBaseClassHandler_Documentation.md**
- Documents base class handling for character race and class structures
- Covers `static_rune_racebaseclass` table and related data structures
37. **dbBlueprintHandler_Documentation.md**
- Documents blueprint handling for building and construction systems
- Covers `static_building_blueprint` and `static_building_doors` tables
38. **dbBoonHandler_Documentation.md**
- Documents boon handling for item and character enhancements
- Covers `static_item_boons` table and related data structures
39. **dbBuildingHandler_Documentation.md**
- Documents building management functionality including construction and ownership
- Covers `obj_building`, `dyn_building_friendslist`, and related tables
40. **dbBuildingLocationHandler_Documentation.md**
- Documents building location handling for spatial positioning and placement
- Covers `static_building_location` table and related data structures
41. **dbCharacterPowerHandler_Documentation.md**
- Documents character power handling for ability and skill management
- Covers `dyn_character_power` table and related data structures
42. **dbCharacterRuneHandler_Documentation.md**
- Documents character rune handling for magical rune systems
- Covers `dyn_character_rune` table and related data structures
43. **dbCharacterSkillHandler_Documentation.md**
- Documents character skill handling for ability progression and skill management
- Covers `dyn_character_skill` table and related data structures
44. **dbZoneHandler_Documentation.md**
- Documents zone management functionality including world zones and area definitions
- Covers `obj_zone` table and its relationships to cities and buildings
## Documentation Structure
All documentation files follow a consistent format with the following sections:
- Overview
- Handler Class information
- Database Tables involved
- Key Queries with line references
- Relationships between entities
- Java Field to Database Column Mappings
## Usage Notes
These documents are intended for:
- Developers working on the Magicbane emulator
- Wiki documentation for project maintainers
- Database schema understanding and maintenance
- Future reference when code changes may affect database relationships
The files are located in: `src/engine/documentation/Handler Specific Documentation/`
+168
View File
@@ -0,0 +1,168 @@
package engine.gameManager;
import engine.Enum;
import engine.InterestManagement.WorldGrid;
import engine.exception.MsgSendException;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
public class ArenaManager {
private static final List<Arena> activeArenas = new ArrayList<>();
public static final List<PlayerCharacter> playerQueue = new ArrayList<>();
public static Long pulseDelay = 180000L;
public static Long lastExecution = 0L;
public static void pulseArenas() {
if(lastExecution == 0L){
lastExecution = System.currentTimeMillis();
}
if(activeArenas.isEmpty() && playerQueue.isEmpty())
return;
Iterator<Arena> iterator = activeArenas.iterator();
while (iterator.hasNext()) {
Arena arena = iterator.next();
if (arena.checkToComplete()) {
iterator.remove();
}
}
if(lastExecution + pulseDelay > System.currentTimeMillis())
return;
lastExecution = System.currentTimeMillis();
while (playerQueue.size() > 1) {
createArena();
}
}
public static void joinQueue(PlayerCharacter player) {
if (!playerQueue.contains(player)) {
playerQueue.add(player);
}
for(PlayerCharacter pc : playerQueue){
if(pc.equals(player))
continue;
ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued.");
}
}
public static void leaveQueue(PlayerCharacter player) {
playerQueue.remove(player);
for(PlayerCharacter pc : playerQueue){
if(pc.equals(player))
continue;
ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued.");
}
}
private static void createArena() {
if (playerQueue.size() > 1) {
Collections.shuffle(playerQueue);
Arena newArena = new Arena();
//set starting time
newArena.startTime = System.currentTimeMillis();
//decide an arena location
newArena.loc = selectRandomArenaLocation();
// Assign players to the arena
newArena.player1 = playerQueue.remove(0);
newArena.player2 = playerQueue.remove(0);
// Teleport players to the arena location
Zone sdr = ZoneManager.getZoneByUUID(656);
MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
// Add the new arena to the active arenas list
activeArenas.add(newArena);
}
}
public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){
if (winner != null && loser != null) {
Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}",
arena.player1.getName(), arena.player2.getName(), winner.getName());
} else {
Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.",
arena.player1.getName(), arena.player2.getName());
}
// Teleport players to the arena location
Zone sdr = ZoneManager.getZoneByUUID(656);
MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
activeArenas.remove(arena);
if(winner != null){
ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!");
//handle prize distribution
//ItemBase specialLoot = ItemBase.getItemBase(866);
//Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
//promoted.setNumOfItems(21235);
//promoted.setName("Special Banker(21235)");
//DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
//winner.getCharItemManager().addItemToInventory(promoted);
//winner.getCharItemManager().updateInventory();
}
}
public static Vector3fImmutable selectRandomArenaLocation() {
boolean locSet = false;
Vector3fImmutable loc = Vector3fImmutable.ZERO;
while (!locSet) {
try {
float x = ThreadLocalRandom.current().nextInt(114300, 123600);
float z = ThreadLocalRandom.current().nextInt(82675, 91700);
float y = 0; // Y coordinate is always 0
loc = new Vector3fImmutable(x, y, z * -1);
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER);
if(inRange.isEmpty() && !isUnderWater(loc))
locSet = true;
//}
}catch(Exception e){
}
}
return loc;
}
public static boolean isUnderWater(Vector3fImmutable loc) {
try {
Zone zone = ZoneManager.findSmallestZone(loc);
if (zone.getSeaLevel() != 0) {
float localAltitude = loc.y;
if (localAltitude < zone.getSeaLevel())
return true;
} else {
if (loc.y < 0)
return true;
}
} catch (Exception e) {
}
return false;
}
}
+36 -1
View File
@@ -438,6 +438,18 @@ public enum BuildingManager {
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
if(building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BANESTONE))
{
Guild playerNation = player.guild.getNation();
City banedCity = ZoneManager.getCityAtLocation(building.loc);
if(banedCity != null){
if(banedCity.getGuild().getNation().equals(playerNation)){
return false;
}else{
return true;
}
}
}
//Nation Members and Guild members are not hostile.
// if (building.getGuild() != null){
// if (pc.getGuild() != null)
@@ -520,7 +532,30 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0)
return false;
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){
if(contract.getContractID() == 850) {
boolean hasRunemaster = false;
for (AbstractCharacter npc : building.getHirelings().keySet()) {
if (npc.getObjectType() != GameObjectType.NPC)
continue;
if(npc.contractUUID == 850)
hasRunemaster = true;
}
if(hasRunemaster)
return false;
}
}
int maxSlots = building.getBlueprint().getMaxSlots();
if(building.getBlueprint().getBuildingGroup() != null) {
maxSlots = building.getBlueprint().getSlotsForRank(building.getRank());
}
if (maxSlots == building.getHirelings().size())
return false;
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
+39 -11
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);
@@ -1054,6 +1055,10 @@ public enum CombatManager {
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
swingAnimation = 0;
if(source != null && source.getObjectType().equals(GameObjectType.PlayerCharacter)){
damage *= ((PlayerCharacter)source).ZergMultiplier;
} // Health modifications are modified by the ZergMechanic
TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation);
DispatchMessage.sendToAllInRange(target, cmm);
}
@@ -1237,14 +1242,17 @@ public enum CombatManager {
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
}
private static void toggleSit(boolean toggle, ClientConnection origin) {
public static void toggleSit(boolean toggle, ClientConnection origin) {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
if (pc == null)
return;
pc.setSit(toggle);
if(pc.isFlying())
pc.setSit(false);
else
pc.setSit(toggle);
UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(pc);
@@ -1322,6 +1330,13 @@ public enum CombatManager {
return;
retaliater.setCombatTarget(ac);
if(retaliater.isPlayerGuard && (retaliater.BehaviourType.equals(MobBehaviourType.GuardMinion) || retaliater.BehaviourType.equals(MobBehaviourType.GuardCaptain))){
for(Mob guard : retaliater.guardedCity.getParent().zoneMobSet){
if(guard.isPlayerGuard && guard.combatTarget == null){
guard.setCombatTarget(ac);
}
}
}
}
}
@@ -1438,4 +1453,17 @@ public enum CombatManager {
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
}
public static boolean LandHit(int C5, int D5){
float chance = (C5-((C5+D5)*.315f)) / ((D5-((C5+D5)*.315f)) + (C5-((C5+D5)*.315f)));
int convertedChance = Math.round(chance * 100);
//convertedChance = Math.max(5, Math.min(95, convertedChance));
int roll = ThreadLocalRandom.current().nextInt(101);
if(roll < 5)//always 5% chance ot miss
return false;
return roll <= convertedChance;
}
}
@@ -65,6 +65,7 @@ public enum ConfigManager {
MB_WORLD_MAINTENANCE,
MB_WORLD_GREETING,
MB_WORLD_KEYCLONE_MAX,
MB_WORLD_TESTMODE,
MB_USE_RUINS,
// Mobile AI modifiers
+18 -3
View File
@@ -79,7 +79,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new AddGoldCmd());
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
DevCmdManager.registerDevCmd(new HotzoneCmd());
DevCmdManager.registerDevCmd(new MineActiveCmd());
// Dev
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
@@ -103,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
@@ -179,8 +179,23 @@ public enum DevCmdManager {
//kill any commands not available to everyone on production server
//only admin level can run dev commands on production
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
boolean playerAllowed = false;
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
switch (adc.getMainCmdString()) {
case "printresists":
case "printstats":
case "printskills":
case "printpowers":
case "gimme":
case "goto":
case "teleportmode":
playerAllowed = true;
if (!a.status.equals(Enum.AccountStatus.ADMIN))
target = pcSender;
break;
}
}
if (!playerAllowed && !a.status.equals(Enum.AccountStatus.ADMIN)) {
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
return false;
}
+557 -99
View File
@@ -17,7 +17,9 @@ import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
/**
@@ -34,6 +36,12 @@ public enum LootManager {
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
public static final ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510));
public static final ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(27570,188900,188910,188920,188930,188940,188950,189500));
public static final ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(27550,27560,189100,189110,189120,189130,189140,189150));
public static final ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(27600,188700,188720,189550,189560));
public static final ArrayList<Integer> racial_guard_uuids = new ArrayList<>(Arrays.asList(841,951,952,1050,1052,1180,1182,1250,1252,1350,1352,1450,1452,1500,1502,1525,1527,1550,1552,1575,1577,1600,1602,1650,1652,1700,980100,980102));
// Drop Rates
public static float NORMAL_DROP_RATE;
@@ -67,41 +75,111 @@ public enum LootManager {
}
public static void GenerateMobLoot(Mob mob) {
//determine if mob is in hotzone
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
boolean inHotzone = false;
//iterate the booty sets
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
if(mob.mobBase == null || mob.getMobBaseID() == 253003){
int i = 0;
}
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet)) {
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
}else if(mob.bootySet != 0 && ItemBase.getItemBase(mob.bootySet) != null){
MobLoot specialDrop = null;
specialDrop = new MobLoot(mob,ItemBase.getItemBase(mob.bootySet),true);
if(specialDrop != null) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
mob.getCharItemManager().addItemToInventory(specialDrop);
mob.setResists(new Resists("Dropper"));
if(!Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
//lastly, check mobs inventory for godly or disc runes to send a server announcement
for (Item it : mob.getInventory()) {
}
ItemBase ib = it.getItemBase();
if(ib == null)
break;
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
}
//lastly, check mobs inventory for godly or disc runes to send a server announcement
for (Item it : mob.getInventory()) {
ItemBase ib = it.getItemBase();
if (ib == null)
break;
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
}
}
}
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
boolean hotzoneWasRan = false;
float dropRate = 1.0f;
float dropRate;
if (!mob.getSafeZone()) {
int contractLow = 1, contractHigh = 400;
int runeLow = 401, runeHigh = 800;
int resourceLow = 801, resourceHigh = 900;
int glassLow = 901, glassHigh = 910;
int guardLow = 911, guardHigh = 920;
// Pre-compute adjusted high values
int contractAdjust = 0, runeAdjust = 0, resourceAdjust = 0, glassAdjust = 0, guardAdjust = 0;
if (mob.level < 50) {
int dif = 50 - mob.level;
contractAdjust = (int)(400 * (dif * 0.02f));
runeAdjust = (int)(400 * (dif * 0.02f));
resourceAdjust = (int)(100 * (dif * 0.02f));
glassAdjust = (int)(10 * (dif * 0.02f));
guardAdjust = (int)(10 * (dif * 0.02f));
}
// Generate a single random roll
int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100001);
// Calculate adjusted high values once
int contractHighAdjusted = contractHigh - contractAdjust;
int runeHighAdjusted = runeHigh - runeAdjust;
int resourceHighAdjusted = resourceHigh - resourceAdjust;
int glassHighAdjusted = glassHigh - glassAdjust;
int guardHighAdjusted = guardHigh - guardAdjust;
// Check the roll range and handle accordingly
if (specialCaseRoll >= contractLow && specialCaseRoll <= contractHighAdjusted) {
SpecialCaseContractDrop(mob, entries);
} else if (specialCaseRoll >= runeLow && specialCaseRoll <= runeHighAdjusted) {
SpecialCaseRuneDrop(mob, entries);
} else if (specialCaseRoll >= resourceLow && specialCaseRoll <= resourceHighAdjusted) {
SpecialCaseResourceDrop(mob, entries);
} else if (specialCaseRoll >= glassLow && specialCaseRoll <= glassHighAdjusted) {
int glassID = rollRandomItem(126);
ItemBase glassItem = ItemBase.getItemBase(glassID);
if (glassItem != null) {
MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
mob.getCharItemManager().addItemToInventory(toAddGlass);
}
} else if (specialCaseRoll >= guardLow && specialCaseRoll <= guardHighAdjusted) {
int guardContractID = racial_guard_uuids.get(new java.util.Random().nextInt(racial_guard_uuids.size()));
ItemBase guardContract = ItemBase.getItemBase(guardContractID);
if (guardContract != null) {
MobLoot toAddContract = new MobLoot(mob, guardContract, false);
mob.getCharItemManager().addItemToInventory(toAddContract);
}
}
}
// Iterate all entries in this bootySet and process accordingly
// Iterate all entries in this bootySet and process accordingly
for (BootySetEntry bse : entries) {
switch (bse.bootyType) {
case "GOLD":
@@ -109,8 +187,10 @@ public enum LootManager {
break;
case "LOOT":
if (mob.getSafeZone() == false)
dropRate = LootManager.NORMAL_DROP_RATE;
if (mob.getSafeZone())
return; // no loot to drop in safezones
dropRate = LootManager.NORMAL_DROP_RATE;
if (inHotzone == true)
dropRate = LootManager.HOTZONE_DROP_RATE;
@@ -135,6 +215,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)
@@ -156,11 +339,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)
@@ -172,13 +354,23 @@ public enum LootManager {
return null;
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
if(ThreadLocalRandom.current().nextInt(1,101) < 91)
return null; // cut down world drops rates of resources by 90%
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
}
if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.RUNE)){
int randomRune = rollRandomItem(itemTableId);
if(randomRune != 0) {
itemUUID = randomRune;
}
} else if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.CONTRACT)){
int randomContract = rollRandomItem(itemTableId);
if(randomContract != 0) {
itemUUID = randomContract;
}
}
outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
Enum.ItemType outType = outItem.getItemBase().getType();
if(selectedRow.pModTable != 0){
try {
@@ -196,6 +388,12 @@ public enum LootManager {
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
}
}
if(outItem.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || outItem.getItemBase().getType().equals(Enum.ItemType.RUNE)){
if(ThreadLocalRandom.current().nextInt(1,101) < 66)
return null; // cut down world drops rates of resources by 65%
}
return outItem;
}
@@ -216,7 +414,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);
@@ -248,7 +446,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) {
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
suffixTableRoll = TableRoll(mob.level, inHotzone);
suffixTableRoll = TableRoll(mob.level);
}
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
@@ -263,23 +461,36 @@ public enum LootManager {
return inItem;
}
public static int TableRoll(int mobLevel, Boolean inHotzone) {
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;
public static int TableRoll(int mobLevel) {
int rank = (int)(mobLevel * 0.1f);
int min = 50;
int max = 100;
switch(rank){
case 1:
min = 200;
max = 250;
break;
case 2:
min = 210;
max = 275;
break;
case 3:
min = 220;
max = 300;
break;
case 4:
min = 230;
max = 320;
break;
case 5:
case 6:
case 7:
case 8:
min = 240;
max = 320;
break;
}
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
@@ -299,12 +510,7 @@ public enum LootManager {
int high = bse.highGold;
int low = bse.lowGold;
int gold = ThreadLocalRandom.current().nextInt(low, high + 1);
if (inHotzone == true)
gold = (int) (gold * HOTZONE_GOLD_RATE);
else
gold = (int) (gold * NORMAL_GOLD_RATE);
int gold = (int) (ThreadLocalRandom.current().nextInt(low, high + 1) * NORMAL_GOLD_RATE);
if (gold > 0) {
MobLoot goldAmount = new MobLoot(mob, gold);
@@ -315,45 +521,63 @@ public enum LootManager {
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
try {
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
if (toAdd != null)
mob.getCharItemManager().addItemToInventory(toAdd);
} catch (Exception e) {
//TODO chase down loot generation error, affects roughly 2% of drops
int i = 0;
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
if(toAdd != null){
ItemBase ib = toAdd.getItemBase();
switch(ib.getType()){
case CONTRACT:
case RUNE:
case RESOURCE:
return;
}
toAdd.setIsID(true);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void GenerateEquipmentDrop(Mob mob) {
if (mob == null || mob.getSafeZone())
return; // no equipment to drop in safezones
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic)
return; // stronghold mobs don't drop equipment
//do equipment here
int dropCount = 0;
if (mob.getEquip() != null)
if (mob.getEquip() != null) {
boolean isVorg = false;
for (MobEquipment me : mob.getEquip().values()) {
if (me.getDropChance() == 0)
continue;
String name = me.getItemBase().getName().toLowerCase();
if (name.contains("vorgrim legionnaire's") || name.contains("vorgrim auxiliary's") ||name.contains("bellugh nuathal") || name.contains("crimson circle"))
isVorg = true;
if(isVorg && !mob.isDropper){
continue;
}
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
float dropChance = me.getDropChance() * 100;
ItemBase itemBase = me.getItemBase();
if(isVorg) {
mob.spawnTime = ThreadLocalRandom.current().nextInt(300, 2700);
dropChance = 10;
itemBase = getRandomVorg(itemBase);
}
if (equipmentRoll > dropChance)
continue;
MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
MobLoot ml = new MobLoot(mob, itemBase, false);
if (ml != null && dropCount < 1) {
ml.setIsID(true);
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
mob.getCharItemManager().addItemToInventory(ml);
dropCount = 1;
//break; // Exit on first successful roll.
}
ml.setIsID(true);
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
mob.getCharItemManager().addItemToInventory(ml);
}
}
}
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
@@ -367,8 +591,11 @@ public enum LootManager {
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
if (lootItem != null)
if (lootItem != null) {
mob.getCharItemManager().addItemToInventory(lootItem);
if(lootItem.getItemBase().isDiscRune() && !Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
}
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
@@ -392,12 +619,12 @@ public enum LootManager {
//check if player owns the gift he is trying to open
if (itemMan.doesCharOwnThisItem(gift.getObjectUUID()) == false)
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID()))
return;
//roll 1-100 for the gen table selection
int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1;
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
if(selectedRow == null)
@@ -413,45 +640,276 @@ public enum LootManager {
//create the item from the table, quantity is always 1
MobLoot winnings = new MobLoot(playerCharacter, ItemBase.getItemBase(selectedItem.cacheID), 1, false);
ItemBase ib = ItemBase.getItemBase(selectedItem.cacheID);
if(ib.getUUID() == Warehouse.coalIB.getUUID()){
//no more coal, give gold instead
if (itemMan.getGoldInventory().getNumOfItems() + 250000 > 10000000) {
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
return;
}
itemMan.addGoldToInventory(250000,false);
itemMan.updateInventory();
}else {
MobLoot winnings = new MobLoot(playerCharacter, ib, 1, false);
if (winnings == null)
return;
if (winnings == null)
return;
//early exit if the inventory of the player will not old the item
//early exit if the inventory of the player will not hold the item
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
return;
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
return;
}
//determine if the winning item needs a prefix
if (selectedRow.pModTable != 0) {
int prefixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
if (prefix != null)
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
}
//determine if the winning item needs a suffix
if (selectedRow.sModTable != 0) {
int suffixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
if (suffix != null)
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
}
winnings.setIsID(true);
//remove gift from inventory
itemMan.consume(gift);
//add winnings to player inventory
Item playerWinnings = winnings.promoteToItem(playerCharacter);
itemMan.addItemToInventory(playerWinnings);
itemMan.updateInventory();
}
}
//determine if the winning item needs a prefix
public static int rollRandomItem(int itemTable){
int returnedID = ItemTableEntry.getRandomItem(itemTable);
return returnedID;
}
if(selectedRow.pModTable != 0){
int prefixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
if(prefix != null)
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
public static ItemBase getRandomVorg(ItemBase itemBase){
int roll = 0;
if(vorg_ha_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_ha_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_ha_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_ha_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_ha_uuids.get(3));
case 5:
return ItemBase.getItemBase(vorg_ha_uuids.get(4));
case 6:
return ItemBase.getItemBase(vorg_ha_uuids.get(5));
case 7:
return ItemBase.getItemBase(vorg_ha_uuids.get(6));
case 8:
return ItemBase.getItemBase(vorg_ha_uuids.get(7));
default:
return ItemBase.getItemBase(vorg_ha_uuids.get(8));
}
}
//determine if the winning item needs a suffix
if(vorg_ma_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_ma_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_ma_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_ma_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_ma_uuids.get(3));
case 5:
return ItemBase.getItemBase(vorg_ma_uuids.get(4));
case 6:
return ItemBase.getItemBase(vorg_ma_uuids.get(5));
case 7:
return ItemBase.getItemBase(vorg_ma_uuids.get(6));
default:
return ItemBase.getItemBase(vorg_ma_uuids.get(7));
}
}
if(selectedRow.sModTable != 0){
int suffixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
if (suffix != null)
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
if(vorg_la_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_la_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_la_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_la_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_la_uuids.get(3));
case 5:
return ItemBase.getItemBase(vorg_la_uuids.get(4));
case 6:
return ItemBase.getItemBase(vorg_la_uuids.get(5));
case 7:
return ItemBase.getItemBase(vorg_la_uuids.get(6));
default:
return ItemBase.getItemBase(vorg_la_uuids.get(7));
}
}
winnings.setIsID(true);
//remove gift from inventory
if(vorg_cloth_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_cloth_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_cloth_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_cloth_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_cloth_uuids.get(3));
default:
return ItemBase.getItemBase(vorg_cloth_uuids.get(4));
}
}
return null;
}
public static void DropPresent(Mob mob){
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);
}
}
itemMan.consume(gift);
public static void GenerateStrongholdLoot(Mob mob, boolean commander, boolean epic) {
//add winnings to player inventory
mob.getCharItemManager().clearInventory();
Item playerWinnings = winnings.promoteToItem(playerCharacter);
itemMan.addItemToInventory(playerWinnings);
itemMan.updateInventory();
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);
}
}
}
}
+15 -108
View File
@@ -24,7 +24,7 @@ public enum MaintenanceManager {
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
building.maintDateTime = maintDate;
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0);
DbManager.BuildingQueries.updateMaintDate(building);
}
@@ -49,19 +49,15 @@ public enum MaintenanceManager {
if (chargeUpkeep(building) == false)
derankList.add(building);
else
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
}
// Reset maintenance dates for these buildings
for (Building building : maintList) {
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
}
// Derak or destroy buildings that did not
// have funds available.
for (Building building : derankList)
for (Building building : derankList) {
building.destroyOrDerank(null);
if(building.getRank() > 0)
setMaintDateTime(building, LocalDateTime.now().plusDays(1));
}
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
}
@@ -98,6 +94,10 @@ public enum MaintenanceManager {
continue;
}
//only ToL pays maintenance
if(building.getBlueprint().getBuildingGroup() != null && !building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL))
continue;
// No maintenance on banestones omfg
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
@@ -122,9 +122,9 @@ public enum MaintenanceManager {
//no maintenance if day of week doesnt match
if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
continue;
}
//if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
// continue;
//}
// Add building to maintenance queue
maintList.add(building);
@@ -186,49 +186,8 @@ public enum MaintenanceManager {
// If this is an R8 tree, validate that we can
// cover the resources required
if (building.getRank() == 8) {
hasResources = true;
if (warehouse == null)
hasResources = false;
else {
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (resourceValue < 5)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (resourceValue < 5)
hasResources = false;
}
}
// Validation completed but has failed. We can derank
// the target building and early exit
if ((hasFunds == false) ||
((building.getRank() == 8) && !hasResources)) {
// Add cash back to strongbox for lost rank if the building isn't being destroyed
// and it's not an R8 deranking
if ((building.getRank() > 1) && (building.getRank() < 8)) {
building.setStrongboxValue(building.getStrongboxValue() + building.getBlueprint().getRankCost(Math.min(building.getRank(), 7)));
}
if (hasFunds == false) {
return false; // Early exit for having failed to meet maintenance
}
@@ -253,58 +212,6 @@ public enum MaintenanceManager {
}
}
// Early exit as we're done if we're not an R8 tree
if (building.getRank() < 8)
return true;
// Now for the resources if it's an R8 tree
// Withdraw Stone
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
} else {
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
// Withdraw Lumber
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
} else {
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
// Withdraw Galvor
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
} else {
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
} else {
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
}
return true;
}
+4 -4
View File
@@ -68,7 +68,7 @@ public enum MovementManager {
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
if (((PlayerCharacter) toMove).isCasting())
((PlayerCharacter) toMove).update();
((PlayerCharacter) toMove).update(false);
}
@@ -96,7 +96,7 @@ public enum MovementManager {
if (!toMove.isMoving())
toMove.resetLastSetLocUpdate();
else
toMove.update();
toMove.update(false);
// Update movement for the player
@@ -351,7 +351,7 @@ public enum MovementManager {
ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ());
//Send run/walk/sit/stand to tell the client we are flying / landing etc
ac.update();
ac.update(false);
ac.stopMovement(ac.getLoc());
if (ac.isAlive())
MovementManager.sendRWSSMsg(ac);
@@ -408,7 +408,7 @@ public enum MovementManager {
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
continue;
member.update();
member.update(false);
// All checks passed, let's move the player
+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);
+181 -45
View File
@@ -163,6 +163,14 @@ public enum PowersManager {
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
boolean sendCastToSelf) {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
if(!pc.isFlying() && powersBaseByToken.get(msg.getPowerUsedID()) != null && powersBaseByToken.get(msg.getPowerUsedID()).isSpell) //cant be sitting if flying
CombatManager.toggleSit(false,origin);
if(pc.isMoving())
pc.stopMovement(pc.getMovementLoc());
if (usePowerA(msg, origin, sendCastToSelf)) {
// Cast failed for some reason, reset timer
@@ -171,13 +179,10 @@ public enum PowersManager {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
// Send Fail to cast message
PlayerCharacter pc = SessionManager
.getPlayerCharacter(origin);
if (pc != null) {
sendPowerMsg(pc, 2, msg);
if (pc.isCasting()) {
pc.update();
pc.update(false);
}
pc.setIsCasting(false);
@@ -205,6 +210,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 +281,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 +293,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 +349,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 +446,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 +568,6 @@ public enum PowersManager {
// Validity checks passed, move on to casting spell
//get caster's live counter
int casterLiveCounter = playerCharacter.getLiveCounter();
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
if (time > 0) {
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
@@ -514,7 +594,7 @@ public enum PowersManager {
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
playerCharacter.update();
playerCharacter.update(false);
playerCharacter.setSit(false);
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
@@ -522,7 +602,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())
@@ -535,13 +617,12 @@ public enum PowersManager {
if (time > 100) {
playerCharacter.update();
playerCharacter.update(false);
playerCharacter.setIsCasting(true);
}
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
// run timer job to end cast
if (time < 1) // run immediately
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
@@ -706,8 +787,19 @@ public enum PowersManager {
if (playerCharacter == null || msg == null)
return;
//if((msg.getPowerUsedID() == 429495514 || msg.getPowerUsedID() == 429407306) && playerCharacter.getRace().getName().toLowerCase().contains("shade")){
// //use sneak instead of hide
// PowersBase pb = PowersManager.getPowerByToken(429397210);
// int offsetTrains = (40 - msg.getNumTrains()) ;
// applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429397210,msg.getNumTrains(),false);
// applyPower(playerCharacter,playerCharacter,playerCharacter.loc,427857146,offsetTrains,false);
//}
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
}
if (playerCharacter.isCasting()) {
playerCharacter.update();
playerCharacter.update(false);
playerCharacter.updateStamRegen(-100);
}
@@ -809,15 +901,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 +1326,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 +1430,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 +1565,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 +1588,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);
@@ -2189,7 +2325,7 @@ public enum PowersManager {
// set player is not casting for regens
if (pc.isCasting()) {
pc.update();
pc.update(false);
}
pc.setIsCasting(false);
@@ -2241,28 +2377,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 +2696,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) {
+24 -10
View File
@@ -10,10 +10,7 @@ package engine.gameManager;
import engine.Enum;
import engine.Enum.GameObjectType;
import engine.objects.AbstractGameObject;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import engine.objects.Runegate;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
@@ -33,7 +30,7 @@ public enum SimulationManager {
SERVERHEARTBEAT;
private static final long CITY_PULSE = 2000;
private static final long RUNEGATE_PULSE = 3000;
private static final long RUNEGATE_PULSE = 1000;
private static final long UPDATE_PULSE = 1000;
private static final long FlIGHT_PULSE = 100;
public static Duration executionTime = Duration.ofNanos(1);
@@ -116,9 +113,18 @@ public enum SimulationManager {
}
try {
if ((_cityPulseTime != 0)
&& (System.currentTimeMillis() > _cityPulseTime))
pulseCities();
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) {
try {
pulseCities();
}catch(Exception e){
}
try {
ArenaManager.pulseArenas();
}catch(Exception e){
}
}
} catch (Exception e) {
Logger.error(
"Fatal error in City Pulse: DISABLED. Error Message : "
@@ -154,7 +160,7 @@ public enum SimulationManager {
if (player == null)
continue;
player.update();
player.update(false);
}
_updatePulseTime = System.currentTimeMillis() + 500;
@@ -203,8 +209,12 @@ public enum SimulationManager {
city = (City) cityObject;
city.onEnter();
}
for(Mine mine : Mine.getMines()){
if(mine != null && mine.isActive)
mine.onEnter();
}
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
}
/*
@@ -214,6 +224,10 @@ public enum SimulationManager {
private void pulseRunegates() {
for (Runegate runegate : Runegate._runegates.values()) {
for(Portal portal : runegate._portals)
if(!portal.isActive())
portal.activate(false);
runegate.collidePortals();
}
@@ -0,0 +1,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;
}
}
}
}
+195
View File
@@ -0,0 +1,195 @@
package engine.gameManager;
import engine.objects.Guild;
public class ZergManager {
public static float getCurrentMultiplier(int count, int maxCount){
switch(maxCount) {
case 3: return getMultiplier3Man(count);
case 5: return getMultiplier5Man(count);
case 10: return getMultiplier10Man(count);
case 20: return getMultiplier20Man(count);
case 30: return getMultiplier30Man(count);
case 40: return getMultiplier40Man(count);
default: return 1.0f; //unlimited
}
}
public static float getMultiplier3Man(int count) {
if(count < 4)
return 1.0f;
if(count > 6)
return 0.0f;
switch(count){
case 4: return 0.63f;
case 5: return 0.40f;
case 6: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier5Man(int count) {
if(count < 6)
return 1.0f;
if(count > 10)
return 0.0f;
switch(count){
case 6: return 0.75f;
case 7: return 0.57f;
case 8: return 0.44f;
case 9: return 0.33f;
case 10: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier10Man(int count) {
if(count < 11)
return 1.0f;
if(count > 20)
return 0.0f;
switch(count){
case 11: return 0.86f;
case 12: return 0.75f;
case 13: return 0.65f;
case 14: return 0.57f;
case 15: return 0.50f;
case 16: return 0.44f;
case 17: return 0.38f;
case 18: return 0.33f;
case 19: return 0.29f;
case 20: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier20Man(int count) {
if(count < 21)
return 1.0f;
if(count > 40)
return 0.0f;
switch (count)
{
case 21: return 0.93f;
case 22: return 0.86f;
case 23: return 0.80f;
case 24: return 0.75f;
case 25: return 0.70f;
case 26: return 0.65f;
case 27: return 0.61f;
case 28: return 0.57f;
case 29: return 0.53f;
case 30: return 0.50f;
case 31: return 0.47f;
case 32: return 0.44f;
case 33: return 0.41f;
case 34: return 0.38f;
case 35: return 0.36f;
case 36: return 0.33f;
case 37: return 0.31f;
case 38: return 0.29f;
case 39: return 0.27f;
case 40: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier30Man(int count) {
if(count < 31)
return 1.0f;
if(count > 60)
return 0.0f;
switch (count)
{
case 31: return 0.95f;
case 32: return 0.91f;
case 33: return 0.86f;
case 34: return 0.82f;
case 35: return 0.79f;
case 36: return 0.75f;
case 37: return 0.72f;
case 38: return 0.68f;
case 39: return 0.65f;
case 40: return 0.63f;
case 41: return 0.60f;
case 42: return 0.57f;
case 43: return 0.55f;
case 44: return 0.52f;
case 45: return 0.50f;
case 46: return 0.48f;
case 47: return 0.46f;
case 48: return 0.44f;
case 49: return 0.42f;
case 50: return 0.40f;
case 51: return 0.38f;
case 52: return 0.37f;
case 53: return 0.35f;
case 54: return 0.33f;
case 55: return 0.32f;
case 56: return 0.30f;
case 57: return 0.29f;
case 58: return 0.28f;
case 59: return 0.26f;
case 60: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier40Man(int count) {
if(count < 41)
return 1.0f;
if(count > 80)
return 0.0f;
switch (count)
{
case 41: return 0.96f;
case 42: return 0.93f;
case 43: return 0.90f;
case 44: return 0.86f;
case 45: return 0.83f;
case 46: return 0.80f;
case 47: return 0.78f;
case 48: return 0.75f;
case 49: return 0.72f;
case 50: return 0.70f;
case 51: return 0.68f;
case 52: return 0.65f;
case 53: return 0.63f;
case 54: return 0.61f;
case 55: return 0.59f;
case 56: return 0.57f;
case 57: return 0.55f;
case 58: return 0.53f;
case 59: return 0.52f;
case 60: return 0.50f;
case 61: return 0.48f;
case 62: return 0.47f;
case 63: return 0.45f;
case 64: return 0.44f;
case 65: return 0.42f;
case 66: return 0.41f;
case 67: return 0.40f;
case 68: return 0.38f;
case 69: return 0.37f;
case 70: return 0.36f;
case 71: return 0.35f;
case 72: return 0.33f;
case 73: return 0.32f;
case 74: return 0.31f;
case 75: return 0.30f;
case 76: return 0.29f;
case 77: return 0.28f;
case 78: return 0.27f;
case 79: return 0.26f;
case 80: return 0.25f;
default: return 1.0f;
}
}
}
-73
View File
@@ -19,14 +19,12 @@ import engine.objects.Building;
import engine.objects.City;
import engine.objects.Zone;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
/*
* Class contains methods and structures which
@@ -109,20 +107,6 @@ public enum ZoneManager {
}
// Returns the number of available hotZones
// remaining in this cycle (1am)
public static int availableHotZones() {
int count = 0;
for (Zone zone : ZoneManager.macroZones)
if (ZoneManager.validHotZone(zone))
count = count + 1;
return count;
}
// Resets the availability of hotZones
// for this cycle
@@ -217,63 +201,6 @@ public enum ZoneManager {
ZoneManager.playerCityZones.add(zone);
}
public static final void generateAndSetRandomHotzone() {
Zone hotZone;
ArrayList<Integer> zoneArray = new ArrayList<>();
if (ZoneManager.macroZones.isEmpty())
return;
// Reset hotZone availability if none are left.
if (ZoneManager.availableHotZones() == 0)
ZoneManager.resetHotZones();
for (Zone zone : ZoneManager.macroZones)
if (validHotZone(zone))
zoneArray.add(zone.getObjectUUID());
int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size());
hotZone = ZoneManager.getZoneByUUID(zoneArray.get(entryIndex));
if (hotZone == null) {
Logger.error("Hotzone is null");
return;
}
ZoneManager.setHotZone(hotZone);
}
public static final boolean validHotZone(Zone zone) {
if (zone.getSafeZone() == (byte) 1)
return false; // no safe zone hotzones// if (this.hotzone == null)
if (zone.getNodes().isEmpty())
return false;
if (zone.equals(ZoneManager.seaFloor))
return false;
//no duplicate hotZones
if (zone.hasBeenHotzone == true)
return false;
// Enforce min level
if (zone.minLvl < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
return false;
if (ZoneManager.hotZone != null)
return ZoneManager.hotZone.getObjectUUID() != zone.getObjectUUID();
return true;
}
// Converts world coordinates to coordinates local to a given zone.
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
+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!");
+18 -4
View File
@@ -9,10 +9,12 @@
package engine.loot;
import engine.gameManager.LootManager;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class ItemTableEntry {
public int minRoll;
@@ -35,11 +37,23 @@ public class ItemTableEntry {
List<ItemTableEntry> itemTableEntryList;
itemTableEntryList = LootManager._itemTables.get(itemTable);
if(itemTableEntryList != null) {
for (ItemTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
itemTableEntry = iteration;
}
return itemTableEntry;
}
public static Integer getRandomItem(int itemTable) {
int id = 0;
List<ItemTableEntry> itemTableEntryList;
for (ItemTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
itemTableEntry = iteration;
itemTableEntryList = LootManager._itemTables.get(itemTable);
return itemTableEntry;
if(itemTableEntryList != null && itemTableEntryList.size() > 1){
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0, itemTableEntryList.size())).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;
}
}
+1 -1
View File
@@ -220,7 +220,7 @@ public class Bounds {
//player is inside building region, skip collision check. we only do collision from the outside.
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
continue;
if (building.getBounds().colliders == null)
if (building.getBounds() == null || building.getBounds().colliders == null)
continue;
for (Colliders collider : building.getBounds().colliders) {
+106 -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());
}
@@ -156,9 +166,12 @@ public class MobAI {
try {
if(mob == null || target == null)
return;
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
mob.setCombatTarget(null);
return;
return;
}
City playercity = ZoneManager.getCityAtLocation(mob.getLoc());
@@ -166,7 +179,7 @@ public class MobAI {
if (playercity != null)
for (Mob guard : playercity.getParent().zoneMobSet)
if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
if (guard.getCombatTarget() == null && !guard.getGuild().equals(mob.getGuild()))
if (guard.getCombatTarget() == null && guard.getGuild() != null && mob.getGuild() != null && !guard.getGuild().equals(mob.getGuild()))
guard.setCombatTarget(mob);
if (mob.isSiege())
@@ -195,11 +208,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 +413,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 {
@@ -589,6 +602,26 @@ public class MobAI {
if (mob == null)
return;
boolean continueExecution = false;
switch(mob.BehaviourType){
case GuardCaptain:
case GuardMinion:
case Pet1:
case GuardWallArcher:
case HamletGuard:
case SimpleStandingGuard:
continueExecution = true;
break;
}
if(!continueExecution) {
MobAi2.runAI(mob);
return;
}
if(mob.isAlive())
if(!mob.getMovementLoc().equals(Vector3fImmutable.ZERO))
mob.setLoc(mob.getMovementLoc());
if (mob.getTimestamps().containsKey("lastExecution") == false)
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
@@ -625,9 +658,6 @@ public class MobAI {
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
CheckToSendMobHome(mob);
return;
}
@@ -646,7 +676,7 @@ public class MobAI {
return;
}
if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
if(mob.isPet() == false && mob.isPlayerGuard == false)
CheckToSendMobHome(mob);
if (mob.getCombatTarget() != null) {
@@ -857,16 +887,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();
@@ -874,9 +902,15 @@ public class MobAI {
}
}
}
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
if (Zone.respawnQue.contains(aiAgent) == false) {
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,7 +945,21 @@ public class MobAI {
private static void CheckToSendMobHome(Mob mob) {
if(mob.isNecroPet())
return;
try {
//trebs dont recall
if(mob.isSiege())
return;
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()) {
@@ -922,9 +970,6 @@ public class MobAI {
}
}
if (mob.getCombatTarget() != null && CombatUtilities.inRange2D(mob, mob.getCombatTarget(), MobAIThread.AI_BASE_AGGRO_RANGE * 0.5f))
return;
if (mob.isPlayerGuard() && !mob.despawned) {
City current = ZoneManager.getCityAtLocation(mob.getLoc());
@@ -945,7 +990,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);
@@ -953,6 +998,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());
@@ -1006,7 +1052,7 @@ public class MobAI {
//dont scan self.
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) == true)
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) || (mob.agentType.equals(Enum.AIAgentType.PET)))
continue;
Mob aggroMob = (Mob) awoMob;
@@ -1029,9 +1075,22 @@ public class MobAI {
}
}
public static void checkToDropGuardAggro(Mob mob){
City city = mob.guardedCity;
if(city == null)
return;
if(mob.combatTarget == null)
return;
if(city._playerMemory.contains(mob.combatTarget.getObjectUUID()) && mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
mob.setCombatTarget(null);
}
public static void GuardCaptainLogic(Mob mob) {
try {
checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob);
@@ -1056,6 +1115,8 @@ public class MobAI {
public static void GuardMinionLogic(Mob mob) {
try {
checkToDropGuardAggro(mob);
boolean isComanded = mob.npcOwner.isAlive();
if (!isComanded) {
GuardCaptainLogic(mob);
@@ -1076,6 +1137,8 @@ public class MobAI {
public static void GuardWallArcherLogic(Mob mob) {
try {
checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob);
else
@@ -1351,21 +1414,24 @@ public class MobAI {
return null;
}
public static void RecoverHealth(Mob mob){
public static void RecoverHealth(Mob mob) {
//recover health
try {
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
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()) {
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());
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());
}
if (mob.getHealth() > mob.getHealthMax())
mob.setHealth(mob.getHealthMax());
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage());
}
}
}
+360
View File
@@ -0,0 +1,360 @@
package engine.mobileAI;
import engine.Enum;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.*;
import engine.mobileAI.Threads.MobAIThread;
import engine.mobileAI.utilities.CombatUtilities;
import engine.mobileAI.utilities.MovementUtilities;
import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.util.HashSet;
import java.util.concurrent.ThreadLocalRandom;
public class MobAi2 {
public enum State
{
Idle,
Patrolling,
Attacking,
Dead
}
public static boolean Agressive(Mob mob){
return mob.BehaviourType.name().contains("Aggro");
}
public static boolean Caster(Mob mob){
return mob.BehaviourType.name().contains("Power");
}
public static boolean HelpResponder(Mob mob){
return mob.BehaviourType.name().contains("Helpee");
}
public static State getState(Mob mob){
if(!mob.isAlive())
return State.Dead;
if(mob.playerAgroMap.isEmpty())
return State.Idle;
if(mob.combatTarget != null)
return State.Attacking;
return State.Patrolling;
}
public static void runAI(Mob mob){
//these will be handled in special conditions later
switch(mob.BehaviourType){
case GuardCaptain:
case GuardMinion:
case Pet1:
case GuardWallArcher:
case HamletGuard:
case SimpleStandingGuard:
return;
}
switch(getState(mob)){
case Idle:
if(mob.isMoving())
mob.stopMovement(mob.loc);
if(mob.combatTarget != null) {
mob.setCombatTarget(null);
mob.setCombat(false);
}
return;
case Dead:
respawn(mob);
break;
case Patrolling:
patrol(mob);
break;
case Attacking:
attack(mob);
break;
}
}
//handles respawning and de-spawning for mobs and their corpses
public static void respawn(Mob mob){
//if mob doesn't have a death time somehow, set it to now
if (mob.deathTime == 0)
mob.setDeathTime(System.currentTimeMillis());
//only execute this logic is the mob hasn't de-spawned yet
if (!mob.despawned) {
//if the inventory is empty, the mob can disappear
if(mob.getInventory(true).isEmpty() && System.currentTimeMillis() > mob.deathTime + 10000L) {
mob.despawn();
mob.deathTime = System.currentTimeMillis();
return;
}
//if the mob has been dead for 10 seconds it can disappear
if (System.currentTimeMillis() > mob.deathTime + 10000L) {
mob.despawn();
mob.deathTime = System.currentTimeMillis();
return;
}
}
//disc dropper respawns are handled elsewhere
if(Mob.discDroppers.contains(mob))
return;
//if mob isn't queued for respawn, do so now
if (!Zone.respawnQue.contains(mob)) {
if (System.currentTimeMillis() > (mob.deathTime + (mob.spawnTime * 1000L))) {
Zone.respawnQue.add(mob);
}
}
}
//handles patrolling and looking for potential combat targets
public static void patrol(Mob mob){
if(Agressive(mob) && mob.combatTarget == null) {
HashSet<AbstractWorldObject> potentialTargets = WorldGrid.getObjectsInRangePartial(mob.loc, 50, MBServerStatics.MASK_PLAYER);
for (AbstractWorldObject awo : potentialTargets) {
PlayerCharacter target = (PlayerCharacter) awo;
if (mob.canSee(target))
mob.setCombatTarget(target);
if (mob.combatTarget != null) {
return;
}
}
}
if(mob.isMoving() || !mob.BehaviourType.canRoam)
return;
int patrolDelay = ThreadLocalRandom.current().nextInt((int) (MobAIThread.AI_PATROL_DIVISOR * 0.5f), MobAIThread.AI_PATROL_DIVISOR) + MobAIThread.AI_PATROL_DIVISOR;
if (mob.stopPatrolTime + (patrolDelay * 1000L) > System.currentTimeMillis())
return;
if (mob.lastPatrolPointIndex > mob.patrolPoints.size() - 1)
mob.lastPatrolPointIndex = 0;
mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex);
mob.lastPatrolPointIndex += 1;
MovementUtilities.aiMove(mob, mob.destination, true);
}
public static void attack(Mob mob){
AbstractWorldObject target = mob.combatTarget;
if (target == null || !target.isAlive()) {
mob.setCombatTarget(null);
return;
}
if(!mob.isCombat())
mob.setCombat(true);
if (!CombatUtilities.inRangeToAttack(mob, target) && mob.BehaviourType.canRoam) {
if(mob.nextChaseUpdate < System.currentTimeMillis()) {
mob.nextChaseUpdate = System.currentTimeMillis() + 2500L;
MovementUtilities.aiMove(mob, target.loc, false);
}
return;
}
switch (target.getObjectType()) {
case PlayerCharacter:
PlayerCharacter targetPlayer = (PlayerCharacter) target;
AttackPlayer(mob, targetPlayer);
break;
case Building:
Building targetBuilding = (Building) target;
AttackBuilding(mob, targetBuilding);
break;
case Mob:
Mob targetMob = (Mob) target;
AttackMob(mob, targetMob);
break;
}
}
public static void AttackPlayer(Mob mob, PlayerCharacter target) {
try {
if (!mob.canSee(target)) {
mob.setCombatTarget(null);
return;
}
if (mob.BehaviourType.callsForHelp)
MobCallForHelp(mob);
if (!MovementUtilities.inRangeDropAggro(mob, target)) {
mob.setCombatTarget(null);
return;
}
if (CombatUtilities.inRange2D(mob, target, mob.getRange())) {
//no weapons, default mob attack speed 3 seconds.
if (System.currentTimeMillis() < mob.getLastAttackTime())
return;
// ranged mobs can't attack while running. skip until they finally stop.
if (mob.isMoving() && mob.getRange() > 20)
return;
// add timer for last attack.
ItemBase mainHand = mob.getWeaponItemBase(true);
ItemBase offHand = mob.getWeaponItemBase(false);
if (mainHand == null && offHand == null) {
CombatUtilities.combatCycle(mob, target, true, null);
int delay = 3000;
if (mob.isSiege())
delay = 11000;
mob.setLastAttackTime(System.currentTimeMillis() + delay);
} else if (mob.getWeaponItemBase(true) != null) {
int delay = 3000;
if (mob.isSiege())
delay = 11000;
CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true));
mob.setLastAttackTime(System.currentTimeMillis() + delay);
} else if (mob.getWeaponItemBase(false) != null) {
int attackDelay = 3000;
if (mob.isSiege())
attackDelay = 11000;
CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false));
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
}
}
if (target.getPet() != null)
if (target.getPet().getCombatTarget() == null && target.getPet().assist)
target.getPet().setCombatTarget(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage());
}
}
public static void AttackBuilding(Mob mob, Building target) {
try {
if(mob == null || target == null)
return;
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
mob.setCombatTarget(null);
return;
}
City playerCity = ZoneManager.getCityAtLocation(mob.getLoc());
if (playerCity != null)
for (Mob guard : playerCity.getParent().zoneMobSet)
if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
if (guard.getCombatTarget() == null && guard.getGuild() != null && mob.getGuild() != null && !guard.getGuild().equals(mob.getGuild()))
guard.setCombatTarget(mob);
if (mob.isSiege())
MovementManager.sendRWSSMsg(mob);
ItemBase mainHand = mob.getWeaponItemBase(true);
ItemBase offHand = mob.getWeaponItemBase(false);
if (mainHand == null && offHand == null) {
CombatUtilities.combatCycle(mob, target, true, null);
int delay = 3000;
if (mob.isSiege())
delay = 15000;
mob.setLastAttackTime(System.currentTimeMillis() + delay);
} else if (mob.getWeaponItemBase(true) != null) {
int attackDelay = 3000;
if (mob.isSiege())
attackDelay = 15000;
CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true));
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
} else if (mob.getWeaponItemBase(false) != null) {
int attackDelay = 3000;
if (mob.isSiege())
attackDelay = 15000;
CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false));
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
}
}
public static void AttackMob(Mob mob, Mob target) {
try {
if (mob.getRange() >= 30 && mob.isMoving())
return;
//no weapons, default mob attack speed 3 seconds.
ItemBase mainHand = mob.getWeaponItemBase(true);
ItemBase offHand = mob.getWeaponItemBase(false);
if (mainHand == null && offHand == null) {
CombatUtilities.combatCycle(mob, target, true, null);
int delay = 3000;
if (mob.isSiege())
delay = 11000;
mob.setLastAttackTime(System.currentTimeMillis() + delay);
} else if (mob.getWeaponItemBase(true) != null) {
int attackDelay = 3000;
if (mob.isSiege())
attackDelay = 11000;
CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true));
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
} else if (mob.getWeaponItemBase(false) != null) {
int attackDelay = 3000;
if (mob.isSiege())
attackDelay = 11000;
CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false));
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
if (target.getCombatTarget() == null) {
target.setCombatTarget(mob);
}
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
}
}
public static void MobCallForHelp(Mob mob) {
if (mob.nextCallForHelp == 0)
mob.nextCallForHelp = System.currentTimeMillis();
if (mob.nextCallForHelp > System.currentTimeMillis())
return;
Zone mobCamp = mob.getParentZone();
for (Mob helper : mobCamp.zoneMobSet) {
if (HelpResponder(helper)) {
helper.setCombatTarget(mob.getCombatTarget());
break;
}
}
mob.nextCallForHelp = System.currentTimeMillis() + 30000L;
}
}
@@ -8,6 +8,8 @@
package engine.mobileAI.Threads;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.ZoneManager;
import engine.objects.Mob;
import engine.objects.Zone;
@@ -49,6 +51,8 @@ public class MobRespawnThread implements Runnable {
respawner.respawn();
zone.respawnQue.remove(respawner);
zone.lastRespawn = System.currentTimeMillis();
WorldGrid.updateObject(respawner);
InterestManager.setObjectDirty(respawner);
}
}
} catch (Exception e) {
@@ -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;
+127 -94
View File
@@ -85,7 +85,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc == null)
return;
pc.update();
pc.update(false);
if (msg.getSpeed() == 2)
pc.setWalkMode(false);
else
@@ -114,7 +114,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc == null)
return;
pc.update();
pc.update(false);
pc.setSit(msg.toggleSitStand());
@@ -560,12 +560,30 @@ public class ClientMessagePump implements NetMsgHandler {
if (!itemManager.inventoryContains(i))
return;
if (i.isCanDestroy())
if (itemManager.delete(i) == true) {
//cannot delete gold
if(i.getItemBaseID() == 7)
return;
if (i.isCanDestroy()) {
int goldValue = i.getBaseValue();
if (i.getItemBase().isRune())
goldValue = 500000;
if (i.getItemBaseID() == 980066)
goldValue = 0;
if(itemManager.getGoldInventory().getNumOfItems() + goldValue > 10000000)
return;
if (itemManager.delete(i)) {
if (goldValue > 0)
itemManager.addGoldToInventory(goldValue, false);
itemManager.updateInventory();
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
}
}
}
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
@@ -654,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);
@@ -1243,6 +1263,8 @@ public class ClientMessagePump implements NetMsgHandler {
cost = sell.getBaseValue();
if(sell.getItemBaseID() == 980066)
cost = 0;
//apply damaged value reduction
float durabilityCurrent = sell.getDurabilityCurrent();
@@ -1347,6 +1369,8 @@ public class ClientMessagePump implements NetMsgHandler {
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);
@@ -1358,219 +1382,192 @@ public class ClientMessagePump implements NetMsgHandler {
}
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
if (sourcePlayer == null)
return;
if (origin.buyLock.tryLock()) {
try {
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
if (itemMan == null)
if (itemMan == null) {
return;
}
NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null)
if (npc == null) {
return;
}
Item gold = itemMan.getGoldInventory();
if (gold == null)
if (gold == null) {
return;
}
Item buy = null;
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
if (sellInventory == null)
//if(npc.contract.getObjectUUID() == 890){ // default steward
// sellInventory = npc.getSellInventorySteward();
//}
//if(npc.contract.getObjectUUID() == 889){ // default builder
// sellInventory = npc.getSellInventoryBuilder();
//}
if (sellInventory == null) {
return;
}
for (MobEquipment me : sellInventory) {
if (me.getObjectUUID() == msg.getItemID()) {
ItemBase ib = me.getItemBase();
if (ib == null)
if (ib == null) {
return;
}
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
if (!itemMan.hasRoomInventory(ib.getWeight())) {
return;
}
int cost = me.getMagicValue();
float bargain = sourcePlayer.getBargain();
switch(npc.getContractID()){
case 1201:
cost = ItemBase.getDiscPrice(ib.getUUID());
bargain = 0;
break;
case 1202:
cost = ItemBase.getStatPrice(ib.getUUID());
bargain = 0;
break;
case 900:
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
bargain = 0;
break;
}
float profit;
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if (profit < 1)
profit = 1;
if(npc.isInSafeZone())
profit = 0;
else
profit = npc.getSellPercent(sourcePlayer) - bargain;
cost *= profit;
if(profit > 0)
cost *= profit;
if (gold.getNumOfItems() - cost < 0) {
//dont' have enough goldItem exit!
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null;
int buildingDeposit = cost - me.getMagicValue();
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
}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;
}
buy = Item.createItemForPlayer(sourcePlayer, ib);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
//itemMan.updateInventory();
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
handleResourcePurchase(me,itemMan,sourcePlayer,ib);
}else {
buy = Item.createItemForPlayer(sourcePlayer, ib, me.fromNoob);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
buy.setNumOfItems(10);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
//itemMan.updateInventory();
}
}
}
}
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null)
return;
buy = Item.getFromCache(msg.getItemID());
if (buy == null)
return;
ItemBase ib = buy.getItemBase();
if (ib == null)
return;
if (!npcCim.inventoryContains(buy))
return;
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getBaseValue();
if (buy.isID() || buy.isCustomValue())
cost = buy.getMagicValue();
float bargain = sourcePlayer.getBargain();
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if (profit < 1)
profit = 1;
if (!buy.isCustomValue())
cost *= profit;
else
cost = buy.getValue();
if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null)
if (b.getProtectionState().equals(ProtectionState.NPC))
b = null;
int buildingDeposit = cost;
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
return;
}
if (buy != null)
itemMan.buyFromNPC(buy, npc);
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null)
return;
buy = MobLoot.getFromCache(msg.getItemID());
if (buy == null)
return;
ItemBase ib = buy.getItemBase();
if (ib == null)
return;
if (!npcCim.inventoryContains(buy))
return;
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getMagicValue();
cost *= npc.getSellPercent(sourcePlayer);
if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null;
int buildingDeposit = cost;
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
return;
if (buy != null)
itemMan.buyFromNPC(buy, npc);
} else
return;
if (buy != null) {
msg.setItem(buy);
//send the buy message back to update player
// msg.setItemType(buy.getObjectType().ordinal());
@@ -1579,14 +1576,43 @@ public class ClientMessagePump implements NetMsgHandler {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
itemMan.updateInventory();
}
} finally {
origin.buyLock.unlock();
}
} else {
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
}
}
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, PlayerCharacter sourcePlayer, ItemBase ib){
boolean stacked = false;
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
for(Item item : itemMan.getInventory()){
int itemID = item.getItemBaseID();
int meID = me.getItemBase().getUUID();
if(itemID == meID){
if(Warehouse.maxResources.isEmpty())
Warehouse.getMaxResources();
int maxStack = Warehouse.maxResources.get(itemID);
if(maxStack > item.getNumOfItems() + buystack){
item.setNumOfItems(item.getNumOfItems() + buystack);
stacked = true;
itemMan.updateInventory();
DbManager.ItemQueries.UPDATE_NUM_ITEMS(item,item.getNumOfItems());
break;
}
}
}
if(!stacked){
Item buy = Item.createItemForPlayer(sourcePlayer, ib, false);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
buy.setNumOfItems(buystack);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
}
itemMan.updateInventory();
}
private static void Repair(RepairMsg msg, ClientConnection origin) {
@@ -1646,14 +1672,21 @@ public class ClientMessagePump implements NetMsgHandler {
max *= (1 + (durMod * 0.01f));
if (dur >= max || dur < 1) {
//redundancy message to clear item from window in client
if (!DbManager.ItemQueries.SET_DURABILITY(toRepair, dur))
return;
toRepair.setDurabilityCurrent(max);
msg.setupRepairAck(max - dur);
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
return;
}
//TODO get cost to repair
int cost = (int) ((max - dur) * 80.1);
int pointsToRepair = max - dur;
double damageRatio = (double)1.0d - (toRepair.getDurabilityMax() - toRepair.getDurabilityCurrent()) / toRepair.getDurabilityMax();
int modifiedValue = (int)(damageRatio * toRepair.getMagicValue());
int costPerPoint = modifiedValue / toRepair.getDurabilityMax();
int modifiedRepairCost = (int)(pointsToRepair * costPerPoint)+ npc.getSpecialPrice();
int cost = (int)(modifiedRepairCost * 1 + npc.buyPercent) + npc.getSpecialPrice();
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null)
@@ -11,6 +11,7 @@ import engine.objects.GuildStatusController;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import engine.objects.Resource;
import org.pmw.tinylog.Logger;
/*
* @Author:
@@ -35,26 +36,28 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
//TODO verify this against the warehouse?
if (GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus()) == false) // is this only GL?
if (!GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus())) // is this only GL?
return true;
Mine mine = Mine.getMine(changeProductionMsg.getMineID());
if (mine == null)
if (mine == null) {
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Mine was Null");
return true;
}
//make sure mine belongs to guild
if (mine.getOwningGuild().isEmptyGuild() ||
mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
if (mine.getOwningGuild().isEmptyGuild() || mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
return true;
//make sure valid resource
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
if (resource == null)
if (resource == null) {
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Resource was Null");
return true;
}
//update resource
@@ -47,13 +47,16 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
if (pc.region != null && !pc.region.isOutside())
return false;
// Find out if we already have an altitude timer running and if so
// do not process more alt change requests
pc.updateFlight();
if (pc.getTakeOffTime() != 0)
return false;
pc.setTakeOffTime(System.currentTimeMillis());
// remove all movement timers and jobs
//TODO: test if they can fly
@@ -67,7 +70,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
if (pc.getAltitude() == 0 && !msg.up())
return true;
pc.update();
pc.update(false);
pc.stopMovement(pc.getLoc());
msg.setStartAlt(pc.getAltitude());
if (msg.up()) {
@@ -132,7 +135,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
}
if (msg.up()) {
pc.update();
pc.update(false);
pc.setDesiredAltitude(targetAlt);
pc.setTakeOffTime(System.currentTimeMillis());
} else {
@@ -158,7 +161,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
} else
pc.setDesiredAltitude(targetAlt);
pc.update();
pc.update(false);
pc.setTakeOffTime(System.currentTimeMillis());
@@ -63,7 +63,7 @@ public class CityDataHandler extends AbstractClientMsgHandler {
// If the hotZone has changed then update the client's map accordingly.
if (playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
if (playerCharacter.getTimestamps().containsKey("hotzoneupdate") && playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
@@ -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;
}
@@ -61,7 +61,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler {
return true;
npc.setRepairCost(msg.repairCost);
npc.setSpecialPrice(msg.repairCost);
ManageNPCMsg outMsg = new ManageNPCMsg(npc);
Dispatch dispatch = Dispatch.borrow(player, msg);
@@ -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);
@@ -17,6 +17,7 @@ import engine.powers.PowersBase;
import engine.server.MBServerStatics;
import java.util.ArrayList;
import java.util.Objects;
/*
* @Author:
@@ -105,7 +106,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
// Validate player can obtain blessing
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) {
if (!GuildStatusController.isGuildLeader(player.getGuildStatus())) {
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
return;
}
@@ -126,12 +127,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
realm = RealmMap.getRealmForCity(city);
if (realm.getCanBeClaimed() == false) {
if (!realm.getCanBeClaimed()) {
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
return;
}
if (realm.isRuled() == true) {
if (realm.isRuled()) {
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
return;
}
@@ -142,12 +143,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
}
private static void requestBoon(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
private static void requestBoon(PlayerCharacter player, NPC npc) {
Building shrineBuilding;
Shrine shrine;
if (npc.getGuild() != player.getGuild())
if (!npc.getGuild().getNation().equals(player.getGuild().getNation()))
return;
shrineBuilding = npc.getBuilding();
@@ -155,7 +156,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
if (shrineBuilding == null)
return;
if (shrineBuilding.getBlueprint() != null && shrineBuilding.getBlueprint().getBuildingGroup() != engine.Enum.BuildingGroup.SHRINE)
if (shrineBuilding.getBlueprint() != null && !shrineBuilding.getBlueprint().getBuildingGroup().equals(engine.Enum.BuildingGroup.SHRINE))
return;
if (shrineBuilding.getRank() == -1)
@@ -171,11 +172,9 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
return;
}
//already haz boon.
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
ErrorPopupMsg.sendErrorPopup(player, 199);
return;
//remove old boon to apply new one, allows boon refreshing
player.effects.remove(PowersManager.getPowerByToken(shrine.getShrineType().getPowerToken()).name);
}
if (!Shrine.canTakeFavor(player, shrine))
@@ -191,16 +190,31 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
return;
}
int rank = shrine.getRank();
//R8 trees always get atleast rank 2 boons. rank uses index, where 0 is first place, 1 is second, etc...
if (shrineBuilding.getCity() != null && shrineBuilding.getCity().getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
if (rank != 0)
rank = 1;
int trains = 40 - (rank * 10);
if (trains < 0)
trains = 0;
int trains = 0;
switch(npc.getRank()){
case 1:
trains = 10;
break;
case 2:
trains = 15;
break;
case 3:
trains = 20;
break;
case 4:
trains = 25;
break;
case 5:
trains = 30;
break;
case 6:
trains = 35;
break;
case 7:
trains = 40;
break;
}
//System.out.println(trains);
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);
@@ -260,60 +274,85 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
}
}
if (targetCity == null)
return;
//verify level required to teleport or repledge
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
Guild toGuild = targetCity.getGuild();
Guild toGuild = targetCity.getGuild();
if (toGuild != null)
if (isTeleport) {
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
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;
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax())
return;
boolean joinedGuild = false;
boolean joinedGuild = false;
//if repledge, reguild the player
//if repledge, reguild the player
if (!isTeleport)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
if (!isTeleport)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
int time;
int time;
if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
//resend message
msg.setTeleportTime(time);
//resend message
msg.setTeleportTime(time);
if ((!isTeleport && joinedGuild) || (isTeleport)) {
if ((!isTeleport && joinedGuild) || (isTeleport)) {
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
//teleport player to city
//teleport player to city
Vector3fImmutable teleportLoc;
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();
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) {
@@ -420,7 +459,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
if (isHermit(npc))
requestHermitBlessing(msg, origin, player, npc);
else
requestBoon(msg, origin, player, npc);
requestBoon(player, npc);
break;
case 15:
LeaderboardMessage lbm = new LeaderboardMessage();
@@ -421,31 +421,12 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
itemMan.consume(item);
}
break;
//ANNIVERSERY GIFT
case 31:
// *** Disabled for now: Needs bootyset created
//if (ib.getUUID() == 971012) {
// int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
// int annyID = ItemBase.AnniverseryGifts.get(random);
// ItemBase annyIB = ItemBase.getItemBase(annyID);
// if (annyIB != null) {
// Item gift = MobLoot.createItemForPlayer(player, annyIB);
// if (gift != null) {
// itemMan.addItemToInventory(gift);
// itemMan.consume(item);
// }
// }
// break;
//}
LootManager.peddleFate(player,item);
break;
case 30: //water bucket
case 8: //potions, tears of saedron
case 5: //runes, petition, warrant, scrolls
if (uuid > 3000 && uuid < 3050) { //Discipline Runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
@@ -462,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);
}
@@ -528,7 +514,6 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
}
// Send piss bucket animation
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
vum.configure();
DispatchMessage.sendToAllInRange(player, vum);
@@ -543,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;
+169 -64
View File
@@ -10,6 +10,7 @@
package engine.net.client.msg;
import engine.Enum;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.net.*;
import engine.net.client.ClientConnection;
@@ -70,62 +71,120 @@ public class ApplyRuneMsg extends ClientNetMsg {
}
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
RuneBase rb = RuneBase.getRuneBase(runeID);
Dispatch dispatch;
if (playerCharacter == null || origin == null || rb == null) {
return false;
}
int raceID = playerCharacter.getRaceID();
//Check race is met
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
if (races.size() > 0) {
int raceID = playerCharacter.getRaceID();
boolean valid = false;
for (int validID : races.keySet()) {
if (validID == raceID) {
valid = true;
break;
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman
if (races.size() > 0) {
boolean valid = false;
for (int validID : races.keySet()) {
if (validID == raceID) {
valid = true;
break;
}
}
}
if (!valid) {
return false;
}
}
if(runeID == 3040)
valid = true;
//Check base class is met
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
if (baseClasses.size() > 0) {
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false;
for (int validID : baseClasses.keySet()) {
if (validID == baseClassID) {
if(runeID == 3049)
valid = true;
break;
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;
}
}
if (!valid) {
return false;
//Check base class is met
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
if (baseClasses.size() > 0) {
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false;
for (int validID : baseClasses.keySet()) {
if (validID == baseClassID) {
valid = true;
break;
}
}
if(runeID == 3040)
valid = true;
if(runeID == 3036 && raceID == 1999)
valid = true;
if(runeID == 3033 && raceID == 1999)
valid = true;
if(runeID == 3035 && baseClassID == 2501)
valid = true;
if(runeID == 3028 && baseClassID == 2501 && playerCharacter.getRace().getName().contains("Irekei"))
valid = true;
if (!valid) {
return false;
}
}
}
//Check promotion class is met
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
if (promotionClasses.size() > 0) {
int promotionClassID = playerCharacter.getPromotionClassID();
boolean valid = false;
for (int validID : promotionClasses.keySet()) {
if (validID == promotionClassID) {
//Check promotion class is met
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
if (promotionClasses.size() > 0) {
int promotionClassID = playerCharacter.getPromotionClassID();
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false;
for (int validID : promotionClasses.keySet()) {
if (validID == promotionClassID) {
valid = true;
break;
}
}
if(runeID == 3040)
valid = true;
break;
if(runeID == 3004 && (playerCharacter.getPromotionClassID() == 2505 || playerCharacter.getPromotionClassID() == 2510))
valid = true;
if(runeID == 3036 && raceID == 1999)
valid = true;
if(runeID == 3033 && raceID == 1999)
valid = true;
if(runeID == 3028 && (raceID == 2013 || raceID == 2014) && playerCharacter.getBaseClassID() == 2501)
valid = true;
if(runeID == 3035 && baseClassID == 2501)
valid = true;
if (!valid) {
return false;
}
}
if (!valid) {
} else{
if(playerCharacter.getPromotionClassID() == 2519){//priest
return false;
}
}
//Check disciplines are met
ArrayList<CharacterRune> runes = playerCharacter.getRunes();
ConcurrentHashMap<Integer, Boolean> disciplines = rb.getDiscipline();
@@ -139,7 +198,6 @@ public class ApplyRuneMsg extends ClientNetMsg {
}
}
}
int discCount = 0;
for (CharacterRune cr : runes) {
int runeBaseID = cr.getRuneBaseID();
@@ -152,28 +210,35 @@ public class ApplyRuneMsg extends ClientNetMsg {
return false;
}
}
//Check level is met
if (playerCharacter.getLevel() < rb.getLevelRequired()) {
return false;
}
int strTotal = 0;
int dexTotal = 0;
int conTotal = 0;
int intTotal = 0;
int spiTotal = 0;
int cost = 0;
//Check any attributes are met
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
if (rb.getAttrs() != null)
for (RuneBaseAttribute rba : attrs) {
int attrID = rba.getAttributeID();
int mod = rba.getModValue();
switch (attrID) {
case MBServerStatics.RUNE_COST_ATTRIBUTE_ID:
switch (rb.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
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()) {
return false;
}
@@ -226,25 +291,64 @@ public class ApplyRuneMsg extends ClientNetMsg {
break;
}
}
//Check if max number runes already reached
if (runes.size() > 12) {
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
return false;
}
//if discipline, check number applied
if (isDiscipline(runeID)) {
if (playerCharacter.getLevel() < 70) {
if (discCount > 2) {
return false;
switch (rb.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
for (CharacterRune charRune : playerCharacter.getRunes()) {
RuneBase rb2 = charRune.getRuneBase();
switch (rb2.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
return false;
}
}
} else {
if (discCount > 3) {
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)) {
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
//Attempt add rune to database
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
@@ -258,7 +362,6 @@ public class ApplyRuneMsg extends ClientNetMsg {
if (cr == null) {
return false;
}
//remove any overridden runes from player
ArrayList<Integer> overwrite = rb.getOverwrite();
CharacterRune toRemove = null;
@@ -267,13 +370,10 @@ public class ApplyRuneMsg extends ClientNetMsg {
toRemove = playerCharacter.removeRune(overwriteID);
}
}
//add rune to player
playerCharacter.addRune(cr);
// recalculate all bonuses/formulas/skills/powers
playerCharacter.recalculate();
//if overwriting a stat rune, add any amount granted from previous rune.
if (toRemove != null) {
RuneBase rbs = toRemove.getRuneBase();
@@ -299,30 +399,35 @@ public class ApplyRuneMsg extends ClientNetMsg {
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
playerCharacter.addSpi(dif);
}
// recalculate all bonuses/formulas/skills/powers
playerCharacter.recalculate();
}
}
switch (rb.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
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;
}
if (cost > 0) {
ModifyStatMsg msm = new ModifyStatMsg((0 - cost), 0, 3);
dispatch = Dispatch.borrow(playerCharacter, msm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
//send apply rune message to client
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
dispatch = Dispatch.borrow(playerCharacter, arm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
//alert them of success
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
//reapply bonuses
playerCharacter.applyBonuses();
return true;
}
@@ -18,9 +18,8 @@ import engine.net.client.Protocol;
import engine.objects.Building;
import engine.objects.Guild;
import engine.server.MBServerStatics;
import java.time.Instant;
import java.time.Duration;
import java.time.temporal.ChronoField;
import org.joda.time.DateTime;
import org.joda.time.Seconds;
public class ArcMineWindowAvailableTimeMsg extends ClientNetMsg {
@@ -28,8 +27,8 @@ public class ArcMineWindowAvailableTimeMsg extends ClientNetMsg {
private Building treeOfLife;
private int currentMineHour;
private Duration secondsLeft;
private Instant lateTime;
private Seconds secondsLeft;
private DateTime lateTime;
private int late;
/**
@@ -74,15 +73,15 @@ public class ArcMineWindowAvailableTimeMsg extends ClientNetMsg {
currentMineHour = guild.getMineTime();
late = MBServerStatics.MINE_LATE_WINDOW;
lateTime = Instant.now();
lateTime = DateTime.now();
if (late == 0)
lateTime = lateTime.plus(Duration.ofDays(1));
lateTime = lateTime.plusDays(1);
lateTime = lateTime.with(ChronoField.HOUR_OF_DAY, late);
lateTime = lateTime.hourOfDay().setCopy(late);
late = ((late > 23) ? (late - 24) : late);
secondsLeft = Duration.between(Instant.now(), lateTime);
secondsLeft = Seconds.secondsBetween(DateTime.now(), lateTime);
}
/**
@@ -108,4 +107,4 @@ public class ArcMineWindowAvailableTimeMsg extends ClientNetMsg {
public void setBuildingUUID(int buildingUUID) {
this.buildingUUID = buildingUUID;
}
}
}
@@ -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)
+8 -4
View File
@@ -104,8 +104,10 @@ public class CityDataMsg extends ClientNetMsg {
}
temp.putInt(mineList.size());
for (Mine mine : mineList)
Mine.serializeForClientMsg(mine, temp);
for (Mine mine : mineList) {
if(mine.getParentZone() != null && !mine.getParentZone().isContinent())
Mine.serializeForClientMsg(mine, temp);
}
temp.put((byte) 0); // PAD
}
@@ -178,8 +180,10 @@ public class CityDataMsg extends ClientNetMsg {
}
writer.putInt(mineList.size());
for (Mine mine : mineList)
Mine.serializeForClientMsg(mine, writer);
for (Mine mine : mineList) {
if(mine.getParentZone() != null && !mine.getParentZone().isContinent())
Mine.serializeForClientMsg(mine, writer);
}
} else
writer.putInt(0);
} catch (Exception e) {

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