Compare commits

...

739 Commits

Author SHA1 Message Date
FatBoy 5142a87b60 direct damage handler - power damage modifiers 2025-03-02 16:09:56 -06:00
FatBoy 9b7568b576 direct damage handler - cleanup 2025-03-02 16:00:48 -06:00
FatBoy 7bec57e77d direct damage handler - fixed double values 2025-03-02 16:00:17 -06:00
FatBoy 28bccdd3d8 direct damage handler - percent damages 2025-03-02 15:51:14 -06:00
FatBoy cca342e99d direct damage behaviour handler -fix max damage pull 2025-03-02 15:38:16 -06:00
FatBoy e41c79e6d7 direct damage behaviour handler 2025-03-02 15:37:45 -06:00
MagicBot 7dfb0da862 NoMod work. 2025-03-02 13:57:27 -05:00
MagicBot c2d4e0c1dd NoMod work. 2025-03-02 13:54:25 -05:00
MagicBot 512621981a NoMod work. 2025-03-02 12:58:48 -05:00
MagicBot 81c9a84edf NoMod work. 2025-03-02 12:42:46 -05:00
MagicBot c099444464 NoMod work. 2025-03-02 12:41:08 -05:00
MagicBot 94afb7f40f Ternary restored 2025-03-01 17:13:58 -05:00
MagicBot d43f87b295 Arguments fixed in enum 2025-03-01 17:10:27 -05:00
MagicBot d5b787430e Method inlined 2025-03-01 16:52:25 -05:00
MagicBot 3af6cab92e Bugfix in enum usage 2025-02-26 14:12:04 -05:00
MagicBot 106e7be1ac Enum equals faster than string contains 2025-02-26 12:22:42 -05:00
MagicBot 0d8f1f7252 Field added to enumeration 2025-02-26 12:20:37 -05:00
MagicBot 330344f55b Comment update 2025-02-26 12:11:04 -05:00
MagicBot 7a5f138c78 Comment update 2025-02-26 12:10:28 -05:00
MagicBot 6a9ca26d81 No need to process zero values 2025-02-26 12:09:13 -05:00
MagicBot 32c28e8f54 Rename of helper method 2025-02-26 12:06:23 -05:00
MagicBot 99dcfbb4a2 Update to helper method 2025-02-26 12:05:18 -05:00
MagicBot 16dffee0e3 Update to helper method 2025-02-26 12:04:07 -05:00
MagicBot a5cb785587 Update to helper method 2025-02-26 11:56:43 -05:00
MagicBot 7bcd75719c Update to helper method 2025-02-26 11:43:46 -05:00
MagicBot d96993576a Update to helper method 2025-02-25 14:44:51 -05:00
MagicBot 17afaf6720 Behaviour is unused. Stilled mechanic? 2025-02-25 13:37:09 -05:00
MagicBot 3e9f38c857 Behaviour work 2025-02-25 13:35:06 -05:00
MagicBot a36dbc6539 Method rename for clarity 2025-02-24 14:47:34 -05:00
MagicBot 7d3ff49796 Comment touch-up 2025-02-24 14:43:30 -05:00
MagicBot d2ac62e320 Removed variable as scope changed 2025-02-24 14:39:51 -05:00
MagicBot 4b83311a89 Comment update 2025-02-24 14:35:34 -05:00
MagicBot 7fd55bb6f3 Rework of helper method 2025-02-24 14:33:40 -05:00
MagicBot a40025bca1 Rework of helper method 2025-02-24 14:26:43 -05:00
MagicBot d58ba67cc2 Comment added 2025-02-24 13:55:04 -05:00
MagicBot 3d4a9e18d0 Tweak to modifierentry 2025-02-24 08:46:31 -05:00
MagicBot 7e5fe56bc0 Enum set for category 2025-02-23 16:15:25 -05:00
MagicBot 4cf3b0929f Commented out stun check for now. 2025-02-23 16:11:56 -05:00
MagicBot 98a6d268d0 Behaviour work. 2025-02-23 15:48:00 -05:00
MagicBot a9a4b36121 Behaviour work. 2025-02-23 15:47:33 -05:00
MagicBot 75a4a69036 Behaviour work. 2025-02-23 15:27:50 -05:00
MagicBot 982a35bb4f Behaviour work. 2025-02-23 15:25:28 -05:00
MagicBot 27c3fe515c Behaviour work. 2025-02-23 14:56:02 -05:00
MagicBot 29d82d9e81 Behaviour returns enumeration 2025-02-23 14:48:39 -05:00
MagicBot 81427e6911 FPSubTypeAttr uses min. 2025-02-23 14:37:43 -05:00
MagicBot 296a7012b0 old method removed 2025-02-23 14:07:49 -05:00
MagicBot b9b88449ed Variable rename 2025-02-22 15:37:38 -05:00
MagicBot 6585248eb8 Variable rename 2025-02-22 15:34:28 -05:00
MagicBot feebddd495 Variable rename 2025-02-22 15:33:59 -05:00
MagicBot 3e510a487c Variable rename 2025-02-22 15:25:36 -05:00
MagicBot 5277fbbe56 More generalized curve helper 2025-02-22 15:23:15 -05:00
MagicBot 1a64272801 Unified signature: caster/power/rank/target 2025-02-22 13:10:30 -05:00
MagicBot fc7b7eb915 Unified signature: caster/power/rank/target 2025-02-22 13:03:39 -05:00
MagicBot 1e3249561c Project headers added 2025-02-22 12:53:26 -05:00
MagicBot 1ac76ae4d3 Less methods = smaller object. 2025-02-22 12:52:22 -05:00
MagicBot 56cea25e06 final field 2025-02-22 12:48:02 -05:00
MagicBot 2c33ff5a2a Both actions use same behaviour 2025-02-22 12:46:22 -05:00
MagicBot 3cdf848e33 Method rename for clarity 2025-02-22 08:10:08 -05:00
MagicBot 7ed291860f Refactor manager for action support 2025-02-22 07:57:38 -05:00
MagicBot e3e8fae90c Comment updated 2025-02-22 07:55:59 -05:00
MagicBot 0a2e487a76 Signature updated for actions 2025-02-22 07:54:49 -05:00
MagicBot 6018be3c72 Actions use same signature as modifiers 2025-02-22 07:24:47 -05:00
FatBoy 486141ce0b Behaviour FPSubTypeDmg 2025-02-21 16:34:35 -06:00
FatBoy cc96d68974 Behaviour FPSubTypeDmg 2025-02-21 16:33:17 -06:00
FatBoy 6740896244 Behaviour SubTypeSkill 2025-02-21 16:17:48 -06:00
FatBoy 811eb42e47 Behaviour SubTypePowerType 2025-02-21 16:12:09 -06:00
MagicBot 1633b5d0dd Shallow copy 2025-02-21 16:13:54 -05:00
MagicBot 808eb989ea Related enums moved close in file 2025-02-21 15:16:01 -05:00
MagicBot 6879a8dccf Comment added 2025-02-21 15:13:11 -05:00
MagicBot 8cf17e3abd Comment added 2025-02-21 15:12:47 -05:00
MagicBot 0711c8f05b More behaviour work. 2025-02-21 14:32:45 -05:00
MagicBot b0ad37dbf8 Refactor for poweraction implementation 2025-02-21 14:13:29 -05:00
MagicBot 2c3d5a3fcf Less boilerplate using functional interface 2025-02-21 13:49:09 -05:00
MagicBot 78e8aab808 parser now uses poweractiontype 2025-02-21 13:15:01 -05:00
MagicBot 2bc033170f Devcmd removed for refactor work. 2025-02-21 12:58:41 -05:00
MagicBot 556eb30ab0 Comment added 2025-02-20 15:21:47 -05:00
MagicBot 4f74d43081 Error log for invalid effect 2025-02-20 15:12:25 -05:00
MagicBot 80c4dcc082 More behaviour work 2025-02-20 14:31:09 -05:00
MagicBot 9cd30d5299 Lookup table uses hash value 2025-02-20 14:22:53 -05:00
MagicBot b148ea5f6e Comment updated 2025-02-20 14:19:59 -05:00
MagicBot 3612232788 PowerAction not ActionEntry 2025-02-20 14:19:10 -05:00
MagicBot 99acc4736f Iterate through all effects for action 2025-02-20 14:13:13 -05:00
MagicBot fac426a09c bugfix in parser 2025-02-20 14:02:28 -05:00
MagicBot c75a153c92 more behaviour work 2025-02-20 13:59:21 -05:00
MagicBot ce5611aafd Scaling method updated 2025-02-20 13:28:19 -05:00
MagicBot 9e6b50d264 argument rename for clarity 2025-02-20 07:58:51 -05:00
MagicBot f5801e0837 Static method to apply curves 2025-02-20 07:54:41 -05:00
MagicBot 79864713b5 More behaviour work 2025-02-20 07:37:22 -05:00
MagicBot 42daf1c049 Comment updated 2025-02-20 07:26:51 -05:00
MagicBot 1784ac1e5d Comment updated 2025-02-19 14:13:56 -05:00
MagicBot 137a547d3d Minor formatting touchup. 2025-02-19 14:04:42 -05:00
MagicBot d9738c39a5 Effects stored in new collection 2025-02-19 13:59:44 -05:00
MagicBot 45bd3159ce Pojo created to store mods 2025-02-19 13:41:16 -05:00
MagicBot acd1246a87 Unnecessary initialization 2025-02-19 12:51:09 -05:00
MagicBot 1e64108b56 Unnecessary cast 2025-02-19 12:49:32 -05:00
MagicBot 1481cc7ac0 Methods made static and moved to manager 2025-02-19 12:43:58 -05:00
MagicBot c0b75564c2 equals and hash defined for wpak pojos 2025-02-19 12:37:04 -05:00
MagicBot 4958165603 Standard behaviour completed. 2025-02-18 15:16:27 -05:00
MagicBot 35258f6ab5 Curve is a float.
Begin filling out first behaviour
2025-02-18 15:07:41 -05:00
MagicBot 3913201eed Arguments filtered down to implementation methods. 2025-02-18 14:42:40 -05:00
MagicBot 37bedcf919 Behaviours return a java Object 2025-02-18 13:20:28 -05:00
MagicBot 11e40d7e57 File reformat 2025-02-18 13:11:56 -05:00
MagicBot 0cdd8a75dc Caster added to signature.
Proper wpak class used for actions.
2025-02-18 13:09:40 -05:00
MagicBot 2e45d8548f Arguments added to signature 2025-02-18 12:55:38 -05:00
MagicBot 61f8c210ae Project headers added 2025-02-17 05:00:33 -05:00
MagicBot acc5c04810 Behaviour method overrides 2025-02-17 04:59:00 -05:00
MagicBot 8030ecb800 Behaviour class defined 2025-02-17 04:45:38 -05:00
MagicBot 12b350580a Token is primary key 2025-02-16 17:27:33 -05:00
MagicBot 78dd409fa8 Only type is needed for key 2025-02-16 17:24:10 -05:00
MagicBot 0727175cb2 new collection populated 2025-02-16 16:44:20 -05:00
MagicBot 7c3a3fb84c new collection for new manager 2025-02-16 16:36:47 -05:00
MagicBot 5781737afc rank added to signature. New package created. 2025-02-16 16:29:14 -05:00
MagicBot 75e1dddd08 ModBehaviour defined 2025-02-15 12:55:06 -05:00
MagicBot 1e78442910 ModBehaviour defined 2025-02-15 12:37:06 -05:00
FatBoy de6158842d loop all effects in power actions 2025-02-01 15:28:09 -06:00
MagicBot 0c07586927 Debug code removed 2025-01-20 16:48:11 -05:00
MagicBot cfca585ab5 Trailing bow can sometimes be missing the bool. 2025-01-20 16:46:51 -05:00
MagicBot db2a168229 Debug code added 2025-01-20 16:32:48 -05:00
MagicBot 040121f7cd Debug code added 2025-01-20 16:24:27 -05:00
MagicBot 570a22f0cb Debug code removed 2025-01-20 16:20:34 -05:00
MagicBot 1ebc5d5e00 Debug code removed 2025-01-20 16:18:18 -05:00
MagicBot 4b1d7ea718 Debug code added 2025-01-20 16:12:43 -05:00
MagicBot 402f608f7a Variable renamed 2025-01-20 16:10:36 -05:00
FatBoy b9b6b37505 use new power manager 2025-01-19 15:26:32 -06:00
FatBoy 3be5236ba8 use new power manager 2025-01-19 15:23:39 -06:00
FatBoy 4cbe9fc236 effect parsing 2025-01-19 15:16:54 -06:00
FatBoy 6ac05d3db2 added missing source types 2025-01-19 15:14:27 -06:00
FatBoy 2531041d7c added missing source types 2025-01-19 15:10:34 -06:00
FatBoy 77e5866351 added missing source types 2025-01-19 15:07:44 -06:00
FatBoy 22e80e1ef4 added missing source types 2025-01-19 15:05:23 -06:00
FatBoy a86e07a89f added missing source types 2025-01-19 15:03:46 -06:00
FatBoy 5f277c3cff added missing source types 2025-01-19 15:00:13 -06:00
FatBoy ef234beeb7 added missing source types 2025-01-19 14:59:05 -06:00
FatBoy 69c5c5da92 added missing source types 2025-01-19 14:52:33 -06:00
FatBoy 7ed5431c99 Logging point - TEMP 2025-01-19 14:49:04 -06:00
FatBoy 627255ce3d Logging point - TEMP 2025-01-19 14:45:03 -06:00
FatBoy 0d1c9e8b8b Logging point - TEMP 2025-01-19 14:43:14 -06:00
MagicBot 5fa79fbac6 Parsing update for eqreqs 2025-01-19 12:01:53 -05:00
FatBoy 45b4ae9e3e TransferStatPowerAction java 2025-01-19 10:22:59 -06:00
MagicBot f410fc5482 Set curve names properly 2024-11-30 09:57:04 -05:00
MagicBot 92db9e1086 More cleanup in statTransferAction 2024-09-13 12:20:33 -04:00
MagicBot f0875a6093 Refactored out garbage variables 2024-09-12 12:20:23 -04:00
FatBoy 0c50cd9536 system to finish using powers with new UsePowerJob 2024-09-08 20:11:21 -05:00
FatBoy 3c1280e546 starting of new power manager 2024-09-08 16:39:29 -05:00
FatBoy aece43a3bc starting of new power manager 2024-09-07 19:57:20 -05:00
MagicBot 1417760f5b StartTransfer poweraction work 2024-09-07 15:49:58 -04:00
MagicBot 2947753c3c StartTransfer poweraction work 2024-09-07 15:47:33 -04:00
MagicBot 98664a8983 Teleport poweraction work 2024-09-07 15:18:02 -04:00
MagicBot 5e5203aa36 Teleport bool parsed 2024-09-07 15:16:05 -04:00
MagicBot a41288ac78 Track poweraction work 2024-09-07 15:05:31 -04:00
MagicBot bdb9a12bd5 Track poweraction work 2024-09-07 14:59:22 -04:00
MagicBot 458bdbd72d Track poweraction work 2024-09-07 14:56:21 -04:00
MagicBot 65b10f72fa Track fields updated 2024-09-07 14:52:12 -04:00
MagicBot b50110f7b0 Poweraction refactor work 2024-09-07 12:13:21 -04:00
MagicBot 1e09930bdb Poweraction refactor work 2024-09-07 12:13:01 -04:00
MagicBot 614fb9a5e9 Field camelcase 2024-09-07 12:10:55 -04:00
MagicBot 17b4b993e2 Signature argument renamed 2024-09-05 15:46:59 -04:00
MagicBot fa45e9556f Refactored poweractions 2024-09-05 15:41:16 -04:00
MagicBot deab274ba2 Refactored poweractions 2024-09-05 15:36:38 -04:00
MagicBot 82cefce424 Refactored poweractions 2024-09-05 15:25:29 -04:00
FatBoy 0fd6dfb648 Power Action Constructor (not finished) 2024-09-02 16:30:47 -05:00
FatBoy a5ccba2e27 updated ModifierEntry contructors 2024-09-02 16:09:52 -05:00
FatBoy e09bd9aae0 Merge branch 'feature-config-parsing2' into feature-config-usage
# Conflicts:
#	src/engine/powers/EffectsBase.java
2024-09-02 15:33:13 -05:00
MagicBot 74b1994f5e Merge remote-tracking branch 'refs/remotes/origin/weekend-fixings' into feature-config-parsing2 2024-08-25 17:52:06 -04:00
MagicBot dfa646d828 Update to player city filter 2024-08-25 17:31:28 -04:00
MagicBot 668b61b734 city.isDestroyed 2024-08-25 17:11:01 -04:00
MagicBot 20c032fa4d Hash value updated. 2024-08-25 17:03:48 -04:00
MagicBot 62235497ad Returns all not just active mines 2024-08-25 16:53:51 -04:00
MagicBot 983dd46870 Update to thread logic 2024-08-25 16:23:28 -04:00
MagicBot 4da089e9b8 Update to thread logic 2024-08-25 16:20:27 -04:00
MagicBot aaff28d720 Update to console output 2024-08-25 16:13:37 -04:00
MagicBot 93befc0887 Update to console output 2024-08-25 16:13:22 -04:00
MagicBot d304d0706c Owner set to null 2024-08-25 15:28:12 -04:00
MagicBot eff44c334d Error trapping and output 2024-08-25 15:26:14 -04:00
MagicBot e082a0b49c Bane logic tweaking 2024-08-25 15:18:40 -04:00
FatBoy 42186fd2a3 labelling 2024-08-22 18:57:55 -05:00
FatBoy 769b84b9da Enchant Value derived form parser instead of database 2024-08-22 18:56:56 -05:00
MagicBot 3842cce1ab Naming conventions set 2024-08-22 16:34:05 -04:00
MagicBot f4fc7fc75b EffectDescription refactored out. 2024-08-22 16:21:13 -04:00
MagicBot f89ce2ee15 Parsing cleanup work. 2024-08-22 16:06:56 -04:00
MagicBot ecd7215003 Parsing cleanup work. 2024-08-22 16:01:42 -04:00
MagicBot 585f984554 Separate group for min/max 2024-08-22 15:52:28 -04:00
FatBoy 3d96e6504e All Effect Data Loaded From Parser 2024-08-21 17:40:24 -05:00
FatBoy f0efd0c477 Fail Conditions for effects fully loaded from parser values 2024-08-21 16:59:43 -05:00
FatBoy bc50408c45 Merge branch 'feature-config-parsing2' into feature-config-usage 2024-08-21 16:34:24 -05:00
MagicBot 7125e9b360 Variable renamed for clarity 2024-08-21 16:59:26 -04:00
MagicBot 2fb7260077 Support for multiple pre-reqs 2024-08-21 16:37:47 -04:00
MagicBot d3ef0c828d Support for multiple pre-reqs 2024-08-21 16:34:43 -04:00
MagicBot bedf3761bd String usage cleanup 2024-08-21 13:28:01 -04:00
MagicBot b3b9867624 String usage cleanup 2024-08-21 13:23:22 -04:00
MagicBot d0f1a73a9f Refactor all arrays to arraylist usage. 2024-08-21 13:06:35 -04:00
MagicBot 4bcf00fd6f Enums are uppercase 2024-08-21 12:43:14 -04:00
MagicBot 5f7465194e List not arraylist 2024-08-21 12:39:45 -04:00
MagicBot f0c6584818 pojo created for ConditionEntry 2024-08-21 12:35:01 -04:00
MagicBot a61b8d193b Comment cleanup 2024-08-21 11:45:11 -04:00
FatBoy c863cd5f54 removed one time used empty hashset 2024-08-20 20:46:17 -05:00
FatBoy c01c69db83 EffectBase sources and fail conditions static maps removed 2024-08-20 20:43:29 -05:00
FatBoy 001a89ccf0 database loading effects 2024-08-20 19:45:31 -05:00
FatBoy c2633d0d9f Usage of EffectsParser 2024-08-20 19:14:50 -05:00
MagicBot 5957ff6f7b Redundant assignment 2024-08-20 19:37:09 -04:00
MagicBot afc80c0e03 Debug code removed 2024-08-20 19:35:17 -04:00
MagicBot 740949812c Package reformat 2024-08-20 19:30:33 -04:00
MagicBot ee0fc67984 Debug code removed 2024-08-20 19:29:50 -04:00
MagicBot 434a9d5fda More PowerAction parsing work. 2024-08-20 19:19:04 -04:00
MagicBot ec6ec33c74 More PowerAction parsing work. 2024-08-20 19:17:06 -04:00
MagicBot 71c240e347 More PowerAction parsing work. 2024-08-20 19:16:11 -04:00
MagicBot eaf9894f99 More PowerAction parsing work. 2024-08-20 19:12:30 -04:00
MagicBot b68aa3b289 More PowerAction parsing work. 2024-08-20 19:10:46 -04:00
MagicBot 345e729d1a More PowerAction parsing work. 2024-08-20 19:09:26 -04:00
MagicBot 2e8b4c97ac More powerAction work 2024-08-20 19:03:27 -04:00
MagicBot 01d5e37a81 More powerAction work 2024-08-20 19:02:21 -04:00
MagicBot 67dc95e496 More powerAction work 2024-08-20 19:00:52 -04:00
MagicBot e56c5a4fdc More powerAction work 2024-08-20 18:49:03 -04:00
MagicBot 4e3a578ad1 More powerAction work 2024-08-20 18:47:44 -04:00
MagicBot 1b7114d8bd More powerAction work 2024-08-20 18:35:34 -04:00
MagicBot 27cc7655b3 More powerAction work 2024-08-20 18:31:37 -04:00
MagicBot f7b593149d More powerAction work 2024-08-20 18:30:37 -04:00
MagicBot 01e7e0fac3 More powerAction work 2024-08-20 18:29:32 -04:00
MagicBot 228781e62f More powerAction work 2024-08-20 18:27:26 -04:00
MagicBot d0c41816ac More powerAction work 2024-08-20 18:24:05 -04:00
MagicBot 2bc872e9d9 TrackEntry pojo created. 2024-08-20 18:18:21 -04:00
MagicBot 127300c58b TrackEntry pojo created. 2024-08-20 18:14:55 -04:00
MagicBot 1da1b2f546 More poweraction parsing work. 2024-08-20 18:14:34 -04:00
MagicBot 79f7458010 More poweraction parsing work. 2024-08-20 17:41:43 -04:00
MagicBot c8f90ea654 More poweraction parsing work. 2024-08-20 17:40:12 -04:00
MagicBot 27c1ec0e55 More poweraction parsing work. 2024-08-20 17:37:17 -04:00
MagicBot bda4bb66e1 More poweraction parsing work. 2024-08-20 17:34:15 -04:00
MagicBot 2691b4317b More poweraction parsing work. 2024-08-20 17:32:26 -04:00
MagicBot 25878db5f0 More poweraction parsing work. 2024-08-20 17:29:58 -04:00
MagicBot 9cd5e42c08 More poweraction parsing work. 2024-08-20 17:28:10 -04:00
MagicBot c39dc59ef5 More poweraction parsing work. 2024-08-20 17:25:00 -04:00
MagicBot 0b5564267f More poweraction parsing work. 2024-08-20 17:19:35 -04:00
MagicBot 6ca5e46ef6 More poweraction parsing work. 2024-08-20 17:14:26 -04:00
MagicBot 4b855cdf6e More poweraction parsing work. 2024-08-20 17:12:11 -04:00
MagicBot b4638f9218 More poweraction parsing work. 2024-08-20 17:10:56 -04:00
MagicBot 5b8934c922 More poweraction parsing work. 2024-08-20 17:08:59 -04:00
MagicBot 9d89f5d7f4 More poweraction parsing work. 2024-08-20 17:07:00 -04:00
MagicBot 1c6be6a1ea More poweraction parsing work. 2024-08-20 16:54:47 -04:00
MagicBot 5d054142ff More poweraction parsing work. 2024-08-20 16:51:59 -04:00
MagicBot 7723ac8830 More poweraction parsing work. 2024-08-20 16:49:51 -04:00
MagicBot b5cc45aafd More poweraction parsing work. 2024-08-20 16:43:56 -04:00
MagicBot 94d3364808 More poweraction parsing work. 2024-08-20 16:39:51 -04:00
MagicBot dab46c185c More poweraction parsing work. 2024-08-20 16:37:55 -04:00
MagicBot 8bf5360f6f StatTransfer pojo created. 2024-08-20 16:35:16 -04:00
MagicBot ee431510fb StatTransfer pojo created. 2024-08-20 16:26:57 -04:00
MagicBot 465736912b PowerAction parsing work. 2024-08-20 15:43:40 -04:00
MagicBot f2ae969e84 PowerAction parsing work. 2024-08-20 15:41:26 -04:00
MagicBot f2eaf61bd0 PowerAction parsing work. 2024-08-20 15:31:26 -04:00
MagicBot 189c052ed5 PowerAction parsing work. 2024-08-20 15:28:40 -04:00
MagicBot fa28129aa4 PowerAction parsing work. 2024-08-20 15:27:06 -04:00
MagicBot c42d438a7c PowerAction parsing work. 2024-08-20 15:24:17 -04:00
MagicBot 2e1efce858 PowerAction parsing work. 2024-08-20 15:21:27 -04:00
MagicBot 825d7eb071 PowerAction parsing work. 2024-08-20 15:18:02 -04:00
MagicBot cd80b9f228 PowerAction parsing work. 2024-08-20 15:05:47 -04:00
MagicBot 502dda0b3b Debug code added 2024-08-20 15:01:28 -04:00
MagicBot a8ea778c6e Debug code added 2024-08-20 12:13:01 -04:00
MagicBot 6c29321581 PowerActionEntry parsing work. 2024-08-20 12:07:56 -04:00
MagicBot 7ed94d171a PowerActionEntry parsing work. 2024-08-20 12:06:35 -04:00
MagicBot afd73082f3 PowerActionEntry parsing work. 2024-08-20 12:05:03 -04:00
MagicBot 890f3523f3 PowerActionEntry parsing work. 2024-08-20 12:00:35 -04:00
MagicBot 8e8ed92e26 PowerActionEntry parsing work. 2024-08-20 12:00:22 -04:00
MagicBot b935ae9fc4 PowerActionEntry parsing work. 2024-08-20 11:58:53 -04:00
MagicBot d6272d7310 PowerActionEntry parsing work. 2024-08-19 21:26:44 -04:00
MagicBot e60a7a5ac0 PowerActionEntry parsing work. 2024-08-19 21:11:53 -04:00
MagicBot 7e8cb056ed PowerActionEntry parsing work. 2024-08-19 21:03:34 -04:00
MagicBot 9ae3cb796d PowerActionEntry parsing work. 2024-08-19 21:02:13 -04:00
MagicBot 9a6a131bbf PowerActionEntry parsing work. 2024-08-19 20:50:45 -04:00
MagicBot 3909ddb3ba PowerActionEntry parsing work. 2024-08-19 20:49:43 -04:00
MagicBot dbc26b8243 PowerActionEntry parsing work. 2024-08-19 20:41:30 -04:00
MagicBot 93a4acb108 init moved to configmanager. 2024-08-19 20:38:38 -04:00
MagicBot 9c1c4e02a9 init moved to configmanager. 2024-08-19 20:38:09 -04:00
MagicBot 00aa06c5f1 Condition fix 2024-08-19 15:24:28 -04:00
MagicBot f3578f82e6 PowerAction work started. 2024-08-19 15:20:15 -04:00
MagicBot 85ee1faf4a PowerAction work started. 2024-08-19 15:18:19 -04:00
MagicBot b72c8e8ce3 PowerAction work started. 2024-08-19 13:17:44 -04:00
MagicBot 77a89b8f8a PowerAction work started. 2024-08-19 13:15:33 -04:00
MagicBot a9a9b6a8ac PowerAction work started. 2024-08-19 13:13:54 -04:00
MagicBot fab77a0dbb PowerAction work started. 2024-08-19 13:13:31 -04:00
MagicBot e83e0def2e PowerAction work started. 2024-08-19 13:05:32 -04:00
MagicBot ebcc721d43 Class renamed 2024-08-19 11:24:37 -04:00
MagicBot ff6d236ea7 Power Conditions parsed 2024-08-19 11:10:55 -04:00
MagicBot 41a9c19001 More PowerEntry parsing work. 2024-08-19 08:29:07 -04:00
MagicBot 187ef18ac2 More PowerEntry parsing work. 2024-08-19 08:27:39 -04:00
MagicBot 93304e3eb7 More PowerEntry parsing work. 2024-08-19 08:25:42 -04:00
MagicBot b1f14c4beb More PowerEntry parsing work. 2024-08-19 08:23:17 -04:00
MagicBot 1b2c073886 More PowerEntry parsing work. 2024-08-19 08:21:38 -04:00
MagicBot f20a5bb881 More PowerEntry parsing work. 2024-08-19 08:20:35 -04:00
MagicBot 394ba5a165 More PowerEntry parsing work. 2024-08-19 08:19:29 -04:00
MagicBot c35e689d1b More PowerEntry parsing work. 2024-08-19 08:16:31 -04:00
MagicBot a9b6fcb9ee More PowerEntry parsing work. 2024-08-19 08:12:45 -04:00
MagicBot 8eeb539f16 More PowerEntry parsing work. 2024-08-19 08:12:18 -04:00
MagicBot a863902370 More PowerEntry parsing work. 2024-08-19 08:10:13 -04:00
MagicBot 12f8139d1e More PowerEntry parsing work. 2024-08-19 08:08:32 -04:00
MagicBot 4f25e7e24f More PowerEntry parsing work. 2024-08-19 08:06:09 -04:00
MagicBot 5860a263d9 More PowerEntry parsing work. 2024-08-19 08:02:35 -04:00
MagicBot 1460ddb975 More PowerEntry parsing work. 2024-08-19 08:00:53 -04:00
MagicBot 5326126dcb More PowerEntry parsing work. 2024-08-19 07:57:32 -04:00
MagicBot e6a8cdd5e2 More PowerEntry parsing work. 2024-08-19 07:56:04 -04:00
MagicBot 0dc8eeee90 More PowerEntry parsing work. 2024-08-19 07:54:14 -04:00
MagicBot e719d13c8c More PowerEntry parsing work. 2024-08-19 07:53:19 -04:00
MagicBot 9ee2592ec7 Regex update 2024-08-19 07:45:26 -04:00
MagicBot 720b97dc69 Regex updated to include spaces only in a line. 2024-08-19 07:40:07 -04:00
MagicBot 177917a8c8 EffectPreReq pojo created 2024-08-19 07:32:25 -04:00
MagicBot a1323e5d17 EffectPreReq pojo created 2024-08-19 07:15:20 -04:00
MagicBot 760b2c3df1 Debug string updated 2024-08-19 07:12:06 -04:00
MagicBot 31f8b5a294 One or more whitspaces 2024-08-19 07:08:09 -04:00
MagicBot 3498cc370f More PowerEntry work. 2024-08-19 06:51:30 -04:00
MagicBot 66dd7b5f90 More PowerEntry work. 2024-08-19 06:49:13 -04:00
MagicBot 5cc979e2f3 More PowerEntry work. 2024-08-19 06:45:37 -04:00
MagicBot 1bcf307f94 More PowerEntry work. 2024-08-19 06:33:30 -04:00
MagicBot cdf67f4ce5 More PowerEntry work. 2024-08-19 06:30:27 -04:00
MagicBot 67f2dce2fd More PowerEntry work. 2024-08-19 06:26:59 -04:00
MagicBot 162f28d874 More PowerEntry work. 2024-08-19 06:26:06 -04:00
MagicBot c6ab1b5468 More PowerEntry work. 2024-08-19 06:25:03 -04:00
MagicBot d17db3a1fd More PowerEntry work. 2024-08-19 06:15:50 -04:00
MagicBot 9428436883 More PowerEntry work. 2024-08-19 06:07:17 -04:00
MagicBot 62dfb8a42e More PowerEntry work. 2024-08-19 06:05:11 -04:00
MagicBot c6647a99b8 More PowerEntry work. 2024-08-19 06:04:01 -04:00
MagicBot a11797c5e4 More PowerEntry work. 2024-08-19 06:01:52 -04:00
MagicBot 84a124bb52 More PowerEntry work. 2024-08-19 05:58:24 -04:00
MagicBot b296742de0 More PowerEntry work. 2024-08-19 05:56:24 -04:00
MagicBot c0560ece47 More PowerEntry work. 2024-08-19 05:55:49 -04:00
MagicBot 89fd647870 More PowerEntry work. 2024-08-19 05:44:35 -04:00
MagicBot 07da5cb77c More PowerEntry work. 2024-08-19 05:44:03 -04:00
MagicBot aaf84d13f8 More PowerEntry work. 2024-08-19 05:42:04 -04:00
MagicBot fd1bb0def7 More PowerEntry work. 2024-08-19 05:39:57 -04:00
MagicBot 3223eae7b6 More PowerEntry work. 2024-08-19 05:39:24 -04:00
MagicBot d836f80805 More PowerEntry work. 2024-08-19 05:38:25 -04:00
MagicBot 1a6dcf3f57 More PowerEntry work. 2024-08-19 05:36:51 -04:00
MagicBot dce48f3d66 More PowerEntry work. 2024-08-19 05:34:38 -04:00
MagicBot 10d98f32b6 More PowerEntry work. 2024-08-19 05:28:23 -04:00
MagicBot acdf6db91a More PowerEntry work. 2024-08-18 16:38:06 -04:00
MagicBot 0ee7269c8f More PowerEntry work. 2024-08-18 16:28:07 -04:00
MagicBot 4b888b3d92 More PowerEntry work. 2024-08-18 16:27:13 -04:00
MagicBot f0ed15baf0 More PowerEntry work. 2024-08-18 16:21:50 -04:00
MagicBot 6c882a7788 More PowerEntry work. 2024-08-18 16:20:58 -04:00
MagicBot 11e03e0051 More PowerEntry work. 2024-08-18 16:18:45 -04:00
MagicBot 6e47b80d23 More powerAction work. 2024-08-18 16:09:40 -04:00
MagicBot a3d3c32b07 More powerAction work. 2024-08-18 16:01:31 -04:00
MagicBot 3a27f2f4c8 More powerAction work. 2024-08-18 15:57:37 -04:00
MagicBot 1638804f1f More powerAction work. 2024-08-18 15:51:30 -04:00
MagicBot 362958c0f1 More powerAction work. 2024-08-18 15:47:22 -04:00
MagicBot 74720956a1 More powerAction work. 2024-08-18 15:35:01 -04:00
MagicBot 58e1f4d70b More powerAction work. 2024-08-18 15:01:29 -04:00
MagicBot c871c253b1 More powerAction work. 2024-08-18 15:01:05 -04:00
MagicBot 547b101c60 More powerAction work. 2024-08-18 15:00:18 -04:00
MagicBot b9ccbe219f More powerAction work. 2024-08-18 14:56:41 -04:00
MagicBot c31409d26f Enum updated from .exe 2024-08-18 14:13:27 -04:00
MagicBot 00d6e4f819 Enum added for CategoryToPower 2024-08-18 14:10:20 -04:00
MagicBot dc9f33dc7b PowerAction pojo created 2024-08-18 13:00:03 -04:00
MagicBot 3d45f26611 PowerAction pojo created 2024-08-18 12:38:22 -04:00
MagicBot 8554bad731 Package restructure 2024-08-17 16:33:20 -04:00
MagicBot b2a8fe357e More enum work. 2024-08-17 16:24:25 -04:00
MagicBot 08ac0b8d8d More enum work. 2024-08-17 16:20:21 -04:00
MagicBot 23bf491d4b More enum work. 2024-08-17 16:16:00 -04:00
MagicBot 76d22abd0b Debug code removed 2024-08-17 16:08:39 -04:00
MagicBot e4e8086e41 More Enum work 2024-08-17 16:07:47 -04:00
MagicBot 63116551bc Enum work 2024-08-17 16:02:44 -04:00
MagicBot d06ce44bd5 Enum work 2024-08-17 15:58:48 -04:00
MagicBot 387f75766f Debug output 2024-08-17 15:36:03 -04:00
MagicBot 2a18b96d23 Reformat 2024-08-17 15:31:45 -04:00
MagicBot bf2174fbe5 Sometimes bad floats. 2024-08-17 15:29:11 -04:00
MagicBot 462f6725b6 Sometimes bad floats. 2024-08-17 15:26:59 -04:00
MagicBot ed09bffc87 Values are floats 2024-08-17 15:23:12 -04:00
MagicBot 218de2bb70 Support for multiple power enrties. 2024-08-17 15:13:32 -04:00
MagicBot c90961b691 Support for multiple power enrties. 2024-08-17 14:51:30 -04:00
MagicBot 1b5b904a8f Support for multiple power enrties. 2024-08-17 14:51:18 -04:00
MagicBot ed219efb92 22 fields 2024-08-17 14:37:49 -04:00
MagicBot 4d704d3ab0 Variables mirror executable 2024-08-16 13:09:22 -04:00
MagicBot 11076ff586 Variables mirror executable 2024-08-16 12:36:54 -04:00
MagicBot 6b22e624f6 Debug code added 2024-08-16 12:01:13 -04:00
MagicBot a81f90238b Debug code added 2024-08-15 16:31:04 -04:00
MagicBot e7c2e827b9 Filename updated 2024-08-15 16:20:33 -04:00
MagicBot 82aa2f9b77 Parsing powers at bootstrap 2024-08-15 16:16:59 -04:00
MagicBot d9cc2d2a56 More PowerEntry parsing work. 2024-08-15 16:08:33 -04:00
MagicBot 28e3769d1e Parm changed to float. 2024-08-15 16:01:50 -04:00
MagicBot e092d764bd More PowerEntry parsing work. 2024-08-14 17:33:06 -04:00
MagicBot 27c0a852e9 More PowerEntry parsing work. 2024-08-14 17:32:45 -04:00
MagicBot bf6ad69d4c More PowerEntry parsing work. 2024-08-14 17:29:13 -04:00
MagicBot 0b4b270d2f Strip quotes from names 2024-08-14 17:21:26 -04:00
MagicBot 4b63493b73 Formatting 2024-08-14 17:19:39 -04:00
MagicBot 9b6c8af171 Cannot be null 2024-08-14 17:18:36 -04:00
MagicBot 4c7421cd62 More PowerEntry parsing work 2024-08-14 17:11:38 -04:00
MagicBot 7662069100 More PowerEntry parsing work 2024-08-14 17:00:19 -04:00
MagicBot adb10e34f3 Naming convention update 2024-08-14 16:57:34 -04:00
MagicBot bd0d814142 Moved comment to declaration 2024-08-14 16:55:11 -04:00
MagicBot 06364a2b9e More power parsing work. 2024-08-14 16:53:07 -04:00
MagicBot afb6d3e8a3 Needs group 0 2024-08-14 16:46:02 -04:00
MagicBot a48ff5851c PowerEntry parsing work 2024-08-14 16:36:07 -04:00
MagicBot ede21f8d54 PowerEntry parsing work 2024-08-14 16:34:20 -04:00
MagicBot d08190cbff PowerEntry parsing work 2024-08-14 16:29:21 -04:00
MagicBot cd50ca4309 PowerEntry parsing work 2024-08-14 16:27:51 -04:00
MagicBot 97c118ae1a PowerEntry parsing work 2024-08-13 12:20:27 -04:00
MagicBot 8878f07628 PowerEntry data class created 2024-08-13 12:06:24 -04:00
MagicBot dee30d8121 Header added to new files 2024-08-13 12:05:09 -04:00
MagicBot 5087465ecb Power parsing work 2024-08-13 12:04:18 -04:00
MagicBot 39844251b0 wpak package for wpak code 2024-08-13 11:58:41 -04:00
MagicBot 8c983eadff Declaration order follows execution order. 2024-08-13 11:29:37 -04:00
MagicBot 7efe5209aa Comment update 2024-08-13 11:28:34 -04:00
MagicBot 95cf5fa209 Comment update 2024-08-13 11:28:07 -04:00
MagicBot adde3fc3a8 Comment update 2024-08-12 16:05:36 -04:00
MagicBot b7089e88d3 Comment update 2024-08-12 11:20:28 -04:00
MagicBot da63d9d926 Can't be null 2024-08-12 11:19:53 -04:00
MagicBot c8a5224c75 Parsing conditions 2024-08-12 11:15:21 -04:00
MagicBot d4618ae4b9 Parsing conditions 2024-08-12 11:13:54 -04:00
MagicBot 0591b9d41f Parsing conditions 2024-08-12 11:10:52 -04:00
MagicBot 52c5f51613 Parsing conditions 2024-08-12 11:03:45 -04:00
MagicBot f8b9c97730 Parsing conditions 2024-08-12 11:01:27 -04:00
MagicBot c7fa537cfb More effectmod parser work. 2024-08-12 10:50:00 -04:00
MagicBot e0e8296339 More effectmod parser work. 2024-08-12 10:47:37 -04:00
MagicBot e677ca9f33 More effectmod parser work. 2024-08-12 10:46:35 -04:00
MagicBot c19f6df690 More effectmod parser work. 2024-08-12 10:45:19 -04:00
MagicBot 3ed7f7c3fb More effectmod parser work. 2024-08-12 10:43:45 -04:00
MagicBot 6b10374adb More effectmod parser work. 2024-08-12 10:42:30 -04:00
MagicBot 0a65ea61e7 More effectmod parser work. 2024-08-12 10:41:11 -04:00
MagicBot 6500659c1f More effectmod parser work. 2024-08-12 10:39:46 -04:00
MagicBot 480887a78f More effectmod parser work. 2024-08-12 10:38:23 -04:00
MagicBot 05ac2d0a90 More effectmod parser work. 2024-08-12 10:36:55 -04:00
MagicBot bbac9ce6b9 More effectmod parser work. 2024-08-12 10:28:37 -04:00
MagicBot 5b9866f704 More effectmod parser work. 2024-08-12 10:26:49 -04:00
MagicBot 4a6e4d2a85 More effectmod parser work. 2024-08-12 10:25:10 -04:00
MagicBot b7ef3de527 More effectmod parser work. 2024-08-12 10:23:56 -04:00
MagicBot 4bfb866abe More effectmod parser work. 2024-08-12 10:22:19 -04:00
MagicBot 23d2b595d9 More effectmod parser work. 2024-08-12 10:21:37 -04:00
MagicBot 7d30fd2b96 More effectmod parser work. 2024-08-12 10:20:48 -04:00
MagicBot 93d5976c1e More effectmod parser work. 2024-08-12 10:19:20 -04:00
MagicBot 260bc453d1 More effectmod parser work. 2024-08-12 10:15:04 -04:00
MagicBot 5a619db9bd More effectmod parser work. 2024-08-12 10:12:28 -04:00
MagicBot d622406912 More effectmod parser work. 2024-08-12 10:09:54 -04:00
MagicBot a5e2b69ae3 More effectmod parser work. 2024-08-12 10:05:49 -04:00
MagicBot 56686944af More effectmod parser work. 2024-08-12 10:03:55 -04:00
MagicBot aa957f41af More effectmod parser work. 2024-08-12 10:02:24 -04:00
MagicBot 9336305334 More effectmod parser work. 2024-08-12 09:59:17 -04:00
MagicBot bc9c5224d0 More effectmod parser work. 2024-08-12 09:57:19 -04:00
MagicBot eda27b2e9c min/max are floats 2024-08-12 09:55:22 -04:00
MagicBot c5d6b382f8 More effectmod parser work. 2024-08-12 09:45:26 -04:00
MagicBot ae0d182e2e More effectmod parser work. 2024-08-12 09:40:43 -04:00
MagicBot ad78d152f7 More effectmod parser work. 2024-08-12 09:39:01 -04:00
MagicBot 000ccdaf0a More effectmod parser work. 2024-08-12 09:32:58 -04:00
MagicBot 57249727de More effectmod parser work. 2024-08-12 09:27:19 -04:00
MagicBot d6c49d0793 More effectmod parser work. 2024-08-12 09:25:17 -04:00
MagicBot 2fa58c4f38 More effectmod parser work. 2024-08-12 09:16:17 -04:00
MagicBot c361c2a78a More effectmod parser work. 2024-08-12 09:13:29 -04:00
MagicBot 4d862355be More effectmod parser work. 2024-08-12 09:09:44 -04:00
MagicBot 52028e0e97 More effectmod parser work. 2024-08-12 09:01:49 -04:00
MagicBot 3e4e13a8ae More effectmod parser work. 2024-08-12 09:00:59 -04:00
MagicBot 0ceea002d5 More effectmod parser work. 2024-08-12 08:52:24 -04:00
MagicBot 7d8f4049b9 More effectmod parser work. 2024-08-12 08:47:57 -04:00
MagicBot dbefaa7ead More effectmod parser work. 2024-08-12 08:45:42 -04:00
MagicBot 9c1ec1069f More effectmod parser work. 2024-08-12 08:14:52 -04:00
MagicBot f36c980eb9 More effectmod parser work. 2024-08-11 17:07:56 -04:00
MagicBot cb1a7f014d More effectmod parser work. 2024-08-11 12:48:56 -04:00
MagicBot e729bc9541 More effectmod parser work. 2024-08-11 12:44:54 -04:00
MagicBot c97a6f555a min/scale/slope for group of types 2024-08-11 12:01:18 -04:00
MagicBot 95a104e397 Effect Modifier parsing work. 2024-08-10 18:56:31 -04:00
MagicBot e7ad83cc60 Effect Modifier parsing work. 2024-08-10 18:55:26 -04:00
MagicBot 821b7264ec Effect Modifier parsing work. 2024-08-10 18:50:28 -04:00
MagicBot 0bf3456119 Effect Modifier parsing work. 2024-08-10 18:45:23 -04:00
MagicBot ff7bd7a699 Effect Modifier parsing work. 2024-08-10 18:33:08 -04:00
MagicBot a028bebafd Effect Modifier parsing work. 2024-08-10 18:27:17 -04:00
MagicBot 789d9a3bb6 Effect Modifier parsing work. 2024-08-10 18:23:40 -04:00
MagicBot 8e19b66a9b Effect Modifier parsing work. 2024-08-10 18:13:56 -04:00
MagicBot 975845375f Effect Modifier parsing work. 2024-08-10 18:13:15 -04:00
MagicBot 74b37063bf Effect Modifier parsing work. 2024-08-10 18:07:54 -04:00
MagicBot c2fee2290d Update to mods regex 2024-08-10 18:02:22 -04:00
MagicBot f7c8c44ebb EffectModifier parsing 2024-08-10 17:54:29 -04:00
MagicBot 91b2ff6e62 EffectModifier parsing 2024-08-10 16:30:43 -04:00
MagicBot 8293f552b1 EffectModifier parsing 2024-08-10 16:29:55 -04:00
MagicBot a84336fc31 Quotes stripped from names. 2024-08-10 16:18:33 -04:00
MagicBot 3951114eb7 Some entries have no icon 2024-08-08 13:14:21 -04:00
MagicBot f24877e9ce Some entries have no icon 2024-08-08 13:14:07 -04:00
MagicBot b81b83570a Some entries have no icon 2024-08-08 13:11:10 -04:00
MagicBot 2417073a4d Regex handles empty strings 2024-08-08 13:07:20 -04:00
MagicBot ebc0b7a89e Debugging 2024-08-08 13:02:01 -04:00
MagicBot 3d6bfcf48f Trim fields before adding to array 2024-08-08 12:57:03 -04:00
MagicBot a5864b74f8 Regex split update 2024-08-08 12:54:58 -04:00
MagicBot de8896ff4e Debugging 2024-08-08 12:29:01 -04:00
MagicBot e579912733 Debugging 2024-08-08 12:28:35 -04:00
MagicBot c7b4404c36 Regex used for strsplit 2024-08-08 12:19:53 -04:00
MagicBot f1de7d413a Hashset initialized 2024-08-08 11:59:10 -04:00
MagicBot cc6f5f5f25 Regex updated with lookahead 2024-08-08 11:56:31 -04:00
MagicBot 19bf75ade8 Regex updated 2024-08-08 11:47:45 -04:00
MagicBot 73eacc3779 Regex updated 2024-08-08 11:38:09 -04:00
MagicBot 69f3504ee9 Regex updated 2024-08-08 11:36:00 -04:00
MagicBot bd89b5e975 Assign result 2024-08-08 11:28:58 -04:00
MagicBot 186eea3099 Regex updated 2024-08-08 11:26:01 -04:00
MagicBot 5e0badef17 EffectModifier pojo work. 2024-08-08 11:21:39 -04:00
MagicBot ea24d493fd Parsing of effect description 2024-08-06 17:18:46 -04:00
MagicBot d12d040def Parsing of effect description 2024-08-06 17:17:57 -04:00
MagicBot 491a9dbae9 Sanitize input 2024-08-06 17:07:07 -04:00
MagicBot 1e0372c40d HashSets for starters. 2024-08-06 16:56:41 -04:00
MagicBot d2f6344846 Regex driven parsing. 2024-08-06 16:52:06 -04:00
FatBoy 47cb824b3f parsing multi worded names 2024-07-24 19:44:29 -05:00
FatBoy 7d8117173f parsing multi worded names 2024-07-24 19:38:28 -05:00
FatBoy 2f076d3215 parsing multi worded names 2024-07-24 19:33:42 -05:00
FatBoy 1a0b8c1d35 parsing multi worded names 2024-07-24 19:31:27 -05:00
FatBoy 887db109c1 parsing multi worded names 2024-07-24 19:31:00 -05:00
FatBoy d8b7f74cd1 attempt to parse 2 worded values 2024-07-24 19:23:18 -05:00
FatBoy b81b4f0e0a attempt to parse 2 worded values 2024-07-24 19:23:04 -05:00
FatBoy 0b4e0d65a9 attempt to parse 2 worded values 2024-07-24 19:14:15 -05:00
FatBoy 2f837ace1e attempt to parse 2 worded values 2024-07-24 19:13:07 -05:00
FatBoy 319d68d15e attempt to parse 2 worded values 2024-07-24 19:09:41 -05:00
FatBoy 2224d811eb attempt to parse 2 worded values 2024-07-24 19:08:41 -05:00
FatBoy 9ec97ce448 attempt to parse 2 worded values 2024-07-24 19:03:49 -05:00
FatBoy f13b8b5d3e attempt to parse 2 worded values 2024-07-24 18:56:29 -05:00
FatBoy 633f5837dc attempt to parse 2 worded values 2024-07-24 18:55:20 -05:00
FatBoy 3238cfa0ff attempt to parse 2 worded values 2024-07-24 18:54:01 -05:00
FatBoy 83b1503cee attempt to parse 2 worded values 2024-07-24 18:51:27 -05:00
MagicBot 6854fad222 Class cleanup 2024-07-24 12:56:24 -04:00
FatBoy 56dd3cfa95 Effects.cfg parser 2024-07-23 21:18:12 -05:00
FatBoy f81a1acb20 Effects.cfg parser 2024-07-23 21:15:37 -05:00
FatBoy 4ed5744707 Effects.cfg parser 2024-07-23 21:11:17 -05:00
FatBoy 085f2816a9 Effects.cfg parser 2024-07-23 21:09:01 -05:00
FatBoy 0526fdef2f Effects.cfg parser 2024-07-23 21:07:29 -05:00
FatBoy 093ee9f59a Effects.cfg parser 2024-07-23 21:02:41 -05:00
FatBoy 1d56b138a5 Effects.cfg parser 2024-07-23 20:57:40 -05:00
FatBoy 419ce3f49c Effects.cfg parser 2024-07-23 20:56:25 -05:00
FatBoy a27f257f80 Effects.cfg parser 2024-07-23 20:53:26 -05:00
FatBoy 8eee7ca23e Effects.cfg parser 2024-07-23 20:51:58 -05:00
FatBoy 28cf0d2232 Effects.cfg parser 2024-07-23 20:48:41 -05:00
FatBoy e12a8a3c7c Effects.cfg parser 2024-07-23 20:47:39 -05:00
MagicBot 9ad5f239b0 No modtable defaults to workorder. 2024-07-22 16:54:11 -04:00
MagicBot 3db8ee7afd Forge validation for modtables updated. 2024-07-22 16:37:27 -04:00
FatBoy f07974f673 dual wield spam attack issue resolved 2024-07-21 19:46:06 -05:00
FatBoy 0d5cef1652 guilds that have sub guilds can no longer be invited to join nations 2024-07-21 19:36:17 -05:00
FatBoy 04203c092a Lowering stats below item requirement unequips and removes item from map correctly 2024-07-21 19:32:16 -05:00
FatBoy 78feee482b items can now be equipped when skill level exactly meets item requirement 2024-07-21 19:23:34 -05:00
FatBoy 8c35844e08 Huntress pet cannot attack players resolved 2024-07-21 19:16:57 -05:00
FatBoy 0fbb43e021 proc fix 2024-07-12 13:43:28 -04:00
MagicBot 145449f26d Bronzewood mine_production updated. 2024-06-29 14:33:19 -04:00
FatBoy feef6263b4 cleanup 2024-06-27 20:41:43 -05:00
FatBoy 6c622c377f blocked power type structuring 2024-06-27 20:19:11 -05:00
FatBoy 8943121336 blocked power type structuring 2024-06-27 19:54:29 -05:00
FatBoy 70cb469190 final cleanup 2024-06-26 20:44:46 -05:00
FatBoy a42f307a70 immunitiy check compiled to single location 2024-06-26 20:37:28 -05:00
FatBoy 2a3ae6eaec Immunities refresh 2024-06-26 20:24:05 -05:00
FatBoy 9e4b596aa1 enforce KOS for building works 2024-06-26 20:07:37 -05:00
FatBoy aa1fe792a3 Load enforceKOS for buildings 2024-06-26 19:57:50 -05:00
FatBoy 79919121a8 claiming an errant ToL gives ownership to the leader of the guild, not individual player 2024-06-26 19:44:23 -05:00
FatBoy 80ccfff635 Building Management compiled to a single method check 2024-06-26 19:27:32 -05:00
MagicBot 381139af35 Collection of resourceHash 2024-06-26 12:31:08 -04:00
MagicBot e79da63556 Method cleanup. 2024-06-24 03:18:59 -04:00
MagicBot 533565e37e UUID is in keyset 2024-06-24 03:09:38 -04:00
FatBoy da0510d2bc proccing system 2024-06-22 19:50:53 -05:00
FatBoy 1f732a8ca9 failed rune sno longer get consumed 2024-06-22 19:31:13 -05:00
FatBoy 0d24789a93 reverse KOS function completed 2024-06-22 19:22:13 -05:00
FatBoy 35427cfb4a reverse KOS function 2024-06-22 19:04:04 -05:00
MagicBot 695a78b1e2 Noob island filter at 20 2024-06-19 17:57:28 -04:00
MagicBot 9f6710ccb9 More logic work 2024-06-19 17:51:42 -04:00
MagicBot fff1e80f61 More logic work 2024-06-19 17:49:46 -04:00
MagicBot 141af19daa More logic work 2024-06-19 17:38:44 -04:00
MagicBot 630748541f More logic work 2024-06-19 17:36:09 -04:00
MagicBot d32818f351 Rearrange logic 2024-06-19 17:27:04 -04:00
MagicBot d6f94bd0e7 Merged methods 2024-06-19 17:10:49 -04:00
MagicBot db6a4e471d Lore rules added to method 2024-06-19 17:08:56 -04:00
MagicBot a24c611bac Lore rules added to method 2024-06-19 17:01:02 -04:00
MagicBot 3926160ab1 Unused method removed 2024-06-19 16:56:57 -04:00
MagicBot 4a7013de61 Signature update 2024-06-19 16:56:06 -04:00
MagicBot 56564f1c3b Cleanup of teleport list 2024-06-19 16:53:55 -04:00
MagicBot 8a3e39e97d Cleanup of cityChoice handler 2024-06-19 15:05:01 -04:00
MagicBot 5224c79441 Condemned uuid is key not value in map 2024-06-19 14:53:57 -04:00
MagicBot ede016a93d Never null 2024-06-19 14:43:31 -04:00
MagicBot cc1825dec9 Increase to handle larger banks. 2024-06-18 12:43:59 -04:00
MagicBot d257ce50cf Sanity check for null city. 2024-06-18 11:56:19 -04:00
MagicBot 5b246211e1 Warehouse record removed in destruction banes. 2024-06-18 11:51:11 -04:00
FatBoy 33c923b0de fixed immunities in powers manager 2024-06-13 20:47:28 -05:00
FatBoy 02d524663a fixed a lore issue in powers manager 2024-06-13 20:14:43 -05:00
MagicBot 5bd85addb7 Removed count when validating stack withdraw weight. 2024-06-13 15:42:54 -04:00
FatBoy 40bae67443 fixed mob damage defense and ATR 2024-06-12 19:35:20 -05:00
FatBoy 1cf1d731c4 added = to range checks and converted speed to float 2024-06-12 19:23:34 -05:00
MagicBot 24215e21c9 Sanity check for deleted vendors 2024-06-12 14:15:19 -04:00
MagicBot 3accd779b9 Sanity check for deleted vendors 2024-06-12 14:06:18 -04:00
MagicBot 1d673ca2e5 Sanity check for deleted vendors 2024-06-12 14:04:19 -04:00
MagicBot c935ea1986 Project reformat. 2024-06-11 13:40:42 -04:00
MagicBot 678ccafd3c Unused variable removed. 2024-06-11 13:23:49 -04:00
MagicBot 31292785a5 templateHash used in this context. 2024-06-11 13:09:40 -04:00
MagicBot cdc4717033 Update to resources message 2024-06-11 12:54:57 -04:00
MagicBot 35c8ac0289 Update to resources message 2024-06-11 12:53:07 -04:00
MagicBot f5cc4a3290 Update to resource type 2024-06-10 15:19:57 -04:00
FatBoy 74bd7ddb8b attack speed calculation handled correctly 2024-05-31 19:02:59 -05:00
FatBoy 4feb95131c early exit for pets attacking a null target 2024-05-31 18:34:27 -05:00
FatBoy d22ba7b89d early exit for pets attacking a null target 2024-05-31 18:32:53 -05:00
FatBoy 722fd14be5 character should now play swing animation everytime he tried to swing regardless of early exits 2024-05-31 18:29:59 -05:00
FatBoy 12e73d59c7 apply weapon powers before early exit for defense of passives 2024-05-31 18:26:36 -05:00
FatBoy 5c70f15064 check player agro map for key before tryign to assign to it 2024-05-31 18:23:34 -05:00
MagicBot 8ca641f353 Return 0 for null table entry. 2024-05-31 07:41:25 -04:00
FatBoy 0f9500a0d7 swing animation for miss 2024-05-29 18:39:24 -05:00
FatBoy 0d51afb737 pet damage adjustment 2024-05-28 19:28:41 -05:00
FatBoy 60e331de1a animation work 2024-05-28 19:12:00 -05:00
FatBoy 4a554b0d61 animation work 2024-05-28 19:09:46 -05:00
FatBoy 3f3d85fb36 animation work 2024-05-28 18:55:54 -05:00
MagicBot d2d655a839 Null check for vendor workorder lookup. 2024-05-28 18:31:16 -04:00
FatBoy 0096b8051c updated range chack and hitbox calculations 2024-05-27 19:59:35 -05:00
FatBoy 86102c8933 updated range chack and hitbox calculations 2024-05-27 19:50:52 -05:00
FatBoy f06e2c2e5c traveller open gate fix 2024-05-26 22:36:12 -05:00
FatBoy 74b425e567 casting fix for lore rulesets 2024-05-26 22:20:30 -05:00
FatBoy 22c8cdcf65 fixed pet attack and null weapon combat issue 2024-05-26 22:00:52 -05:00
FatBoy 7ed026f088 machine gun combat fixed 2024-05-26 21:49:36 -05:00
FatBoy 232c381e96 early exit for attack timer 2024-05-26 21:41:59 -05:00
FatBoy 69ea460d5e early exit for attack timer 2024-05-26 20:31:22 -05:00
FatBoy cbe9a30590 corrected convention for naming auto attack job 2024-05-26 20:17:15 -05:00
FatBoy 1bbbc396bd handle destory or derank for buildings 2024-05-22 20:49:33 -05:00
FatBoy 8601f9fcd5 special animation case for Siege Bow 2024-05-22 19:52:21 -05:00
FatBoy 7f029fd0e2 invalid range check for ranged characters attacking a building 2024-05-22 19:45:16 -05:00
FatBoy cc7188b404 invalid range check for ranged characters attacking a building 2024-05-22 19:40:25 -05:00
FatBoy aa0621bb02 bane live processing with vulnerable buildings 2024-05-22 19:27:44 -05:00
FatBoy b4ff1a3f7f swing animation lookup 2024-05-17 20:34:26 -05:00
FatBoy 9d6b1dcf60 swing animation lookup 2024-05-17 20:22:56 -05:00
FatBoy 6e123ecb86 swing animation lookup 2024-05-17 20:17:17 -05:00
FatBoy 2b8b9464af swing animation lookup 2024-05-17 20:09:46 -05:00
FatBoy cd8099b42f noob island guard aggro 2024-05-17 20:01:39 -05:00
FatBoy 2cdcba47a5 noob island guard aggro 2024-05-17 19:57:18 -05:00
FatBoy b7b4623c75 noob island guard aggro 2024-05-17 19:53:39 -05:00
FatBoy 2d958b929d noob island guard aggro 2024-05-17 19:50:44 -05:00
FatBoy e8f0e9f5de noob island guard aggro 2024-05-17 19:50:09 -05:00
FatBoy 03f0f3fcf0 noob island guard aggro 2024-05-17 19:41:26 -05:00
FatBoy 65db64d3df null spam fix for hamlet guards 2024-05-16 19:41:06 -05:00
FatBoy 5a25958aa5 cannot teleport od repledge to perdition or bastion 2024-05-14 19:35:37 -05:00
FatBoy 1f8c5495ab repledge work 2024-05-14 19:28:19 -05:00
FatBoy a54aa03ade can always teleport and repledge to your own nation 2024-05-14 19:22:31 -05:00
FatBoy e82445fcd2 teleport and repledge inside your own nation 2024-05-14 19:14:40 -05:00
FatBoy 9e9716fc88 Lore Teleport list and repledge list construction 2024-05-14 19:10:01 -05:00
FatBoy 4f01da368c Lore Guard AI Aggro 2024-05-14 18:49:30 -05:00
FatBoy 93c4103f61 Lore Mob AI Aggro 2024-05-14 18:42:38 -05:00
MagicBot f8180a7000 Removed custom exception candy 2024-05-12 13:42:11 -04:00
MagicBot 634f1478ce Removed custom exception candy 2024-05-12 13:36:47 -04:00
MagicBot 7335946c10 Removed 4 squigglies 2024-05-12 13:31:05 -04:00
MagicBot fb4eea67ed Comment cleanup 2024-05-12 13:18:51 -04:00
MagicBot 96ba17f67a DispatchManager is now an official manager singleton. 2024-05-12 13:14:42 -04:00
MagicBot ff17cacda7 magicvalue update 2024-05-12 12:54:11 -04:00
MagicBot 4d6ce2b155 Update to value in item rs constructor 2024-05-12 12:06:30 -04:00
MagicBot b2c9331899 Unused variables removed 2024-05-12 11:57:26 -04:00
MagicBot 1cb01b1cce Unused field removed 2024-05-12 11:55:12 -04:00
MagicBot e79fd0c3b4 Unused method removed 2024-05-12 11:46:28 -04:00
MagicBot 6dd1d97be5 Comment cleanup 2024-05-12 11:34:22 -04:00
MagicBot 805034e30b Comment cleanup 2024-05-12 11:32:00 -04:00
MagicBot 9646964698 TODO touchup 2024-05-12 11:31:25 -04:00
MagicBot 9ffaf96017 recalc magic value 2024-05-12 11:24:01 -04:00
MagicBot ce98f80b85 recalc magic value 2024-05-12 11:22:12 -04:00
MagicBot f683201086 recalc magic value 2024-05-12 11:18:22 -04:00
MagicBot 4796f7042d Bugfix in update_value 2024-05-12 11:09:45 -04:00
MagicBot 94ff3cf222 New rolling duration method moved to manager singleton. 2024-05-12 08:14:06 -04:00
MagicBot 174be35cac Comment cleanup 2024-05-12 07:17:31 -04:00
MagicBot ba266e506a Comment cleanup 2024-05-12 07:15:55 -04:00
MagicBot 4123157b92 Comment cleanup 2024-05-11 13:12:10 -04:00
MagicBot 7bb9aeacf7 Comment cleanup 2024-05-11 11:06:07 -04:00
MagicBot 1eda55a3f1 Serialization update 2024-05-11 11:01:49 -04:00
MagicBot f670e3143c Serialization update 2024-05-11 10:52:31 -04:00
MagicBot d55b57f7d0 Flag testing 2024-05-11 10:46:34 -04:00
MagicBot ea2f6f4593 Remove from dbManager cache 2024-05-11 09:37:23 -04:00
MagicBot b592f050c2 convention is == false 2024-05-11 09:33:54 -04:00
MagicBot 25f522c539 Make sure no memory leaks 2024-05-11 09:25:57 -04:00
MagicBot e89404abda json and string methods updated 2024-05-11 09:19:29 -04:00
MagicBot ad2cde9d85 Atomic instead of volatile to match counter 2024-05-11 09:16:48 -04:00
MagicBot ba94fabfb8 Atomic instead of volatile to match counter 2024-05-11 09:15:11 -04:00
MagicBot f7ab38e9a8 Comment updated 2024-05-11 09:02:54 -04:00
MagicBot 0d97fa614b Equals and hash overrides for workObject 2024-05-11 08:57:26 -04:00
MagicBot 6878916874 Update to workOrder cleanup 2024-05-11 08:51:41 -04:00
MagicBot c545468f26 Update to workOrder cleanup 2024-05-11 08:49:44 -04:00
MagicBot 7993fb22d2 Thread consistency for these 2024-05-11 08:33:34 -04:00
MagicBot 19bdb89c0f Unused variable removed 2024-05-11 08:30:32 -04:00
MagicBot 6b0b0cc357 Workorder set to completed when redeeding. 2024-05-11 08:07:04 -04:00
MagicBot bc1ae9a2c9 Minor cleanup 2024-05-11 08:02:19 -04:00
MagicBot 408e3a45ca Workorders cleared with hireling removal. 2024-05-11 07:51:56 -04:00
MagicBot 52e0b5be4d Minor cleanup 2024-05-11 07:31:09 -04:00
MagicBot 161335da26 Comment cleanup 2024-05-10 10:12:45 -04:00
MagicBot 7f1bc2a4b7 Update to workOrder loading. 2024-05-10 09:50:14 -04:00
MagicBot e37a4fab38 Update to workOrder loading. 2024-05-10 09:44:11 -04:00
MagicBot 2760a45d2f Early exit moved to run() 2024-05-10 09:39:43 -04:00
MagicBot 77673fde5f completed workOrders handling update 2024-05-10 09:34:58 -04:00
MagicBot 5fd4e5a088 Early exit for no avail slots 2024-05-09 14:50:47 -04:00
MagicBot b01b62ac3d Withdraw logic cleanup 2024-05-09 14:40:40 -04:00
MagicBot 7193ff7698 Withdraw logic cleanup 2024-05-09 14:12:55 -04:00
MagicBot dd72e20ff9 Withdraw logic cleanup 2024-05-09 14:04:19 -04:00
MagicBot f465ea4045 Withdraw logic cleanup 2024-05-09 11:32:26 -04:00
MagicBot 973dfc94f7 Withdraw logic cleanup 2024-05-09 11:31:12 -04:00
MagicBot a5255bcf11 Simplify total cost calc 2024-05-08 15:40:35 -04:00
MagicBot ec35228de9 Beardstyle bugfix 2024-05-08 13:31:47 -04:00
MagicBot 47a93f6545 sql parm count fix 2024-05-06 13:56:18 -04:00
MagicBot 0cff40070b Realm derived not stored 2024-05-06 13:33:28 -04:00
FatBoy 3f3fb53675 hamlet guard aggro 2024-05-05 19:45:46 -05:00
FatBoy b198dbcc09 Added ./setrace command 2024-05-04 21:39:35 -05:00
FatBoy 60b8843563 Added ./setrace command 2024-05-04 21:38:06 -05:00
MagicBot eff8be91d6 Comment cleanup 2024-05-04 13:38:38 -04:00
MagicBot 55e2d3fb5e Class cleanup 2024-05-04 13:33:33 -04:00
MagicBot a6f417d9cc Comment cleanup 2024-05-04 13:23:33 -04:00
MagicBot 7b1b09dc40 Comment cleanup 2024-05-04 13:20:26 -04:00
MagicBot 5724608005 Class cleanup 2024-05-04 13:18:34 -04:00
MagicBot f5d410f868 typo fixed contextually 2024-05-04 12:58:46 -04:00
MagicBot a5c1422534 unused variable removed 2024-05-04 12:55:51 -04:00
MagicBot 6df0e5625c Class cleanup. 2024-05-04 12:53:06 -04:00
MagicBot 5de932b095 Comment updated. 2024-05-04 12:41:45 -04:00
MagicBot db7d606b36 Devcmd removed. 2024-05-04 12:31:25 -04:00
FatBoy 30d302c43e Lore Guards use charter restrictions when aggroing 2024-04-30 21:45:28 -05:00
FatBoy 95cfc43956 debug option added in canJoin for charter type 2024-04-28 13:49:14 -05:00
FatBoy 7c8d78581e debug option added in canJoin for charter type 2024-04-28 13:46:35 -05:00
FatBoy 6f4a9f7d1a debug option added in canJoin for charter type 2024-04-28 13:44:35 -05:00
FatBoy 7a5569ab89 return guild charter type 2024-04-28 13:39:24 -05:00
FatBoy 042f7c675f cleanup dbEffectsResourceCostHandler 2024-04-28 13:28:53 -05:00
MagicBot 3c4d8239db Charter template id is stored not ordinal 2024-04-28 14:18:13 -04:00
MagicBot 4f20cc9aba Comment update. 2024-04-28 13:56:03 -04:00
MagicBot 34812694b7 Comparison fix 2024-04-28 13:49:21 -04:00
MagicBot 0bbbcbaa81 Removed squiggles 2024-04-28 13:44:35 -04:00
FatBoy 72172b9f05 GuildType lookup work 2024-04-28 12:40:53 -05:00
MagicBot 1876e09b48 method for populating lookup table 2024-04-28 13:34:45 -04:00
MagicBot 31c83f2bb5 upgraded protection for variables 2024-04-28 13:26:07 -04:00
MagicBot 065aa34652 Update to type constructor 2024-04-28 13:23:52 -04:00
FatBoy 8bbaae418d fix for player guild checks 2024-04-28 12:05:56 -05:00
FatBoy 10db850de4 replace == "LORE" with .equals("LORE") 2024-04-28 11:58:55 -05:00
FatBoy 753c3686ea Added MB Dev Notes 2024-04-28 11:44:28 -05:00
FatBoy f4bd928796 Lore check for telport and repledge 2024-04-28 11:34:03 -05:00
MagicBot 916a12a434 City realm id lookup not db load 2024-04-27 11:32:05 -04:00
MagicBot 3a8521683b Bootstrap logging info update 2024-04-27 09:32:25 -04:00
MagicBot df4d5a654f Comment cleanup 2024-04-27 08:58:28 -04:00
MagicBot 7fb5d7d23d Comment cleanup 2024-04-27 08:53:50 -04:00
MagicBot a7c9a15405 Comment cleanup 2024-04-27 08:47:04 -04:00
MagicBot b3b115e9ba Comment cleanup 2024-04-27 08:37:20 -04:00
MagicBot 1b5a64d8fc Minor cleanup 2024-04-27 08:17:43 -04:00
MagicBot 01f0e25e08 Minor cleanup 2024-04-27 08:17:17 -04:00
MagicBot 0782814c8e Update to junk handling 2024-04-27 08:14:31 -04:00
MagicBot 111ba02289 Merge remote-tracking branch 'refs/remotes/origin/feature-workorder2.8' into magicbox-1.5.2.1 2024-04-27 07:28:55 -04:00
MagicBot f09a7d4d12 Unused method removed 2024-04-27 07:27:03 -04:00
MagicBot e1e72b71bd Better name for context 2024-04-27 07:24:57 -04:00
MagicBot 4dce2e2aa2 Comment cleanup 2024-04-27 07:22:20 -04:00
MagicBot 743c897254 total_to_produce updated when slot removed from workOrder 2024-04-27 07:18:24 -04:00
MagicBot f134f71695 Squiggly removal 2024-04-27 07:07:59 -04:00
MagicBot 91016dd53c Cleanup in bane handling 2024-04-27 07:06:39 -04:00
FatBoy 39d04188b4 cleanup old rune handler in ObjectActionMsgHandler 2024-04-26 19:10:56 -05:00
FatBoy c99433c9bd missing case for type RUNE in ObjectActionMsgHandler 2024-04-26 19:07:33 -05:00
FatBoy 6cc94e076d promoting was attempting to use players promotion class (which is null) 2024-04-26 19:00:12 -05:00
MagicBot f294e48140 Null check added for city 2024-04-26 16:15:16 -04:00
MagicBot c25f325f87 Null check added for city 2024-04-26 16:15:07 -04:00
MagicBot ac0c11cb46 Comment cleanup 2024-04-26 15:56:04 -04:00
MagicBot 79e86e0a6f Comment cleanup 2024-04-26 15:43:45 -04:00
MagicBot 46f35f0b10 Minor update to keyset() usages 2024-04-26 15:37:37 -04:00
MagicBot 1b20201f8d MB Dev note added 2024-04-26 15:32:17 -04:00
MagicBot 0d744d900c MB Dev note added 2024-04-26 15:12:53 -04:00
MagicBot 9a8e0bd5c9 Comment cleanup 2024-04-26 15:10:49 -04:00
MagicBot 1bc3609cbe Unused method removed 2024-04-20 08:57:42 -04:00
468 changed files with 6663 additions and 4917 deletions
@@ -8,6 +8,7 @@
package engine.InterestManagement; package engine.InterestManagement;
import engine.gameManager.DispatchManager;
import engine.gameManager.GroupManager; import engine.gameManager.GroupManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.job.JobScheduler; import engine.job.JobScheduler;
@@ -17,7 +18,6 @@ import engine.mbEnums.DispatchChannel;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.net.AbstractNetMsg; import engine.net.AbstractNetMsg;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.LoadCharacterMsg; import engine.net.client.msg.LoadCharacterMsg;
import engine.net.client.msg.LoadStructureMsg; import engine.net.client.msg.LoadStructureMsg;
@@ -88,7 +88,7 @@ public enum InterestManager implements Runnable {
if (send) { if (send) {
Dispatch dispatch = Dispatch.borrow(player, msg); Dispatch dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
} }
} }
@@ -270,7 +270,7 @@ public enum InterestManager implements Runnable {
} }
Dispatch dispatch = Dispatch.borrow(player, uom); Dispatch dispatch = Dispatch.borrow(player, uom);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
loadedStaticObjects.removeAll(toRemove); loadedStaticObjects.removeAll(toRemove);
@@ -292,7 +292,7 @@ public enum InterestManager implements Runnable {
lcm = new LoadCharacterMsg(corpse, PlayerCharacter.hideNonAscii()); lcm = new LoadCharacterMsg(corpse, PlayerCharacter.hideNonAscii());
Dispatch dispatch = Dispatch.borrow(player, lcm); Dispatch dispatch = Dispatch.borrow(player, lcm);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} else if (awo.getObjectType().equals(GameObjectType.NPC)) { } else if (awo.getObjectType().equals(GameObjectType.NPC)) {
NPC npc = (NPC) awo; NPC npc = (NPC) awo;
@@ -304,13 +304,13 @@ public enum InterestManager implements Runnable {
if (lsm.getStructureList().size() > 0) { if (lsm.getStructureList().size() > 0) {
Dispatch dispatch = Dispatch.borrow(player, lsm); Dispatch dispatch = Dispatch.borrow(player, lsm);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
for (LoadCharacterMsg lc : lcmList) { for (LoadCharacterMsg lc : lcmList) {
Dispatch dispatch = Dispatch.borrow(player, lc); Dispatch dispatch = Dispatch.borrow(player, lc);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
loadedStaticObjects.addAll(toLoad); loadedStaticObjects.addAll(toLoad);
@@ -414,7 +414,7 @@ public enum InterestManager implements Runnable {
if (!uom.getObjectList().isEmpty()) { if (!uom.getObjectList().isEmpty()) {
Dispatch dispatch = Dispatch.borrow(player, uom); Dispatch dispatch = Dispatch.borrow(player, uom);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
} }
@@ -492,7 +492,7 @@ public enum InterestManager implements Runnable {
if (lcm != null) { if (lcm != null) {
Dispatch dispatch = Dispatch.borrow(player, lcm); Dispatch dispatch = Dispatch.borrow(player, lcm);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
+5 -5
View File
@@ -8,10 +8,10 @@
package engine.InterestManagement; package engine.InterestManagement;
import engine.gameManager.DispatchManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.msg.TerritoryChangeMessage; import engine.net.client.msg.TerritoryChangeMessage;
import engine.objects.City; import engine.objects.City;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -68,7 +68,7 @@ public enum RealmMap {
public static Realm getRealmForCity(City city) { public static Realm getRealmForCity(City city) {
Realm outRealm = null; Realm outRealm = null;
outRealm = city.getRealm(); outRealm = city.realm;
return outRealm; return outRealm;
} }
@@ -91,17 +91,17 @@ public enum RealmMap {
if (city != null) { if (city != null) {
TerritoryChangeMessage tcm = new TerritoryChangeMessage((PlayerCharacter) realm.getRulingCity().getOwner(), realm); TerritoryChangeMessage tcm = new TerritoryChangeMessage((PlayerCharacter) realm.getRulingCity().getOwner(), realm);
Dispatch dispatch = Dispatch.borrow(player, tcm); Dispatch dispatch = Dispatch.borrow(player, tcm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
} else { } else {
TerritoryChangeMessage tcm = new TerritoryChangeMessage(null, realm); TerritoryChangeMessage tcm = new TerritoryChangeMessage(null, realm);
Dispatch dispatch = Dispatch.borrow(player, tcm); Dispatch dispatch = Dispatch.borrow(player, tcm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
} }
} else { } else {
TerritoryChangeMessage tcm = new TerritoryChangeMessage(null, realm); TerritoryChangeMessage tcm = new TerritoryChangeMessage(null, realm);
Dispatch dispatch = Dispatch.borrow(player, tcm); Dispatch dispatch = Dispatch.borrow(player, tcm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
} }
} }
+1 -1
View File
@@ -120,7 +120,7 @@ public class Terrain {
public static float getWorldHeight(Zone zone, Vector3fImmutable world_loc) { public static float getWorldHeight(Zone zone, Vector3fImmutable world_loc) {
// Retrieve the next zone with a terrain defined. // Retrieve the next zone up in the tree with a terrain defined.
Zone terrainZone = getNextZoneWithTerrain(zone); Zone terrainZone = getNextZoneWithTerrain(zone);
Zone parentZone = getNextZoneWithTerrain(zone.parent); Zone parentZone = getNextZoneWithTerrain(zone.parent);
+11 -11
View File
@@ -8,11 +8,11 @@
package engine.InterestManagement; package engine.InterestManagement;
import engine.mbEnums.GridObjectType; import engine.gameManager.DispatchManager;
import engine.math.FastMath; import engine.math.FastMath;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.net.DispatchMessage; import engine.mbEnums.GridObjectType;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.LoadCharacterMsg; import engine.net.client.msg.LoadCharacterMsg;
import engine.net.client.msg.LoadStructureMsg; import engine.net.client.msg.LoadStructureMsg;
@@ -201,7 +201,7 @@ public class WorldGrid {
UnloadObjectsMsg uom = new UnloadObjectsMsg(); UnloadObjectsMsg uom = new UnloadObjectsMsg();
uom.addObject(awo); uom.addObject(awo);
DispatchMessage.sendToAllInRange(awo, uom); DispatchManager.sendToAllInRange(awo, uom);
} }
public static void loadObject(AbstractWorldObject awo) { public static void loadObject(AbstractWorldObject awo) {
@@ -213,15 +213,15 @@ public class WorldGrid {
case Building: case Building:
lsm = new LoadStructureMsg(); lsm = new LoadStructureMsg();
lsm.addObject((Building) awo); lsm.addObject((Building) awo);
DispatchMessage.sendToAllInRange(awo, lsm); DispatchManager.sendToAllInRange(awo, lsm);
break; break;
case NPC: case NPC:
lcm = new LoadCharacterMsg((NPC) awo, false); lcm = new LoadCharacterMsg((NPC) awo, false);
DispatchMessage.sendToAllInRange(awo, lcm); DispatchManager.sendToAllInRange(awo, lcm);
break; break;
case Mob: case Mob:
lcm = new LoadCharacterMsg((Mob) awo, false); lcm = new LoadCharacterMsg((Mob) awo, false);
DispatchMessage.sendToAllInRange(awo, lcm); DispatchManager.sendToAllInRange(awo, lcm);
break; break;
default: default:
// *** Refactor: Log error? // *** Refactor: Log error?
@@ -239,19 +239,19 @@ public class WorldGrid {
case Building: case Building:
lsm = new LoadStructureMsg(); lsm = new LoadStructureMsg();
lsm.addObject((Building) awo); lsm.addObject((Building) awo);
DispatchMessage.sendToAllInRange(awo, lsm); DispatchManager.sendToAllInRange(awo, lsm);
break; break;
case NPC: case NPC:
lcm = new LoadCharacterMsg((NPC) awo, false); lcm = new LoadCharacterMsg((NPC) awo, false);
DispatchMessage.sendToAllInRange(awo, lcm); DispatchManager.sendToAllInRange(awo, lcm);
break; break;
case Mob: case Mob:
lcm = new LoadCharacterMsg((Mob) awo, false); lcm = new LoadCharacterMsg((Mob) awo, false);
DispatchMessage.sendToAllInRange(awo, lcm); DispatchManager.sendToAllInRange(awo, lcm);
break; break;
case PlayerCharacter: case PlayerCharacter:
lcm = new LoadCharacterMsg((PlayerCharacter) awo, false); lcm = new LoadCharacterMsg((PlayerCharacter) awo, false);
DispatchMessage.sendToAllInRange(awo, lcm); DispatchManager.sendToAllInRange(awo, lcm);
break; break;
default: default:
// *** Refactor: Log error? // *** Refactor: Log error?
@@ -263,7 +263,7 @@ public class WorldGrid {
ClientConnection origin) { ClientConnection origin) {
UnloadObjectsMsg uom = new UnloadObjectsMsg(); UnloadObjectsMsg uom = new UnloadObjectsMsg();
uom.addObject(awo); uom.addObject(awo);
DispatchMessage.sendToAllInRange(awo, uom); DispatchManager.sendToAllInRange(awo, uom);
} }
public static void addObject(AbstractWorldObject awo, PlayerCharacter pc) { public static void addObject(AbstractWorldObject awo, PlayerCharacter pc) {
+2 -1
View File
@@ -89,7 +89,8 @@ public class GuildRecord extends DataRecord {
guildRecord.guildHash = guildRecord.guild.getHash(); guildRecord.guildHash = guildRecord.guild.getHash();
guildRecord.guildID = guildRecord.guild.getObjectUUID(); guildRecord.guildID = guildRecord.guild.getObjectUUID();
guildRecord.guildName = guildRecord.guild.getName(); guildRecord.guildName = guildRecord.guild.getName();
guildRecord.charterName = mbEnums.GuildCharterType.getGuildTypeFromInt(guildRecord.guild.getCharter()).getCharterName(); mbEnums.GuildCharterType guildCharterType = guild.charter;
guildRecord.charterName = guildCharterType.name;
guildRecord.GLHash = DataWarehouse.hasher.encrypt(guildRecord.guild.getGuildLeaderUUID()); guildRecord.GLHash = DataWarehouse.hasher.encrypt(guildRecord.guild.getGuildLeaderUUID());
+10 -11
View File
@@ -52,25 +52,24 @@ public class dbCityHandler extends dbHandlerBase {
} }
} }
public ArrayList<AbstractGameObject> CREATE_CITY(int ownerID, int parentZoneID, int realmID, float xCoord, float yCoord, float zCoord, float rotation, float W, String name, LocalDateTime established) { public ArrayList<AbstractGameObject> CREATE_CITY(int ownerID, int parentZoneID, float xCoord, float yCoord, float zCoord, float rotation, float W, String name, LocalDateTime established) {
LocalDateTime upgradeTime = LocalDateTime.now().plusHours(2); LocalDateTime upgradeTime = LocalDateTime.now().plusHours(2);
ArrayList<AbstractGameObject> objectList = new ArrayList<>(); ArrayList<AbstractGameObject> objectList = new ArrayList<>();
try (Connection connection = DbManager.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)")) { PreparedStatement preparedStatement = connection.prepareStatement("CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?,?,?)")) {
preparedStatement.setLong(1, ownerID); //objectUUID of owning player preparedStatement.setLong(1, ownerID); //objectUUID of owning player
preparedStatement.setLong(2, parentZoneID); //objectUUID of parent (continent) zone preparedStatement.setLong(2, parentZoneID); //objectUUID of parent (continent) zone
preparedStatement.setLong(3, realmID); //objectUUID of realm city belongs in preparedStatement.setFloat(3, xCoord); //xOffset from parentZone center
preparedStatement.setFloat(4, xCoord); //xOffset from parentZone center preparedStatement.setFloat(4, yCoord); //yOffset from parentZone center
preparedStatement.setFloat(5, yCoord); //yOffset from parentZone center preparedStatement.setFloat(5, zCoord); //zOffset from parentZone center
preparedStatement.setFloat(6, zCoord); //zOffset from parentZone center preparedStatement.setString(6, name); //city name
preparedStatement.setString(7, name); //city name preparedStatement.setTimestamp(7, Timestamp.valueOf(established));
preparedStatement.setTimestamp(8, Timestamp.valueOf(established)); preparedStatement.setFloat(8, rotation);
preparedStatement.setFloat(9, rotation); preparedStatement.setFloat(9, W);
preparedStatement.setFloat(10, W); preparedStatement.setTimestamp(10, Timestamp.valueOf(upgradeTime));
preparedStatement.setTimestamp(11, Timestamp.valueOf(upgradeTime));
boolean work = preparedStatement.execute(); boolean work = preparedStatement.execute();
@@ -1,303 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.gameManager.PowersManager;
import engine.mbEnums;
import engine.powers.EffectsBase;
import engine.powers.effectmodifiers.*;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
public class dbEffectsBaseHandler extends dbHandlerBase {
public dbEffectsBaseHandler() {
}
public static ArrayList<EffectsBase> getAllEffectsBase() {
ArrayList<EffectsBase> effectList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM static_power_effectbase ORDER BY `IDString` DESC")) {
ResultSet rs = prepareStatement.executeQuery();
while (rs.next()) {
EffectsBase effectBase = new EffectsBase(rs);
effectList.add(effectBase);
}
} catch (SQLException e) {
Logger.error(e.toString());
}
return effectList;
}
public static void cacheAllEffectModifiers() {
String IDString;
AbstractEffectModifier abstractEffectModifier = null;
try (Connection connection = DbManager.getConnection();
PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM static_power_effectmod")) {
ResultSet rs = prepareStatement.executeQuery();
while (rs.next()) {
IDString = rs.getString("IDString");
EffectsBase effectBase = PowersManager.getEffectByIDString(IDString);
mbEnums.ModType modifier = mbEnums.ModType.GetModType(rs.getString("modType"));
//combine item prefix and suffix effect modifiers
abstractEffectModifier = getCombinedModifiers(abstractEffectModifier, rs, effectBase, modifier);
if (abstractEffectModifier != null) {
if (EffectsBase.modifiersMap.containsKey(effectBase.getIDString()) == false)
EffectsBase.modifiersMap.put(effectBase.getIDString(), new HashSet<>());
EffectsBase.modifiersMap.get(effectBase.getIDString()).add(abstractEffectModifier);
}
}
} catch (Exception e) {
Logger.error(e);
}
}
private static AbstractEffectModifier getCombinedModifiers(AbstractEffectModifier abstractEffectModifier, ResultSet rs, EffectsBase effectBase, mbEnums.ModType modifier) throws SQLException {
switch (modifier) {
case AdjustAboveDmgCap:
abstractEffectModifier = new AdjustAboveDmgCapEffectModifier(rs);
break;
case Ambidexterity:
abstractEffectModifier = new AmbidexterityEffectModifier(rs);
break;
case AnimOverride:
break;
case ArmorPiercing:
abstractEffectModifier = new ArmorPiercingEffectModifier(rs);
break;
case AttackDelay:
abstractEffectModifier = new AttackDelayEffectModifier(rs);
break;
case Attr:
abstractEffectModifier = new AttributeEffectModifier(rs);
break;
case BlackMantle:
abstractEffectModifier = new BlackMantleEffectModifier(rs);
break;
case BladeTrails:
abstractEffectModifier = new BladeTrailsEffectModifier(rs);
break;
case Block:
abstractEffectModifier = new BlockEffectModifier(rs);
break;
case BlockedPowerType:
abstractEffectModifier = new BlockedPowerTypeEffectModifier(rs);
break;
case CannotAttack:
abstractEffectModifier = new CannotAttackEffectModifier(rs);
break;
case CannotCast:
abstractEffectModifier = new CannotCastEffectModifier(rs);
break;
case CannotMove:
abstractEffectModifier = new CannotMoveEffectModifier(rs);
break;
case CannotTrack:
abstractEffectModifier = new CannotTrackEffectModifier(rs);
break;
case Charmed:
abstractEffectModifier = new CharmedEffectModifier(rs);
break;
case ConstrainedAmbidexterity:
abstractEffectModifier = new ConstrainedAmbidexterityEffectModifier(rs);
break;
case DamageCap:
abstractEffectModifier = new DamageCapEffectModifier(rs);
break;
case DamageShield:
abstractEffectModifier = new DamageShieldEffectModifier(rs);
break;
case DCV:
abstractEffectModifier = new DCVEffectModifier(rs);
break;
case Dodge:
abstractEffectModifier = new DodgeEffectModifier(rs);
break;
case DR:
abstractEffectModifier = new DREffectModifier(rs);
break;
case Durability:
abstractEffectModifier = new DurabilityEffectModifier(rs);
break;
case ExclusiveDamageCap:
abstractEffectModifier = new ExclusiveDamageCapEffectModifier(rs);
break;
case Fade:
abstractEffectModifier = new FadeEffectModifier(rs);
break;
case Fly:
abstractEffectModifier = new FlyEffectModifier(rs);
break;
case Health:
abstractEffectModifier = new HealthEffectModifier(rs);
break;
case HealthFull:
abstractEffectModifier = new HealthFullEffectModifier(rs);
break;
case HealthRecoverRate:
abstractEffectModifier = new HealthRecoverRateEffectModifier(rs);
break;
case IgnoreDamageCap:
abstractEffectModifier = new IgnoreDamageCapEffectModifier(rs);
break;
case IgnorePassiveDefense:
abstractEffectModifier = new IgnorePassiveDefenseEffectModifier(rs);
break;
case ImmuneTo:
abstractEffectModifier = new ImmuneToEffectModifier(rs);
break;
case ImmuneToAttack:
abstractEffectModifier = new ImmuneToAttackEffectModifier(rs);
break;
case ImmuneToPowers:
abstractEffectModifier = new ImmuneToPowersEffectModifier(rs);
break;
case Invisible:
abstractEffectModifier = new InvisibleEffectModifier(rs);
break;
case ItemName:
abstractEffectModifier = new ItemNameEffectModifier(rs);
if (((ItemNameEffectModifier) abstractEffectModifier).name.isEmpty())
break;
if (effectBase != null)
effectBase.setName((((ItemNameEffectModifier) abstractEffectModifier).name));
break;
case Mana:
abstractEffectModifier = new ManaEffectModifier(rs);
break;
case ManaFull:
abstractEffectModifier = new ManaFullEffectModifier(rs);
break;
case ManaRecoverRate:
abstractEffectModifier = new ManaRecoverRateEffectModifier(rs);
break;
case MaxDamage:
abstractEffectModifier = new MaxDamageEffectModifier(rs);
break;
case MeleeDamageModifier:
abstractEffectModifier = new MeleeDamageEffectModifier(rs);
break;
case MinDamage:
abstractEffectModifier = new MinDamageEffectModifier(rs);
break;
case NoMod:
abstractEffectModifier = new NoModEffectModifier(rs);
break;
case OCV:
abstractEffectModifier = new OCVEffectModifier(rs);
break;
case Parry:
abstractEffectModifier = new ParryEffectModifier(rs);
break;
case PassiveDefense:
abstractEffectModifier = new PassiveDefenseEffectModifier(rs);
break;
case PowerCost:
abstractEffectModifier = new PowerCostEffectModifier(rs);
break;
case PowerCostHealth:
abstractEffectModifier = new PowerCostHealthEffectModifier(rs);
break;
case PowerDamageModifier:
abstractEffectModifier = new PowerDamageEffectModifier(rs);
break;
case ProtectionFrom:
abstractEffectModifier = new ProtectionFromEffectModifier(rs);
break;
case Resistance:
abstractEffectModifier = new ResistanceEffectModifier(rs);
break;
case ScaleHeight:
abstractEffectModifier = new ScaleHeightEffectModifier(rs);
break;
case ScaleWidth:
abstractEffectModifier = new ScaleWidthEffectModifier(rs);
break;
case ScanRange:
abstractEffectModifier = new ScanRangeEffectModifier(rs);
break;
case SeeInvisible:
abstractEffectModifier = new SeeInvisibleEffectModifier(rs);
break;
case Silenced:
abstractEffectModifier = new SilencedEffectModifier(rs);
break;
case Skill:
abstractEffectModifier = new SkillEffectModifier(rs);
break;
case Slay:
abstractEffectModifier = new SlayEffectModifier(rs);
break;
case Speed:
abstractEffectModifier = new SpeedEffectModifier(rs);
break;
case SpireBlock:
abstractEffectModifier = new SpireBlockEffectModifier(rs);
break;
case Stamina:
abstractEffectModifier = new StaminaEffectModifier(rs);
break;
case StaminaFull:
abstractEffectModifier = new StaminaFullEffectModifier(rs);
break;
case StaminaRecoverRate:
abstractEffectModifier = new StaminaRecoverRateEffectModifier(rs);
break;
case Stunned:
abstractEffectModifier = new StunnedEffectModifier(rs);
break;
case Value:
abstractEffectModifier = new ValueEffectModifier(rs);
if (effectBase != null) {
ValueEffectModifier valueEffect = (ValueEffectModifier) abstractEffectModifier;
effectBase.setValue(valueEffect.minMod);
}
break;
case WeaponProc:
abstractEffectModifier = new WeaponProcEffectModifier(rs);
break;
case WeaponRange:
abstractEffectModifier = new WeaponRangeEffectModifier(rs);
break;
case WeaponSpeed:
abstractEffectModifier = new WeaponSpeedEffectModifier(rs);
break;
}
return abstractEffectModifier;
}
}
@@ -20,7 +20,6 @@ import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
public class dbEffectsResourceCostHandler extends dbHandlerBase { public class dbEffectsResourceCostHandler extends dbHandlerBase {
@@ -30,73 +29,6 @@ public class dbEffectsResourceCostHandler extends dbHandlerBase {
this.localObjectType = mbEnums.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = mbEnums.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public void GENERATE_COST_DATA() {
ArrayList<String> effectList = GET_EFFECTS_WITH_COST();
for (String effectID : effectList) {
JSONObject costMap = GET_EFFECT_COSTMAP(effectID);
WRITE_COSTMAP(effectID, costMap);
}
}
public JSONObject GET_EFFECT_COSTMAP(String effectID) {
HashMap<mbEnums.ResourceType, Integer> costMap = new HashMap<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_power_effectcost` WHERE `IDString` = ?")) {
preparedStatement.setString(1, effectID);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
mbEnums.ResourceType resourceType = mbEnums.ResourceType.resourceLookup.get(rs.getInt("resource"));
int value = rs.getInt("amount");
costMap.put(resourceType, value);
}
} catch (SQLException e) {
Logger.error(e);
}
return new JSONObject(costMap);
}
public ArrayList<String> GET_EFFECTS_WITH_COST() {
ArrayList<String> effectList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT DISTINCT `IDString` FROM `static_power_effectcost`")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
effectList.add(rs.getString("IdString"));
}
} catch (SQLException e) {
Logger.error(e);
}
return effectList;
}
public boolean WRITE_COSTMAP(String effectID, JSONObject costmap) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `static_effect_costmaps` (`effectID`, `costMap`) VALUES (?, ?) " +
"ON DUPLICATE KEY UPDATE `costmap` = VALUES(`costmap`)")) {
preparedStatement.setString(1, effectID);
preparedStatement.setString(2, costmap.toString());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public void LOAD_ALL_COSTMAPS() { public void LOAD_ALL_COSTMAPS() {
try (Connection connection = DbManager.getConnection(); try (Connection connection = DbManager.getConnection();
@@ -123,22 +55,4 @@ public class dbEffectsResourceCostHandler extends dbHandlerBase {
} }
} }
public ArrayList<EffectsResourceCosts> GET_ALL_EFFECT_RESOURCES(String idString) {
ArrayList<EffectsResourceCosts> effectsResourceCosts = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_power_effectcost` WHERE `IDString` = ?")) {
preparedStatement.setString(1, idString);
ResultSet rs = preparedStatement.executeQuery();
effectsResourceCosts = getObjectsFromRs(rs, 1000);
} catch (SQLException e) {
Logger.error(e);
}
return effectsResourceCosts;
}
} }
+2 -2
View File
@@ -427,7 +427,7 @@ public class dbGuildHandler extends dbHandlerBase {
preparedStatement.setInt(6, guildTag.symbolColor); preparedStatement.setInt(6, guildTag.symbolColor);
preparedStatement.setInt(7, guildTag.backgroundDesign); preparedStatement.setInt(7, guildTag.backgroundDesign);
preparedStatement.setInt(8, guildTag.symbol); preparedStatement.setInt(8, guildTag.symbol);
preparedStatement.setInt(9, g.getCharter()); preparedStatement.setInt(9, g.charter.templateID);
preparedStatement.setString(10, g.getLeadershipType()); preparedStatement.setString(10, g.getLeadershipType());
preparedStatement.setString(11, g.getMotto()); preparedStatement.setString(11, g.getMotto());
@@ -573,7 +573,7 @@ public class dbGuildHandler extends dbHandlerBase {
preparedStatement.setInt(4, g.getGuildTag().symbolColor); preparedStatement.setInt(4, g.getGuildTag().symbolColor);
preparedStatement.setInt(5, g.getGuildTag().backgroundDesign); preparedStatement.setInt(5, g.getGuildTag().backgroundDesign);
preparedStatement.setInt(6, g.getGuildTag().symbol); preparedStatement.setInt(6, g.getGuildTag().symbol);
preparedStatement.setInt(7, g.getCharter()); preparedStatement.setInt(7, g.charter.templateID);
preparedStatement.setString(8, g.getMOTD()); preparedStatement.setString(8, g.getMOTD());
preparedStatement.setString(9, g.getICMOTD()); preparedStatement.setString(9, g.getICMOTD());
preparedStatement.setString(10, ""); preparedStatement.setString(10, "");
+1 -1
View File
@@ -554,7 +554,7 @@ public class dbItemHandler extends dbHandlerBase {
// Write 0 if we will not modify the value from template // Write 0 if we will not modify the value from template
if (item.value == item.template.item_value) if (value == item.template.item_value)
value = 0; value = 0;
try (Connection connection = DbManager.getConnection(); try (Connection connection = DbManager.getConnection();
-16
View File
@@ -221,20 +221,4 @@ public class dbLootHandler extends dbHandlerBase {
return bootySets; return bootySets;
} }
public void LOAD_ENCHANT_VALUES() {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `IDString`, `minMod` FROM `static_power_effectmod` WHERE `modType` = ?")) {
preparedStatement.setString(1, "Value");
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
Item.addEnchantValue(rs.getString("IDString"), rs.getInt("minMod"));
} catch (SQLException e) {
Logger.error(e);
}
}
} }
+1 -1
View File
@@ -8,8 +8,8 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.Mine; import engine.objects.Mine;
import engine.objects.MineProduction; import engine.objects.MineProduction;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
+1 -1
View File
@@ -9,9 +9,9 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.gameManager.DbManager;
import engine.objects.MobBase; import engine.objects.MobBase;
import engine.objects.MobBaseEffects; import engine.objects.MobBaseEffects;
import engine.objects.MobBaseStats; import engine.objects.MobBaseStats;
+16
View File
@@ -310,6 +310,22 @@ public class dbNPCHandler extends dbHandlerBase {
} }
} }
public boolean UPDATE_RACE(NPC npc, int value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_npc` SET `npc_raceID`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, value);
preparedStatement.setLong(2, npc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public void LOAD_PIRATE_NAMES() { public void LOAD_PIRATE_NAMES() {
String pirateName; String pirateName;
@@ -9,8 +9,8 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.Petition; import engine.objects.Petition;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -9,8 +9,8 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.objects.Heraldry; import engine.objects.Heraldry;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -1,82 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager;
import engine.gameManager.PowersManager;
import engine.objects.Mob;
import engine.powers.EffectsBase;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashSet;
public class dbPowerHandler extends dbHandlerBase {
public dbPowerHandler() {
this.localClass = Mob.class;
this.localObjectType = mbEnums.GameObjectType.valueOf(this.localClass.getSimpleName());
}
public static void addAllSourceTypes() {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_power_sourcetype")) {
ResultSet rs = preparedStatement.executeQuery();
String IDString, source;
while (rs.next()) {
IDString = rs.getString("IDString");
int token = DbManager.hasher.SBStringHash(IDString);
source = rs.getString("source").replace("-", "").trim();
mbEnums.EffectSourceType effectSourceType = mbEnums.EffectSourceType.GetEffectSourceType(source);
if (EffectsBase.effectSourceTypeMap.containsKey(token) == false)
EffectsBase.effectSourceTypeMap.put(token, new HashSet<>());
EffectsBase.effectSourceTypeMap.get(token).add(effectSourceType);
}
} catch (Exception e) {
Logger.error(e);
}
}
public static void addAllAnimationOverrides() {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_power_animation_override")) {
ResultSet rs = preparedStatement.executeQuery();
String IDString;
int animation;
while (rs.next()) {
IDString = rs.getString("IDString");
EffectsBase eb = PowersManager.getEffectByIDString(IDString);
if (eb != null)
IDString = eb.getIDString();
animation = rs.getInt("animation");
PowersManager.AnimationOverrides.put(IDString, animation);
}
} catch (Exception e) {
Logger.error(e);
}
}
}
@@ -9,9 +9,9 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.gameManager.DbManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.RuneBaseEffect; import engine.objects.RuneBaseEffect;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -9,8 +9,8 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.Portal; import engine.objects.Portal;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
+2 -2
View File
@@ -9,10 +9,10 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.mbEnums.ProtectionState;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums;
import engine.mbEnums.ProtectionState;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.Shrine; import engine.objects.Shrine;
@@ -9,9 +9,9 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.gameManager.DbManager;
import engine.objects.MaxSkills; import engine.objects.MaxSkills;
import engine.objects.SkillsBase; import engine.objects.SkillsBase;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -9,8 +9,8 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.VendorDialog; import engine.objects.VendorDialog;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
+24 -13
View File
@@ -136,6 +136,12 @@ public class dbWarehouseHandler extends dbHandlerBase {
int cityUID = rs.getInt("cityUUID"); int cityUID = rs.getInt("cityUUID");
JSONObject jsonObject = new JSONObject(rs.getString("warehouse")); JSONObject jsonObject = new JSONObject(rs.getString("warehouse"));
City city = City.getCity(cityUID); City city = City.getCity(cityUID);
if (city == null) {
Logger.error("No city " + cityUID + " for warehouse");
continue;
}
city.warehouse = new Warehouse(jsonObject); city.warehouse = new Warehouse(jsonObject);
city.warehouse.city = city; city.warehouse.city = city;
@@ -154,7 +160,7 @@ public class dbWarehouseHandler extends dbHandlerBase {
} }
} }
public boolean UPDATE_WORKORDER(WorkOrder workOrder) { public boolean WRITE_WORKORDER(WorkOrder workOrder) {
JSONObject warehouseJSON = WorkOrder.toJson(workOrder); JSONObject warehouseJSON = WorkOrder.toJson(workOrder);
@@ -187,7 +193,12 @@ public class dbWarehouseHandler extends dbHandlerBase {
public void LOAD_WORKORDERS() { public void LOAD_WORKORDERS() {
// Method loads NPC workOrders from disk at bootstrap.
// A workOrder will persist until completed or junked
// via the client interface.
ArrayList<WorkOrder> submitList = new ArrayList<>(); ArrayList<WorkOrder> submitList = new ArrayList<>();
ArrayList<WorkOrder> orphanList = new ArrayList<>();
try (Connection connection = DbManager.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_workorders`;"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_workorders`;");
@@ -202,22 +213,22 @@ public class dbWarehouseHandler extends dbHandlerBase {
Logger.error(e); Logger.error(e);
} }
// Remove the old workOrder records // Submit new workOrders to the ForgeManager
for (WorkOrder workOrder : submitList)
DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder);
// Submit the new workOrders to the ForgeManager
for (WorkOrder workOrder : submitList) { for (WorkOrder workOrder : submitList) {
DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder);
// Delete but do not reconstitute orphan workOrders
if (workOrder.vendor == null)
continue;
workOrder.workOrderID = ForgeManager.workOrderCounter.incrementAndGet(); workOrder.workOrderID = ForgeManager.workOrderCounter.incrementAndGet();
DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
ForgeManager.vendorWorkOrderLookup.get(workOrder.vendor).add(workOrder); ForgeManager.vendorWorkOrderLookup.get(workOrder.vendor).add(workOrder);
ForgeManager.forge.add(workOrder);
// If workorder is not yet complete process it
if (workOrder.runCompleted == false)
ForgeManager.forge.add(workOrder);
} }
} }
} }
+1 -1
View File
@@ -9,9 +9,9 @@
package engine.db.handlers; package engine.db.handlers;
import engine.mbEnums;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.mbEnums;
import engine.objects.Zone; import engine.objects.Zone;
import engine.objects.ZoneTemplate; import engine.objects.ZoneTemplate;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
-156
View File
@@ -1,156 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.gameManager.PowersManager;
import engine.mbEnums.PowerActionType;
import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter;
import engine.powers.ActionsBase;
import engine.powers.PowersBase;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.util.ThreadUtils;
import org.pmw.tinylog.Logger;
import java.util.HashMap;
import java.util.HashSet;
public class ApplyBonusCmd extends AbstractDevCmd {
public ApplyBonusCmd() {
super("applybonus");
}
@Override
protected void _doCmd(PlayerCharacter pcSender, String[] words,
AbstractGameObject target) {
String action = words[0];
PowerActionType actionType = null;
HashMap<String, HashSet<String>> appliedMods = new HashMap<>();
try {
if (action.equals("all") == false)
for (PowerActionType powerActionType : PowerActionType.values()) {
if (powerActionType.name().equalsIgnoreCase(action) == false)
continue;
actionType = powerActionType;
break;
}
} catch (Exception e) {
this.throwbackError(pcSender, "Invalid power Action type for " + action);
this.throwbackInfo(pcSender, "Valid Types : " + this.getActionTypes());
return;
}
if (action.equals("all") == false)
if (actionType == null) {
this.throwbackError(pcSender, "Invalid power Action type for " + action);
this.throwbackInfo(pcSender, "Valid Types : " + this.getActionTypes());
return;
}
for (PowersBase pb : PowersManager.powersBaseByIDString.values()) {
if (pb.getActions() == null || pb.getActions().isEmpty())
continue;
for (ActionsBase ab : pb.getActions()) {
if (ab.getPowerAction() == null)
continue;
if (action.equals("all") == false)
if (ab.getPowerAction().getType().equalsIgnoreCase(action) == false)
continue;
String effect1 = "";
String effect2 = "";
ChatManager.chatSystemInfo(pcSender, "Applying Power " + pb.getName() + " : " + pb.getDescription());
if (ab.getPowerAction().getEffectsBase() == null) {
try {
PowersManager.runPowerAction(pcSender, pcSender, pcSender.getLoc(), ab, 1, pb);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ThreadUtils.sleep(500);
continue;
}
if (ab.getPowerAction().getEffectsBase().getModifiers() == null || ab.getPowerAction().getEffectsBase().getModifiers().isEmpty()) {
try {
PowersManager.runPowerAction(pcSender, pcSender, pcSender.getLoc(), ab, 1, pb);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
continue;
}
boolean run = true;
for (AbstractEffectModifier mod : ab.getPowerAction().getEffectsBase().getModifiers()) {
if (appliedMods.containsKey(mod.modType.name()) == false) {
appliedMods.put(mod.modType.name(), new HashSet<>());
}
// if (appliedMods.get(mod.modType.name()).contains(mod.sourceType.name())){
// continue;
// }
appliedMods.get(mod.modType.name()).add(mod.sourceType.name());
try {
try {
PowersManager.runPowerAction(pcSender, pcSender, pcSender.getLoc(), ab, 1, pb);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
Logger.error(e);
}
break;
}
}
}
}
@Override
protected String _getUsageString() {
return "' /bounds'";
}
@Override
protected String _getHelpString() {
return "Audits all the mobs in a zone.";
}
private String getActionTypes() {
String output = "";
for (PowerActionType actionType : PowerActionType.values()) {
output += actionType.name() + " | ";
}
return output.substring(0, output.length() - 3);
}
}
+1 -1
View File
@@ -9,11 +9,11 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums.GameObjectType;
import engine.objects.*; import engine.objects.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
+1 -1
View File
@@ -9,10 +9,10 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums;
import engine.objects.*; import engine.objects.*;
public class GotoObj extends AbstractDevCmd { public class GotoObj extends AbstractDevCmd {
+1 -1
View File
@@ -475,7 +475,7 @@ public class InfoCmd extends AbstractDevCmd {
output += "EquipSet: " + targetMob.equipmentSetID; output += "EquipSet: " + targetMob.equipmentSetID;
output += newline; output += newline;
try { try {
output += "Parent Zone LoadNum : " + targetMob.getParentZone().templateID; output += "Parent Zone LoadNum : " + targetMob.parentZone.templateID;
} catch (Exception ex) { } catch (Exception ex) {
//who cares //who cares
} }
-212
View File
@@ -1,212 +0,0 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.mbEnums.ProtectionState;
import engine.objects.*;
import org.pmw.tinylog.Logger;
/**
* @author Eighty
*/
public class MakeBaneCmd extends AbstractDevCmd {
public MakeBaneCmd() {
super("makebane");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
if (words.length < 1 || words.length > 2) {
this.sendUsage(pc);
return;
}
int attackerID = 0;
int rank = 8;
if (words.length == 2) {
try {
attackerID = Integer.parseInt(words[0]);
rank = Integer.parseInt(words[1]);
} catch (NumberFormatException e) {
throwbackError(pc, "AttackerGuildID must be a number, " + words[0] + " is invalid");
return;
}
} else if (words.length == 1) {
if (target == null) {
throwbackError(pc, "No target specified");
return;
}
if (!(target instanceof PlayerCharacter)) {
throwbackError(pc, "Target is not a player");
return;
}
attackerID = target.getObjectUUID();
try {
rank = Integer.parseInt(words[0]);
} catch (NumberFormatException e) {
throwbackError(pc, "Rank must be specified, 1 through 8");
return;
}
}
if (rank < 1 || rank > 8) {
throwbackError(pc, "Rank must be 1 through 8");
return;
}
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(attackerID);
if (player.getGuild().isEmptyGuild()) {
throwbackError(pc, "Errant's can not place banes");
return;
}
AbstractCharacter attackerAGL = Guild.GetGL(player.getGuild());
if (attackerAGL == null) {
throwbackError(pc, "No guild leader found for attacking guild.");
return;
}
if (!(attackerAGL instanceof PlayerCharacter)) {
throwbackError(pc, "Attacking guild leader is an NPC.");
return;
}
if (player.getGuild().isNPCGuild()) {
throwbackError(pc, "The guild used is an npc guild. They can not bane.");
return;
}
// if (player.getGuild().getOwnedCity() != null) {
// throwbackError(pc, "The attacking guild already has a city.");
// return;
// }
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
if (zone == null) {
throwbackError(pc, "Unable to find the zone you're in.");
return;
}
if (!zone.guild_zone) {
throwbackError(pc, "This is not a player city.");
return;
}
City city = City.getCity(zone.playerCityUUID);
if (city == null) {
throwbackError(pc, "Unable to find the city associated with this zone.");
return;
}
if (city.getTOL() == null) {
throwbackError(pc, "Unable to find the tree of life for this city.");
return;
}
if (city.getBane() != null) {
throwbackError(pc, "This city is already baned.");
return;
}
if (Bane.getBaneByAttackerGuild(player.getGuild()) != null) {
throwbackError(pc, "This guild is already baning someone.");
return;
}
Blueprint blueprint = Blueprint.getBlueprint(24300);
if (blueprint == null) {
throwbackError(pc, "Unable to find building set for banestone.");
return;
}
Vector3f rot = new Vector3f(0, 0, 0);
// *** Refactor : Overlap test goes here
//Let's drop a banestone!
Vector3fImmutable localLocation = ZoneManager.worldToLocal(pc.getLoc(), zone);
if (localLocation == null) {
ChatManager.chatSystemError(pc, "Failed to convert world location to zone location. Contact a CCR.");
Logger.info("Failed to Convert World coordinates to local zone coordinates");
return;
}
Building stone = DbManager.BuildingQueries.CREATE_BUILDING(
zone.getObjectUUID(), pc.getObjectUUID(), blueprint.getName(), blueprint.getBlueprintUUID(),
localLocation, 1.0f, blueprint.getMaxHealth(rank), ProtectionState.PROTECTED, 0, rank,
null, blueprint.getBlueprintUUID(), 1, 0.0f);
if (stone == null) {
ChatManager.chatSystemError(pc, "Failed to create banestone.");
return;
}
stone.addEffectBit((1 << 19));
BuildingManager.setRank(stone, (byte) rank);
stone.setMaxHitPoints(blueprint.getMaxHealth(stone.getRank()));
stone.setCurrentHitPoints(stone.getMaxHitPoints());
BuildingManager.setUpgradeDateTime(stone, null, 0);
//Make the bane
Bane bane = Bane.makeBane(player, city, stone);
if (bane == null) {
//delete bane stone, failed to make bane object
DbManager.BuildingQueries.DELETE_FROM_DATABASE(stone);
throwbackError(pc, "Failed to create bane.");
return;
}
WorldGrid.addObject(stone, pc);
//Add baned effect to TOL
city.getTOL().addEffectBit((1 << 16));
city.getTOL().updateEffects();
Vector3fImmutable movePlayerOutsideStone = player.getLoc();
movePlayerOutsideStone = movePlayerOutsideStone.setX(movePlayerOutsideStone.x + 10);
movePlayerOutsideStone = movePlayerOutsideStone.setZ(movePlayerOutsideStone.z + 10);
player.teleport(movePlayerOutsideStone);
throwbackInfo(pc, "The city has been succesfully baned.");
}
@Override
protected String _getHelpString() {
return "Creates an bane.";
}
@Override
protected String _getUsageString() {
return "'./makebane playerUUID baneRank'";
}
}
+8 -4
View File
@@ -64,8 +64,9 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
WorldGrid.RemoveWorldObject(mob); WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc); WorldGrid.removeObject(mob, pc);
if (mob.getParentZone() != null) if (mob.getParentZone() != null) {
mob.getParentZone().zoneMobSet.remove(mob); mob.getParentZone().zoneMobSet.remove(mob);
}
} }
DbManager.NPCQueries.DELETE_NPC(npc); DbManager.NPCQueries.DELETE_NPC(npc);
@@ -78,8 +79,9 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
WorldGrid.RemoveWorldObject(mob); WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc); WorldGrid.removeObject(mob, pc);
if (mob.getParentZone() != null) if (mob.getParentZone() != null) {
mob.getParentZone().zoneMobSet.remove(mob); mob.getParentZone().zoneMobSet.remove(mob);
}
} }
DbManager.MobQueries.DELETE_MOB(mobA); DbManager.MobQueries.DELETE_MOB(mobA);
DbManager.removeFromCache(GameObjectType.Mob, DbManager.removeFromCache(GameObjectType.Mob,
@@ -159,8 +161,9 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
WorldGrid.RemoveWorldObject(mob); WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc); WorldGrid.removeObject(mob, pc);
if (mob.getParentZone() != null) if (mob.getParentZone() != null) {
mob.getParentZone().zoneMobSet.remove(mob); mob.getParentZone().zoneMobSet.remove(mob);
}
} }
DbManager.NPCQueries.DELETE_NPC(npc); DbManager.NPCQueries.DELETE_NPC(npc);
DbManager.removeFromCache(mbEnums.GameObjectType.NPC, DbManager.removeFromCache(mbEnums.GameObjectType.NPC,
@@ -172,8 +175,9 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
WorldGrid.RemoveWorldObject(mob); WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc); WorldGrid.removeObject(mob, pc);
if (mob.getParentZone() != null) if (mob.getParentZone() != null) {
mob.getParentZone().zoneMobSet.remove(mob); mob.getParentZone().zoneMobSet.remove(mob);
}
} }
DbManager.MobQueries.DELETE_MOB(mobA); DbManager.MobQueries.DELETE_MOB(mobA);
DbManager.removeFromCache(mbEnums.GameObjectType.Mob, DbManager.removeFromCache(mbEnums.GameObjectType.Mob,
+10 -6
View File
@@ -180,8 +180,9 @@ public class RemoveObjectCmd extends AbstractDevCmd {
WorldGrid.RemoveWorldObject(minionMob); WorldGrid.RemoveWorldObject(minionMob);
WorldGrid.removeObject(minionMob, pc); WorldGrid.removeObject(minionMob, pc);
if (minionMob.getParentZone() != null) if (minionMob.getParentZone() != null) {
minionMob.getParentZone().zoneMobSet.remove(minionMob); minionMob.getParentZone().zoneMobSet.remove(minionMob);
}
} }
DbManager.NPCQueries.DELETE_NPC(npc); DbManager.NPCQueries.DELETE_NPC(npc);
@@ -202,9 +203,11 @@ public class RemoveObjectCmd extends AbstractDevCmd {
return; return;
} }
if (mob.getParentZone() != null && mob.getParentZone() != currentZone && !mob.isPet() && !mob.isNecroPet()) { if (mob.getParentZone() != null) {
this.throwbackError(pc, "Error 376954: Could not Remove Mob.Mob is not in the same zone as player."); if (mob.parentZone != currentZone && !mob.isPet() && !mob.isNecroPet()) {
return; this.throwbackError(pc, "Error 376954: Could not Remove Mob.Mob is not in the same zone as player.");
return;
}
} }
// Remove npc from hirelings list. // Remove npc from hirelings list.
@@ -222,8 +225,9 @@ public class RemoveObjectCmd extends AbstractDevCmd {
WorldGrid.RemoveWorldObject(mob); WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc); WorldGrid.removeObject(mob, pc);
if (mob.getParentZone() != null) if (mob.parentZone != null) {
mob.getParentZone().zoneMobSet.remove(mob); mob.parentZone.zoneMobSet.remove(mob);
}
ChatManager.chatSayInfo(pc, ChatManager.chatSayInfo(pc,
"Mob with ID " + mob.getDBID() + " removed"); "Mob with ID " + mob.getDBID() + " removed");
@@ -9,12 +9,12 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums.GameObjectType;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
+1 -1
View File
@@ -1,9 +1,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums.GameObjectType;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Guild; import engine.objects.Guild;
import engine.objects.NPC; import engine.objects.NPC;
+3 -3
View File
@@ -9,9 +9,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.DispatchChannel;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.net.DispatchMessage; import engine.gameManager.DispatchManager;
import engine.mbEnums.DispatchChannel;
import engine.net.client.msg.TargetedActionMsg; import engine.net.client.msg.TargetedActionMsg;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -41,7 +41,7 @@ public class SetHealthCmd extends AbstractDevCmd {
// Update all surrounding clients. // Update all surrounding clients.
TargetedActionMsg cmm = new TargetedActionMsg(pc); TargetedActionMsg cmm = new TargetedActionMsg(pc);
DispatchMessage.dispatchMsgToInterestArea(pc, cmm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(pc, cmm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
this.throwbackError(pc, "Supplied data: " + words[0] this.throwbackError(pc, "Supplied data: " + words[0]
+1 -1
View File
@@ -10,9 +10,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.ProtectionState; import engine.mbEnums.ProtectionState;
import engine.devcmd.AbstractDevCmd;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.City; import engine.objects.City;
+2 -2
View File
@@ -1,8 +1,8 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DispatchManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.DispatchMessage;
import engine.net.client.msg.TargetedActionMsg; import engine.net.client.msg.TargetedActionMsg;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -32,7 +32,7 @@ public class SetManaCmd extends AbstractDevCmd {
//Update all surrounding clients. - NOT for Mana? //Update all surrounding clients. - NOT for Mana?
TargetedActionMsg cmm = new TargetedActionMsg(pc); TargetedActionMsg cmm = new TargetedActionMsg(pc);
DispatchMessage.dispatchMsgToInterestArea(pc, cmm, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(pc, cmm, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
this.throwbackError(pc, "Supplied data: " + words[0] this.throwbackError(pc, "Supplied data: " + words[0]
+1 -1
View File
@@ -9,9 +9,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.mbEnums.GameObjectType;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.NPC; import engine.objects.NPC;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
+2 -2
View File
@@ -1,10 +1,10 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.DbObjectType; import engine.mbEnums.DbObjectType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager;
import engine.objects.*; import engine.objects.*;
@@ -1,10 +1,10 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.DispatchChannel;
import engine.InterestManagement.InterestManager; import engine.InterestManagement.InterestManager;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.net.DispatchMessage; import engine.gameManager.DispatchManager;
import engine.mbEnums.DispatchChannel;
import engine.net.client.msg.ApplyRuneMsg; import engine.net.client.msg.ApplyRuneMsg;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -54,7 +54,7 @@ public class SetPromotionClassCmd extends AbstractDevCmd {
PromotionClass promo = pc.getPromotionClass(); PromotionClass promo = pc.getPromotionClass();
if (promo != null) { if (promo != null) {
ApplyRuneMsg arm = new ApplyRuneMsg(pc.getObjectType().ordinal(), pc.getObjectUUID(), promo.getObjectUUID(), promo.getObjectType().ordinal(), promo.getObjectUUID(), true); ApplyRuneMsg arm = new ApplyRuneMsg(pc.getObjectType().ordinal(), pc.getObjectUUID(), promo.getObjectUUID(), promo.getObjectType().ordinal(), promo.getObjectUUID(), true);
DispatchMessage.dispatchMsgToInterestArea(pc, arm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(pc, arm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} }
} }
+52
View File
@@ -0,0 +1,52 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.InterestManagement.InterestManager;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager;
import engine.mbEnums;
import engine.objects.AbstractGameObject;
import engine.objects.NPC;
import engine.objects.PlayerCharacter;
public class SetRaceCmd extends AbstractDevCmd {
public SetRaceCmd() {
super("setRace");
}
@Override
protected void _doCmd(PlayerCharacter player, String[] words,
AbstractGameObject target) {
int newRace = Integer.parseInt(words[0]);
if (target.getObjectType().equals(mbEnums.GameObjectType.NPC) == false) {
throwbackError(player, "You Must Target An NPC");
}
NPC npc = (NPC) target;
npc.loadID = newRace;
DbManager.NPCQueries.UPDATE_RACE(npc, newRace);
InterestManager.reloadCharacter(npc);
}
@Override
protected String _getHelpString() {
return "Sets NPC race";
}
@Override
protected String _getUsageString() {
return "' /setrace ID'";
}
}
+3 -3
View File
@@ -9,9 +9,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.DispatchChannel;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.net.DispatchMessage; import engine.gameManager.DispatchManager;
import engine.mbEnums.DispatchChannel;
import engine.net.client.msg.TargetedActionMsg; import engine.net.client.msg.TargetedActionMsg;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -42,7 +42,7 @@ public class SetStaminaCmd extends AbstractDevCmd {
// Update all surrounding clients. // Update all surrounding clients.
TargetedActionMsg cmm = new TargetedActionMsg(pc); TargetedActionMsg cmm = new TargetedActionMsg(pc);
DispatchMessage.dispatchMsgToInterestArea(pc, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(pc, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
this.throwbackError(pc, "Supplied data: " + words[0] this.throwbackError(pc, "Supplied data: " + words[0]
+5 -5
View File
@@ -10,9 +10,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.net.DispatchMessage; import engine.gameManager.DispatchManager;
import engine.mbEnums.GameObjectType;
import engine.net.client.msg.ApplyBuildingEffectMsg; import engine.net.client.msg.ApplyBuildingEffectMsg;
import engine.net.client.msg.UpdateCharOrMobMessage; import engine.net.client.msg.UpdateCharOrMobMessage;
import engine.objects.*; import engine.objects.*;
@@ -39,13 +39,13 @@ public class SetSubRaceCmd extends AbstractDevCmd {
if (raceID == 0) if (raceID == 0)
raceID = player.getRaceID(); raceID = player.getRaceID();
UpdateCharOrMobMessage ucm = new UpdateCharOrMobMessage(player, 1, raceID); UpdateCharOrMobMessage ucm = new UpdateCharOrMobMessage(player, 1, raceID);
DispatchMessage.sendToAllInRange(player, ucm); DispatchManager.sendToAllInRange(player, ucm);
return; return;
} }
if (words[0].equals("all")) { if (words[0].equals("all")) {
for (int i = 15999; i < 16337; i++) { for (int i = 15999; i < 16337; i++) {
ApplyBuildingEffectMsg applyBuildingEffectMsg = new ApplyBuildingEffectMsg(4, 0, target.getObjectType().ordinal(), target.getObjectUUID(), i); ApplyBuildingEffectMsg applyBuildingEffectMsg = new ApplyBuildingEffectMsg(4, 0, target.getObjectType().ordinal(), target.getObjectUUID(), i);
DispatchMessage.sendToAllInRange((AbstractWorldObject) target, applyBuildingEffectMsg); DispatchManager.sendToAllInRange((AbstractWorldObject) target, applyBuildingEffectMsg);
try { try {
Thread.sleep(500); Thread.sleep(500);
} catch (InterruptedException e) { } catch (InterruptedException e) {
@@ -56,7 +56,7 @@ public class SetSubRaceCmd extends AbstractDevCmd {
} else { } else {
ApplyBuildingEffectMsg applyBuildingEffectMsg = new ApplyBuildingEffectMsg(4, 0, target.getObjectType().ordinal(), target.getObjectUUID(), Integer.parseInt(words[0])); ApplyBuildingEffectMsg applyBuildingEffectMsg = new ApplyBuildingEffectMsg(4, 0, target.getObjectType().ordinal(), target.getObjectUUID(), Integer.parseInt(words[0]));
DispatchMessage.sendToAllInRange((AbstractWorldObject) target, applyBuildingEffectMsg); DispatchManager.sendToAllInRange((AbstractWorldObject) target, applyBuildingEffectMsg);
} }
return; return;
+1 -1
View File
@@ -1,8 +1,8 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums.GameObjectType;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
+1 -1
View File
@@ -9,11 +9,11 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums.GameObjectType;
import engine.objects.*; import engine.objects.*;
import java.util.ArrayList; import java.util.ArrayList;
+1 -1
View File
@@ -1,9 +1,9 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Mob; import engine.objects.Mob;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -9,8 +9,8 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.mbEnums.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.mbEnums.GameObjectType;
import engine.net.client.msg.LoadStructureMsg; import engine.net.client.msg.LoadStructureMsg;
import engine.net.client.msg.MoveToPointMsg; import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.UnloadObjectsMsg; import engine.net.client.msg.UnloadObjectsMsg;
+116 -139
View File
@@ -14,6 +14,7 @@ import engine.InterestManagement.WorldGrid;
import engine.job.JobContainer; import engine.job.JobContainer;
import engine.job.JobScheduler; import engine.job.JobScheduler;
import engine.jobs.UpgradeBuildingJob; import engine.jobs.UpgradeBuildingJob;
import engine.loot.WorkOrder;
import engine.math.Bounds; import engine.math.Bounds;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
@@ -49,8 +50,7 @@ public enum BuildingManager {
// Some meshes might not have slot locations assigned. // Some meshes might not have slot locations assigned.
if (slotLocations == null || if (slotLocations == null || slotLocations.isEmpty())
slotLocations.isEmpty())
return -1; return -1;
int numOfSlots = _slotLocations.get(building.meshUUID).size(); int numOfSlots = _slotLocations.get(building.meshUUID).size();
@@ -69,17 +69,15 @@ public enum BuildingManager {
// Some meshes might not have slot locations assigned. // Some meshes might not have slot locations assigned.
if (slotLocations == null || if (slotLocations == null || slotLocations.isEmpty())
slotLocations.isEmpty())
return -1; return -1;
int numOfSlots = _slotLocations.get(building.meshUUID).size(); int numOfSlots = _slotLocations.get(building.meshUUID).size();
for (int i = numOfSlots; i > 0; i--) { for (int i = numOfSlots; i > 0; i--)
if (!building.getHirelings().containsValue(i)) if (!building.getHirelings().containsValue(i))
return i; return i;
}
return -1; return -1;
} }
@@ -92,9 +90,8 @@ public enum BuildingManager {
buildingLocation = _slotLocations.get(building.meshUUID).get(slot - 1); // array index buildingLocation = _slotLocations.get(building.meshUUID).get(slot - 1); // array index
if (buildingLocation == null) { if (buildingLocation == null)
Logger.error("Invalid slot for building: " + building.getObjectUUID()); Logger.error("Invalid slot for building: " + building.getObjectUUID());
}
return buildingLocation; return buildingLocation;
} }
@@ -107,73 +104,67 @@ public enum BuildingManager {
if (building == null) if (building == null)
return false; return false;
//cannot access destroyed buildings
if (building.getRank() == -1) if (building.getRank() == -1)
return false; return false;
if (IsOwner(building, player)) //admin characters can always access buildings
return true;
//individual friend.
if (building.getFriends() != null && building.getFriends().get(player.getObjectUUID()) != null)
return true;
//Admins can access stuff
if (player.isCSR()) if (player.isCSR())
return true; return true;
//Guild stuff //owner can always access their own building
if (building.getGuild().isGuildLeader(player.getObjectUUID()))
return true;
if (building.getFriends().get(player.getGuild().getObjectUUID()) != null
&& building.getFriends().get(player.getGuild().getObjectUUID()).friendType == 8)
return true;
if (building.getFriends().get(player.getGuild().getObjectUUID()) != null
&& building.getFriends().get(player.getGuild().getObjectUUID()).friendType == 9
&& GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (Guild.sameGuild(building.getGuild(), player.getGuild()) && GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (Guild.sameGuild(building.getGuild(), player.getGuild()) && GuildStatusController.isGuildLeader(player.getGuildStatus()))
return true;
return false;
//TODO test friends list once added
//does not meet above criteria. Cannot access.
}
public static boolean playerCanManageNotFriends(PlayerCharacter player, Building building) {
//Player Can only Control Building if player is in Same Guild as Building and is higher rank than IC.
if (player == null)
return false;
if (building == null)
return false;
if (building.getRank() == -1)
return false;
if (IsOwner(building, player)) if (IsOwner(building, player))
return true; return true;
//Somehow guild leader check fails? lets check if Player is true Guild GL. //check for default IC access if building belongs to same guild
if (building.getGuild() != null && building.getGuild().isGuildLeader(player.getObjectUUID())) if(player.guild.equals(building.getGuild())) {
return true; if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null) {
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false && GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false) switch (building.getBlueprint().getBuildingGroup()) {
return false; case TOL:
case BARRACK:
case SPIRE:
case SHRINE:
case BANESTONE:
case MINE:
case WAREHOUSE:
case BULWARK:
case SIEGETENT:
if (GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (GuildStatusController.isGuildLeader(player.getGuildStatus()))
return true;
break;
}
}
}
//check against friends list entries if any present
if (building.getFriends() != null) {
//check individuals
if (building.getFriends().get(player.getObjectUUID()) != null)
return true;
if (building.getFriends().get(player.guild.objectUUID) != null) {
//check friend type for guild related access
switch (building.getFriends().get(player.guild.objectUUID).friendType) {
case 8: //full member
if (GuildStatusController.isFullMember(player.getGuildStatus()))
return true;
break;
case 9: //Inner Council
if (GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (GuildStatusController.isGuildLeader(player.getGuildStatus()))
return true;
break;
}
}
}
//did not meet access grant criteria, deny access
return false; return false;
} }
public static synchronized boolean lootBuilding(PlayerCharacter player, Building building) { public static synchronized boolean lootBuilding(PlayerCharacter player, Building building) {
@@ -274,9 +265,7 @@ public enum BuildingManager {
// Submit upgrade job for future date or current instant // Submit upgrade job for future date or current instant
if (building.getUpgradeDateTime().isAfter(LocalDateTime.now())) { if (building.getUpgradeDateTime().isAfter(LocalDateTime.now())) {
JobContainer jc = JobScheduler.getInstance().scheduleJob(new UpgradeBuildingJob(building), JobContainer jc = JobScheduler.getInstance().scheduleJob(new UpgradeBuildingJob(building), building.getUpgradeDateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
building.getUpgradeDateTime().atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli());
} else } else
JobScheduler.getInstance().scheduleJob(new UpgradeBuildingJob(building), 0); JobScheduler.getInstance().scheduleJob(new UpgradeBuildingJob(building), 0);
} }
@@ -335,8 +324,35 @@ public enum BuildingManager {
WorldGrid.RemoveWorldObject(minionMob); WorldGrid.RemoveWorldObject(minionMob);
WorldGrid.unloadObject(minionMob); WorldGrid.unloadObject(minionMob);
if (minionMob.getParentZone() != null) if (minionMob.parentZone != null)
minionMob.getParentZone().zoneMobSet.remove(minionMob); minionMob.parentZone.zoneMobSet.remove(minionMob);
}
// Clear all workorders for this hireling
if (hireling.getObjectType().equals(GameObjectType.NPC)) {
NPC hirelingNPC = (NPC) hireling;
if (ForgeManager.vendorWorkOrderLookup.get(hirelingNPC) != null)
for (WorkOrder workOrder : ForgeManager.vendorWorkOrderLookup.get(hirelingNPC)) {
workOrder.runCompleted.set(true);
workOrder.vendor = null;
// Remove any cooking items from collections
// to ensure we don't leak memory.
for (Item item : workOrder.cooking) {
DbManager.removeFromCache(item);
ForgeManager.itemWorkOrderLookup.remove(item);
}
DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder);
}
// Finally remove the NPC from ForgeManager
ForgeManager.vendorWorkOrderLookup.remove(hirelingNPC);
} }
// Remove hireling from building // Remove hireling from building
@@ -349,10 +365,9 @@ public enum BuildingManager {
Mob hirelingMob = (Mob) hireling; Mob hirelingMob = (Mob) hireling;
if (hirelingMob.getParentZone() != null) if (hirelingMob.parentZone != null)
if (hirelingMob.getParentZone().zoneMobSet.contains(hirelingMob)) if (hirelingMob.parentZone.zoneMobSet.contains(hirelingMob))
hirelingMob.getParentZone().zoneMobSet.remove(hireling); hirelingMob.parentZone.zoneMobSet.remove(hireling);
} }
if (hireling.getObjectType().equals(GameObjectType.NPC)) { if (hireling.getObjectType().equals(GameObjectType.NPC)) {
@@ -377,10 +392,8 @@ public enum BuildingManager {
DbManager.MobQueries.DELETE_MOB((Mob) hireling); DbManager.MobQueries.DELETE_MOB((Mob) hireling);
else else
DbManager.NPCQueries.DELETE_NPC((NPC) hireling); DbManager.NPCQueries.DELETE_NPC((NPC) hireling);
} }
public static void cleanupHirelings(Building building) { public static void cleanupHirelings(Building building) {
// Early exit: Cannot have hirelings in a building // Early exit: Cannot have hirelings in a building
@@ -392,22 +405,17 @@ public enum BuildingManager {
// Remove all hirelings for destroyed buildings // Remove all hirelings for destroyed buildings
if (building.getRank() < 1) { if (building.getRank() < 1) {
for (AbstractCharacter slottedNPC : building.getHirelings().keySet()) for (AbstractCharacter slottedNPC : building.getHirelings().keySet())
BuildingManager.removeHireling(building, slottedNPC); BuildingManager.removeHireling(building, slottedNPC);
return; return;
} }
// Delete hireling if building has deranked. // Delete hireling if building has deranked.
for (AbstractCharacter hireling : building.getHirelings().keySet()) { for (AbstractCharacter hireling : building.getHirelings().keySet())
if (building.getHirelings().get(hireling) > building.getBlueprint().getSlotsForRank(building.getRank())) if (building.getHirelings().get(hireling) > building.getBlueprint().getSlotsForRank(building.getRank()))
BuildingManager.removeHireling(building, hireling); BuildingManager.removeHireling(building, hireling);
}
refreshHirelings(building); refreshHirelings(building);
} }
@@ -439,6 +447,7 @@ public enum BuildingManager {
return false; return false;
//lets pass true if player is owner anyway. //lets pass true if player is owner anyway.
if (building.getOwner().equals(player)) if (building.getOwner().equals(player))
return true; return true;
@@ -451,52 +460,22 @@ public enum BuildingManager {
if (!Guild.sameGuild(building.getGuild(), player.getGuild())) if (!Guild.sameGuild(building.getGuild(), player.getGuild()))
return false; return false;
return GuildStatusController.isGuildLeader(player.getGuildStatus()) != false || GuildStatusController.isInnerCouncil(player.getGuildStatus()) != false; return GuildStatusController.isGuildLeader(player.getGuildStatus()) || GuildStatusController.isInnerCouncil(player.getGuildStatus());
}
//This is mainly used for Rolling and gold sharing between building and warehouse.
public static int GetWithdrawAmountForRolling(Building building, int cost) {
//all funds are available to roll.
if (cost <= GetAvailableGold(building))
return cost;
// cost is more than available gold, return available gold
return GetAvailableGold(building);
}
public static int GetAvailableGold(Building building) {
if (building.getStrongboxValue() == 0)
return 0;
if (building.getStrongboxValue() < building.reserve)
return 0;
return building.getStrongboxValue() - building.reserve;
}
public static int GetOverdraft(Building building, int cost) {
int availableGold = GetWithdrawAmountForRolling(building, cost);
return cost - availableGold;
} }
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) { public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
//Nation Members and Guild members are not hostile.
// if (building.getGuild() != null){
// if (pc.getGuild() != null)
// if (building.getGuild().getObjectUUID() == pc.getGuildUUID()
// || pc.getGuild().getNation().getObjectUUID() == building.getGuild().getNation().getObjectUUID())
// return false;
// }
if (Guild.sameNationExcludeErrant(building.getGuild(), player.getGuild())) if (Guild.sameNationExcludeErrant(building.getGuild(), player.getGuild()))
return false; return false;
if(building.enforceKOS) {
if (building.getCity() != null) {
Building TOL = building.getCity().getTOL();
if (TOL != null) {
building = TOL;
}
}
}
if (!building.reverseKOS) { if (!building.reverseKOS) {
Condemned condemn = building.getCondemned().get(player.getObjectUUID()); Condemned condemn = building.getCondemned().get(player.getObjectUUID());
@@ -548,7 +527,7 @@ public enum BuildingManager {
String pirateName = NPCManager.getPirateName(NpcID.getMobbaseID()); String pirateName = NPCManager.getPirateName(NpcID.getMobbaseID());
NPC npc = null; NPC npc;
npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, building.getGuild(), zone, (short) rank, building); npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, building.getGuild(), zone, (short) rank, building);
@@ -564,7 +543,7 @@ public enum BuildingManager {
public static synchronized boolean addHireling(Building building, PlayerCharacter contractOwner, Zone zone, Contract contract, Item item) { public static synchronized boolean addHireling(Building building, PlayerCharacter contractOwner, Zone zone, Contract contract, Item item) {
int rank = 1; int rank;
if (building.getBlueprintUUID() == 0) if (building.getBlueprintUUID() == 0)
return false; return false;
@@ -623,6 +602,7 @@ public enum BuildingManager {
if (contract.getContractID() == 910) { if (contract.getContractID() == 910) {
//guard dog //guard dog
mobile = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank, mbEnums.AIAgentType.GUARDCAPTAIN); mobile = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank, mbEnums.AIAgentType.GUARDCAPTAIN);
if (mobile == null) if (mobile == null)
@@ -682,9 +662,7 @@ public enum BuildingManager {
if (building.getOwner() == null) if (building.getOwner() == null)
return false; return false;
return building.getOwner().getObjectUUID() == player.getObjectUUID(); return building.getOwner().getObjectUUID() == player.getObjectUUID();
} }
public static float GetMissingHealth(Building building) { public static float GetMissingHealth(Building building) {
@@ -696,6 +674,7 @@ public enum BuildingManager {
} }
public static Regions GetRegion(Building building, float x, float y, float z) { public static Regions GetRegion(Building building, float x, float y, float z) {
if (building.getBounds() == null) if (building.getBounds() == null)
return null; return null;
@@ -703,17 +682,18 @@ public enum BuildingManager {
return null; return null;
Regions currentRegion = null; Regions currentRegion = null;
for (Regions region : building.getBounds().getRegions()) {
if (region.isPointInPolygon(new Vector3fImmutable(x, y, z))) { for (Regions region : building.getBounds().getRegions()) {
if (region.isPointInPolygon(new Vector3fImmutable(x, y, z)))
if (y > (region.highLerp.y - 5)) if (y > (region.highLerp.y - 5))
currentRegion = region; currentRegion = region;
}
} }
return currentRegion; return currentRegion;
} }
public static Regions GetRegion(Building building, int room, int level, float x, float z) { public static Regions GetRegion(Building building, int room, int level, float x, float z) {
if (building.getBounds() == null) if (building.getBounds() == null)
return null; return null;
@@ -724,12 +704,12 @@ public enum BuildingManager {
if (region.getLevel() != level) if (region.getLevel() != level)
continue; continue;
if (region.getRoom() != room) if (region.getRoom() != room)
continue; continue;
if (region.isPointInPolygon(new Vector3fImmutable(x, 0, z))) { if (region.isPointInPolygon(new Vector3fImmutable(x, 0, z)))
return region; return region;
}
} }
return null; return null;
} }
@@ -741,11 +721,10 @@ public enum BuildingManager {
if (building == null) if (building == null)
return mbEnums.Ruins.getRandomRuin().getLocation(); return mbEnums.Ruins.getRandomRuin().getLocation();
bindLoc = building.getLoc(); bindLoc = building.getLoc();
float radius = Bounds.meshBoundsCache.get(building.getMeshUUID()).radius; float radius = Bounds.meshBoundsCache.get(building.getMeshUUID()).radius;
if (building.getRank() == 8) { if (building.getRank() == 8) {
bindLoc = building.getStuckLocation(); bindLoc = building.getStuckLocation();
if (bindLoc != null) if (bindLoc != null)
@@ -798,7 +777,6 @@ public enum BuildingManager {
int newMeshUUID; int newMeshUUID;
boolean success; boolean success;
// If this building has no blueprint then set rank and exit immediatly. // If this building has no blueprint then set rank and exit immediatly.
if (building.blueprintUUID == 0 || building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)) { if (building.blueprintUUID == 0 || building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)) {
@@ -810,22 +788,22 @@ public enum BuildingManager {
// Delete any upgrade jobs before doing anything else. It won't quite work // Delete any upgrade jobs before doing anything else. It won't quite work
// if in a few lines we happen to delete this building. // if in a few lines we happen to delete this building.
JobContainer jc = building.getTimers().get("UPGRADE"); JobContainer jobContainer = building.getTimers().get("UPGRADE");
if (jc != null) { if (jobContainer != null) {
if (!JobScheduler.getInstance().cancelScheduledJob(jc)) if (!JobScheduler.getInstance().cancelScheduledJob(jobContainer))
Logger.error("failed to cancel existing upgrade job."); Logger.error("failed to cancel existing upgrade job.");
} }
// Attempt write to database, or delete the building // Attempt to write to database or delete the building
// if we are destroying it. // if we are destroying it.
if (rank == -1) if (rank < 0)
success = DbManager.BuildingQueries.DELETE_FROM_DATABASE(building); success = DbManager.BuildingQueries.DELETE_FROM_DATABASE(building);
else else
success = DbManager.BuildingQueries.updateBuildingRank(building, rank); success = DbManager.BuildingQueries.updateBuildingRank(building, rank);
if (success == false) { if (!success) {
Logger.error("Error writing to database UUID: " + building.getObjectUUID()); Logger.error("Error writing to database UUID: " + building.getObjectUUID());
return; return;
} }
@@ -882,7 +860,6 @@ public enum BuildingManager {
if (Bounds.collide(loc, building.getBounds())) if (Bounds.collide(loc, building.getBounds()))
return building; return building;
} }
return null; return null;
} }
+17 -18
View File
@@ -17,7 +17,6 @@ import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType; import engine.mbEnums.SourceType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.MessageDispatcher; import engine.net.MessageDispatcher;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.handlers.ClientAdminCommandMsgHandler; import engine.net.client.handlers.ClientAdminCommandMsgHandler;
@@ -87,7 +86,7 @@ public enum ChatManager {
for (AbstractWorldObject abstractWorldObject : distroList) { for (AbstractWorldObject abstractWorldObject : distroList) {
PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject;
Dispatch dispatch = Dispatch.borrow(playerCharacter, msg); Dispatch dispatch = Dispatch.borrow(playerCharacter, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -161,7 +160,7 @@ public enum ChatManager {
// Make the Message // Make the Message
ChatSayMsg chatSayMsg = new ChatSayMsg(player, text); ChatSayMsg chatSayMsg = new ChatSayMsg(player, text);
DispatchMessage.dispatchMsgToInterestArea(pcSender, chatSayMsg, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.SAY_RANGE, true, true); DispatchManager.dispatchMsgToInterestArea(pcSender, chatSayMsg, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.SAY_RANGE, true, true);
} }
@@ -171,7 +170,7 @@ public enum ChatManager {
msg.setMessageType(4); msg.setMessageType(4);
msg.setChannel(mbEnums.ChatChannelType.SYSTEM.getChannelID()); msg.setChannel(mbEnums.ChatChannelType.SYSTEM.getChannelID());
Dispatch dispatch = Dispatch.borrow(targetPlayer, msg); Dispatch dispatch = Dispatch.borrow(targetPlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
/* /*
@@ -195,7 +194,7 @@ public enum ChatManager {
// Make the Message // Make the Message
ChatShoutMsg msg = new ChatShoutMsg(sender, text); ChatShoutMsg msg = new ChatShoutMsg(sender, text);
DispatchMessage.dispatchMsgToInterestArea(pcSender, msg, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.SHOUT_RANGE, true, true); DispatchManager.dispatchMsgToInterestArea(pcSender, msg, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.SHOUT_RANGE, true, true);
} }
@@ -217,7 +216,7 @@ public enum ChatManager {
// Make the Message // Make the Message
ChatGlobalMsg msg = new ChatGlobalMsg(sender, text); ChatGlobalMsg msg = new ChatGlobalMsg(sender, text);
DispatchMessage.dispatchMsgToAll(sender, msg, true); DispatchManager.dispatchMsgToAll(sender, msg, true);
} }
@@ -284,13 +283,13 @@ public enum ChatManager {
// Send dispatch to each player // Send dispatch to each player
Dispatch dispatch = Dispatch.borrow(pcRecip, chatTellMsg); Dispatch dispatch = Dispatch.borrow(pcRecip, chatTellMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
// Also send /tell to sender // Also send /tell to sender
if (pcSender != null) { if (pcSender != null) {
Dispatch dispatch = Dispatch.borrow(pcSender, chatTellMsg); Dispatch dispatch = Dispatch.borrow(pcSender, chatTellMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} else } else
@@ -339,8 +338,8 @@ public enum ChatManager {
chatGuildMsg.setSourceID(sender.getObjectUUID()); chatGuildMsg.setSourceID(sender.getObjectUUID());
chatGuildMsg.setSourceName(sender.getFirstName()); chatGuildMsg.setSourceName(sender.getFirstName());
chatGuildMsg.setUnknown03(WorldServer.worldMapID); // Server ID chatGuildMsg.setUnknown03(WorldServer.worldMapID); // Server ID
chatGuildMsg.setUnknown04(sender.getGuild() != null ? sender.getGuild() Guild guild1 = sender.getGuild();
.getCharter() : 0); // Charter? chatGuildMsg.setUnknown04(sender.getGuild() != null ? guild1.charter.ordinal() : 0); // Charter?
chatGuildMsg.setUnknown05(GuildStatusController.getTitle(sender.getGuildStatus())); // Title? chatGuildMsg.setUnknown05(GuildStatusController.getTitle(sender.getGuildStatus())); // Title?
chatGuildMsg.setUnknown06(sender.race.getRaceType().getCharacterSex().equals(mbEnums.CharacterSex.MALE) ? 1 : 2); // isMale?, seen 1 and 2 chatGuildMsg.setUnknown06(sender.race.getRaceType().getCharacterSex().equals(mbEnums.CharacterSex.MALE) ? 1 : 2); // isMale?, seen 1 and 2
@@ -349,7 +348,7 @@ public enum ChatManager {
for (AbstractWorldObject abstractWorldObject : distroList) { for (AbstractWorldObject abstractWorldObject : distroList) {
PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject;
Dispatch dispatch = Dispatch.borrow(playerCharacter, chatGuildMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, chatGuildMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -404,7 +403,7 @@ public enum ChatManager {
for (AbstractWorldObject abstractWorldObject : distroList) { for (AbstractWorldObject abstractWorldObject : distroList) {
PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject;
Dispatch dispatch = Dispatch.borrow(playerCharacter, chatICMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, chatICMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -463,7 +462,7 @@ public enum ChatManager {
for (AbstractWorldObject abstractWorldObject : distroList) { for (AbstractWorldObject abstractWorldObject : distroList) {
PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject;
Dispatch dispatch = Dispatch.borrow(playerCharacter, chatGroupMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, chatGroupMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -490,14 +489,14 @@ public enum ChatManager {
msg.setName(sender.getFirstName()); msg.setName(sender.getFirstName());
msg.setGuildTitle(GuildStatusController.getTitle(sender.getGuildStatus())); msg.setGuildTitle(GuildStatusController.getTitle(sender.getGuildStatus()));
msg.setGuildUUID(guild.getObjectUUID()); msg.setGuildUUID(guild.getObjectUUID());
msg.setCharter(guild.getCharter()); msg.setCharter(guild.charter.ordinal());
// Send dispatch to each player // Send dispatch to each player
for (AbstractWorldObject abstractWorldObject : distroList) { for (AbstractWorldObject abstractWorldObject : distroList) {
PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject;
Dispatch dispatch = Dispatch.borrow(playerCharacter, msg); Dispatch dispatch = Dispatch.borrow(playerCharacter, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -733,7 +732,7 @@ public enum ChatManager {
public static void chatPVP(String text) { public static void chatPVP(String text) {
// Create message // Create message
ChatPvPMsg msg = new ChatPvPMsg(null, text); ChatPvPMsg msg = new ChatPvPMsg(null, text);
DispatchMessage.dispatchMsgToAll(msg); DispatchManager.dispatchMsgToAll(msg);
} }
public static ChatSystemMsg CombatInfo(AbstractWorldObject source, AbstractWorldObject target) { public static ChatSystemMsg CombatInfo(AbstractWorldObject source, AbstractWorldObject target) {
@@ -844,7 +843,7 @@ public enum ChatManager {
for (AbstractWorldObject abstractWorldObject : distroList) { for (AbstractWorldObject abstractWorldObject : distroList) {
PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject;
Dispatch dispatch = Dispatch.borrow(playerCharacter, chatSystemMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, chatSystemMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -993,7 +992,7 @@ public enum ChatManager {
chatSystemMsg.setChannel(channel); chatSystemMsg.setChannel(channel);
Dispatch dispatch = Dispatch.borrow(playerCharacter, chatSystemMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, chatSystemMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
+235 -91
View File
@@ -13,13 +13,13 @@ import engine.job.JobScheduler;
import engine.jobs.AttackJob; import engine.jobs.AttackJob;
import engine.jobs.DeferredPowerJob; import engine.jobs.DeferredPowerJob;
import engine.mbEnums; import engine.mbEnums;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.TargetedActionMsg; import engine.net.client.msg.TargetedActionMsg;
import engine.net.client.msg.UpdateStateMsg; import engine.net.client.msg.UpdateStateMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.DamageShield; import engine.powers.DamageShield;
import engine.powers.effectmodifiers.AbstractEffectModifier; import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.effectmodifiers.WeaponProcEffectModifier;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -29,9 +29,24 @@ import java.util.EnumSet;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import static java.lang.Math.pow;
public enum CombatManager { public enum CombatManager {
// MB Dev notes:
// Class implements all combat mechanics for Magicbane.
//
// Combat initiates in "combatCycle" to determine which hands will be swung, and attack is processed based on that.
// Handles all combat for AbstractCharacter including player characters and mobiles.
// Controls toggling of combat and sit/stand for all AbstractCharacters
//
//
COMBAT_MANAGER; COMBAT_MANAGER;
public static final int COMBAT_BLOCK_ANIMATION = 298;
public static final int COMBAT_PARRY_ANIMATION = 299;
public static final int COMBAT_DODGE_ANIMATION = 300;
public static void combatCycle(AbstractCharacter attacker, AbstractWorldObject target) { public static void combatCycle(AbstractCharacter attacker, AbstractWorldObject target) {
@@ -76,25 +91,25 @@ public enum CombatManager {
return; return;
} }
if (mainWeapon == null && offWeapon != null && !offWeapon.template.item_skill_required.containsKey("Block")) { if (mainWeapon == null && offWeapon != null && !offWeapon.template.item_skill_used.equals("Block")) {
//swing left hand only //swing left hand only
processAttack(attacker, target, mbEnums.EquipSlotType.LHELD); processAttack(attacker, target, mbEnums.EquipSlotType.LHELD);
return; return;
} }
if (mainWeapon == null && offWeapon != null && offWeapon.template.item_skill_required.containsKey("Block")) { if (mainWeapon == null && offWeapon != null && offWeapon.template.item_skill_used.equals("Block")) {
//no weapon equipped with a shield, punch with one hand //no weapon equipped with a shield, punch with one hand
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
return; return;
} }
if (mainWeapon != null && offWeapon != null && offWeapon.template.item_skill_required.containsKey("Block")) { if (mainWeapon != null && offWeapon != null && offWeapon.template.item_skill_used.equals("Block")) {
//one weapon equipped with a shield, swing with one hand //one weapon equipped with a shield, swing with one hand
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
return; return;
} }
if (mainWeapon != null && offWeapon != null && !offWeapon.template.item_skill_required.containsKey("Block")) { if (mainWeapon != null && offWeapon != null && !offWeapon.template.item_skill_used.equals("Block")) {
//two weapons equipped, swing both hands //two weapons equipped, swing both hands
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter))
@@ -104,16 +119,19 @@ public enum CombatManager {
public static void processAttack(AbstractCharacter attacker, AbstractWorldObject target, mbEnums.EquipSlotType slot) { public static void processAttack(AbstractCharacter attacker, AbstractWorldObject target, mbEnums.EquipSlotType slot) {
if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
if (!attacker.isCombat()) if (!attacker.isCombat())
return; return;
if (attacker.getTimestamps().get("Attack" + slot.name()) != null && attacker.getTimestamps().get("Attack" + slot.name()) < System.currentTimeMillis()) { //check if this slot is on attack timer, if timer has passed clear it, else early exit
setAutoAttackJob(attacker, slot, 1000); if (attacker.getTimers() != null && attacker.getTimers().containsKey("Attack" + slot.name()))
return; if (attacker.getTimers().get("Attack" + slot.name()).timeToExecutionLeft() <= 0)
} attacker.getTimers().remove("Attack" + slot.name());
else
return;
} }
// check if character is in range to attack target // check if character is in range to attack target
PlayerBonuses bonus = attacker.getBonuses(); PlayerBonuses bonus = attacker.getBonuses();
@@ -127,7 +145,7 @@ public enum CombatManager {
if (bonus != null) if (bonus != null)
rangeMod += bonus.getFloatPercentAll(mbEnums.ModType.WeaponRange, mbEnums.SourceType.None); rangeMod += bonus.getFloatPercentAll(mbEnums.ModType.WeaponRange, mbEnums.SourceType.None);
attackRange = weapon.template.item_weapon_max_range * rangeMod; attackRange += weapon.template.item_weapon_max_range * rangeMod;
} }
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
@@ -137,31 +155,46 @@ public enum CombatManager {
float distanceSquared = attacker.loc.distanceSquared(target.loc); float distanceSquared = attacker.loc.distanceSquared(target.loc);
boolean inRange = false; boolean inRange = false;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { if (AbstractCharacter.IsAbstractCharacter(target)) {
attackRange += ((PlayerCharacter) attacker).getCharacterHeight() * 0.5f; attackRange += ((AbstractCharacter) target).calcHitBox();
} else { } else {
attackRange += attacker.calcHitBox();
} }
if (attackRange > 15 && attacker.isMoving()) {
//cannot shoot bow while moving;
return;
}
switch (target.getObjectType()) { switch (target.getObjectType()) {
case PlayerCharacter: case PlayerCharacter:
attackRange += ((PlayerCharacter) target).getCharacterHeight() * 0.5f; attackRange += ((PlayerCharacter) target).getCharacterHeight() * 0.5f;
if (distanceSquared < attackRange * attackRange) if (distanceSquared <= attackRange * attackRange)
inRange = true; inRange = true;
break; break;
case Mob: case Mob:
attackRange += ((AbstractCharacter) target).calcHitBox(); attackRange += ((AbstractCharacter) target).calcHitBox();
if (distanceSquared < attackRange * attackRange) if (distanceSquared <= attackRange * attackRange)
inRange = true; inRange = true;
break; break;
case Building: case Building:
float locX = target.loc.x - target.getBounds().getHalfExtents().x; if (attackRange > 15) {
float locZ = target.loc.z - target.getBounds().getHalfExtents().y; float rangeSquared = (attackRange + target.getBounds().getHalfExtents().x) * (attackRange + target.getBounds().getHalfExtents().x);
float sizeX = (target.getBounds().getHalfExtents().x + attackRange) * 2; //float distanceSquared = attacker.loc.distanceSquared(target.loc);
float sizeZ = (target.getBounds().getHalfExtents().y + attackRange) * 2; if (distanceSquared < rangeSquared) {
Rectangle2D.Float rect = new Rectangle2D.Float(locX, locZ, sizeX, sizeZ); inRange = true;
if (rect.contains(new Point2D.Float(attacker.loc.x, attacker.loc.z))) break;
inRange = true; }
break; } else {
float locX = target.loc.x - target.getBounds().getHalfExtents().x;
float locZ = target.loc.z - target.getBounds().getHalfExtents().y;
float sizeX = (target.getBounds().getHalfExtents().x + attackRange) * 2;
float sizeZ = (target.getBounds().getHalfExtents().y + attackRange) * 2;
Rectangle2D.Float rect = new Rectangle2D.Float(locX, locZ, sizeX, sizeZ);
if (rect.contains(new Point2D.Float(attacker.loc.x, attacker.loc.z)))
inRange = true;
break;
}
} }
//get delay for the auto attack job //get delay for the auto attack job
@@ -169,7 +202,7 @@ public enum CombatManager {
if (weapon != null) { if (weapon != null) {
int wepSpeed = (int) (weapon.template.item_weapon_wepspeed); float wepSpeed = (int) (weapon.template.item_weapon_wepspeed);
if (weapon.getBonusPercent(mbEnums.ModType.WeaponSpeed, mbEnums.SourceType.None) != 0f) //add weapon speed bonus if (weapon.getBonusPercent(mbEnums.ModType.WeaponSpeed, mbEnums.SourceType.None) != 0f) //add weapon speed bonus
wepSpeed *= (1 + weapon.getBonus(mbEnums.ModType.WeaponSpeed, mbEnums.SourceType.None)); wepSpeed *= (1 + weapon.getBonus(mbEnums.ModType.WeaponSpeed, mbEnums.SourceType.None));
@@ -180,7 +213,7 @@ public enum CombatManager {
if (wepSpeed < 10) if (wepSpeed < 10)
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects. wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
delay = wepSpeed * 100L; delay = (long)wepSpeed * 100L;
} }
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
@@ -188,6 +221,16 @@ public enum CombatManager {
if (inRange) { if (inRange) {
if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)){
if(!attacker.getTimestamps().contains(slot.name()+"Attack")){
attacker.getTimestamps().put(slot.name()+"Attack", System.currentTimeMillis() - 1000);
} else if(System.currentTimeMillis() < attacker.getTimestamps().get(slot.name()+"Attack") + delay){
setAutoAttackJob(attacker,slot,delay);
return;
}
}
//handle retaliate //handle retaliate
if (AbstractCharacter.IsAbstractCharacter(target)) { if (AbstractCharacter.IsAbstractCharacter(target)) {
if (((AbstractCharacter) target).combatTarget == null || !((AbstractCharacter) target).combatTarget.isAlive()) { if (((AbstractCharacter) target).combatTarget == null || !((AbstractCharacter) target).combatTarget.isAlive()) {
@@ -197,23 +240,21 @@ public enum CombatManager {
} }
} }
// take stamina away from attacker if its not a mob
if (weapon != null && !attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) {
//check if Out of Stamina //check if Out of Stamina
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
if (attacker.getStamina() < (weapon.template.item_wt / 3f)) { if (attacker.getStamina() < (weapon.template.item_wt / 3f)) {
//set auto attack job //set auto attack job
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
return; return;
}
} }
}
// take stamina away from attacker
if (weapon != null) {
float stam = weapon.template.item_wt / 3f; float stam = weapon.template.item_wt / 3f;
stam = (stam < 1) ? 1 : stam; stam = (stam < 1) ? 1 : stam;
attacker.modifyStamina(-(stam), attacker, true); attacker.modifyStamina(-(stam), attacker, true);
} else } else
attacker.modifyStamina(-0.5f, attacker, true); attacker.modifyStamina(1, attacker, true);
//cancel things that are cancelled by an attack //cancel things that are cancelled by an attack
@@ -233,6 +274,22 @@ public enum CombatManager {
atr = attacker.atrHandTwo; atr = attacker.atrHandTwo;
} }
//apply weapon powers before early exit for miss or passives
DeferredPowerJob dpj = null;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
dpj = ((PlayerCharacter) attacker).getWeaponPower();
if (dpj != null) {
dpj.attack(target, attackRange);
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
((PlayerCharacter) attacker).setWeaponPower(dpj);
}
}
int def = 0; int def = 0;
if (AbstractCharacter.IsAbstractCharacter(target)) if (AbstractCharacter.IsAbstractCharacter(target))
@@ -252,19 +309,18 @@ public enum CombatManager {
if (target.getObjectType() == mbEnums.GameObjectType.Building) if (target.getObjectType() == mbEnums.GameObjectType.Building)
hitChance = 100; hitChance = 100;
int passiveAnim = getPassiveAnimation(mbEnums.PassiveType.None); // checking for a miss due to ATR vs Def
int passiveAnim = getSwingAnimation(null, null, slot.equals(mbEnums.EquipSlotType.RHELD));
if (attacker.charItemManager.getEquipped().get(slot) != null) {
passiveAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, null, true);
}
if (ThreadLocalRandom.current().nextInt(100) > hitChance) { if (ThreadLocalRandom.current().nextInt(100) > hitChance) {
TargetedActionMsg msg = new TargetedActionMsg(attacker, target, 0f, passiveAnim); TargetedActionMsg msg = new TargetedActionMsg(attacker, target, 0f, passiveAnim);
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter) if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else else
DispatchMessage.sendToAllInRange(attacker, msg); DispatchManager.sendToAllInRange(attacker, msg);
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job //set auto attack job
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
@@ -296,19 +352,24 @@ public enum CombatManager {
if (!passiveType.equals(mbEnums.PassiveType.None)) { if (!passiveType.equals(mbEnums.PassiveType.None)) {
passiveAnim = getPassiveAnimation(passiveType);
TargetedActionMsg msg = new TargetedActionMsg(attacker, passiveAnim, target, passiveType.value); TargetedActionMsg msg = new TargetedActionMsg(attacker, passiveAnim, target, passiveType.value);
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter) if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchMessage.sendToAllInRange(attacker, msg);
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job //set auto attack job
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
return; return;
} }
} }
//check for proccing
checkForProc(attacker,target,weapon);
//calculate the base damage //calculate the base damage
int damage = ThreadLocalRandom.current().nextInt(min, max + 1); int damage = ThreadLocalRandom.current().nextInt(min, max + 1);
if (damage == 0) { if (damage == 0) {
@@ -316,6 +377,9 @@ public enum CombatManager {
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
return; return;
} }
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob) && ((Mob) attacker).isPet())
calculatePetDamage(attacker);
//get the damage type //get the damage type
mbEnums.DamageType damageType; mbEnums.DamageType damageType;
@@ -372,7 +436,7 @@ public enum CombatManager {
//apply Damage back //apply Damage back
attacker.modifyHealth(-total, absTarget, true); attacker.modifyHealth(-total, absTarget, true);
TargetedActionMsg cmm = new TargetedActionMsg(attacker, attacker, total, 0); TargetedActionMsg cmm = new TargetedActionMsg(attacker, attacker, total, 0);
DispatchMessage.sendToAllInRange(target, cmm); DispatchManager.sendToAllInRange(target, cmm);
} }
} }
@@ -382,6 +446,9 @@ public enum CombatManager {
if (resists.immuneTo(damageType)) { if (resists.immuneTo(damageType)) {
//set auto attack job //set auto attack job
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
return; return;
} }
@@ -398,33 +465,19 @@ public enum CombatManager {
if (AbstractCharacter.IsAbstractCharacter(target)) if (AbstractCharacter.IsAbstractCharacter(target))
((AbstractCharacter) target).modifyHealth(-damage, attacker, true); ((AbstractCharacter) target).modifyHealth(-damage, attacker, true);
else else
((Building) target).setCurrentHitPoints(target.getCurrentHitpoints() - damage); ((Building) target).modifyHealth(-damage, attacker);
int attackAnim = getSwingAnimation(null, null, slot.equals(mbEnums.EquipSlotType.RHELD)); int attackAnim = getSwingAnimation(null, null, slot);
if (attacker.charItemManager.getEquipped().get(slot) != null) { if (attacker.charItemManager.getEquipped().get(slot) != null) {
if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
DeferredPowerJob weaponPower = ((PlayerCharacter) attacker).getWeaponPower(); DeferredPowerJob weaponPower = ((PlayerCharacter) attacker).getWeaponPower();
attackAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, weaponPower, slot.equals(mbEnums.EquipSlotType.RHELD)); attackAnim = getSwingAnimation(weapon.template, weaponPower, slot);
}else { } else {
attackAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, null, slot.equals(mbEnums.EquipSlotType.RHELD)); attackAnim = getSwingAnimation(weapon.template, null, slot);
} }
} }
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim); TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim);
DispatchMessage.sendToAllInRange(target, cmm); DispatchManager.sendToAllInRange(target, cmm);
}
}
DeferredPowerJob dpj = null;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
dpj = ((PlayerCharacter) attacker).getWeaponPower();
if (dpj != null) {
dpj.attack(target, attackRange);
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
((PlayerCharacter) attacker).setWeaponPower(dpj);
} }
} }
@@ -447,7 +500,7 @@ public enum CombatManager {
UpdateStateMsg rwss = new UpdateStateMsg(); UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(playerCharacter); rwss.setPlayer(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, rwss, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, rwss, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
} }
public static void toggleSit(boolean toggle, ClientConnection origin) { public static void toggleSit(boolean toggle, ClientConnection origin) {
@@ -460,7 +513,7 @@ public enum CombatManager {
playerCharacter.setSit(toggle); playerCharacter.setSit(toggle);
UpdateStateMsg rwss = new UpdateStateMsg(); UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(playerCharacter); rwss.setPlayer(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, rwss, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, rwss, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} }
@@ -488,7 +541,11 @@ public enum CombatManager {
target.setCombatTarget(attacker); target.setCombatTarget(attacker);
} }
public static int getSwingAnimation(ItemTemplate wb, DeferredPowerJob dpj, boolean mainHand) { public static int getSwingAnimation(ItemTemplate wb, DeferredPowerJob dpj, mbEnums.EquipSlotType slot) {
//No weapon, return default animation
if (wb == null)
return 75;
int token; int token;
@@ -498,31 +555,71 @@ public enum CombatManager {
if (token == 563721004) //kick animation if (token == 563721004) //kick animation
return 79; return 79;
if (wb != null) {
if (mainHand) {
int random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size());
int anim = wb.weapon_attack_anim_right.get(random)[0];
return anim;
}else {
int random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size());
return wb.weapon_attack_anim_left.get(random)[0];
}
}
} }
if (wb == null) //Item has no equipment slots and should not try to return an animation, return default instead
if (wb.item_eq_slots_or == null || wb.item_eq_slots_or.isEmpty()) {
return 75; return 75;
}
if (mainHand) //declare variables
return wb.weapon_attack_anim_right.get(0)[0]; int anim;
else int random;
return wb.weapon_attack_anim_left.get(0)[0];
//Item can only be equipped in one slot, return animation for that slot
if (wb.item_eq_slots_or.size() == 1) {
if (wb.item_eq_slots_or.iterator().next().equals(mbEnums.EquipSlotType.RHELD)) {
anim = wb.weapon_attack_anim_right.get(0)[0];
if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size());
anim = wb.weapon_attack_anim_right.get(random)[0];
}
} else {
anim = wb.weapon_attack_anim_left.get(0)[0];
if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size());
anim = wb.weapon_attack_anim_left.get(random)[0];
}
}
return anim;
}
//Item can be equipped in either hand, and should have animation sets for each hand
if (slot.equals(mbEnums.EquipSlotType.RHELD)) {
anim = wb.weapon_attack_anim_right.get(0)[0];
if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size());
anim = wb.weapon_attack_anim_right.get(random)[0];
}
} else {
anim = wb.weapon_attack_anim_left.get(0)[0];
if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size());
anim = wb.weapon_attack_anim_left.get(random)[0];
}
}
return anim;
}
public static int getPassiveAnimation(mbEnums.PassiveType passiveType) {
switch (passiveType) {
case Block:
return COMBAT_BLOCK_ANIMATION;
case Parry:
return COMBAT_PARRY_ANIMATION;
case Dodge:
return COMBAT_DODGE_ANIMATION;
default:
return 0;
}
} }
public static void setAutoAttackJob(AbstractCharacter attacker, mbEnums.EquipSlotType slot, long delay) { public static void setAutoAttackJob(AbstractCharacter attacker, mbEnums.EquipSlotType slot, long delay) {
//calculate next allowed attack and update the timestamp //calculate next allowed attack and update the timestamp
if (attacker.getTimestamps().containsKey("Attack" + slot.name()) && attacker.getTimestamps().get("Attack" + slot.name()) > System.currentTimeMillis())
return;
attacker.getTimestamps().put("Attack" + slot.name(), System.currentTimeMillis() + delay); attacker.getTimestamps().put("Attack" + slot.name(), System.currentTimeMillis() + delay);
//handle auto attack job creation //handle auto attack job creation
@@ -532,9 +629,56 @@ public enum CombatManager {
AttackJob aj = new AttackJob(attacker, slot.ordinal(), true); AttackJob aj = new AttackJob(attacker, slot.ordinal(), true);
JobContainer job; JobContainer job;
job = JobScheduler.getInstance().scheduleJob(aj, (System.currentTimeMillis() + delay)); // offset 1 millisecond so no overlap issue job = JobScheduler.getInstance().scheduleJob(aj, (System.currentTimeMillis() + delay)); // offset 1 millisecond so no overlap issue
timers.put("Attack" + slot, job); timers.put("Attack" + slot.name(), job);
} else } else
Logger.error("Unable to find Timers for Character " + attacker.getObjectUUID()); Logger.error("Unable to find Timers for Character " + attacker.getObjectUUID());
} }
public static int calculatePetDamage(AbstractCharacter agent) {
//damage calc for pet
float range;
float damage;
float min = 40;
float max = 60;
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(mbEnums.ModType.MeleeDamageModifier, mbEnums.SourceType.None);
double minDmg = getMinDmg(min, agent);
double maxDmg = getMaxDmg(max, agent);
dmgMultiplier += agent.getLevel() * 0.1f;
range = (float) (maxDmg - minDmg);
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
return (int) (damage * dmgMultiplier);
}
public static double getMinDmg(double min, AbstractCharacter agent) {
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
}
public static double getMaxDmg(double max, AbstractCharacter agent) {
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
}
public static void checkForProc(AbstractCharacter attacker, AbstractWorldObject target, Item weapon){
if(weapon == null) // cant proc without a weapon
return;
for(Effect eff : weapon.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectsBase().getModifiers()){
if(mod.modType.equals(mbEnums.ModType.WeaponProc))
if(ThreadLocalRandom.current().nextInt(0,101) < 6)
((WeaponProcEffectModifier)mod).applyProc(attacker,target);
}
}
}
} }
+10
View File
@@ -11,6 +11,9 @@ package engine.gameManager;
import engine.mbEnums; import engine.mbEnums;
import engine.server.login.LoginServer; import engine.server.login.LoginServer;
import engine.server.world.WorldServer; import engine.server.world.WorldServer;
import engine.wpak.EffectsParser;
import engine.wpak.PowerActionParser;
import engine.wpak.PowersParser;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.io.BufferedReader; import java.io.BufferedReader;
@@ -164,6 +167,13 @@ public enum ConfigManager {
Logger.info("Compiling regex"); Logger.info("Compiling regex");
regex.put(MB_LOGIN_FNAME_REGEX, Pattern.compile(MB_LOGIN_FNAME_REGEX.getValue())); regex.put(MB_LOGIN_FNAME_REGEX, Pattern.compile(MB_LOGIN_FNAME_REGEX.getValue()));
Logger.info("Loading WPAK data");
//EffectsParser.parseWpakFile();
//PowersParser.parseWpakFile();
//PowerActionParser.parseWpakFile();
return true; return true;
} }
+1 -3
View File
@@ -10,9 +10,9 @@ package engine.gameManager;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import engine.db.handlers.*;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.db.handlers.*;
import engine.objects.*; import engine.objects.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.util.Hasher; import engine.util.Hasher;
@@ -69,8 +69,6 @@ public enum DbManager {
public static final dbBlueprintHandler BlueprintQueries = new dbBlueprintHandler(); public static final dbBlueprintHandler BlueprintQueries = new dbBlueprintHandler();
public static final dbShrineHandler ShrineQueries = new dbShrineHandler(); public static final dbShrineHandler ShrineQueries = new dbShrineHandler();
public static final dbRunegateHandler RunegateQueries = new dbRunegateHandler(); public static final dbRunegateHandler RunegateQueries = new dbRunegateHandler();
public static final dbPowerHandler PowerQueries = new dbPowerHandler();
public static final dbPetitionHandler PetitionQueries = new dbPetitionHandler(); public static final dbPetitionHandler PetitionQueries = new dbPetitionHandler();
private static final EnumMap<GameObjectType, ConcurrentHashMap<Integer, AbstractGameObject>> objectCache = new EnumMap<>(GameObjectType.class); private static final EnumMap<GameObjectType, ConcurrentHashMap<Integer, AbstractGameObject>> objectCache = new EnumMap<>(GameObjectType.class);
public static Hasher hasher; public static Hasher hasher;
+9 -6
View File
@@ -8,9 +8,9 @@
package engine.gameManager; package engine.gameManager;
import engine.mbEnums;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.devcmd.cmds.*; import engine.devcmd.cmds.*;
import engine.mbEnums;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Account; import engine.objects.Account;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -22,6 +22,13 @@ import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public enum DevCmdManager { public enum DevCmdManager {
// MB Dev Notes:
// Class registers "Dev Commands" where access requires
// Status = "ADMIN" be set in the obj_account table
//
// Use these at your own risk.
DEV_CMD_MANAGER; DEV_CMD_MANAGER;
public static ConcurrentHashMap<String, AbstractDevCmd> devCmds; public static ConcurrentHashMap<String, AbstractDevCmd> devCmds;
@@ -35,9 +42,6 @@ public enum DevCmdManager {
DevCmdManager.registerCommands(); DevCmdManager.registerCommands();
} }
/**
*
*/
private static void registerCommands() { private static void registerCommands() {
// Player // Player
@@ -72,6 +76,7 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new SetLevelCmd()); DevCmdManager.registerDevCmd(new SetLevelCmd());
DevCmdManager.registerDevCmd(new SetBaseClassCmd()); DevCmdManager.registerDevCmd(new SetBaseClassCmd());
DevCmdManager.registerDevCmd(new SetPromotionClassCmd()); DevCmdManager.registerDevCmd(new SetPromotionClassCmd());
DevCmdManager.registerDevCmd(new SetRaceCmd());
DevCmdManager.registerDevCmd(new SetRuneCmd()); DevCmdManager.registerDevCmd(new SetRuneCmd());
DevCmdManager.registerDevCmd(new GetOffsetCmd()); DevCmdManager.registerDevCmd(new GetOffsetCmd());
DevCmdManager.registerDevCmd(new AddGoldCmd()); DevCmdManager.registerDevCmd(new AddGoldCmd());
@@ -91,7 +96,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new RenameCmd()); DevCmdManager.registerDevCmd(new RenameCmd());
DevCmdManager.registerDevCmd(new CreateItemCmd()); DevCmdManager.registerDevCmd(new CreateItemCmd());
DevCmdManager.registerDevCmd(new SetRankCmd()); DevCmdManager.registerDevCmd(new SetRankCmd());
DevCmdManager.registerDevCmd(new MakeBaneCmd());
DevCmdManager.registerDevCmd(new RemoveBaneCmd()); DevCmdManager.registerDevCmd(new RemoveBaneCmd());
DevCmdManager.registerDevCmd(new SetBaneActiveCmd()); DevCmdManager.registerDevCmd(new SetBaneActiveCmd());
DevCmdManager.registerDevCmd(new SetAdminRuneCmd()); DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
@@ -118,7 +122,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new SetNpcNameCmd()); DevCmdManager.registerDevCmd(new SetNpcNameCmd());
DevCmdManager.registerDevCmd(new BoundsCmd()); DevCmdManager.registerDevCmd(new BoundsCmd());
DevCmdManager.registerDevCmd(new RegionCmd()); DevCmdManager.registerDevCmd(new RegionCmd());
DevCmdManager.registerDevCmd(new ApplyBonusCmd());
DevCmdManager.registerDevCmd(new SlotTestCmd()); DevCmdManager.registerDevCmd(new SlotTestCmd());
} }
@@ -7,13 +7,15 @@
// www.magicbane.com // www.magicbane.com
package engine.net; package engine.gameManager;
import engine.InterestManagement.WorldGrid;
import engine.math.Vector3fImmutable;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.net.AbstractNetMsg;
import engine.gameManager.SessionManager; import engine.net.Dispatch;
import engine.math.Vector3fImmutable; import engine.net.MessageDispatcher;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.objects.Item; import engine.objects.Item;
@@ -26,12 +28,17 @@ import java.util.HashSet;
import static engine.net.MessageDispatcher.dispatchCount; import static engine.net.MessageDispatcher.dispatchCount;
import static engine.net.MessageDispatcher.maxRecipients; import static engine.net.MessageDispatcher.maxRecipients;
/* // MB Dev Notes:
* Dispatch Message is the main interface to Magicbane's threaded // Dispatch Manager is the main interface to the threaded async message
* async message delivery system. // delivery system used by Magicbane.
*/ //
// A Dispatch is .borrowed() and used to wrap an outgoing protocol message.
// A distribution list is created and passed to the MessageDispatcher for
// delivery.
public class DispatchMessage { public enum DispatchManager {
DISPATCH_MANAGER;
public static void startMessagePump() { public static void startMessagePump() {
@@ -83,7 +90,7 @@ public class DispatchMessage {
sourcePlayer = (PlayerCharacter) sourceObject; sourcePlayer = (PlayerCharacter) sourceObject;
if (sourcePlayer.getClientConnection() != null && sendToSelf) { if (sourcePlayer.getClientConnection() != null && sendToSelf) {
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg); Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
@@ -151,7 +158,7 @@ public class DispatchMessage {
if (sourcePlayer.getClientConnection() != null && sendToSelf) { if (sourcePlayer.getClientConnection() != null && sendToSelf) {
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg); Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
@@ -280,7 +287,7 @@ public class DispatchMessage {
} }
protected static void serializeDispatch(Dispatch messageDispatch) { public static void serializeDispatch(Dispatch messageDispatch) {
ClientConnection connection; ClientConnection connection;
if (messageDispatch.player == null) { if (messageDispatch.player == null) {
+67 -62
View File
@@ -12,7 +12,6 @@ import engine.loot.ModTableEntry;
import engine.loot.ModTypeTableEntry; import engine.loot.ModTypeTableEntry;
import engine.loot.WorkOrder; import engine.loot.WorkOrder;
import engine.mbEnums; import engine.mbEnums;
import engine.net.DispatchMessage;
import engine.net.client.msg.ItemProductionMsg; import engine.net.client.msg.ItemProductionMsg;
import engine.objects.City; import engine.objects.City;
import engine.objects.Item; import engine.objects.Item;
@@ -23,19 +22,25 @@ import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.*; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public enum ForgeManager implements Runnable { public enum ForgeManager implements Runnable {
// MB Dev notes: // MB Dev notes:
// Class handles all forge rolling mechanics for the game. // Class implements forge rolling mechanics for Magicbane.
// //
// WorkOrders may be submitted from any thread: usually (ItemProductionMsgHandler). // .submit(workOrder) may be called from any thread: (ItemProductionMsgHandler).
// Concurrency is managed by the same lock used by the warehouse (city.cityTransactionLock). // Concurrency is managed by same lock used for warehouse (city.cityTransactionLock).
// WorkOrders are persisted then reconstituted at bootstrap from table dyn.workorders. // WorkOrders are persisted then reconstituted at bootstrap using table dyn.workorders.
// Forge window (ManageNPCMsg) uses item.upgradeDate to serialize completion time.
// //
// p.s. replaces garbage code that looked like it was written by a crack head with face boils. // Replaces garbage code that looked as if written by a mental patient.
//
// @TODO Reuse same set of virtual items for the life of a workOrder.
FORGE_MANAGER; FORGE_MANAGER;
@@ -52,33 +57,41 @@ public enum ForgeManager implements Runnable {
while (true) { while (true) {
// .forge is a delayQueue (blocking priority queue using an epoc sort) // The forge is a blocking priority queue using an epoc sort.
// workOrders are popped and processed when their completion time has passed. // workOrders are popped once the workOrder.completionTime has
// passed.
try { try {
workOrder = forge.take(); workOrder = forge.take();
// Early exit for completed workOrders loaded from disk
// or vendors who were re-deeded with items still cooking.
if (workOrder.vendor == null || workOrder.runCompleted.get())
continue;
// This workOrder has completed production.
if (workOrder.total_produced >= workOrder.total_to_produce) { if (workOrder.total_produced >= workOrder.total_to_produce) {
// Complete this workOrder. // CONFIRM_PRODUCE to refresh the interface after we add
// the Identified flag to the item.
for (Item workOrderItem : workOrder.cooking) { for (Item workOrderItem : workOrder.cooking) {
workOrderItem.flags.add(mbEnums.ItemFlags.Identified); workOrderItem.flags.add(mbEnums.ItemFlags.Identified);
ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, workOrderItem, mbEnums.ProductionActionType.CONFIRM_PRODUCE, true); ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, workOrderItem, mbEnums.ProductionActionType.CONFIRM_PRODUCE, true);
DispatchMessage.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false); DispatchManager.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
} }
workOrder.runCompleted = true; // Set this workOrder to completed and update on disk
// Update workOrder on disk workOrder.runCompleted.set(true);
DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
DbManager.WarehouseQueries.UPDATE_WORKORDER(workOrder); continue;
} }
if (workOrder.runCompleted) // PERSIST our current cooking batch of virtual
continue; // items then add to the vendor inventory
// Move current cooking batch to vendor inventory
completeWorkOrderBatch(workOrder); completeWorkOrderBatch(workOrder);
@@ -131,30 +144,32 @@ public enum ForgeManager implements Runnable {
if (validation_result != 0) if (validation_result != 0)
return validation_result; return validation_result;
try { // Configure this production run.
// Configure this production run.
try {
workOrder.workOrderID = workOrderCounter.incrementAndGet(); workOrder.workOrderID = workOrderCounter.incrementAndGet();
workOrder.rollingDuration = ForgeManager.calcRollingDuration(workOrder); workOrder.rollingDuration = NPCManager.calcRollingDuration(workOrder.vendor, workOrder.templateID);
workOrder.completionTime = System.currentTimeMillis() + workOrder.rollingDuration; workOrder.completionTime = System.currentTimeMillis() + workOrder.rollingDuration;
workOrder.slots_used = calcAvailableSlots(workOrder); workOrder.slots_used.set(calcAvailableSlots(workOrder));
if (workOrder.slots_used.get() == 0)
return 58;
workOrder.total_produced = 0; workOrder.total_produced = 0;
// Single item configuration // Single item configuration from protocol message (ItemProductionMsg)
if (!workOrder.multiple_slot_request && workOrder.total_to_produce == 0) if (workOrder.multiple_slot_request == false && workOrder.total_to_produce == 0)
workOrder.total_to_produce = 1; workOrder.total_to_produce = 1;
// Set total cost for production run // Calculate total cost for this production run
workOrder.total_to_produce *= workOrder.slots_used; workOrder.total_to_produce *= workOrder.slots_used.get();
workOrder.production_cost = calcProductionCost(workOrder); workOrder.production_cost = calcProductionCost(workOrder);
workOrder.production_cost_total.putAll(workOrder.production_cost); workOrder.production_cost.forEach((key, value) -> workOrder.production_cost_total.put(key, value * workOrder.total_to_produce));
workOrder.production_cost_total.forEach((key, value) -> workOrder.production_cost_total.put(key, value * workOrder.total_to_produce));
// Withdraw gold and resource costs. Availability has previously been validated. // Withdraw gold and resources. Availability has previously been validated.
if (!WorkOrder.withdrawWorkOrderCost(workOrder)) if (!WorkOrder.withdrawWorkOrderCost(workOrder))
return 58; //58: The formula is beyond the means of this facility return 58; //58: The formula is beyond the means of this facility
@@ -163,15 +178,17 @@ public enum ForgeManager implements Runnable {
forgeWorkOrderBatch(workOrder); forgeWorkOrderBatch(workOrder);
// Enqueue workOrder in the .forge and then // Assign the new workOrder to the vendor
// add the workOrder to it's vendor
vendorWorkOrderLookup.get(workOrder.vendor).add(workOrder); vendorWorkOrderLookup.get(workOrder.vendor).add(workOrder);
// Enqueue the new workOrder
forge.add(workOrder); forge.add(workOrder);
// PERSIST workOrder (dyn_workorders) // PERSIST workOrder (dyn_workorders)
DbManager.WarehouseQueries.UPDATE_WORKORDER(workOrder); DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
} catch (Exception e) { } catch (Exception e) {
Logger.error(e); Logger.error(e);
@@ -182,24 +199,6 @@ public enum ForgeManager implements Runnable {
return validation_result; return validation_result;
} }
public static long calcRollingDuration(WorkOrder workOrder) {
float rollingDuration;
rollingDuration = workOrder.vendor.getBuilding().getRank() * -5L + 40;
rollingDuration = TimeUnit.MINUTES.toMillis((long) rollingDuration);
rollingDuration *= Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue());
ItemTemplate template = ItemTemplate.templates.get(workOrder.templateID);
// Bane circles
if (template.item_bane_rank > 0)
rollingDuration = (long) template.item_bane_rank * 60 * 60 * 3 * 1000 * Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue());
return (long) rollingDuration;
}
public static int calcAvailableSlots(WorkOrder workOrder) { public static int calcAvailableSlots(WorkOrder workOrder) {
// Slots available in a forge are based on the npc rank // Slots available in a forge are based on the npc rank
@@ -213,7 +212,7 @@ public enum ForgeManager implements Runnable {
// Single item rolls are always a single slot // Single item rolls are always a single slot
if (availableSlots > 0 && !workOrder.multiple_slot_request) if (availableSlots > 0 && workOrder.multiple_slot_request == false)
availableSlots = 1; availableSlots = 1;
return availableSlots; return availableSlots;
@@ -266,12 +265,12 @@ public enum ForgeManager implements Runnable {
// Assign a prefix and suffix to this item if random rolled // Assign a prefix and suffix to this item if random rolled
if (workOrder.prefixToken == 0) if (workOrder.prefixToken == 0 && workOrder.vendor.getItemModTable().contains((template.modTable)))
forgedItem.prefixToken = calcRandomMod(workOrder.vendor, mbEnums.ItemModType.PREFIX, template.modTable); forgedItem.prefixToken = calcRandomMod(workOrder.vendor, mbEnums.ItemModType.PREFIX, template.modTable);
else else
forgedItem.prefixToken = workOrder.prefixToken; forgedItem.prefixToken = workOrder.prefixToken;
if (workOrder.suffixToken == 0) if (workOrder.suffixToken == 0 && workOrder.vendor.getItemModTable().contains((template.modTable)))
forgedItem.suffixToken = calcRandomMod(workOrder.vendor, mbEnums.ItemModType.SUFFIX, template.modTable); forgedItem.suffixToken = calcRandomMod(workOrder.vendor, mbEnums.ItemModType.SUFFIX, template.modTable);
else else
forgedItem.suffixToken = workOrder.suffixToken; forgedItem.suffixToken = workOrder.suffixToken;
@@ -312,7 +311,8 @@ public enum ForgeManager implements Runnable {
completedItem.prefixToken = virutalItem.prefixToken; completedItem.prefixToken = virutalItem.prefixToken;
completedItem.suffixToken = virutalItem.suffixToken; completedItem.suffixToken = virutalItem.suffixToken;
// Add effects to these tokens. Writes to disk. // Add effects for the tokens. Writes to disk using
// table dyn_item_enchantment
ItemManager.applyItemEffects(completedItem); ItemManager.applyItemEffects(completedItem);
@@ -321,9 +321,9 @@ public enum ForgeManager implements Runnable {
workOrder.vendor.charItemManager.addItemToInventory(completedItem); workOrder.vendor.charItemManager.addItemToInventory(completedItem);
ItemProductionMsg outMsg1 = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, completedItem, mbEnums.ProductionActionType.DEPOSIT, true); ItemProductionMsg outMsg1 = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, completedItem, mbEnums.ProductionActionType.DEPOSIT, true);
DispatchMessage.dispatchMsgToInterestArea(workOrder.vendor, outMsg1, mbEnums.DispatchChannel.SECONDARY, 700, false, false); DispatchManager.dispatchMsgToInterestArea(workOrder.vendor, outMsg1, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
ItemProductionMsg outMsg2 = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, completedItem, mbEnums.ProductionActionType.CONFIRM_DEPOSIT, true); ItemProductionMsg outMsg2 = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, completedItem, mbEnums.ProductionActionType.CONFIRM_DEPOSIT, true);
DispatchMessage.dispatchMsgToInterestArea(workOrder.vendor, outMsg2, mbEnums.DispatchChannel.SECONDARY, 700, false, false); DispatchManager.dispatchMsgToInterestArea(workOrder.vendor, outMsg2, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
toRemove.add(virutalItem); toRemove.add(virutalItem);
} }
@@ -333,7 +333,7 @@ public enum ForgeManager implements Runnable {
// Remove virtual items from the forge window // Remove virtual items from the forge window
ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, virtualItem, mbEnums.ProductionActionType.CONFIRM_SETPRICE, true); ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, virtualItem, mbEnums.ProductionActionType.CONFIRM_SETPRICE, true);
DispatchMessage.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false); DispatchManager.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
// Remove virtual item from all collections // Remove virtual item from all collections
@@ -349,21 +349,20 @@ public enum ForgeManager implements Runnable {
workOrder.completionTime = System.currentTimeMillis() + workOrder.rollingDuration; workOrder.completionTime = System.currentTimeMillis() + workOrder.rollingDuration;
for (int i = 0; i < workOrder.slots_used; ++i) { for (int i = 0; i < workOrder.slots_used.get(); ++i) {
Item forged_item = forgeItem(workOrder); Item forged_item = forgeItem(workOrder);
// Update NPC window // Update NPC window
ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, forged_item, mbEnums.ProductionActionType.CONFIRM_PRODUCE, true); ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, forged_item, mbEnums.ProductionActionType.CONFIRM_PRODUCE, true);
DispatchMessage.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false); DispatchManager.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
workOrder.total_produced = workOrder.total_produced + 1; workOrder.total_produced = workOrder.total_produced + 1;
} }
// Write updated workOrder to disk // Write updated workOrder to disk
DbManager.WarehouseQueries.UPDATE_WORKORDER(workOrder); DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
} }
public static int calcRandomMod(NPC vendor, mbEnums.ItemModType itemModType, int modTable) { public static int calcRandomMod(NPC vendor, mbEnums.ItemModType itemModType, int modTable) {
@@ -394,6 +393,12 @@ public enum ForgeManager implements Runnable {
if (rollForModifier < 80) { if (rollForModifier < 80) {
int randomModifier = LootManager.TableRoll(vendor.getLevel(), false); int randomModifier = LootManager.TableRoll(vendor.getLevel(), false);
modTableEntry = ModTableEntry.rollTable(modTypeTableEntry.modTableID, randomModifier); modTableEntry = ModTableEntry.rollTable(modTypeTableEntry.modTableID, randomModifier);
// @TODO : Figure out how a null can be returned from a defined set.
if (modTableEntry == null)
return 0;
EffectsBase effectsBase = PowersManager.getEffectByIDString(modTableEntry.action); EffectsBase effectsBase = PowersManager.getEffectByIDString(modTableEntry.action);
modifier = effectsBase.getToken(); modifier = effectsBase.getToken();
} }
+8 -10
View File
@@ -9,9 +9,7 @@
package engine.gameManager; package engine.gameManager;
import engine.mbEnums; import engine.mbEnums;
import engine.exception.MsgSendException;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.UpdateGoldMsg; import engine.net.client.msg.UpdateGoldMsg;
import engine.net.client.msg.group.GroupUpdateMsg; import engine.net.client.msg.group.GroupUpdateMsg;
@@ -46,12 +44,12 @@ public enum GroupManager {
} }
public static void LeaveGroup(ClientConnection origin) throws MsgSendException { public static void LeaveGroup(ClientConnection origin) {
PlayerCharacter source = SessionManager.getPlayerCharacter(origin); PlayerCharacter source = SessionManager.getPlayerCharacter(origin);
LeaveGroup(source); LeaveGroup(source);
} }
public static void LeaveGroup(PlayerCharacter source) throws MsgSendException { public static void LeaveGroup(PlayerCharacter source) {
if (source == null) if (source == null)
return; return;
@@ -80,7 +78,7 @@ public enum GroupManager {
groupUpdateMsg.setMessageType(3); groupUpdateMsg.setMessageType(3);
groupUpdateMsg.setPlayer(groupMember); groupUpdateMsg.setPlayer(groupMember);
Dispatch dispatch = Dispatch.borrow(source, groupUpdateMsg); Dispatch dispatch = Dispatch.borrow(source, groupUpdateMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
@@ -160,7 +158,7 @@ public enum GroupManager {
gum.setPlayerUUID(groupMember.getObjectUUID()); gum.setPlayerUUID(groupMember.getObjectUUID());
Dispatch dispatch = Dispatch.borrow(groupMember, gum); Dispatch dispatch = Dispatch.borrow(groupMember, gum);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -189,7 +187,7 @@ public enum GroupManager {
gum.setMessageType(1); gum.setMessageType(1);
gum.setPlayer(groupMember); gum.setPlayer(groupMember);
Dispatch dispatch = Dispatch.borrow(groupMember, gum); Dispatch dispatch = Dispatch.borrow(groupMember, gum);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
} }
@@ -217,7 +215,7 @@ public enum GroupManager {
gum.setPlayer(playerToRefresh); gum.setPlayer(playerToRefresh);
Dispatch dispatch = Dispatch.borrow(source, gum); Dispatch dispatch = Dispatch.borrow(source, gum);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
public static void RefreshOthersGroupList(PlayerCharacter source) { public static void RefreshOthersGroupList(PlayerCharacter source) {
@@ -372,12 +370,12 @@ public enum GroupManager {
ugm.configure(); ugm.configure();
Dispatch dispatch = Dispatch.borrow(splitPlayer, ugm); Dispatch dispatch = Dispatch.borrow(splitPlayer, ugm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
UpdateGoldMsg updateTargetGold = new UpdateGoldMsg(tar); UpdateGoldMsg updateTargetGold = new UpdateGoldMsg(tar);
updateTargetGold.configure(); updateTargetGold.configure();
DispatchMessage.dispatchMsgToInterestArea(tar, updateTargetGold, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(tar, updateTargetGold, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
// //TODO send group split message // //TODO send group split message
String text = "Group Split: " + amount; String text = "Group Split: " + amount;
+21 -30
View File
@@ -12,7 +12,6 @@ import engine.mbEnums;
import engine.mbEnums.BuildingGroup; import engine.mbEnums.BuildingGroup;
import engine.mbEnums.GuildHistoryType; import engine.mbEnums.GuildHistoryType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.guild.AcceptInviteToGuildMsg; import engine.net.client.msg.guild.AcceptInviteToGuildMsg;
import engine.net.client.msg.guild.GuildInfoMsg; import engine.net.client.msg.guild.GuildInfoMsg;
@@ -89,16 +88,17 @@ public enum GuildManager {
if (fromTeleportScreen) { if (fromTeleportScreen) {
dispatch = Dispatch.borrow(playerCharacter, msg); dispatch = Dispatch.borrow(playerCharacter, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
if (DbManager.GuildQueries.ADD_TO_GUILDHISTORY(guild.getObjectUUID(), playerCharacter, DateTime.now(), historyType)) { if (DbManager.GuildQueries.ADD_TO_GUILDHISTORY(guild.getObjectUUID(), playerCharacter, DateTime.now(), historyType)) {
GuildHistory guildHistory = new GuildHistory(guild.getObjectUUID(), guild.getName(), DateTime.now(), historyType); GuildHistory guildHistory = new GuildHistory(guild.getObjectUUID(), guild.getName(), DateTime.now(), historyType);
playerCharacter.getGuildHistory().add(guildHistory); playerCharacter.getGuildHistory().add(guildHistory);
} }
DispatchMessage.sendToAllInRange(playerCharacter, new GuildInfoMsg(playerCharacter, guild, 2)); DispatchManager.sendToAllInRange(playerCharacter, new GuildInfoMsg(playerCharacter, guild, 2));
// Send guild join message // Send guild join message
ChatManager.chatGuildInfo(playerCharacter, ChatManager.chatGuildInfo(playerCharacter,
playerCharacter.getFirstName() + " has joined the guild"); playerCharacter.getFirstName() + " has joined the guild");
@@ -108,44 +108,44 @@ public enum GuildManager {
// TODO update player to world // TODO update player to world
} }
public static void enterWorldMOTD(PlayerCharacter pc) { public static void enterWorldMOTD(PlayerCharacter playerCharacter) {
Guild guild; Guild guild;
Guild nation; Guild nation;
if (pc == null) { if (playerCharacter == null)
return; return;
}
guild = pc.getGuild(); guild = playerCharacter.getGuild();
if (guild == null || guild.getObjectUUID() == 0) // Don't send to errant if (guild == null || guild.getObjectUUID() == 0) // Don't send to errant
return; return;
// Send Guild MOTD // Send Guild MOTD
String motd = guild.getMOTD(); String motd = guild.getMOTD();
if (motd.length() > 0) {
ChatManager.chatGuildMOTD(pc, motd); if (!motd.isEmpty())
} ChatManager.chatGuildMOTD(playerCharacter, motd);
// Send Nation MOTD // Send Nation MOTD
nation = guild.getNation(); nation = guild.getNation();
if (nation != null) { if (nation != null)
if (nation.getObjectUUID() != 0) { // Don't send to errant nation if (nation.getObjectUUID() != 0) { // Don't send to errant nation
motd = nation.getMOTD(); motd = nation.getMOTD();
if (motd.length() > 0) {
ChatManager.chatNationMOTD(pc, motd); if (!motd.isEmpty())
} ChatManager.chatNationMOTD(playerCharacter, motd);
} }
}
// Send IC MOTD if player is IC // Send IC MOTD if player is IC
if (GuildStatusController.isInnerCouncil(pc.getGuildStatus())) { if (GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus())) {
motd = guild.getICMOTD(); motd = guild.getICMOTD();
if (motd.length() > 0) {
ChatManager.chatICMOTD(pc, motd); if (!motd.isEmpty())
} ChatManager.chatICMOTD(playerCharacter, motd);
} }
} }
@@ -156,12 +156,8 @@ public enum GuildManager {
if (guild == null) if (guild == null)
return; return;
int cityID = (city != null) ? city.getObjectUUID() : 0;
//update binds ingame //update binds ingame
for (PlayerCharacter playerCharacter : Guild.GuildRoster(guild)) { for (PlayerCharacter playerCharacter : Guild.GuildRoster(guild)) {
boolean updateBindBuilding = false; boolean updateBindBuilding = false;
@@ -170,7 +166,6 @@ public enum GuildManager {
if (oldBoundBuilding == null || oldBoundBuilding.getBlueprint() == null || oldBoundBuilding.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)) if (oldBoundBuilding == null || oldBoundBuilding.getBlueprint() == null || oldBoundBuilding.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL))
updateBindBuilding = true; updateBindBuilding = true;
if (updateBindBuilding) { if (updateBindBuilding) {
Building bindBuilding = null; Building bindBuilding = null;
if (city != null) if (city != null)
@@ -183,7 +178,6 @@ public enum GuildManager {
playerCharacter.setBindBuildingID(bindBuilding != null ? bindBuilding.getObjectUUID() : 0); playerCharacter.setBindBuildingID(bindBuilding != null ? bindBuilding.getObjectUUID() : 0);
} }
} }
} }
@@ -193,12 +187,9 @@ public enum GuildManager {
if (guild == null) if (guild == null)
return; return;
for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) { for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters())
if (player.getGuild().equals(guild)) if (player.getGuild().equals(guild))
DispatchMessage.sendToAllInRange(player, new GuildInfoMsg(player, guild, 2)); DispatchManager.sendToAllInRange(player, new GuildInfoMsg(player, guild, 2));
}
} }
public static Boolean meetsLoreRequirements(Guild guild, PlayerCharacter player) { public static Boolean meetsLoreRequirements(Guild guild, PlayerCharacter player) {
+2 -2
View File
@@ -102,7 +102,7 @@ public enum ItemManager {
if (characterSkill == null) if (characterSkill == null)
return false; return false;
if (characterSkill.getModifiedAmountBeforeMods() > required_value) if (characterSkill.getModifiedAmountBeforeMods() >= required_value)
return true; return true;
} }
@@ -192,7 +192,7 @@ public enum ItemManager {
if (!ValidRace(item, abstractCharacter.absRace)) if (!ValidRace(item, abstractCharacter.absRace))
return false; return false;
if (!ValidClass(item, abstractCharacter.absBaseClass,abstractCharacter.absPromotionClass)) if (!ValidClass(item, abstractCharacter.absBaseClass, abstractCharacter.absPromotionClass))
return false; return false;
//players can't wear 0 value items. //players can't wear 0 value items.
+11 -2
View File
@@ -10,7 +10,6 @@ package engine.gameManager;
import engine.loot.*; import engine.loot.*;
import engine.mbEnums; import engine.mbEnums;
import engine.net.DispatchMessage;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.chat.ChatSystemMsg; import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.*; import engine.objects.*;
@@ -25,6 +24,16 @@ import java.util.concurrent.ThreadLocalRandom;
*/ */
public enum LootManager { public enum LootManager {
// MB Dev notes:
// Class implements all loot generation mechanics for Magicbane.
// Class handles variables like drop rates
// Generation initiates in GenerateMobLoot and is passed a mobile
// Utilized database tables:
// - static_loot_bootySet - static_loot_gen - static_loot_item - static_loot_mod - static_loot_modtype
// Class also handles mechanic for Fate Peddler
//
LOOTMANAGER; LOOTMANAGER;
// Newer tables // Newer tables
@@ -86,7 +95,7 @@ public enum LootManager {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().zoneName + " has found the " + item.template.item_base_name + ". Are you tough enough to take it?"); ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().zoneName + " has found the " + item.template.item_base_name + ". Are you tough enough to take it?");
chatMsg.setMessageType(10); chatMsg.setMessageType(10);
chatMsg.setChannel(mbEnums.ChatChannelType.SYSTEM.getChannelID()); chatMsg.setChannel(mbEnums.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg); DispatchManager.dispatchMsgToAll(chatMsg);
} }
} }
+9 -11
View File
@@ -9,7 +9,6 @@
package engine.gameManager; package engine.gameManager;
import engine.InterestManagement.InterestManager; import engine.InterestManagement.InterestManager;
import engine.exception.MsgSendException;
import engine.math.Bounds; import engine.math.Bounds;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
@@ -18,7 +17,6 @@ import engine.mbEnums.DispatchChannel;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType; import engine.mbEnums.SourceType;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.MoveToPointMsg; import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.TeleportToPointMsg; import engine.net.client.msg.TeleportToPointMsg;
@@ -50,9 +48,9 @@ public enum MovementManager {
UpdateStateMsg rssm = new UpdateStateMsg(); UpdateStateMsg rssm = new UpdateStateMsg();
rssm.setPlayer(ac); rssm.setPlayer(ac);
if (ac.getObjectType() == GameObjectType.PlayerCharacter) if (ac.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(ac, rssm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(ac, rssm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else else
DispatchMessage.sendToAllInRange(ac, rssm); DispatchManager.sendToAllInRange(ac, rssm);
} }
/* /*
@@ -61,7 +59,7 @@ public enum MovementManager {
* target upon each move, unless something has set the firstHitCombatTarget * target upon each move, unless something has set the firstHitCombatTarget
* Also used to determine the size of a monster's hitbox * Also used to determine the size of a monster's hitbox
*/ */
public static void movement(MoveToPointMsg msg, AbstractCharacter toMove) throws MsgSendException { public static void movement(MoveToPointMsg msg, AbstractCharacter toMove) {
// check for stun/root // check for stun/root
if (!toMove.isAlive()) if (!toMove.isAlive())
@@ -241,7 +239,7 @@ public enum MovementManager {
// If it's not a player moving just send the message // If it's not a player moving just send the message
if ((toMove.getObjectType() == GameObjectType.PlayerCharacter) == false) { if ((toMove.getObjectType() == GameObjectType.PlayerCharacter) == false) {
DispatchMessage.sendToAllInRange(toMove, msg); DispatchManager.sendToAllInRange(toMove, msg);
return; return;
} }
@@ -253,9 +251,9 @@ public enum MovementManager {
player.setTimeStamp("lastMoveGate", System.currentTimeMillis()); player.setTimeStamp("lastMoveGate", System.currentTimeMillis());
if (collide) if (collide)
DispatchMessage.dispatchMsgToInterestArea(player, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(player, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else else
DispatchMessage.dispatchMsgToInterestArea(player, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); DispatchManager.dispatchMsgToInterestArea(player, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
// Handle formation movement if needed // Handle formation movement if needed
@@ -349,7 +347,7 @@ public enum MovementManager {
// Handle formation movement in group // Handle formation movement in group
public static void moveGroup(PlayerCharacter pc, ClientConnection origin, MoveToPointMsg msg) throws MsgSendException { public static void moveGroup(PlayerCharacter pc, ClientConnection origin, MoveToPointMsg msg) {
// get forward vector // get forward vector
Vector3f faceDir = new Vector3f(pc.getFaceDir().x, 0, pc.getFaceDir().z).normalize(); Vector3f faceDir = new Vector3f(pc.getFaceDir().x, 0, pc.getFaceDir().z).normalize();
// get perpendicular vector // get perpendicular vector
@@ -443,7 +441,7 @@ public enum MovementManager {
groupMsg.setStartCoord(member.getLoc()); groupMsg.setStartCoord(member.getLoc());
groupMsg.setEndCoord(destination); groupMsg.setEndCoord(destination);
groupMsg.clearTarget(); groupMsg.clearTarget();
DispatchMessage.sendToAllInRange(member, groupMsg); DispatchManager.sendToAllInRange(member, groupMsg);
// update group member // update group member
member.setFaceDir(destination.subtract2D(member.getLoc()).normalize()); member.setFaceDir(destination.subtract2D(member.getLoc()).normalize());
@@ -463,7 +461,7 @@ public enum MovementManager {
InterestManager.INTERESTMANAGER.HandleLoadForTeleport((PlayerCharacter) teleporter); InterestManager.INTERESTMANAGER.HandleLoadForTeleport((PlayerCharacter) teleporter);
TeleportToPointMsg msg = new TeleportToPointMsg(teleporter, teleporter.loc.getX(), teleporter.loc.getY(), teleporter.loc.getZ(), 0, -1, -1); TeleportToPointMsg msg = new TeleportToPointMsg(teleporter, teleporter.loc.getX(), teleporter.loc.getY(), teleporter.loc.getZ(), 0, -1, -1);
DispatchMessage.dispatchMsgToInterestArea(oldLoc, teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(oldLoc, teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} }
+26 -2
View File
@@ -15,7 +15,6 @@ import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.PetMsg; import engine.net.client.msg.PetMsg;
@@ -29,6 +28,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import static engine.math.FastMath.acos; import static engine.math.FastMath.acos;
@@ -68,7 +68,7 @@ public enum NPCManager {
PetMsg petMsg = new PetMsg(5, null); PetMsg petMsg = new PetMsg(5, null);
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg); Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
} }
} }
@@ -525,9 +525,33 @@ public enum NPCManager {
ConcurrentHashMap.KeySetView<WorkOrder, Boolean> vendorWorkOrders = ForgeManager.vendorWorkOrderLookup.get(npc); ConcurrentHashMap.KeySetView<WorkOrder, Boolean> vendorWorkOrders = ForgeManager.vendorWorkOrderLookup.get(npc);
if (vendorWorkOrders == null)
return itemList;
for (WorkOrder workOrder : vendorWorkOrders) for (WorkOrder workOrder : vendorWorkOrders)
itemList.addAll(workOrder.cooking); itemList.addAll(workOrder.cooking);
return itemList; return itemList;
} }
public static long calcRollingDuration(NPC vendor, int templateID) {
ItemTemplate template = ItemTemplate.templates.get(templateID);
float rollingDuration;
if (template == null)
return 0;
if (template.item_bane_rank > 0)
return (long) (template.item_bane_rank * 60 * 60 * 3 * 1000 * Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue()));
if (vendor.building == null)
return 600;
rollingDuration = vendor.getBuilding().getRank() * -5L + 40;
rollingDuration = TimeUnit.MINUTES.toMillis((long) rollingDuration);
rollingDuration *= Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue());
return (long) rollingDuration;
}
} }
+192 -81
View File
@@ -10,8 +10,6 @@ package engine.gameManager;
import engine.InterestManagement.Terrain; import engine.InterestManagement.Terrain;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.db.handlers.dbEffectsBaseHandler;
import engine.db.handlers.dbPowerHandler;
import engine.db.handlers.dbSkillReqHandler; import engine.db.handlers.dbSkillReqHandler;
import engine.job.AbstractJob; import engine.job.AbstractJob;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
@@ -25,13 +23,18 @@ import engine.math.Vector3fImmutable;
import engine.mbEnums.*; import engine.mbEnums.*;
import engine.net.ByteBufferWriter; import engine.net.ByteBufferWriter;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.*; import engine.net.client.msg.*;
import engine.objects.*; import engine.objects.*;
import engine.powers.*; import engine.powers.*;
import engine.powers.poweractions.AbstractPowerAction; import engine.powers.poweractions.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.wpak.EffectsParser;
import engine.wpak.PowerActionParser;
import engine.wpak.PowersParser;
import engine.wpak.data.Effect;
import engine.wpak.data.PowerAction;
import engine.wpakpowers.WpakPowerManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
@@ -54,7 +57,6 @@ public enum PowersManager {
public static HashMap<String, AbstractPowerAction> powerActionsByIDString = new HashMap<>(); public static HashMap<String, AbstractPowerAction> powerActionsByIDString = new HashMap<>();
public static HashMap<Integer, AbstractPowerAction> powerActionsByID = new HashMap<>(); public static HashMap<Integer, AbstractPowerAction> powerActionsByID = new HashMap<>();
public static HashMap<String, Integer> ActionTokenByIDString = new HashMap<>(); public static HashMap<String, Integer> ActionTokenByIDString = new HashMap<>();
public static HashMap<String, Integer> AnimationOverrides = new HashMap<>();
public static HashMap<Integer, ArrayList<RunePowerEntry>> _allRunePowers; public static HashMap<Integer, ArrayList<RunePowerEntry>> _allRunePowers;
public static HashMap<Integer, ArrayList<RuneSkillAdjustEntry>> _allRuneSkillAdjusts; public static HashMap<Integer, ArrayList<RuneSkillAdjustEntry>> _allRuneSkillAdjusts;
public static HashMap<String, HashMap<ResourceType, Integer>> _effect_costMaps = new HashMap<>(); public static HashMap<String, HashMap<ResourceType, Integer>> _effect_costMaps = new HashMap<>();
@@ -62,10 +64,12 @@ public enum PowersManager {
public static void initPowersManager(boolean fullPowersLoad) { public static void initPowersManager(boolean fullPowersLoad) {
if (fullPowersLoad) if (fullPowersLoad) {
PowersManager.InitializePowers(); //PowersManager.InitializePowers();
else WpakPowerManager.init();
}else {
PowersManager.InitializeLoginPowers(); PowersManager.InitializeLoginPowers();
}
PowersManager.js = JobScheduler.getInstance(); PowersManager.js = JobScheduler.getInstance();
@@ -113,33 +117,138 @@ public enum PowersManager {
return powerEntries; return powerEntries;
} }
public static void InitializeEffects(){
// Add EffectsBase
ArrayList<EffectsBase> effectList = new ArrayList<>();
for (Effect entry : WpakPowerManager._effectsLookup.values()) {
EffectsBase effectBase = new EffectsBase(entry);
effectList.add(effectBase);
PowersManager.effectsBaseByToken.put(effectBase.getToken(), effectBase);
PowersManager.effectsBaseByIDString.put(effectBase.getIDString(), effectBase);
}
}
public static void InitializePowerActions(){
// Add PowerActions
//AbstractPowerAction.getAllPowerActions(PowersManager.powerActionsByIDString, PowersManager.powerActionsByID, PowersManager.effectsBaseByIDString);
HashMap<String, EffectsBase> effects = PowersManager.effectsBaseByIDString;
for (PowerAction powerAction : WpakPowerManager._powerActionLookup.values()) {
AbstractPowerAction apa;
PowerActionType type = powerAction.action_type;
String IDString = powerAction.action_id;
int token = DbManager.hasher.SBStringHash(IDString);
//cache token, used for applying effects.
PowersManager.ActionTokenByIDString.put(IDString, token);
apa = null;
switch (type) {
default:
Logger.error("valid type not found for poweraction of ID" + IDString);
break;
case ApplyEffect:
apa = new ApplyEffectPowerAction(powerAction, effects);
break;
case ApplyEffects:
apa = new ApplyEffectsPowerAction(powerAction, effects);
break;
case DeferredPower:
apa = new DeferredPowerPowerAction(powerAction, effects);
break;
case DamageOverTime:
apa = new DamageOverTimePowerAction(powerAction, effects);
break;
case Peek:
apa = new PeekPowerAction(powerAction);
break;
case Charm:
apa = new CharmPowerAction(powerAction);
break;
case RemoveEffect:
apa = new RemoveEffectPowerAction(powerAction);
break;
case Track:
apa = new TrackPowerAction(powerAction, effects);
break;
case DirectDamage:
apa = new DirectDamagePowerAction(powerAction, effects);
break;
case Transform:
apa = new TransformPowerAction(powerAction, effects);
break;
case CreateMob:
apa = new CreateMobPowerAction(powerAction);
break;
case Invis:
apa = new InvisPowerAction(powerAction, effects);
break;
case ClearNearbyAggro:
apa = new ClearNearbyAggroPowerAction(powerAction);
break;
case MobRecall:
apa = new MobRecallPowerAction(powerAction);
break;
case SetItemFlag:
apa = new SetItemFlagPowerAction(powerAction);
break;
case SimpleDamage:
apa = new SimpleDamagePowerAction(powerAction);
break;
case TransferStatOT:
apa = new TransferStatOTPowerAction(powerAction, effects);
break;
case TransferStat:
apa = new TransferStatPowerAction(powerAction, effects);
break;
case Teleport:
apa = new TeleportPowerAction(powerAction);
break;
case TreeChoke:
apa = new TreeChokePowerAction(powerAction);
break;
case Block:
apa = new BlockPowerAction(powerAction);
break;
case Resurrect:
apa = new ResurrectPowerAction(powerAction);
break;
case ClaimMine:
apa = new ClaimMinePowerAction(powerAction);
break;
case Recall:
apa = new RecallPowerAction(powerAction);
break;
case SpireDisable:
apa = new SpireDisablePowerAction(powerAction);
break;
case Steal:
apa = new StealPowerAction(powerAction);
break;
case Summon:
apa = new SummonPowerAction(powerAction);
break;
case RunegateTeleport:
apa = new RunegateTeleportPowerAction(powerAction);
break;
}
PowersManager.powerActionsByIDString.put(IDString, apa);
}
}
// This pre-loads all powers and effects // This pre-loads all powers and effects
public static void InitializePowers() { public static void InitializePowers() {
// Add EffectsBase EffectsParser.parseWpakFile();
ArrayList<EffectsBase> ebList = dbEffectsBaseHandler.getAllEffectsBase(); PowersParser.parseWpakFile();
PowerActionParser.parseWpakFile();
for (EffectsBase eb : ebList) { //Initialize Effects Data
PowersManager.effectsBaseByToken.put(eb.getToken(), eb); InitializeEffects();
PowersManager.effectsBaseByIDString.put(eb.getIDString(), eb);
} //Initialize Power Actions
InitializePowerActions();
// Add Fail Conditions
EffectsBase.getFailConditions(PowersManager.effectsBaseByIDString);
// Add Modifiers to Effects
dbEffectsBaseHandler.cacheAllEffectModifiers();
// Add Source Types to Effects
dbPowerHandler.addAllSourceTypes();
dbPowerHandler.addAllAnimationOverrides();
// Add PowerActions
AbstractPowerAction.getAllPowerActions(PowersManager.powerActionsByIDString, PowersManager.powerActionsByID, PowersManager.effectsBaseByIDString);
// Load valid Item Flags
// AbstractPowerAction.loadValidItemFlags(PowersManager.powerActionsByIDString);
// get all PowersBase // get all PowersBase
ArrayList<PowersBase> pbList = dbSkillReqHandler.getAllPowersBase(); ArrayList<PowersBase> pbList = dbSkillReqHandler.getAllPowersBase();
@@ -160,29 +269,36 @@ public enum PowersManager {
} }
public static EffectsBase setEffectToken(int ID, int token) {
for (EffectsBase eb : PowersManager.effectsBaseByIDString.values()) {
if (eb.getUUID() == ID) {
eb.setToken(token);
return eb;
}
}
return null;
}
public static void usePower(final PerformActionMsg msg, ClientConnection origin, public static void usePower(final PerformActionMsg msg, ClientConnection origin,
boolean sendCastToSelf) { boolean sendCastToSelf) {
if (ConfigManager.MB_RULESET.getValue() == "LORE") { if (ConfigManager.MB_RULESET.getValue().equals("LORE")) {
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID()); PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
PlayerCharacter caster = origin.getPlayerCharacter(); PlayerCharacter caster = origin.getPlayerCharacter();
PlayerCharacter target = PlayerCharacter.getFromCache(msg.getTargetID()); PlayerCharacter target = PlayerCharacter.getFromCache(msg.getTargetID());
if (pb != null && pb.isHarmful == false) { if (pb != null && pb.enforceLore()) {
if (caster.guild.equals(Guild.getErrantGuild())) //if (caster.guild.equals(Guild.getErrantGuild()))
return; // return;
if (target != null && caster.guild.getGuildType().equals(target.guild.getGuildType()) == false) if (target != null && caster.guild.getGuildType().equals(target.guild.getGuildType()) == false && target.getObjectType().equals(GameObjectType.Building) == false) {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
DispatchManager.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.setIsCasting(false);
}
return; return;
}
} }
} }
@@ -191,7 +307,7 @@ public enum PowersManager {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID()); RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg); Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
// Send Fail to cast message // Send Fail to cast message
PlayerCharacter pc = SessionManager PlayerCharacter pc = SessionManager
@@ -244,7 +360,7 @@ public enum PowersManager {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID()); RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
return false; return false;
} }
@@ -488,7 +604,7 @@ public enum PowersManager {
0f, 0f, 0, null, 0f, 0f, 0, null,
9999, 0); 9999, 0);
mhm.setOmitFromChat(1); mhm.setOmitFromChat(1);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, mhm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, mhm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} }
else if (pb.useMana()) else if (pb.useMana())
if (playerCharacter.getMana() < cost) if (playerCharacter.getMana() < cost)
@@ -519,7 +635,7 @@ public enum PowersManager {
// else send recycle message to unlock power // else send recycle message to unlock power
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID()); RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
//what the fuck? //what the fuck?
@@ -529,7 +645,7 @@ public enum PowersManager {
// else // else
// msg.setUnknown04(1); // Regular Race, use mana? // msg.setUnknown04(1); // Regular Race, use mana?
int tr = msg.getNumTrains(); int tr = msg.getNumTrains();
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, sendCastToSelf, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, sendCastToSelf, false);
//Make new msg.. //Make new msg..
PerformActionMsg copyMsg = new PerformActionMsg(msg); PerformActionMsg copyMsg = new PerformActionMsg(msg);
@@ -540,7 +656,7 @@ public enum PowersManager {
playerCharacter.update(); playerCharacter.update();
playerCharacter.setSit(false); playerCharacter.setSit(false);
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter); UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} }
@@ -683,8 +799,8 @@ public enum PowersManager {
msg.setNumTrains(9999); msg.setNumTrains(9999);
DispatchMessage.sendToAllInRange(caster, msg); DispatchManager.sendToAllInRange(caster, msg);
DispatchMessage.sendToAllInRange(caster, msg); DispatchManager.sendToAllInRange(caster, msg);
msg.setNumTrains(tr); msg.setNumTrains(tr);
@@ -751,7 +867,7 @@ public enum PowersManager {
performActionMsg.setUnknown04(2); performActionMsg.setUnknown04(2);
dispatch = Dispatch.borrow(playerCharacter, performActionMsg); dispatch = Dispatch.borrow(playerCharacter, performActionMsg);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, performActionMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, performActionMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
return; return;
} }
@@ -909,10 +1025,6 @@ public enum PowersManager {
if (pb.isHarmful()) if (pb.isHarmful())
mobTarget.handleDirectAggro(playerCharacter); mobTarget.handleDirectAggro(playerCharacter);
} }
//Power is aiding a target, handle aggro if combat target is a Mob.
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
PlayerCharacter pcTarget = (PlayerCharacter) target;
}
// update target of used power timer // update target of used power timer
@@ -934,8 +1046,7 @@ public enum PowersManager {
continue; continue;
// If something blocks the action, then stop // If something blocks the action, then stop
if (ab.blocked(target, pb, trains)) { if (ab.blocked(target,pb.vampDrain)) {
PowersManager.sendEffectMsg(playerCharacter, 5, ab, pb); PowersManager.sendEffectMsg(playerCharacter, 5, ab, pb);
continue; continue;
} }
@@ -946,7 +1057,7 @@ public enum PowersManager {
// if (!stackType.equals("IgnoreStack")) { // if (!stackType.equals("IgnoreStack")) {
if (target.getEffects().containsKey(stackType)) { if (target.getEffects().containsKey(stackType)) {
// remove any existing power that overrides // remove any existing power that overrides
Effect ef = target.getEffects().get(stackType); engine.objects.Effect ef = target.getEffects().get(stackType);
AbstractEffectJob effect = null; AbstractEffectJob effect = null;
if (ef != null) { if (ef != null) {
JobContainer jc = ef.getJobContainer(); JobContainer jc = ef.getJobContainer();
@@ -992,7 +1103,7 @@ public enum PowersManager {
PerformActionMsg castMsg = new PerformActionMsg(msg); PerformActionMsg castMsg = new PerformActionMsg(msg);
castMsg.setNumTrains(9999); castMsg.setNumTrains(9999);
castMsg.setUnknown04(2); castMsg.setUnknown04(2);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, castMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, castMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
msgCasted = true; msgCasted = true;
} }
} }
@@ -1002,7 +1113,7 @@ public enum PowersManager {
PerformActionMsg castMsg = new PerformActionMsg(msg); PerformActionMsg castMsg = new PerformActionMsg(msg);
castMsg.setNumTrains(9999); castMsg.setNumTrains(9999);
castMsg.setUnknown04(2); castMsg.setUnknown04(2);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, castMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, castMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
msgCasted = true; msgCasted = true;
} }
@@ -1063,7 +1174,7 @@ public enum PowersManager {
msg.setNumTrains(9999); msg.setNumTrains(9999);
msg.setUnknown04(2); msg.setUnknown04(2);
DispatchMessage.sendToAllInRange(caster, msg); DispatchManager.sendToAllInRange(caster, msg);
// get target loc // get target loc
Vector3fImmutable targetLoc = msg.getTargetLoc(); Vector3fImmutable targetLoc = msg.getTargetLoc();
@@ -1110,7 +1221,7 @@ public enum PowersManager {
continue; continue;
// If something blocks the action, then stop // If something blocks the action, then stop
if (ab.blocked(target, pb, trains)) if (ab.blocked(target,pb.vampDrain))
continue; continue;
// TODO handle overwrite stack order here // TODO handle overwrite stack order here
String stackType = ab.getStackType(); String stackType = ab.getStackType();
@@ -1118,7 +1229,7 @@ public enum PowersManager {
// if (!stackType.equals("IgnoreStack")) { // if (!stackType.equals("IgnoreStack")) {
if (target.getEffects().containsKey(stackType)) { if (target.getEffects().containsKey(stackType)) {
// remove any existing power that overrides // remove any existing power that overrides
Effect ef = target.getEffects().get(stackType); engine.objects.Effect ef = target.getEffects().get(stackType);
AbstractEffectJob effect = null; AbstractEffectJob effect = null;
if (ef != null) { if (ef != null) {
JobContainer jc = ef.getJobContainer(); JobContainer jc = ef.getJobContainer();
@@ -1170,7 +1281,7 @@ public enum PowersManager {
// TODO echo power use to everyone else // TODO echo power use to everyone else
msg.setNumTrains(9999); msg.setNumTrains(9999);
msg.setUnknown04(2); msg.setUnknown04(2);
DispatchMessage.sendToAllInRange(caster, msg); DispatchManager.sendToAllInRange(caster, msg);
} }
@@ -1248,7 +1359,7 @@ public enum PowersManager {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token); RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg); Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
@@ -1374,7 +1485,7 @@ public enum PowersManager {
PerformActionMsg msg = new PerformActionMsg(pb.getToken(), PerformActionMsg msg = new PerformActionMsg(pb.getToken(),
trains, ac.getObjectType().ordinal(), ac.getObjectUUID(), tarType, tarID, 0, trains, ac.getObjectType().ordinal(), ac.getObjectUUID(), tarType, tarID, 0,
0, 0, 1, 0); 0, 0, 1, 0);
DispatchMessage.sendToAllInRange(target, msg); DispatchManager.sendToAllInRange(target, msg);
ConcurrentHashMap<String, JobContainer> timers = ac.getTimers(); ConcurrentHashMap<String, JobContainer> timers = ac.getTimers();
@@ -1424,7 +1535,7 @@ public enum PowersManager {
if (trains < ab.getMinTrains() || trains > ab.getMaxTrains()) if (trains < ab.getMinTrains() || trains > ab.getMaxTrains())
continue; continue;
// If something blocks the action, then stop // If something blocks the action, then stop
if (ab.blocked(target, pb, trains)) if (ab.blocked(target,pb.vampDrain))
// sendPowerMsg(pc, 5, msg); // sendPowerMsg(pc, 5, msg);
continue; continue;
// TODO handle overwrite stack order here // TODO handle overwrite stack order here
@@ -1432,7 +1543,7 @@ public enum PowersManager {
stackType = (stackType.equals("IgnoreStack")) ? Integer.toString(ab.getUUID()) : stackType; stackType = (stackType.equals("IgnoreStack")) ? Integer.toString(ab.getUUID()) : stackType;
if (target.getEffects().containsKey(stackType)) { if (target.getEffects().containsKey(stackType)) {
// remove any existing power that overrides // remove any existing power that overrides
Effect ef = target.getEffects().get(stackType); engine.objects.Effect ef = target.getEffects().get(stackType);
AbstractEffectJob effect = null; AbstractEffectJob effect = null;
if (ef != null) { if (ef != null) {
JobContainer jc = ef.getJobContainer(); JobContainer jc = ef.getJobContainer();
@@ -1492,7 +1603,7 @@ public enum PowersManager {
.getObjectType().ordinal(), ac.getObjectUUID(), target.getObjectType().ordinal(), .getObjectType().ordinal(), ac.getObjectUUID(), target.getObjectType().ordinal(),
target.getObjectUUID(), 0, 0, 0, 2, 0); target.getObjectUUID(), 0, 0, 0, 2, 0);
DispatchMessage.sendToAllInRange(ac, msg); DispatchManager.sendToAllInRange(ac, msg);
} }
} }
@@ -1879,7 +1990,7 @@ public enum PowersManager {
stackType = (stackType.equals("IgnoreStack")) ? Integer stackType = (stackType.equals("IgnoreStack")) ? Integer
.toString(toRemove.getUUID()) : stackType; .toString(toRemove.getUUID()) : stackType;
if (fromChant) { if (fromChant) {
Effect eff = awo.getEffects().get(stackType); engine.objects.Effect eff = awo.getEffects().get(stackType);
if (eff != null) if (eff != null)
eff.cancelJob(true); eff.cancelJob(true);
} else } else
@@ -1943,7 +2054,7 @@ public enum PowersManager {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token); RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
Dispatch dispatch = Dispatch.borrow(pc, recyclePowerMsg); Dispatch dispatch = Dispatch.borrow(pc, recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
@@ -2103,12 +2214,12 @@ public enum PowersManager {
case 3: case 3:
case 4: case 4:
msg.setUnknown04(2); msg.setUnknown04(2);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
break; break;
default: default:
msg.setUnknown04(1); msg.setUnknown04(1);
Dispatch dispatch = Dispatch.borrow(playerCharacter, msg); Dispatch dispatch = Dispatch.borrow(playerCharacter, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} }
} }
@@ -2126,7 +2237,7 @@ public enum PowersManager {
ApplyEffectMsg aem = new ApplyEffectMsg(pc, pc, 0, eb.getToken(), 9, pb.getToken(), pb.getName()); ApplyEffectMsg aem = new ApplyEffectMsg(pc, pc, 0, eb.getToken(), 9, pb.getToken(), pb.getName());
aem.setUnknown03(type); aem.setUnknown03(type);
DispatchMessage.dispatchMsgToInterestArea(pc, aem, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(pc, aem, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} catch (Exception e) { } catch (Exception e) {
@@ -2147,7 +2258,7 @@ public enum PowersManager {
aem.setUnknown03(type); aem.setUnknown03(type);
aem.setUnknown05(1); aem.setUnknown05(1);
DispatchMessage.dispatchMsgToInterestArea(pc, aem, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchManager.dispatchMsgToInterestArea(pc, aem, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
} catch (Exception e) { } catch (Exception e) {
@@ -2162,7 +2273,7 @@ public enum PowersManager {
switch (type) { switch (type) {
case 3: case 3:
case 4: case 4:
DispatchMessage.sendToAllInRange(mob, msg); DispatchManager.sendToAllInRange(mob, msg);
} }
} }
@@ -2401,7 +2512,7 @@ public enum PowersManager {
if (pam != null) { if (pam != null) {
pam.setNumTrains(9999); pam.setNumTrains(9999);
pam.setUnknown04(2); pam.setUnknown04(2);
DispatchMessage.sendToAllInRange(ac, pam); DispatchManager.sendToAllInRange(ac, pam);
} }
} }
} }
@@ -2465,7 +2576,7 @@ public enum PowersManager {
PerformActionMsg pam = new PerformActionMsg(pb.getToken(), 9999, ac PerformActionMsg pam = new PerformActionMsg(pb.getToken(), 9999, ac
.getObjectType().ordinal(), ac.getObjectUUID(), target.getObjectType().ordinal(), .getObjectType().ordinal(), ac.getObjectUUID(), target.getObjectType().ordinal(),
target.getObjectUUID(), 0, 0, 0, 2, 0); target.getObjectUUID(), 0, 0, 0, 2, 0);
DispatchMessage.sendToAllInRange(ac, pam); DispatchManager.sendToAllInRange(ac, pam);
} }
} }
+1 -1
View File
@@ -8,12 +8,12 @@
package engine.gameManager; package engine.gameManager;
import engine.mbEnums;
import engine.InterestManagement.Terrain; import engine.InterestManagement.Terrain;
import engine.math.Bounds; import engine.math.Bounds;
import engine.math.Vector2f; import engine.math.Vector2f;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.City; import engine.objects.City;
import engine.objects.Zone; import engine.objects.Zone;
+2 -2
View File
@@ -10,10 +10,10 @@
package engine.jobs; package engine.jobs;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.DispatchManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.ChatChannelType; import engine.mbEnums.ChatChannelType;
import engine.net.DispatchMessage;
import engine.net.client.msg.chat.ChatSystemMsg; import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.City; import engine.objects.City;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -66,7 +66,7 @@ public class ActivateBaneJob extends AbstractScheduleJob {
msg.setMessageType(4); // Error message msg.setMessageType(4); // Error message
msg.setChannel(ChatChannelType.SYSTEM.getChannelID()); msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(msg); DispatchManager.dispatchMsgToAll(msg);
} }
@Override @Override
+3 -3
View File
@@ -9,9 +9,9 @@
package engine.jobs; package engine.jobs;
import engine.mbEnums.DoorState; import engine.gameManager.DispatchManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.net.DispatchMessage; import engine.mbEnums.DoorState;
import engine.net.client.msg.DoorTryOpenMsg; import engine.net.client.msg.DoorTryOpenMsg;
import engine.objects.Blueprint; import engine.objects.Blueprint;
import engine.objects.Building; import engine.objects.Building;
@@ -40,7 +40,7 @@ public class DoorCloseJob extends AbstractScheduleJob {
this.building.setDoorState(doorNumber, DoorState.CLOSED); this.building.setDoorState(doorNumber, DoorState.CLOSED);
DoorTryOpenMsg msg = new DoorTryOpenMsg(door, this.building.getObjectUUID(), 0, (byte) 0); DoorTryOpenMsg msg = new DoorTryOpenMsg(door, this.building.getObjectUUID(), 0, (byte) 0);
DispatchMessage.sendToAllInRange(building, msg); DispatchManager.sendToAllInRange(building, msg);
} }
+2 -2
View File
@@ -9,11 +9,11 @@
package engine.jobs; package engine.jobs;
import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.job.JobContainer; import engine.job.JobContainer;
import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
+3 -3
View File
@@ -9,11 +9,11 @@
package engine.jobs; package engine.jobs;
import engine.mbEnums; import engine.gameManager.DispatchManager;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.msg.TrackArrowMsg; import engine.net.client.msg.TrackArrowMsg;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -84,7 +84,7 @@ public class TrackJob extends AbstractEffectJob {
TrackArrowMsg tam = new TrackArrowMsg(rotation); TrackArrowMsg tam = new TrackArrowMsg(rotation);
Dispatch dispatch = Dispatch.borrow(pc, tam); Dispatch dispatch = Dispatch.borrow(pc, tam);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
} }
} }
+1 -1
View File
@@ -9,9 +9,9 @@
package engine.jobs; package engine.jobs;
import engine.mbEnums.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.mbEnums.GameObjectType;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.Mob; import engine.objects.Mob;
import engine.objects.NPC; import engine.objects.NPC;
+1
View File
@@ -14,6 +14,7 @@ import engine.job.AbstractScheduleJob;
import engine.net.client.msg.PerformActionMsg; import engine.net.client.msg.PerformActionMsg;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import engine.powers.PowersBase; import engine.powers.PowersBase;
import engine.wpak.data.Power;
public class UsePowerJob extends AbstractScheduleJob { public class UsePowerJob extends AbstractScheduleJob {
+42
View File
@@ -0,0 +1,42 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.jobs;
import engine.gameManager.PowersManager;
import engine.job.AbstractScheduleJob;
import engine.net.client.msg.PerformActionMsg;
import engine.objects.AbstractWorldObject;
import engine.objects.PlayerCharacter;
import engine.wpakpowers.WpakPowerManager;
public class WpakUsePowerJob extends AbstractScheduleJob {
private final PlayerCharacter pc;
private final PerformActionMsg msg;
private AbstractWorldObject target;
public WpakUsePowerJob(PlayerCharacter pc, PerformActionMsg msg, AbstractWorldObject tar) {
super();
this.pc = pc;
this.msg = msg;
this.target = tar;
}
@Override
protected void doJob() {
WpakPowerManager.finishUsePower(this.msg, this.pc,this.target);
}
@Override
protected void _cancelJob() {
//cast stopped early, reset recycle timer
PowersManager.finishRecycleTime(this.msg, this.pc, true);
}
}
+70 -43
View File
@@ -25,24 +25,25 @@ import java.time.ZoneId;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Delayed; import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class WorkOrder implements Delayed { public class WorkOrder implements Delayed {
// MB Dev notes: // MB Dev notes:
// Class defines a Forge rolling request made through a // Class defines a Forge rolling request made through a vendor
// vendor; then passed to the ForgeManager singleton // interaction; submitted to the ForgeManager singleton for completion.
// for completion.
// //
// A workOrder once created will last until all items are // A workOrder once created will last until all items are either
// either completed or junked. They are persisted in the // completed or junked. They are persisted in the table dyn_workorders.
// table dyn_workorders.
public int workOrderID; public int workOrderID;
public NPC vendor; public NPC vendor;
public int slots_used; public AtomicInteger slots_used = new AtomicInteger(0);
public int total_to_produce; public int total_to_produce;
public int total_produced; public int total_produced;
public boolean multiple_slot_request; public boolean multiple_slot_request;
@@ -54,8 +55,7 @@ public class WorkOrder implements Delayed {
public int suffixToken; public int suffixToken;
public long rollingDuration; public long rollingDuration;
public long completionTime; public long completionTime;
public boolean runCompleted = false; public AtomicBoolean runCompleted = new AtomicBoolean(false);
public boolean runCanceled = false;
// This collection is serialized to the vendor rolling window in ManageNPCMsg. // This collection is serialized to the vendor rolling window in ManageNPCMsg.
@@ -72,7 +72,7 @@ public class WorkOrder implements Delayed {
this.workOrderID = jsonWorkOrder.getInt("workOrderID"); this.workOrderID = jsonWorkOrder.getInt("workOrderID");
this.vendor = NPC.getNPC(jsonWorkOrder.getInt("vendor")); this.vendor = NPC.getNPC(jsonWorkOrder.getInt("vendor"));
this.slots_used = jsonWorkOrder.getInt("slots_used"); this.slots_used.set(jsonWorkOrder.getInt("slots_used"));
this.total_to_produce = jsonWorkOrder.getInt("total_to_produce"); this.total_to_produce = jsonWorkOrder.getInt("total_to_produce");
this.total_produced = jsonWorkOrder.getInt("total_produced"); this.total_produced = jsonWorkOrder.getInt("total_produced");
this.multiple_slot_request = jsonWorkOrder.getBoolean("multiple_slot_request"); this.multiple_slot_request = jsonWorkOrder.getBoolean("multiple_slot_request");
@@ -80,10 +80,14 @@ public class WorkOrder implements Delayed {
this.item_name_override = jsonWorkOrder.getString("item_name_override"); this.item_name_override = jsonWorkOrder.getString("item_name_override");
this.prefixToken = jsonWorkOrder.getInt("prefixToken"); this.prefixToken = jsonWorkOrder.getInt("prefixToken");
this.suffixToken = jsonWorkOrder.getInt("suffixToken"); this.suffixToken = jsonWorkOrder.getInt("suffixToken");
this.slots_used = jsonWorkOrder.getInt("slots_used");
this.rollingDuration = jsonWorkOrder.getLong("rollingDuration"); this.rollingDuration = jsonWorkOrder.getLong("rollingDuration");
this.completionTime = jsonWorkOrder.getLong("completionTime"); this.completionTime = jsonWorkOrder.getLong("completionTime");
this.runCompleted = jsonWorkOrder.getBoolean("runCompleted"); this.runCompleted.set(jsonWorkOrder.getBoolean("runCompleted"));
// Vendor sanity check. Might have been deleted
if (this.vendor == null)
return;
JSONObject productionCostMap = jsonWorkOrder.getJSONObject("production_cost"); JSONObject productionCostMap = jsonWorkOrder.getJSONObject("production_cost");
@@ -108,6 +112,7 @@ public class WorkOrder implements Delayed {
for (Object o : tokenList) { for (Object o : tokenList) {
int prefix = ((JSONArray) o).getInt(0); int prefix = ((JSONArray) o).getInt(0);
int suffix = ((JSONArray) o).getInt(1); int suffix = ((JSONArray) o).getInt(1);
Item cookingItem = ForgeManager.forgeItem(this); Item cookingItem = ForgeManager.forgeItem(this);
cookingItem.prefixToken = prefix; cookingItem.prefixToken = prefix;
cookingItem.suffixToken = suffix; cookingItem.suffixToken = suffix;
@@ -130,7 +135,8 @@ public class WorkOrder implements Delayed {
if (!workOrder.vendor.charItemManager.hasRoomInventory(template.item_wt)) if (!workOrder.vendor.charItemManager.hasRoomInventory(template.item_wt))
return 30; //30: That person cannot carry that item return 30; //30: That person cannot carry that item
if (!workOrder.vendor.getItemModTable().contains((template.modTable))) if ((workOrder.prefixToken != 0 || workOrder.suffixToken != 0) &&
!workOrder.vendor.getItemModTable().contains((template.modTable)))
return 59; //59: This hireling does not have this formula return 59; //59: This hireling does not have this formula
if (!Warehouse.calcCostOverrun(workOrder).isEmpty()) if (!Warehouse.calcCostOverrun(workOrder).isEmpty())
@@ -147,53 +153,46 @@ public class WorkOrder implements Delayed {
public static boolean withdrawWorkOrderCost(WorkOrder workOrder) { public static boolean withdrawWorkOrderCost(WorkOrder workOrder) {
HashMap<mbEnums.ResourceType, Integer> modified_production_cost = new HashMap<>(workOrder.production_cost_total);
if (workOrder.vendor.building.getCity() == null) if (workOrder.vendor.building.getCity() == null)
return false; return false;
int strongbox = workOrder.vendor.building.getStrongboxValue(); int strongbox = workOrder.vendor.building.getStrongboxValue();
// Strongbox can cover total gold cost; // Early exit if strongbox can cover gold only roll.
if (workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD) <= strongbox) {
if (workOrder.production_cost_total.size() == 1 && workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD) <= strongbox) {
workOrder.vendor.building.setStrongboxValue(strongbox - workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD)); workOrder.vendor.building.setStrongboxValue(strongbox - workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD));
workOrder.production_cost_total.put(mbEnums.ResourceType.GOLD, 0); return true;
// Early exit for Strongbox covering gold only rolls
if (workOrder.production_cost_total.size() == 1)
return true;
} else {
int remainingAmount = workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD) - strongbox;
workOrder.vendor.building.setStrongboxValue(0);
workOrder.production_cost_total.put(mbEnums.ResourceType.GOLD, workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD) - remainingAmount);
} }
// There is an overflow at this point and a warehouse is required // Warehouse is required after this point
Warehouse warehouse = workOrder.vendor.building.getCity().warehouse; Warehouse warehouse = workOrder.vendor.building.getCity().warehouse;
if (warehouse == null) if (warehouse == null)
return false; return false;
// Take from strongbox first and deduct from production cost total
if (workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD) <= strongbox) {
workOrder.vendor.building.setStrongboxValue(strongbox - workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD));
modified_production_cost.put(mbEnums.ResourceType.GOLD, 0);
} else {
int overflowAmount = workOrder.production_cost_total.get(mbEnums.ResourceType.GOLD) - strongbox;
workOrder.vendor.building.setStrongboxValue(0);
modified_production_cost.put(mbEnums.ResourceType.GOLD, overflowAmount);
}
// Deduct total production cost from warehouse // Deduct total production cost from warehouse
workOrder.production_cost_total.forEach((key, value) -> warehouse.resources.put(key, warehouse.resources.get(key) - value)); modified_production_cost.forEach((key, value) -> warehouse.resources.put(key, warehouse.resources.get(key) - value));
DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse); DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse);
return true; return true;
} }
@Override
public long getDelay(TimeUnit unit) {
long timeRemaining = completionTime - System.currentTimeMillis();
return unit.convert(timeRemaining, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.completionTime, ((WorkOrder) o).completionTime);
}
public static JSONObject toJson(WorkOrder workOrder) { public static JSONObject toJson(WorkOrder workOrder) {
@@ -203,7 +202,7 @@ public class WorkOrder implements Delayed {
jsonWorkOrder.put("workOrderID", workOrder.workOrderID); jsonWorkOrder.put("workOrderID", workOrder.workOrderID);
jsonWorkOrder.put("vendor", workOrder.vendor.getObjectUUID()); jsonWorkOrder.put("vendor", workOrder.vendor.getObjectUUID());
jsonWorkOrder.put("slots_used", workOrder.slots_used); jsonWorkOrder.put("slots_used", workOrder.slots_used.get());
jsonWorkOrder.put("total_to_produce", workOrder.total_to_produce); jsonWorkOrder.put("total_to_produce", workOrder.total_to_produce);
jsonWorkOrder.put("total_produced", workOrder.total_produced); jsonWorkOrder.put("total_produced", workOrder.total_produced);
jsonWorkOrder.put("multiple_slot_request", workOrder.multiple_slot_request); jsonWorkOrder.put("multiple_slot_request", workOrder.multiple_slot_request);
@@ -215,7 +214,7 @@ public class WorkOrder implements Delayed {
jsonWorkOrder.put("suffixToken", workOrder.suffixToken); jsonWorkOrder.put("suffixToken", workOrder.suffixToken);
jsonWorkOrder.put("rollingDuration", workOrder.rollingDuration); jsonWorkOrder.put("rollingDuration", workOrder.rollingDuration);
jsonWorkOrder.put("completionTime", workOrder.completionTime); jsonWorkOrder.put("completionTime", workOrder.completionTime);
jsonWorkOrder.put("runCompleted", workOrder.runCompleted); jsonWorkOrder.put("runCompleted", workOrder.runCompleted.get());
ArrayList<Integer[]> cookingTokens = new ArrayList<>(); ArrayList<Integer[]> cookingTokens = new ArrayList<>();
@@ -235,7 +234,7 @@ public class WorkOrder implements Delayed {
String outSTring = "\r\nwordOrderID: " + this.workOrderID + "\r\n" + String outSTring = "\r\nwordOrderID: " + this.workOrderID + "\r\n" +
"vendor: " + this.vendor.getObjectUUID() + "\r\n" + "vendor: " + this.vendor.getObjectUUID() + "\r\n" +
"slots_used: " + this.slots_used + "\r\n" + "slots_used: " + this.slots_used.get() + "\r\n" +
"total_to_produce: " + this.total_to_produce + "\r\n" + "total_to_produce: " + this.total_to_produce + "\r\n" +
"total_produced: " + this.total_produced + "\r\n" + "total_produced: " + this.total_produced + "\r\n" +
"templateID: " + this.templateID + "\r\n" + "templateID: " + this.templateID + "\r\n" +
@@ -244,12 +243,40 @@ public class WorkOrder implements Delayed {
"suffixToken: " + this.suffixToken + "\r\n" + "suffixToken: " + this.suffixToken + "\r\n" +
"rollingDuration: " + duration + "\r\n" + "rollingDuration: " + duration + "\r\n" +
"completionTime: " + localDateTime + "\r\n" + "completionTime: " + localDateTime + "\r\n" +
"runCompleted: " + this.runCompleted + "\r\n" + "runCompleted: " + this.runCompleted.get() + "\r\n" +
"runCanceled: " + this.runCanceled + "\r\n" +
"productionCost: " + this.production_cost.toString() + "\r\n" + "productionCost: " + this.production_cost.toString() + "\r\n" +
"totalProductionCost:: " + this.production_cost_total.toString(); "totalProductionCost:: " + this.production_cost_total.toString();
return outSTring; return outSTring;
} }
@Override
public long getDelay(TimeUnit unit) {
long timeRemaining = completionTime - System.currentTimeMillis();
return unit.convert(timeRemaining, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.completionTime, ((WorkOrder) o).completionTime);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
WorkOrder otherWorkOrder = (WorkOrder) obj;
return workOrderID == otherWorkOrder.workOrderID;
}
@Override
public int hashCode() {
return Objects.hash(workOrderID);
}
} }
+693 -575
View File
File diff suppressed because it is too large Load Diff
+155 -103
View File
@@ -8,6 +8,7 @@
package engine.mobileAI; package engine.mobileAI;
import engine.InterestManagement.RealmMap;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.gameManager.*; import engine.gameManager.*;
import engine.math.Vector3f; import engine.math.Vector3f;
@@ -15,9 +16,8 @@ import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.mobileAI.Threads.MobAIThread; import engine.mobileAI.Threads.MobAIThread;
import engine.mobileAI.Threads.Respawner; import engine.mobileAI.Threads.ReSpawner;
import engine.mobileAI.utilities.MovementUtilities; import engine.mobileAI.utilities.MovementUtilities;
import engine.net.DispatchMessage;
import engine.net.client.msg.PerformActionMsg; import engine.net.client.msg.PerformActionMsg;
import engine.net.client.msg.PowerProjectileMsg; import engine.net.client.msg.PowerProjectileMsg;
import engine.objects.*; import engine.objects.*;
@@ -30,6 +30,7 @@ import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@@ -37,6 +38,13 @@ import static engine.math.FastMath.sqr;
public class MobAI { public class MobAI {
// MB Dev notes:
// Class implements mobile AI mechanics for Magicbane.
//
// Controls all mob actions from regular mobs to pets and guards.
// Initiates in the "DetermineAction" method and branches from there
//
// CombatManager.class implements shared combat routines for all avatars.
private static void attackTarget(Mob mob, AbstractWorldObject target) { private static void attackTarget(Mob mob, AbstractWorldObject target) {
@@ -50,8 +58,7 @@ public class MobAI {
return; return;
} }
if (target.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && if (target.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && !mob.canSee((AbstractCharacter) target)) {
!mob.canSee((AbstractCharacter) target)) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
} }
@@ -93,7 +100,10 @@ public class MobAI {
public static void attackPlayer(Mob mob, PlayerCharacter target) { public static void attackPlayer(Mob mob, PlayerCharacter target) {
try { try {
if (target == null || !target.isAlive() || !target.isActive()) {
mob.setCombatTarget(null);
return;
}
if (!mob.canSee(target)) { if (!mob.canSee(target)) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
@@ -115,11 +125,11 @@ public class MobAI {
if (mob.isMoving() && mob.getRange() > 20) if (mob.isMoving() && mob.getRange() > 20)
return; return;
CombatManager.combatCycle(mob, mob.combatTarget); CombatManager.combatCycle(mob, target);
} }
if (target.getPet() != null) if (target.getPet() != null)
if (target.getPet().getCombatTarget() == null && target.getPet().assist == true) if (target.getPet().getCombatTarget() == null && target.getPet().assist)
target.getPet().setCombatTarget(mob); target.getPet().setCombatTarget(mob);
} catch (Exception e) { } catch (Exception e) {
@@ -154,7 +164,7 @@ public class MobAI {
if (mob.isSiege()) { if (mob.isSiege()) {
PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target); PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
ppm.setRange(50); ppm.setRange(50);
DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); DispatchManager.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
} }
} catch (Exception e) { } catch (Exception e) {
@@ -165,13 +175,14 @@ public class MobAI {
public static void attackMob(Mob mob, Mob target) { public static void attackMob(Mob mob, Mob target) {
try { try {
if (mob == null || target == null)
return;
if (mob.getRange() >= 30 && mob.isMoving()) if (mob.getRange() >= 30 && mob.isMoving())
return; return;
//no weapons, default mob attack speed 3 seconds. //no weapons, default mob attack speed 3 seconds.
CombatManager.combatCycle(mob, target); CombatManager.combatCycle(mob, target);
} catch (Exception e) { } catch (Exception e) {
@@ -188,10 +199,9 @@ public class MobAI {
// early exit while waiting to patrol again. // early exit while waiting to patrol again.
// Minions are force marched if captain is alive // Minions are force marched if captain is alive
boolean forced = mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION) && boolean forced = mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION) && mob.guardCaptain.isAlive();
mob.guardCaptain.isAlive();
if (mob.stopPatrolTime + (patrolDelay * 1000) > System.currentTimeMillis()) if (mob.stopPatrolTime + (patrolDelay * 1000L) > System.currentTimeMillis())
if (!forced) if (!forced)
return; return;
@@ -210,6 +220,7 @@ public class MobAI {
} }
} }
assert mob.patrolPoints != null;
if (mob.lastPatrolPointIndex > mob.patrolPoints.size() - 1) if (mob.lastPatrolPointIndex > mob.patrolPoints.size() - 1)
mob.lastPatrolPointIndex = 0; mob.lastPatrolPointIndex = 0;
@@ -229,6 +240,7 @@ public class MobAI {
if (mob.agentType.equals(mbEnums.AIAgentType.GUARDCAPTAIN)) if (mob.agentType.equals(mbEnums.AIAgentType.GUARDCAPTAIN))
for (Integer minionUUID : mob.minions) { for (Integer minionUUID : mob.minions) {
Mob minion = Mob.getMob(minionUUID); Mob minion = Mob.getMob(minionUUID);
assert minion != null;
if (minion.isAlive() && minion.combatTarget == null) if (minion.isAlive() && minion.combatTarget == null)
MobAI.patrol(minion); MobAI.patrol(minion);
} }
@@ -252,7 +264,7 @@ public class MobAI {
if (mob == null) if (mob == null)
return false; return false;
if (mob.isPlayerGuard() == true) { if (mob.isPlayerGuard()) {
if (mob.agentType.equals(mbEnums.AIAgentType.GUARDWALLARCHER)) if (mob.agentType.equals(mbEnums.AIAgentType.GUARDWALLARCHER))
return false; //wall archers don't cast return false; //wall archers don't cast
@@ -263,14 +275,13 @@ public class MobAI {
// exception allowing werewolf and werebear guard captains to cast // exception allowing werewolf and werebear guard captains to cast
if (mbEnums.MinionType.ContractToMinionMap.get(contractID).isMage() == false && contractID != 980103 && contractID != 980104) if (!mbEnums.MinionType.ContractToMinionMap.get(contractID).isMage() && contractID != 980103 && contractID != 980104)
return false; return false;
} }
// Mobile has no powers defined in mobbase or contract.. // Mobile has no powers defined in mobbase or contract..
if (PowersManager.getPowersForRune(mob.getMobBaseID()).isEmpty() && if (PowersManager.getPowersForRune(mob.getMobBaseID()).isEmpty() && PowersManager.getPowersForRune(contractID).isEmpty())
PowersManager.getPowersForRune(contractID).isEmpty())
return false; return false;
if (mob.nextCastTime == 0) if (mob.nextCastTime == 0)
@@ -370,7 +381,7 @@ public class MobAI {
msg.setUnknown04(2); msg.setUnknown04(2);
PowersManager.finishUseMobPower(msg, mob, 0, 0); PowersManager.finishUseMobPower(msg, mob, 0, 0);
long randomCooldown = (long) ((ThreadLocalRandom.current().nextInt(10, 15) * 1000) * MobAIThread.AI_CAST_FREQUENCY); long randomCooldown = (long) ((ThreadLocalRandom.current().nextInt(10, 15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
mob.nextCastTime = System.currentTimeMillis() + randomCooldown; mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
return true; return true;
@@ -426,7 +437,7 @@ public class MobAI {
ChatManager.chatSayInfo(null, mob.getName() + " calls for help!"); ChatManager.chatSayInfo(null, mob.getName() + " calls for help!");
Zone mobCamp = mob.getParentZone(); Zone mobCamp = mob.parentZone;
for (Mob helper : mobCamp.zoneMobSet) { for (Mob helper : mobCamp.zoneMobSet) {
if (helper.behaviourType.respondsToCallForHelp && helper.behaviourType.BehaviourHelperType.equals(mob.behaviourType)) { if (helper.behaviourType.respondsToCallForHelp && helper.behaviourType.BehaviourHelperType.equals(mob.behaviourType)) {
@@ -454,7 +465,7 @@ public class MobAI {
if (mob == null) if (mob == null)
return; return;
if (mob.getTimestamps().containsKey("lastExecution") == false) if (!mob.getTimestamps().containsKey("lastExecution"))
mob.getTimestamps().put("lastExecution", System.currentTimeMillis()); mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
if (System.currentTimeMillis() < mob.getTimeStamp("lastExecution")) if (System.currentTimeMillis() < mob.getTimeStamp("lastExecution"))
@@ -474,11 +485,11 @@ public class MobAI {
if (mob.despawned && mob.isPlayerGuard()) { if (mob.despawned && mob.isPlayerGuard()) {
if (mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION)) { if (mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION)) {
if (mob.guardCaptain.isAlive() == false || ((Mob) mob.guardCaptain).despawned == true) { if (!mob.guardCaptain.isAlive() || ((Mob) mob.guardCaptain).despawned) {
//minions don't respawn while guard captain is dead //minions don't respawn while guard captain is dead
if (mob.isAlive() == false) { if (!mob.isAlive()) {
mob.deathTime = System.currentTimeMillis(); mob.deathTime = System.currentTimeMillis();
return; return;
} }
@@ -519,12 +530,12 @@ public class MobAI {
} }
if (mob.agentType.equals(mbEnums.AIAgentType.PET) == false) if (!mob.agentType.equals(mbEnums.AIAgentType.PET))
checkToSendMobHome(mob); checkToSendMobHome(mob);
if (mob.getCombatTarget() != null) { if (mob.getCombatTarget() != null) {
if (mob.getCombatTarget().isAlive() == false) { if (!mob.getCombatTarget().isAlive()) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
} }
@@ -533,12 +544,12 @@ public class MobAI {
PlayerCharacter target = (PlayerCharacter) mob.getCombatTarget(); PlayerCharacter target = (PlayerCharacter) mob.getCombatTarget();
if (mob.playerAgroMap.containsKey(target.getObjectUUID()) == false) { if (!mob.playerAgroMap.containsKey(target.getObjectUUID())) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
} }
if (mob.canSee((PlayerCharacter) mob.getCombatTarget()) == false) { if (!mob.canSee((PlayerCharacter) mob.getCombatTarget())) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
} }
@@ -579,9 +590,9 @@ public class MobAI {
ConcurrentHashMap<Integer, Float> loadedPlayers = aiAgent.playerAgroMap; ConcurrentHashMap<Integer, Float> loadedPlayers = aiAgent.playerAgroMap;
for (Entry playerEntry : loadedPlayers.entrySet()) { for (Entry<Integer, Float> playerEntry : loadedPlayers.entrySet()) {
int playerID = (int) playerEntry.getKey(); int playerID = playerEntry.getKey();
PlayerCharacter loadedPlayer = PlayerCharacter.getPlayerCharacter(playerID); PlayerCharacter loadedPlayer = PlayerCharacter.getPlayerCharacter(playerID);
//Player is null, let's remove them from the list. //Player is null, let's remove them from the list.
@@ -605,12 +616,12 @@ public class MobAI {
// No aggro for this race type // No aggro for this race type
if (aiAgent.notEnemy.size() > 0 && aiAgent.notEnemy.contains(loadedPlayer.race.getRaceType().getMonsterType()) == true) if (!aiAgent.notEnemy.isEmpty() && aiAgent.notEnemy.contains(loadedPlayer.race.getRaceType().getMonsterType()))
continue; continue;
//mob has enemies and this player race is not it //mob has enemies and this player race is not it
if (aiAgent.enemy.size() > 0 && aiAgent.enemy.contains(loadedPlayer.race.getRaceType().getMonsterType()) == false) if (!aiAgent.enemy.isEmpty() && !aiAgent.enemy.contains(loadedPlayer.race.getRaceType().getMonsterType()))
continue; continue;
if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) { if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) {
@@ -651,49 +662,44 @@ public class MobAI {
mob.updateLocation(); mob.updateLocation();
switch (mob.behaviourType) { if (mob.behaviourType == mbEnums.MobBehaviourType.Pet1) {
if (mob.guardCaptain == null)
return;
case Pet1: //mob no longer has its owner loaded, translate pet to owner
if (mob.guardCaptain == null) if (!mob.playerAgroMap.containsKey(mob.guardCaptain.getObjectUUID())) {
MovementManager.translocate(mob, mob.guardCaptain.getLoc());
return;
}
if (mob.getCombatTarget() == null) {
//move back to owner
if (mob.getRange() * mob.getRange() >= mob.loc.distanceSquared(mob.guardCaptain.loc))
return; return;
//mob no longer has its owner loaded, translate pet to owner mob.destination = mob.guardCaptain.getLoc();
MovementUtilities.moveToLocation(mob, mob.destination, 5, false);
} else
chaseTarget(mob);
} else {
if (mob.getCombatTarget() == null) {
if (!mob.playerAgroMap.containsKey(mob.guardCaptain.getObjectUUID())) { if (!mob.isMoving()) {
MovementManager.translocate(mob, mob.guardCaptain.getLoc());
return;
}
if (mob.getCombatTarget() == null) { // Minions only patrol on their own if captain is dead.
//move back to owner if (!mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION))
patrol(mob);
if (mob.getRange() * mob.getRange() >= mob.loc.distanceSquared(mob.guardCaptain.loc)) else if (!mob.guardCaptain.isAlive())
return; patrol(mob);
mob.destination = mob.guardCaptain.getLoc();
MovementUtilities.moveToLocation(mob, mob.destination, 5, false);
} else } else
chaseTarget(mob); mob.stopPatrolTime = System.currentTimeMillis();
break; } else {
default: chaseTarget(mob);
if (mob.getCombatTarget() == null) { }
if (!mob.isMoving()) {
// Minions only patrol on their own if captain is dead.
if (mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION) == false)
patrol(mob);
else if (mob.guardCaptain.isAlive() == false)
patrol(mob);
} else
mob.stopPatrolTime = System.currentTimeMillis();
} else {
chaseTarget(mob);
}
break;
} }
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage());
@@ -718,7 +724,6 @@ public class MobAI {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) { if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) {
aiAgent.despawn(); aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis(); aiAgent.deathTime = System.currentTimeMillis();
return;
} }
//No items in inventory. //No items in inventory.
} else { } else {
@@ -727,20 +732,18 @@ public class MobAI {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) { if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
aiAgent.despawn(); aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis(); aiAgent.deathTime = System.currentTimeMillis();
return;
} }
//Mob never had Loot. //Mob never had Loot.
} else { } else {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) { if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
aiAgent.despawn(); aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis(); aiAgent.deathTime = System.currentTimeMillis();
return;
} }
} }
} }
} else if (System.currentTimeMillis() > aiAgent.deathTime + (aiAgent.spawnDelay * 1000L)) { } else if (System.currentTimeMillis() > aiAgent.deathTime + (aiAgent.spawnDelay * 1000L)) {
aiAgent.respawnTime = aiAgent.deathTime + (aiAgent.spawnDelay * 1000L); aiAgent.respawnTime = aiAgent.deathTime + (aiAgent.spawnDelay * 1000L);
Respawner.respawnQueue.put(aiAgent); ReSpawner.respawnQueue.put(aiAgent);
} }
} catch (Exception e) { } catch (Exception e) {
Logger.info(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForRespawn" + " " + e.getMessage()); Logger.info(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForRespawn" + " " + e.getMessage());
@@ -752,14 +755,13 @@ public class MobAI {
//checks if mob can attack based on attack timer and range //checks if mob can attack based on attack timer and range
if (mob.isAlive() == false) if (!mob.isAlive())
return; return;
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
return; return;
if (mob.getCombatTarget().getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false && if (mob.getCombatTarget().getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && !MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) && !mob.agentType.equals(mbEnums.AIAgentType.PET)) {
mob.agentType.equals(mbEnums.AIAgentType.PET) == false) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
@@ -782,7 +784,7 @@ public class MobAI {
City current = ZoneManager.getCityAtLocation(mob.getLoc()); City current = ZoneManager.getCityAtLocation(mob.getLoc());
if (current == null || current.equals(mob.getGuild().getOwnedCity()) == false) { if (current == null || !current.equals(mob.getGuild().getOwnedCity())) {
PowersBase recall = PowersManager.getPowerByToken(-1994153779); PowersBase recall = PowersManager.getPowerByToken(-1994153779);
PowersManager.useMobPower(mob, mob, recall, 40); PowersManager.useMobPower(mob, mob, recall, 40);
@@ -796,18 +798,18 @@ public class MobAI {
Mob minion = Mob.getMob(minionUUID); Mob minion = Mob.getMob(minionUUID);
PowersManager.useMobPower(minion, minion, recall, 40); PowersManager.useMobPower(minion, minion, recall, 40);
assert minion != null;
minion.setCombatTarget(null); minion.setCombatTarget(null);
} }
} }
} }
} else if (MovementUtilities.inRangeOfBindLocation(mob) == false) { } else if (!MovementUtilities.inRangeOfBindLocation(mob)) {
PowersBase recall = PowersManager.getPowerByToken(-1994153779); PowersBase recall = PowersManager.getPowerByToken(-1994153779);
PowersManager.useMobPower(mob, mob, recall, 40); PowersManager.useMobPower(mob, mob, recall, 40);
mob.setCombatTarget(null); mob.setCombatTarget(null);
for (Integer playerEntry : mob.playerAgroMap.keySet()) mob.playerAgroMap.replaceAll((e, v) -> 0f);
mob.playerAgroMap.put(playerEntry, 0f);
} }
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
@@ -818,9 +820,9 @@ public class MobAI {
try { try {
if (mob.getTimestamps().containsKey("lastChase") == false) if (!mob.getTimestamps().containsKey("lastChase"))
mob.getTimestamps().put("lastChase", System.currentTimeMillis()); mob.getTimestamps().put("lastChase", System.currentTimeMillis());
else if (System.currentTimeMillis() < mob.getTimestamps().get("lastChase").longValue() + (750 + ThreadLocalRandom.current().nextInt(0, 500))) else if (System.currentTimeMillis() < mob.getTimestamps().get("lastChase") + (750 + ThreadLocalRandom.current().nextInt(0, 500)))
return; return;
mob.getTimestamps().put("lastChase", System.currentTimeMillis()); mob.getTimestamps().put("lastChase", System.currentTimeMillis());
@@ -868,7 +870,7 @@ public class MobAI {
Mob aggroMob = (Mob) awoMob; Mob aggroMob = (Mob) awoMob;
//don't attack other guards //don't attack other guards
if (aggroMob.isGuard() == true) if (aggroMob.isGuard())
continue; continue;
//don't attack pets //don't attack pets
@@ -919,7 +921,7 @@ public class MobAI {
try { try {
if (mob.guardCaptain == null && mob.isNecroPet() == false && mob.isSiege() == false) if (mob.guardCaptain == null && !mob.isNecroPet() && !mob.isSiege())
if (ZoneManager.seaFloor.zoneMobSet.contains(mob)) if (ZoneManager.seaFloor.zoneMobSet.contains(mob))
mob.killCharacter("no owner"); mob.killCharacter("no owner");
@@ -930,7 +932,7 @@ public class MobAI {
//recover health //recover health
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false) if (!mob.getTimestamps().containsKey("HEALTHRECOVERED"))
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis()); mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000) if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
@@ -951,26 +953,67 @@ public class MobAI {
private static void hamletGuardLogic(Mob mob) { private static void hamletGuardLogic(Mob mob) {
try { try {
//safehold guard
if (mob.getCombatTarget() == null) if (ConfigManager.MB_RULESET.getValue().equals("LORE")) {
safeGuardAggro(mob); //lore guard aggro to kill members of opposing charters
else if (mob.getCombatTarget().isAlive() == false) if (mob.getCombatTarget() == null || !mob.combatTarget.isAlive())
safeGuardAggro(mob); hamletGuardAggro(mob);
else if (!mob.getCombatTarget().isAlive())
hamletGuardAggro(mob);
} else {
//safehold guard
if (mob.getCombatTarget() == null || !mob.combatTarget.isAlive())
safeGuardAggro(mob);
else if (!mob.getCombatTarget().isAlive())
safeGuardAggro(mob);
}
checkForAttack(mob); checkForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: HamletGuardLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: HamletGuardLogic" + " " + e.getMessage());
} }
} }
private static void hamletGuardAggro(Mob mob) {
Realm realm = RealmMap.getRealmAtLocation(mob.loc);
if (realm.getRealmName().equals("Uthgaard")) {
HashSet<AbstractWorldObject> loadedMobs = WorldGrid.getObjectsInRangePartial(mob.loc, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_MOB);
for (AbstractWorldObject awo : loadedMobs) {
Mob targetMob = (Mob) awo;
if (targetMob.equals(mob))
continue;
if (!targetMob.isAlive() || targetMob.despawned)
continue;
if (targetMob.isPet())
continue;
mob.combatTarget = targetMob;
return;
}
return;
}
HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(mob.loc, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_PLAYER);
for (AbstractWorldObject awo : loadedPlayers) {
PlayerCharacter pc = (PlayerCharacter) awo;
if (!pc.isAlive() || !pc.isActive())
continue;
if (pc.guild.equals(Guild.getErrantGuild())) {
mob.combatTarget = pc;
return;
}
if (pc.guild.charter.equals(mob.guild.charter))
continue;
mob.combatTarget = pc;
return;
}
}
private static void defaultLogic(Mob mob) { private static void defaultLogic(Mob mob) {
try { try {
//check for players that can be aggroed if mob is agressive and has no target //check for players that can be aggroed if mob is agressive and has no target
if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false) if (mob.getCombatTarget() != null && !mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()))
mob.setCombatTarget(null); mob.setCombatTarget(null);
if (mob.behaviourType.isAgressive) { if (mob.behaviourType.isAgressive) {
@@ -1015,18 +1058,16 @@ public class MobAI {
// Defer to captain if possible for current target // Defer to captain if possible for current target
if (mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION) && if (mob.agentType.equals(mbEnums.AIAgentType.GUARDMINION) && mob.guardCaptain.isAlive() && mob.guardCaptain.combatTarget != null) {
mob.guardCaptain.isAlive()
&& mob.guardCaptain.combatTarget != null) {
mob.setCombatTarget(mob.guardCaptain.combatTarget); mob.setCombatTarget(mob.guardCaptain.combatTarget);
return; return;
} }
ConcurrentHashMap<Integer, Float> loadedPlayers = mob.playerAgroMap; ConcurrentHashMap<Integer, Float> loadedPlayers = mob.playerAgroMap;
for (Entry playerEntry : loadedPlayers.entrySet()) { for (Entry<Integer, Float> playerEntry : loadedPlayers.entrySet()) {
int playerID = (int) playerEntry.getKey(); int playerID = playerEntry.getKey();
PlayerCharacter loadedPlayer = PlayerCharacter.getPlayerCharacter(playerID); PlayerCharacter loadedPlayer = PlayerCharacter.getPlayerCharacter(playerID);
//Player is null, let's remove them from the list. //Player is null, let's remove them from the list.
@@ -1050,7 +1091,7 @@ public class MobAI {
// No aggro for this player // No aggro for this player
if (guardCanAggro(mob, loadedPlayer) == false) if (!guardCanAggro(mob, loadedPlayer))
continue; continue;
if (MovementUtilities.inRangeToAggro(mob, loadedPlayer) && mob.getCombatTarget() == null) { if (MovementUtilities.inRangeToAggro(mob, loadedPlayer) && mob.getCombatTarget() == null) {
@@ -1084,7 +1125,12 @@ public class MobAI {
try { try {
if (mob.guardedCity.cityOutlaws.contains(target.getObjectUUID()) == true) if (ConfigManager.MB_RULESET.getValue().equals("LORE") && !target.guild.equals(Guild.getErrantGuild())) {
if (mob.guild.charter.equals(target.guild.charter))
return false;
}
if (mob.guardedCity != null && mob.guardedCity.cityOutlaws.contains(target.getObjectUUID()))
return true; return true;
if (mob.getGuild().getNation().equals(target.getGuild().getNation())) if (mob.getGuild().getNation().equals(target.getGuild().getNation()))
@@ -1092,8 +1138,8 @@ public class MobAI {
//first check condemn list for aggro allowed (allies button is checked) //first check condemn list for aggro allowed (allies button is checked)
if (ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().reverseKOS) { if (Objects.requireNonNull(ZoneManager.getCityAtLocation(mob.getLoc())).getTOL().reverseKOS) {
for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().getCondemned().entrySet()) { for (Entry<Integer, Condemned> entry : Objects.requireNonNull(ZoneManager.getCityAtLocation(mob.getLoc())).getTOL().getCondemned().entrySet()) {
//target is listed individually //target is listed individually
@@ -1115,7 +1161,7 @@ public class MobAI {
//allies button is not checked //allies button is not checked
for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().getCondemned().entrySet()) { for (Entry<Integer, Condemned> entry : Objects.requireNonNull(ZoneManager.getCityAtLocation(mob.getLoc())).getTOL().getCondemned().entrySet()) {
//target is listed individually //target is listed individually
@@ -1146,7 +1192,7 @@ public class MobAI {
//early exit for a mob who is already moving to a patrol point //early exit for a mob who is already moving to a patrol point
//while mob moving, update lastPatrolTime so that when they stop moving the 10 second timer can begin //while mob moving, update lastPatrolTime so that when they stop moving the 10 second timer can begin
if (mob.isMoving() == true) { if (mob.isMoving()) {
mob.stopPatrolTime = System.currentTimeMillis(); mob.stopPatrolTime = System.currentTimeMillis();
return; return;
} }
@@ -1174,7 +1220,8 @@ public class MobAI {
//make sure mob is out of combat stance //make sure mob is out of combat stance
if (minion.despawned == false) { assert minion != null;
if (!minion.despawned) {
if (MovementUtilities.canMove(minion)) { if (MovementUtilities.canMove(minion)) {
Vector3f minionOffset = mbEnums.FormationType.getOffset(2, mob.minions.indexOf(minionUUID) + 3); Vector3f minionOffset = mbEnums.FormationType.getOffset(2, mob.minions.indexOf(minionUUID) + 3);
minion.updateLocation(); minion.updateLocation();
@@ -1196,19 +1243,24 @@ public class MobAI {
float CurrentHateValue = 0; float CurrentHateValue = 0;
if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter))
CurrentHateValue = mob.playerAgroMap.get(mob.combatTarget.getObjectUUID()).floatValue(); CurrentHateValue = mob.playerAgroMap.get(mob.combatTarget.getObjectUUID());
AbstractWorldObject mostHatedTarget = null; AbstractWorldObject mostHatedTarget = null;
for (Entry playerEntry : mob.playerAgroMap.entrySet()) { for (Entry<Integer, Float> playerEntry : mob.playerAgroMap.entrySet()) {
PlayerCharacter potentialTarget = PlayerCharacter.getPlayerCharacter((int) playerEntry.getKey()); PlayerCharacter potentialTarget = PlayerCharacter.getPlayerCharacter(playerEntry.getKey());
if (potentialTarget.equals(mob.getCombatTarget())) if (potentialTarget.equals(mob.getCombatTarget()))
continue; continue;
if (potentialTarget != null && mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) { if (ConfigManager.MB_RULESET.getValue().equals("LORE") && !potentialTarget.guild.equals(Guild.getErrantGuild())) {
CurrentHateValue = mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue(); if (mob.guild.charter.equals(potentialTarget.guild.charter))
continue;
}
if (mob.playerAgroMap.get(potentialTarget.getObjectUUID()) > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
CurrentHateValue = mob.playerAgroMap.get(potentialTarget.getObjectUUID());
mostHatedTarget = potentialTarget; mostHatedTarget = potentialTarget;
} }
+4 -8
View File
@@ -13,23 +13,21 @@ public class MobAIThread implements Runnable {
public static int AI_PULSE_MOB_THRESHOLD = 200; public static int AI_PULSE_MOB_THRESHOLD = 200;
public static int AI_PATROL_DIVISOR = 15; public static int AI_PATROL_DIVISOR = 15;
public static float AI_CAST_FREQUENCY; public static float AI_CAST_FREQUENCY;
// Thread constructor
public MobAIThread() { public MobAIThread() {
Logger.info(" MobAIThread thread has started!"); Logger.info(" MobAIThread thread has started!");
} }
@Override @Override
public void run() { public void run() {
//cache config value for mobile casting delay //cache config value for mobile casting delay
AI_CAST_FREQUENCY = Float.parseFloat(ConfigManager.MB_AI_CAST_FREQUENCY.getValue()); AI_CAST_FREQUENCY = Float.parseFloat(ConfigManager.MB_AI_CAST_FREQUENCY.getValue());
AI_BASE_AGGRO_RANGE = (int) (60 * Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue())); AI_BASE_AGGRO_RANGE = (int) (60 * Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue()));
while (true) { while (true) {
for (Zone zone : ZoneManager.getAllZones()) { for (Zone zone : ZoneManager.getAllZones())
for (Mob mob : zone.zoneMobSet)
for (Mob mob : zone.zoneMobSet) {
try { try {
if (mob != null) if (mob != null)
MobAI.determineAction(mob); MobAI.determineAction(mob);
@@ -37,8 +35,6 @@ public class MobAIThread implements Runnable {
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e); Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
e.printStackTrace(); e.printStackTrace();
} }
}
}
} }
} }
@@ -15,17 +15,18 @@ import org.pmw.tinylog.Logger;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue; import java.util.concurrent.DelayQueue;
public enum Respawner implements Runnable { public enum ReSpawner implements Runnable {
// MB Dev Notes: // MB Dev Notes:
// //
// Thread acts as a throttle for messages to the client. Mobiles are // Thread acts as a throttle for messages to the client. Mobiles are
// respawned over a short time so as not to flood the client when // respawned over a short time so as not to flood client when
// an entire camp respawns at once. // entire camp respawns at once. Client has a tendency to drop
// messages when given too much to digest.
RESPAWNER; RESPAWNER;
public static BlockingQueue<Mob> respawnQueue = new DelayQueue(); public static final BlockingQueue<Mob> respawnQueue = new DelayQueue<>();
@Override @Override
public void run() { public void run() {
@@ -9,7 +9,6 @@
package engine.mobileAI.utilities; package engine.mobileAI.utilities;
import engine.exception.MsgSendException;
import engine.gameManager.MovementManager; import engine.gameManager.MovementManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
@@ -68,8 +67,9 @@ public class MovementUtilities {
float zoneRange = 250; float zoneRange = 250;
if (agent.getParentZone() != null) { if (agent.getParentZone() != null) {
if (agent.getParentZone().bounds != null) if (agent.getParentZone().bounds != null) {
zoneRange = agent.getParentZone().bounds.getHalfExtents().x * 2; zoneRange = agent.getParentZone().bounds.getHalfExtents().x * 2;
}
} }
if (zoneRange > 300) if (zoneRange > 300)
@@ -252,7 +252,7 @@ public class MovementUtilities {
try { try {
MovementManager.movement(msg, agent); MovementManager.movement(msg, agent);
} catch (MsgSendException e) { } catch (Exception e) {
// TODO Figure out how we want to handle the msg send exception // TODO Figure out how we want to handle the msg send exception
e.printStackTrace(); e.printStackTrace();
} }
-3
View File
@@ -19,7 +19,6 @@ import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException; import java.nio.channels.ClosedChannelException;
import java.nio.channels.NotYetConnectedException; import java.nio.channels.NotYetConnectedException;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
@@ -41,8 +40,6 @@ public abstract class AbstractConnection implements
protected long lastKeepAliveTime = System.currentTimeMillis(); protected long lastKeepAliveTime = System.currentTimeMillis();
protected long lastOpcode = -1; protected long lastOpcode = -1;
protected ConcurrentLinkedQueue<ByteBuffer> outbox = new ConcurrentLinkedQueue<>(); protected ConcurrentLinkedQueue<ByteBuffer> outbox = new ConcurrentLinkedQueue<>();
protected ByteBuffer outBuf = null;
protected ConcurrentHashMap<Long, Byte> cacheList;
protected long nextWriteTime = 0L; protected long nextWriteTime = 0L;
//Opcode tracking //Opcode tracking
+1 -2
View File
@@ -9,7 +9,6 @@
package engine.net; package engine.net;
import engine.exception.SerializationException;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.util.StringUtils; import engine.util.StringUtils;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -95,7 +94,7 @@ public abstract class AbstractNetMsg {
* @throws Exception * @throws Exception
*/ */
protected abstract void _serialize(ByteBufferWriter writer) protected abstract void _serialize(ByteBufferWriter writer)
throws SerializationException; ;
/** /**
* Attempts to serialize this NetMsg into a ByteBuffer. ByteBuffer is * Attempts to serialize this NetMsg into a ByteBuffer. ByteBuffer is
+6 -6
View File
@@ -9,6 +9,7 @@
package engine.net; package engine.net;
import engine.gameManager.DispatchManager;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -21,12 +22,11 @@ import java.util.regex.Pattern;
// All outgoing Protocol messages to the player are managed through the MessageDispatcher.class. // All outgoing Protocol messages to the player are managed through the MessageDispatcher.class.
// All incoming Protocol messages from the player are managed by the Protocol.class. // All incoming Protocol messages from the player are managed by the Protocol.class.
// //
// A DispatchMessage is configured (Protocol messsage) and wrapped in a Dispatch (distribution list). // A Dispatch is configured wrapping a Protocol message and a distribution list is built.
// A Dispatch can be submitted to the MessageDispatcher for delivery from any thread.
// //
// Dispatches are interleaved between channels. This is to ensure // The system interleaves dispatches between two channels. This is to ensure that
// a combat or movement message is not delayed by spam clicking a // a critical combat or movement message will not be delayed by spam clicking a larger
// larger message. Choose your channel wisely. // message with no temporal immediacy. Pick the correct channel will this in mind.
public class MessageDispatcher implements Runnable { public class MessageDispatcher implements Runnable {
@@ -73,7 +73,7 @@ public class MessageDispatcher implements Runnable {
this.messageDispatch = _messageQueue[dispatchChannel.getChannelID()].poll(); this.messageDispatch = _messageQueue[dispatchChannel.getChannelID()].poll();
if (this.messageDispatch != null) { if (this.messageDispatch != null) {
DispatchMessage.serializeDispatch(this.messageDispatch); DispatchManager.serializeDispatch(this.messageDispatch);
shouldBlock = false; shouldBlock = false;
} }
} }
@@ -1,6 +1,5 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.*; import engine.gameManager.*;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.BuildingGroup; import engine.mbEnums.BuildingGroup;
@@ -22,7 +21,7 @@ public class AbandonAssetMsgHandler extends AbstractClientMsgHandler {
// Instance variables // Instance variables
public AbandonAssetMsgHandler() { public AbandonAssetMsgHandler() {
super(AbandonAssetMsg.class); super();
} }
@@ -48,7 +47,7 @@ public class AbandonAssetMsgHandler extends AbstractClientMsgHandler {
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration // Member variable declaration
PlayerCharacter player; PlayerCharacter player;
@@ -8,7 +8,6 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.net.Protocol; import engine.net.Protocol;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
@@ -22,11 +21,11 @@ import static engine.gameManager.ChatManager.FLOOD_TIME_THRESHOLD;
public class AbstractChatMsgHandler extends AbstractClientMsgHandler { public class AbstractChatMsgHandler extends AbstractClientMsgHandler {
public AbstractChatMsgHandler() { public AbstractChatMsgHandler() {
super(AbstractChatMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter playerCharacter = origin.getPlayerCharacter(); PlayerCharacter playerCharacter = origin.getPlayerCharacter();
@@ -1,6 +1,5 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -10,10 +9,8 @@ import engine.net.client.msg.ClientNetMsg;
*/ */
public abstract class AbstractClientMsgHandler { public abstract class AbstractClientMsgHandler {
private final Class<? extends ClientNetMsg> handler;
public AbstractClientMsgHandler(Class<? extends ClientNetMsg> handler) { public AbstractClientMsgHandler() {
this.handler = handler;
} }
public boolean handleNetMsg(ClientNetMsg msg) { public boolean handleNetMsg(ClientNetMsg msg) {
@@ -22,7 +19,7 @@ public abstract class AbstractClientMsgHandler {
try { try {
executionSucceded = _handleNetMsg(msg, (ClientConnection) msg.getOrigin()); executionSucceded = _handleNetMsg(msg, (ClientConnection) msg.getOrigin());
} catch (MsgSendException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
executionSucceded = false; executionSucceded = false;
} }
@@ -30,5 +27,5 @@ public abstract class AbstractClientMsgHandler {
return executionSucceded; return executionSucceded;
} }
protected abstract boolean _handleNetMsg(ClientNetMsg msg, ClientConnection origin) throws MsgSendException; protected abstract boolean _handleNetMsg(ClientNetMsg msg, ClientConnection origin);
} }
@@ -9,16 +9,11 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.*;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.GuildManager;
import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.GuildHistoryType; import engine.mbEnums.GuildHistoryType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
@@ -32,11 +27,11 @@ import org.joda.time.DateTime;
public class AcceptInviteToGuildHandler extends AbstractClientMsgHandler { public class AcceptInviteToGuildHandler extends AbstractClientMsgHandler {
public AcceptInviteToGuildHandler() { public AcceptInviteToGuildHandler() {
super(AcceptInviteToGuildMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter player; PlayerCharacter player;
AcceptInviteToGuildMsg msg; AcceptInviteToGuildMsg msg;
@@ -86,9 +81,9 @@ public class AcceptInviteToGuildHandler extends AbstractClientMsgHandler {
player.resetGuildStatuses(); player.resetGuildStatuses();
Dispatch dispatch = Dispatch.borrow(player, msg); Dispatch dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
DispatchMessage.sendToAllInRange(player, new GuildInfoMsg(player, guild, 2)); DispatchManager.sendToAllInRange(player, new GuildInfoMsg(player, guild, 2));
player.incVer(); player.incVer();
@@ -9,15 +9,14 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.DispatchManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.GuildState; import engine.mbEnums.GuildState;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
@@ -31,11 +30,11 @@ import java.util.ArrayList;
public class AcceptSubInviteHandler extends AbstractClientMsgHandler { public class AcceptSubInviteHandler extends AbstractClientMsgHandler {
public AcceptSubInviteHandler() { public AcceptSubInviteHandler() {
super(AcceptSubInviteMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
AcceptSubInviteMsg msg = (AcceptSubInviteMsg) baseMsg; AcceptSubInviteMsg msg = (AcceptSubInviteMsg) baseMsg;
PlayerCharacter sourcePlayer; PlayerCharacter sourcePlayer;
@@ -98,7 +97,7 @@ public class AcceptSubInviteHandler extends AbstractClientMsgHandler {
msg.setUnknown02(1); msg.setUnknown02(1);
msg.setResponse("Your guild is now a " + sourceGuild.getGuildState().name() + '.'); msg.setResponse("Your guild is now a " + sourceGuild.getGuildState().name() + '.');
dispatch = Dispatch.borrow(sourcePlayer, msg); dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
ChatManager.chatSystemInfo(sourcePlayer, "Your guild is now a " + sourceGuild.getGuildState().name() + '.'); ChatManager.chatSystemInfo(sourcePlayer, "Your guild is now a " + sourceGuild.getGuildState().name() + '.');
return true; return true;
@@ -8,10 +8,9 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.AcceptTradeRequestMsg; import engine.net.client.msg.AcceptTradeRequestMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -28,11 +27,11 @@ import static engine.objects.CharacterItemManager.canTrade;
public class AcceptTradeRequestMsgHandler extends AbstractClientMsgHandler { public class AcceptTradeRequestMsgHandler extends AbstractClientMsgHandler {
public AcceptTradeRequestMsgHandler() { public AcceptTradeRequestMsgHandler() {
super(AcceptTradeRequestMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration // Member variable declaration
@@ -92,10 +91,10 @@ public class AcceptTradeRequestMsgHandler extends AbstractClientMsgHandler {
UpdateVaultMsg uvmTarget = new UpdateVaultMsg(targetAccount); UpdateVaultMsg uvmTarget = new UpdateVaultMsg(targetAccount);
dispatch = Dispatch.borrow(source, uvmSource); dispatch = Dispatch.borrow(source, uvmSource);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
dispatch = Dispatch.borrow(target, uvmTarget); dispatch = Dispatch.borrow(target, uvmTarget);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
source.charItemManager.setVaultOpen(false); source.charItemManager.setVaultOpen(false);
toTradeWith.setVaultOpen(false); toTradeWith.setVaultOpen(false);
@@ -118,10 +117,10 @@ public class AcceptTradeRequestMsgHandler extends AbstractClientMsgHandler {
toTradeWith.tradeID = msg.getUnknown01(); toTradeWith.tradeID = msg.getUnknown01();
dispatch = Dispatch.borrow(source, otwm); dispatch = Dispatch.borrow(source, otwm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
dispatch = Dispatch.borrow(target, otwm); dispatch = Dispatch.borrow(target, otwm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
return true; return true;
} }
@@ -1,11 +1,9 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.*; import engine.gameManager.*;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.ItemType; import engine.mbEnums.ItemType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ActivateNPCMessage; import engine.net.client.msg.ActivateNPCMessage;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -23,11 +21,11 @@ import java.util.ArrayList;
public class ActivateNPCMsgHandler extends AbstractClientMsgHandler { public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
public ActivateNPCMsgHandler() { public ActivateNPCMsgHandler() {
super(ActivateNPCMessage.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
ActivateNPCMessage msg; ActivateNPCMessage msg;
PlayerCharacter player; PlayerCharacter player;
@@ -66,7 +64,7 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
anm.setSize(ItemLists.size()); anm.setSize(ItemLists.size());
anm.setItemList(ItemLists); anm.setItemList(ItemLists);
Dispatch dispatch = Dispatch.borrow(player, anm); Dispatch dispatch = Dispatch.borrow(player, anm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
if (msg.getUnknown01() == 0) { if (msg.getUnknown01() == 0) {
@@ -125,7 +123,7 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
mca1.setAssetName1(building.getName()); mca1.setAssetName1(building.getName());
mca1.setUnknown54(1); mca1.setUnknown54(1);
Dispatch dispatch = Dispatch.borrow(player, mca1); Dispatch dispatch = Dispatch.borrow(player, mca1);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
@@ -8,10 +8,9 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.AddGoldToTradeWindowMsg; import engine.net.client.msg.AddGoldToTradeWindowMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -27,11 +26,11 @@ import static engine.objects.CharacterItemManager.canTrade;
public class AddGoldToTradeWindowMsgHandler extends AbstractClientMsgHandler { public class AddGoldToTradeWindowMsgHandler extends AbstractClientMsgHandler {
public AddGoldToTradeWindowMsgHandler() { public AddGoldToTradeWindowMsgHandler() {
super(AddGoldToTradeWindowMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter source = origin.getPlayerCharacter(); PlayerCharacter source = origin.getPlayerCharacter();
@@ -95,13 +94,13 @@ public class AddGoldToTradeWindowMsgHandler extends AbstractClientMsgHandler {
source.charItemManager.modifyCommitToTrade(); source.charItemManager.modifyCommitToTrade();
dispatch = Dispatch.borrow(source, utwm); dispatch = Dispatch.borrow(source, utwm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
dispatch = Dispatch.borrow(source, ugm); dispatch = Dispatch.borrow(source, ugm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
dispatch = Dispatch.borrow(other, utwmOther); dispatch = Dispatch.borrow(other, utwmOther);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return true; return true;
} }
@@ -8,10 +8,9 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.AddItemToTradeWindowMsg; import engine.net.client.msg.AddItemToTradeWindowMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -25,11 +24,11 @@ import static engine.objects.CharacterItemManager.canTrade;
public class AddItemToTradeWindowMsgHandler extends AbstractClientMsgHandler { public class AddItemToTradeWindowMsgHandler extends AbstractClientMsgHandler {
public AddItemToTradeWindowMsgHandler() { public AddItemToTradeWindowMsgHandler() {
super(AddItemToTradeWindowMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration // Member variable declaration
@@ -81,7 +80,7 @@ public class AddItemToTradeWindowMsgHandler extends AbstractClientMsgHandler {
if (!tradingWith.hasRoomTrade(item.template.item_wt)) { if (!tradingWith.hasRoomTrade(item.template.item_wt)) {
dispatch = Dispatch.borrow(source, msg); dispatch = Dispatch.borrow(source, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
return false; return false;
} }
@@ -93,12 +92,12 @@ public class AddItemToTradeWindowMsgHandler extends AbstractClientMsgHandler {
source.charItemManager.addItemToTrade(item); source.charItemManager.addItemToTrade(item);
dispatch = Dispatch.borrow(other, msg); dispatch = Dispatch.borrow(other, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
source.charItemManager.modifyCommitToTrade(); source.charItemManager.modifyCommitToTrade();
dispatch = Dispatch.borrow(other, utwm); dispatch = Dispatch.borrow(other, utwm);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.PRIMARY);
return true; return true;
} }
@@ -1,11 +1,10 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.AllianceType; import engine.mbEnums.AllianceType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.AllianceChangeMsg; import engine.net.client.msg.AllianceChangeMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -21,7 +20,7 @@ import engine.objects.PlayerCharacter;
public class AllianceChangeMsgHandler extends AbstractClientMsgHandler { public class AllianceChangeMsgHandler extends AbstractClientMsgHandler {
public AllianceChangeMsgHandler() { public AllianceChangeMsgHandler() {
super(AllianceChangeMsg.class); super();
} }
private static void MakeEnemy(Guild fromGuild, Guild toGuild, AllianceChangeMsg msg, ClientConnection origin) { private static void MakeEnemy(Guild fromGuild, Guild toGuild, AllianceChangeMsg msg, ClientConnection origin) {
@@ -40,20 +39,20 @@ public class AllianceChangeMsgHandler extends AbstractClientMsgHandler {
if (!Guild.sameGuild(origin.getPlayerCharacter().getGuild(), fromGuild)) { if (!Guild.sameGuild(origin.getPlayerCharacter().getGuild(), fromGuild)) {
msg.setMsgType(AllianceChangeMsg.ERROR_NOT_SAME_GUILD); msg.setMsgType(AllianceChangeMsg.ERROR_NOT_SAME_GUILD);
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return; return;
} }
if (!GuildStatusController.isInnerCouncil(origin.getPlayerCharacter().getGuildStatus()) && !GuildStatusController.isGuildLeader(origin.getPlayerCharacter().getGuildStatus())) { if (!GuildStatusController.isInnerCouncil(origin.getPlayerCharacter().getGuildStatus()) && !GuildStatusController.isGuildLeader(origin.getPlayerCharacter().getGuildStatus())) {
msg.setMsgType(AllianceChangeMsg.ERROR_NOT_AUTHORIZED); msg.setMsgType(AllianceChangeMsg.ERROR_NOT_AUTHORIZED);
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return; return;
} }
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
@@ -72,7 +71,7 @@ public class AllianceChangeMsgHandler extends AbstractClientMsgHandler {
return; return;
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
@@ -91,13 +90,13 @@ public class AllianceChangeMsgHandler extends AbstractClientMsgHandler {
return; return;
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration // Member variable declaration
@@ -142,7 +141,7 @@ public class AllianceChangeMsgHandler extends AbstractClientMsgHandler {
} }
msg.setMsgType(AllianceChangeMsg.INFO_SUCCESS); msg.setMsgType(AllianceChangeMsg.INFO_SUCCESS);
Dispatch dispatch = Dispatch.borrow(player, msg); Dispatch dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return true; return true;
@@ -1,10 +1,9 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.AllyEnemyListMsg; import engine.net.client.msg.AllyEnemyListMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -19,7 +18,7 @@ import engine.objects.PlayerCharacter;
public class AllyEnemyListMsgHandler extends AbstractClientMsgHandler { public class AllyEnemyListMsgHandler extends AbstractClientMsgHandler {
public AllyEnemyListMsgHandler() { public AllyEnemyListMsgHandler() {
super(AllyEnemyListMsg.class); super();
} }
private static void showAllyEnemyList(Guild fromGuild, Guild toGuild, AllyEnemyListMsg msg, ClientConnection origin) { private static void showAllyEnemyList(Guild fromGuild, Guild toGuild, AllyEnemyListMsg msg, ClientConnection origin) {
@@ -35,7 +34,7 @@ public class AllyEnemyListMsgHandler extends AbstractClientMsgHandler {
if (toGuild == null) if (toGuild == null)
return; return;
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
// UpdateClientAlliancesMsg ucam = new UpdateClientAlliancesMsg(); // UpdateClientAlliancesMsg ucam = new UpdateClientAlliancesMsg();
// //
@@ -46,7 +45,7 @@ public class AllyEnemyListMsgHandler extends AbstractClientMsgHandler {
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration // Member variable declaration
@@ -9,13 +9,12 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DispatchManager;
import engine.gameManager.GroupManager; import engine.gameManager.GroupManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.group.AppointGroupLeaderMsg; import engine.net.client.msg.group.AppointGroupLeaderMsg;
@@ -26,11 +25,11 @@ import engine.objects.PlayerCharacter;
public class AppointGroupLeaderHandler extends AbstractClientMsgHandler { public class AppointGroupLeaderHandler extends AbstractClientMsgHandler {
public AppointGroupLeaderHandler() { public AppointGroupLeaderHandler() {
super(AppointGroupLeaderMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
AppointGroupLeaderMsg msg = (AppointGroupLeaderMsg) baseMsg; AppointGroupLeaderMsg msg = (AppointGroupLeaderMsg) baseMsg;
PlayerCharacter source = SessionManager.getPlayerCharacter(origin); PlayerCharacter source = SessionManager.getPlayerCharacter(origin);
@@ -52,7 +51,7 @@ public class AppointGroupLeaderHandler extends AbstractClientMsgHandler {
AppointGroupLeaderMsg reply = new AppointGroupLeaderMsg(); AppointGroupLeaderMsg reply = new AppointGroupLeaderMsg();
reply.setResponse(1); reply.setResponse(1);
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), reply); Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), reply);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return false; return false;
} }
@@ -1,14 +1,11 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.*; import engine.gameManager.*;
import engine.job.JobScheduler; import engine.job.JobScheduler;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ArcLoginNotifyMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.HotzoneChangeMsg; import engine.net.client.msg.HotzoneChangeMsg;
import engine.net.client.msg.PetMsg; import engine.net.client.msg.PetMsg;
@@ -23,11 +20,11 @@ import org.pmw.tinylog.Logger;
public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler { public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
public ArcLoginNotifyMsgHandler() { public ArcLoginNotifyMsgHandler() {
super(ArcLoginNotifyMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter player = SessionManager.getPlayerCharacter(origin); PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
@@ -69,7 +66,7 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
// Send branch string if available from ConfigManager. // Send branch string if available from ConfigManager.
if (ConfigManager.currentRepoBranch != "") if (!ConfigManager.currentRepoBranch.equals(""))
ChatManager.sendSystemMessage(player, ConfigManager.currentRepoBranch); ChatManager.sendSystemMessage(player, ConfigManager.currentRepoBranch);
// Set player mask for QT // Set player mask for QT
@@ -130,7 +127,7 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
if (player.getPet() != null) { if (player.getPet() != null) {
PetMsg pm = new PetMsg(5, player.getPet()); PetMsg pm = new PetMsg(5, player.getPet());
Dispatch dispatch = Dispatch.borrow(player, pm); Dispatch dispatch = Dispatch.borrow(player, pm);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
} }
//Send current hotzone //Send current hotzone
@@ -138,7 +135,7 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
if (ZoneManager.hotZone != null) { if (ZoneManager.hotZone != null) {
HotzoneChangeMsg hcm = new HotzoneChangeMsg(mbEnums.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID()); HotzoneChangeMsg hcm = new HotzoneChangeMsg(mbEnums.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
Dispatch dispatch = Dispatch.borrow(player, hcm); Dispatch dispatch = Dispatch.borrow(player, hcm);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
} }
if (player.getGuild() != null && !player.getGuild().isEmptyGuild()) { if (player.getGuild() != null && !player.getGuild().isEmptyGuild()) {
@@ -1,10 +1,9 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ArcMineChangeProductionMsg; import engine.net.client.msg.ArcMineChangeProductionMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -21,11 +20,11 @@ import engine.objects.PlayerCharacter;
public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler { public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler {
public ArcMineChangeProductionMsgHandler() { public ArcMineChangeProductionMsgHandler() {
super(ArcMineChangeProductionMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter playerCharacter = origin.getPlayerCharacter(); PlayerCharacter playerCharacter = origin.getPlayerCharacter();
ArcMineChangeProductionMsg changeProductionMsg = (ArcMineChangeProductionMsg) baseMsg; ArcMineChangeProductionMsg changeProductionMsg = (ArcMineChangeProductionMsg) baseMsg;
@@ -51,7 +50,7 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
//make sure valid resource //make sure valid resource
mbEnums.ResourceType resource = mbEnums.ResourceType.hashLookup.get(changeProductionMsg.getResourceHash()); mbEnums.ResourceType resource = mbEnums.ResourceType.resourceHashLookup.get(changeProductionMsg.getResourceHash());
if (resource == null) if (resource == null)
return true; return true;
@@ -60,7 +59,7 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
mine.changeProductionType(resource); mine.changeProductionType(resource);
Dispatch dispatch = Dispatch.borrow(playerCharacter, changeProductionMsg); Dispatch dispatch = Dispatch.borrow(playerCharacter, changeProductionMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
return true; return true;
} }
@@ -1,11 +1,10 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.DispatchManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ArcMineWindowAvailableTimeMsg; import engine.net.client.msg.ArcMineWindowAvailableTimeMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -23,11 +22,11 @@ import engine.objects.PlayerCharacter;
public class ArcMineWindowAvailableTimeHandler extends AbstractClientMsgHandler { public class ArcMineWindowAvailableTimeHandler extends AbstractClientMsgHandler {
public ArcMineWindowAvailableTimeHandler() { public ArcMineWindowAvailableTimeHandler() {
super(ArcMineWindowAvailableTimeMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
ArcMineWindowAvailableTimeMsg msg = (ArcMineWindowAvailableTimeMsg) baseMsg; ArcMineWindowAvailableTimeMsg msg = (ArcMineWindowAvailableTimeMsg) baseMsg;
PlayerCharacter playerCharacter = origin.getPlayerCharacter(); PlayerCharacter playerCharacter = origin.getPlayerCharacter();
@@ -55,7 +54,7 @@ public class ArcMineWindowAvailableTimeHandler extends AbstractClientMsgHandler
ArcMineWindowAvailableTimeMsg outMsg = new ArcMineWindowAvailableTimeMsg(treeOfLife, 10); ArcMineWindowAvailableTimeMsg outMsg = new ArcMineWindowAvailableTimeMsg(treeOfLife, 10);
outMsg.configure(); outMsg.configure();
dispatch = Dispatch.borrow(playerCharacter, outMsg); dispatch = Dispatch.borrow(playerCharacter, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
return true; return true;
} }
@@ -1,9 +1,8 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.DispatchManager;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ArcOwnedMinesListMsg; import engine.net.client.msg.ArcOwnedMinesListMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -20,11 +19,11 @@ import engine.objects.PlayerCharacter;
public class ArcOwnedMinesListHandler extends AbstractClientMsgHandler { public class ArcOwnedMinesListHandler extends AbstractClientMsgHandler {
public ArcOwnedMinesListHandler() { public ArcOwnedMinesListHandler() {
super(ArcOwnedMinesListMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter playerCharacter = origin.getPlayerCharacter(); PlayerCharacter playerCharacter = origin.getPlayerCharacter();
ArcOwnedMinesListMsg msg = (ArcOwnedMinesListMsg) baseMsg; ArcOwnedMinesListMsg msg = (ArcOwnedMinesListMsg) baseMsg;
@@ -37,7 +36,7 @@ public class ArcOwnedMinesListHandler extends AbstractClientMsgHandler {
msg.setMineList(Mine.getMinesForGuild(playerCharacter.getGuild().getObjectUUID())); msg.setMineList(Mine.getMinesForGuild(playerCharacter.getGuild().getObjectUUID()));
Dispatch dispatch = Dispatch.borrow(playerCharacter, msg); Dispatch dispatch = Dispatch.borrow(playerCharacter, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
return true; return true;
} }
@@ -1,6 +1,5 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
@@ -22,11 +21,11 @@ import org.pmw.tinylog.Logger;
public class ArcSiegeSpireMsgHandler extends AbstractClientMsgHandler { public class ArcSiegeSpireMsgHandler extends AbstractClientMsgHandler {
public ArcSiegeSpireMsgHandler() { public ArcSiegeSpireMsgHandler() {
super(ArcSiegeSpireMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter player; PlayerCharacter player;
Building spire; Building spire;
@@ -1,11 +1,10 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.DispatchManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ArcViewAssetTransactionsMsg; import engine.net.client.msg.ArcViewAssetTransactionsMsg;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
@@ -23,11 +22,11 @@ import engine.objects.Warehouse;
public class ArcViewAssetTransactionsMsgHandler extends AbstractClientMsgHandler { public class ArcViewAssetTransactionsMsgHandler extends AbstractClientMsgHandler {
public ArcViewAssetTransactionsMsgHandler() { public ArcViewAssetTransactionsMsgHandler() {
super(ArcViewAssetTransactionsMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter player; PlayerCharacter player;
ArcViewAssetTransactionsMsg msg; ArcViewAssetTransactionsMsg msg;
@@ -55,7 +54,7 @@ public class ArcViewAssetTransactionsMsgHandler extends AbstractClientMsgHandler
newMsg.configure(); newMsg.configure();
dispatch = Dispatch.borrow(player, newMsg); dispatch = Dispatch.borrow(player, newMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return true; return true;
} }
@@ -1,14 +1,13 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.DispatchManager;
import engine.gameManager.NPCManager; import engine.gameManager.NPCManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.SupportMsgType; import engine.mbEnums.SupportMsgType;
import engine.mbEnums.TaxType; import engine.mbEnums.TaxType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.*; import engine.net.client.msg.*;
import engine.objects.*; import engine.objects.*;
@@ -22,7 +21,7 @@ import org.pmw.tinylog.Logger;
public class AssetSupportMsgHandler extends AbstractClientMsgHandler { public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
public AssetSupportMsgHandler() { public AssetSupportMsgHandler() {
super(AssetSupportMsg.class); super();
} }
private static void protectAsset(AssetSupportMsg msg, Building targetBuilding, NPC vendor, ClientConnection origin) { private static void protectAsset(AssetSupportMsg msg, Building targetBuilding, NPC vendor, ClientConnection origin) {
@@ -96,7 +95,7 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
outMsg = new ManageNPCMsg(vendor); outMsg = new ManageNPCMsg(vendor);
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), outMsg); dispatch = Dispatch.borrow(origin.getPlayerCharacter(), outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} }
private static void unprotectAsset(Building targetBuilding, NPC vendor, ClientConnection origin) { private static void unprotectAsset(Building targetBuilding, NPC vendor, ClientConnection origin) {
@@ -123,7 +122,7 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration // Member variable declaration
@@ -179,7 +178,7 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
outMsg.configure(); outMsg.configure();
dispatch = Dispatch.borrow(player, outMsg); dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
break; break;
case REMOVETAX: case REMOVETAX:
@@ -202,7 +201,7 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
mca.setAssetName1(targetBuilding.getName()); mca.setAssetName1(targetBuilding.getName());
mca.setUnknown54(1); mca.setUnknown54(1);
dispatch = Dispatch.borrow(player, mca); dispatch = Dispatch.borrow(player, mca);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return true; return true;
case ACCEPTTAX: //AcceptTax case ACCEPTTAX: //AcceptTax
@@ -226,12 +225,12 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
mca.setUnknown54(1); mca.setUnknown54(1);
dispatch = Dispatch.borrow(player, mca); dispatch = Dispatch.borrow(player, mca);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return true; return true;
} }
dispatch = Dispatch.borrow(player, baseMsg); dispatch = Dispatch.borrow(player, baseMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
return true; return true;
@@ -1,6 +1,5 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.CombatManager; import engine.gameManager.CombatManager;
import engine.mbEnums; import engine.mbEnums;
@@ -22,11 +21,11 @@ import engine.objects.PlayerCharacter;
public class AttackCmdMsgHandler extends AbstractClientMsgHandler { public class AttackCmdMsgHandler extends AbstractClientMsgHandler {
public AttackCmdMsgHandler() { public AttackCmdMsgHandler() {
super(AttackCmdMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
PlayerCharacter playerCharacter = origin.getPlayerCharacter(); PlayerCharacter playerCharacter = origin.getPlayerCharacter();
@@ -68,12 +67,6 @@ public class AttackCmdMsgHandler extends AbstractClientMsgHandler {
return true; // cannot attack a null target return true; // cannot attack a null target
} }
// No point in setting combat target to someone you are already fighting
if (playerCharacter.isCombat() && playerCharacter.getCombatTarget() != null &&
playerCharacter.getCombatTarget().equals(target))
return true;
//set sources target //set sources target
playerCharacter.setCombatTarget(target); playerCharacter.setCombatTarget(target);
@@ -9,14 +9,13 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.DispatchManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GuildHistoryType; import engine.mbEnums.GuildHistoryType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
@@ -31,11 +30,11 @@ import org.joda.time.DateTime;
public class BanishUnbanishHandler extends AbstractClientMsgHandler { public class BanishUnbanishHandler extends AbstractClientMsgHandler {
public BanishUnbanishHandler() { public BanishUnbanishHandler() {
super(BanishUnbanishMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
BanishUnbanishMsg msg = (BanishUnbanishMsg) baseMsg; BanishUnbanishMsg msg = (BanishUnbanishMsg) baseMsg;
Dispatch dispatch; Dispatch dispatch;
@@ -115,7 +114,7 @@ public class BanishUnbanishHandler extends AbstractClientMsgHandler {
targetName + " has been banished from " + guild.getName() + '.'); targetName + " has been banished from " + guild.getName() + '.');
GuildListMsg guildListMsg = new GuildListMsg(guild); GuildListMsg guildListMsg = new GuildListMsg(guild);
dispatch = Dispatch.borrow(source, guildListMsg); dispatch = Dispatch.borrow(source, guildListMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} else { } else {
ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
} }
@@ -9,15 +9,10 @@
package engine.net.client.handlers; package engine.net.client.handlers;
import engine.exception.MsgSendException; import engine.gameManager.*;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.GuildManager;
import engine.gameManager.SessionManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
@@ -32,11 +27,11 @@ import java.util.ArrayList;
public class BreakFealtyHandler extends AbstractClientMsgHandler { public class BreakFealtyHandler extends AbstractClientMsgHandler {
public BreakFealtyHandler() { public BreakFealtyHandler() {
super(BreakFealtyMsg.class); super();
} }
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
BreakFealtyMsg bfm; BreakFealtyMsg bfm;
PlayerCharacter player; PlayerCharacter player;
@@ -97,7 +92,7 @@ public class BreakFealtyHandler extends AbstractClientMsgHandler {
SendGuildEntryMsg msg = new SendGuildEntryMsg(player); SendGuildEntryMsg msg = new SendGuildEntryMsg(player);
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
//Update Map. //Update Map.
@@ -164,7 +159,7 @@ public class BreakFealtyHandler extends AbstractClientMsgHandler {
SendGuildEntryMsg msg = new SendGuildEntryMsg(player); SendGuildEntryMsg msg = new SendGuildEntryMsg(player);
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY); DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
//Update Map. //Update Map.

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