Compare commits

...
1907 Commits
Author SHA1 Message Date
KennyTV 6060954f87 3.1.0 Release - 1.16.2 support 2020-08-11 12:44:41 +02:00
KennyTV ff8a27d92a Fix multi block change not being sent
Tfw when the ugly logic works but you just didn't send the packet
2020-08-11 12:38:45 +02:00
Nassim 617abe2d8c Merge pull request #1977 from RaphiMC/dev
fixed 1.11 -> 1.10.2 potion data remapping
2020-08-10 22:34:50 +02:00
Koppe 93c84b1912 minor code improvements 2020-08-10 22:28:40 +02:00
Koppe 0b17b81b63 fixed 1.11 -> 1.10.2 potion data remapping 2020-08-10 22:17:31 +02:00
KennyTV 6a7a92a97b Remove ClientChunk from 1.14+ chunk types
Apparently multiple people (including me) blindly copied that from older versions.
Also removed join/respawn from the abstract MetadataRewriter, since they were only used twice each.
2020-08-10 21:22:01 +02:00
KennyTV 31f7bde35f Some MetadataRewriter cleanup 2020-08-10 18:32:23 +02:00
KennyTV da77c32a0d 1.16.2-rc2 2020-08-10 14:53:32 +02:00
KennyTV 421453d25e Fix 1.8->1.9 ender dragon sound
Fixes #1943
2020-08-10 09:22:08 +02:00
KennyTV fa4d44b929 Update rc1 mappings 2020-08-07 17:48:58 +02:00
KennyTV 7c8b56b3cb 1.16.2-rc1 2020-08-07 17:35:48 +02:00
KennyTV f6fec5b93b 1.16.2-pre3 (almost)
The Nether does not have its custom fog, no idea why yet
2020-08-06 20:21:54 +02:00
KennyTV ea0f91136e Accept plain strings for components
Addresses #1968
2020-08-06 10:15:38 +02:00
KennyTV cf7d49aec5 1.16.2-pre2 2020-08-05 18:19:00 +02:00
KennyTV 03733d274a Merge remote-tracking branch 'origin/master' into dev 2020-08-05 17:44:38 +02:00
Myles 2dd688fa0e Merge pull request #1963 from KennyTV/master
Update Issue Template
2020-08-05 08:38:50 +01:00
KennyTV 8165e55514 Update Issue Template 2020-08-05 09:23:30 +02:00
Nassim e5464c8e4b Merge pull request #1960 from creeper123123321/patch-6
Update javassist and gson
2020-08-05 09:23:06 +02:00
creeper123123321 f70b9a8322 Update javassist and gson 2020-08-04 08:22:03 -03:00
Myles c31f728a37 Merge pull request #1955 from Jo0001/patch-1
Disable blank issues ;)
2020-08-03 19:10:52 +01:00
Jo0001 0a519379a1 Disable blank issues ;) 2020-08-03 17:03:12 +02:00
KennyTV 2b50f6c713 Merge branch 'master' into dev
# Conflicts:
#	pom.xml
2020-08-03 08:40:53 +02:00
KennyTV be2ba2b1b9 Fix Chat meta type
Fixes #1949
2020-08-03 08:39:58 +02:00
Myles 5051e7ea48 Merge pull request #1947 from creeper123123321/patch-5
Explain chatrewriter changes
2020-08-02 20:17:42 +01:00
creeper123123321 a42aa4b202 use velocity snapshots repo 2020-08-02 13:55:48 -03:00
creeper123123321 3d22258321 update velocity repo 2020-08-02 12:47:45 -03:00
creeper123123321 8fe1648d6b Explain chatrewriter changes 2020-08-02 12:37:36 -03:00
KennyTV 49211240a3 1.16.2-Pre1 2020-07-29 17:22:04 +02:00
KennyTV 89c503dd92 Print erroneous json if parsing fails 2020-07-28 09:59:35 +02:00
KennyTV c326bb7b51 Merge remote-tracking branch 'origin/master' into dev 2020-07-26 10:36:22 +02:00
Gerrygames 50024b0602 fix global palette value 2020-07-25 17:56:42 +02:00
KennyTV 5503a338fa Check for register/unregister channels with long names 2020-07-23 19:31:37 +02:00
Nassim 076c5e5265 Merge pull request #1927 from creeper123123321/patch-4
Remove "API" from name in fabric.mod.json
2020-07-23 16:12:42 +02:00
creeper123123321 01d534391d Remove "API" from name in fabric.mod.json 2020-07-23 10:56:54 -03:00
KennyTV 48f8412440 20w30a 2020-07-22 21:47:18 +02:00
KennyTV 2c9ce50312 Bump version to 3.1.0- 2020-07-22 09:17:28 +02:00
KennyTV 601a6eb808 Set mapping load thread name, config comment change
Closes #1922
2020-07-21 09:10:16 +02:00
KennyTV 647230a996 Move long plugin channel name check to a config option 2020-07-19 17:30:03 +02:00
KennyTV 5047aaff0c Fix 1.12->1.13 recipe type switcheroo
Fixes #1918
2020-07-19 13:37:41 +02:00
KennyTV a981adf7a3 Fix VB check on Velocity/Sponge 2020-07-16 19:43:54 +02:00
KennyTV a16a085f75 Print exceptions during mapping loading 2020-07-16 19:27:56 +02:00
KennyTV 37f5948b0a 20w29a 2020-07-15 17:44:24 +02:00
KennyTV 7fa80e1759 Use buffered stream for compressed nbt reading
(See tux' open pr at adventure)
2020-07-15 12:10:24 +02:00
KennyTV e1464044a7 Use Map in RecipeRewriter, use correct names for 1.13/1.14 rewriters 2020-07-15 11:42:59 +02:00
KennyTV 42167394e0 Make 1.16 default registry public 2020-07-11 22:26:54 +02:00
KennyTV 3ef1912267 Map biomes, fix registry sending 2020-07-09 14:31:19 +02:00
KennyTV 3c20b79573 Implement multi block change packet changes 2020-07-08 21:51:56 +02:00
KennyTV 7171802b78 20w28a 2020-07-08 21:01:18 +02:00
KennyTV 58e7455cd9 Fix NPE on proxies in ViaIdleThread
Fixes #1878
2020-07-04 13:22:51 +02:00
KennyTV a613edcb42 Fix legacy nbt io
Fixes #1874
2020-07-02 16:35:33 +02:00
KennyTV 5ce1e850c8 Rewrite item nbt attributes 2020-07-02 15:57:52 +02:00
KennyTV 4f392ba361 Suffix snapshot version again
(Now accepted by ViaFabric)
2020-07-02 15:57:52 +02:00
KennyTV 61fb1c249c Wrap exceptions in remappers to InformativeEx 2020-07-02 15:57:52 +02:00
KennyTV dae83d0e36 Wrap exceptions in remappers to InformativeEx 2020-07-02 11:08:59 +02:00
KennyTV 67c5e78e7b Cleanup declare recipe, trade list, and advancement packets 2020-07-02 00:18:33 +02:00
KennyTV 1ec2551fcc Change version back to 3.0.2-SNAPSHOT
Spam is over, I promise
2020-07-01 20:42:07 +02:00
KennyTV d4a299501a Add piglin brute to entity types 2020-07-01 20:21:38 +02:00
KennyTV 3fbeb3e902 Actually fix hardcore flag 2020-07-01 20:07:20 +02:00
KennyTV 7f2023176f Fix hardcore flag 2020-07-01 20:02:44 +02:00
KennyTV 3ddd289b49 20w27a
TODO: Yoink recipe rewriter from ViaBackwards
2020-07-01 19:44:11 +02:00
KennyTV f16ff65933 Move handshake exceptions filter to exceptionCaught handling 2020-07-01 13:22:00 +02:00
KennyTV 96485c444e Filter new blocks/items in tag rewriting
Fixes ViaVersion/ViaBackwards#219
2020-07-01 09:40:18 +02:00
KennyTV b99b79f44a Only print handshake errors when debug is enabled
The exceptions only now showed up with the new print handling, but 100% of the printed cases have just been invalid packets, which we can (and should) just ignore.
Fixes #1854
2020-07-01 09:11:46 +02:00
KennyTV 3ba2191829 Fix late Bungee connection cancelling 2020-06-30 13:51:06 +02:00
KennyTV 26de3fe573 Cancel lengthy plugin channels on Spigot
Fixes #1859
2020-06-30 09:35:37 +02:00
KennyTV d59749fb03 Fix legacy nbt parsing 2020-06-29 18:06:23 +02:00
KennyTV a0195c59cc Handle lore in show_item in 1.13->1.14
Also print out nbt if reading/writing fails
2020-06-28 22:19:59 +02:00
KennyTV 26b90b6d71 Fix accidental casting
Might have forgotten to actually commit this, whoopsie
2020-06-28 20:44:45 +02:00
Myles ed0db721dd Merge pull request #1853 from KennyTV/master
Fix 1.12->1.13 show_item handling
2020-06-28 11:52:59 +01:00
KennyTV b203db3ce5 Minor formatting change 2020-06-28 12:35:42 +02:00
KennyTV e386f7cf45 Fix 1.12->1.13 show_item handling
Fixes #1603
2020-06-28 12:28:35 +02:00
KennyTV c1c542cc5a Fix advancement reading 2020-06-28 11:59:19 +02:00
KennyTV 642d427783 Convert component score values
Fixes #1817
2020-06-27 23:41:46 +02:00
KennyTV b2514a9e50 Map a few removed translation keys
Fixes #1818
2020-06-27 19:51:42 +02:00
Nassim a942d3aad5 Merge pull request #1840 from KennyTV/component-reading
Directly read components as json, to only de-/serialize once
2020-06-27 17:42:25 +02:00
KennyTV 7a25645ed5 Rename some A's 2020-06-27 16:56:57 +02:00
Myles 3c23bd41dd Merge pull request #1843 from creeper123123321/patch-3
Fix bossbar
2020-06-26 10:04:18 +01:00
Myles e5ba76e006 Merge pull request #1833 from KennyTV/master
Only print InformativeException cases in codec handlers
2020-06-26 10:03:49 +01:00
creeper123123321 7a03feeccc Fix bossbar 2020-06-26 05:57:02 -03:00
Nassim 67ef4700c7 Merge pull request #1842 from creeper123123321/fixdisablebaseprotocol
inactivate userconnection correctly when there's no translation
2020-06-25 20:50:17 +02:00
creeper123123321 790a9d0058 inactivate userconnection correctly when there's no translation 2020-06-25 13:49:19 -03:00
Myles 002ad95cad Merge pull request #1839 from creeper123123321/nonuuidbossbar
Allow use of UserConnections for BossBars
2020-06-25 17:25:44 +01:00
creeper123123321 7ff42400c0 javadc 2020-06-25 12:07:30 -03:00
creeper123123321 3df7f760a6 warn about duplicate uuids 2020-06-25 11:50:12 -03:00
KennyTV 3a48e54e52 Directly read components as json, to only de-/serialize once 2020-06-25 16:41:39 +02:00
creeper123123321 73eef1727a make isFrontEnd public 2020-06-25 11:41:38 -03:00
creeper123123321 1ab0cd07af Use return value from add/remove and add abstract isFrontEnd 2020-06-25 11:40:15 -03:00
creeper123123321 9df545483c Fix when client doesn't have id 2020-06-25 11:28:30 -03:00
creeper123123321 3f93bb051d Redirect UUID to UserConnection bossbars 2020-06-25 11:25:59 -03:00
creeper123123321 8bd982a412 fix number comparing 2020-06-25 11:00:43 -03:00
creeper123123321 7b200ad264 dont use uuids for bossbars, use userconnection 2020-06-25 10:50:34 -03:00
KennyTV 5d2a4e2ef3 Add sanity check to conduit nbt handling 2020-06-25 12:52:59 +02:00
KennyTV d414106d5a Only print InformativeException cases in codec handlers 2020-06-25 12:51:51 +02:00
KennyTV d86ac64ac9 Fix PS support
Fixes #1825
2020-06-25 12:39:49 +02:00
KennyTV 6761489ebf Also handle the block entity data packet for nbt
Fixes #1816
2020-06-25 11:18:07 +02:00
KennyTV dd0ec0033a Bukkit is no more
... no longer deployed that is
2020-06-25 10:44:53 +02:00
KennyTV f91ddb2521 Hotfix RGB Bungee legacy insertions
Fixes #1838
We should at some point completely remove the Bungee chat lib and handle everything with plain json ourselves
2020-06-25 09:57:26 +02:00
Myles 3ee94415a9 Back to snapshot 2020-06-24 13:34:17 +01:00
Myles 1a7ce908b8 Release 2020-06-24 13:16:45 +01:00
KennyTV d3fb7cd91b 1.16.1 2020-06-24 14:10:33 +02:00
KennyTV 8b61d168f7 Send remaining (empty) tags
Fixes #1830
2020-06-24 14:05:52 +02:00
Myles 50cb30b4fc Version graph (updated by @kennytv) 2020-06-24 09:36:01 +01:00
KennyTV 5b807a9f17 Fix motd reading in some cases
Fixes #1826
2020-06-23 23:33:59 +02:00
KennyTV f671a4fa5c Work around player sample line breaks
Fixes #1819
2020-06-23 20:01:01 +02:00
KennyTV 0b1c210f77 Fix component read length
Fixes #1822, fixes #1696
2020-06-23 19:15:20 +02:00
KennyTV 9220c5ae40 Remap ocelots to cats in 1.13->1.14 again
Fixes #1815
2020-06-23 17:43:05 +02:00
KennyTV f391cc6185 Send impact_projectiles enttiy tag 2020-06-23 17:30:37 +02:00
KennyTV b0fe7d9c6d Also add wooden_trapdoors item tag 2020-06-23 17:13:11 +02:00
KennyTV 3d39f0d304 Fix wooden_trapdoors tag checking 2020-06-23 16:31:00 +02:00
Myles 42029770a2 Back to snapshot 2020-06-23 14:40:22 +01:00
Myles cf00b9ee7c 3.0.0 2020-06-23 14:07:27 +01:00
Myles b0816b1ce6 Merge pull request #1812 from KennyTV/abstraction
Revert removal of concurrency hacks
2020-06-22 17:15:11 +01:00
KennyTV 67cce53b72 Revert removal of concurrency hacks
Apparently still causes issues with PS, we'll investigate this properly at a later date
2020-06-22 17:45:10 +02:00
Myles 0c097d7467 Merge pull request #1810 from KennyTV/abstraction
Fix 1.16 Bungee compat
2020-06-22 16:33:25 +01:00
KennyTV 70e142e4c4 Fix 1.16 Bungee compat
Moved the version hack outside of the BaseProtocol class into separate impls with properly checking the sent version
2020-06-22 17:02:25 +02:00
KennyTV 9f104866b2 Prepare for 1.16 2020-06-22 16:10:34 +02:00
KennyTV 7ec9eb08d9 Fix banner item color in 1.12->1.13
Fixes #1809
2020-06-22 10:20:00 +02:00
Myles 2ea3d60307 Merge pull request #1807 from KennyTV/abstraction
Avoid a bit of overhead in manual primitive type reading
2020-06-18 19:02:05 +01:00
KennyTV 7595ca0c40 Avoid a bit of overhead in manual primitive type reading
Mostly interesting for proper object type reading (arrays, chunks, etc.) that manually call the type read/write methods + packet varint channel id
2020-06-18 19:38:47 +02:00
KennyTV 5a15d34d9e 1.16 rc1 2020-06-18 15:48:33 +02:00
KennyTV cc500e4681 1.16 pre8 2020-06-17 18:03:22 +02:00
KennyTV 4c7cf56655 Fix future entity equip reading 2020-06-16 21:04:29 +02:00
Myles f570e77325 Merge pull request #1805 from KennyTV/abstraction
1.16 pre7
2020-06-16 18:55:22 +01:00
KennyTV 9785878d87 1.16 pre7 2020-06-16 18:50:50 +02:00
KennyTV 6cd6c87127 1.16 pre6 2020-06-15 20:11:21 +02:00
KennyTV 8d7c7743b8 Only print codec netty exceptions 2020-06-14 18:15:09 +02:00
KennyTV b9889d2c45 1.16 pre5 2020-06-12 17:18:06 +02:00
Myles a58257bc38 Merge pull request #1802 from KennyTV/abstraction
1.16 pre4
2020-06-11 22:28:52 +01:00
KennyTV 7924dfeab2 Remove -1 tag workaround, fixed in pre4 2020-06-11 19:36:35 +02:00
KennyTV 989c0bf55f 1.16 pre4 2020-06-11 19:30:52 +02:00
Myles 064c7a3cd0 Merge pull request #1801 from KennyTV/abstraction
1.16 pre3
2020-06-11 13:26:14 +01:00
KennyTV e1b2702231 1.16 pre3 2020-06-10 19:36:05 +02:00
KennyTV 029f399a14 Rename ViaCodecException to CancelCodecException 2020-06-10 08:58:40 +02:00
KennyTV 7588609c56 Fix cancelexception printing 2020-06-09 21:29:19 +02:00
KennyTV 6513df10e7 Explicitly cast json loaded map in BlockIdData
Else json will start to cry sometimes
2020-06-09 20:38:50 +02:00
KennyTV d14a74f29e Change CancelException message 2020-06-09 20:05:35 +02:00
Myles 2f9c66eafb Merge pull request #1505 from creeper123123321/nettyhandlerabstraction
Netty handler tidy
2020-06-09 17:10:06 +01:00
KennyTV ad1707f0ee Fixup docs 2020-06-09 17:57:14 +02:00
KennyTV aa59ed112a Fixup docs, remove ConcurrentList 2020-06-09 17:53:31 +02:00
Myles 7be8c9d8aa Merge pull request #1799 from KennyTV/abstraction
Use FastUtil collections for frequently called code
2020-06-09 15:50:23 +01:00
KennyTV f408a5d4c6 Add last load factors 2020-06-09 08:38:22 +02:00
KennyTV 5d8084986f Put itemmappings into custom Int2IntBiMap 2020-06-08 23:54:24 +02:00
KennyTV 5bd1ef882e Set load factor to 1 for deterministically sized collections 2020-06-08 23:13:47 +02:00
KennyTV 6167c3b526 Set default return values 2020-06-08 23:01:55 +02:00
KennyTV 8188ae09f5 Use proper FU classes, shade dumbed down version 2020-06-08 22:23:24 +02:00
KennyTV 9c81ba368f Cancel block change packets for removed actions 2020-06-08 17:46:18 +02:00
KennyTV 39cb8fd554 Fix FU check 2020-06-08 15:58:10 +02:00
KennyTV 623cdaf881 Getter for original map in IntMap 2020-06-08 15:34:34 +02:00
KennyTV 1ad559212e Create soft wrapper for FU Int2ObjectMap 2020-06-08 13:49:26 +02:00
KennyTV 30e10bb645 Create soft wrapper for FU IntSet and Int2IntMap 2020-06-08 12:27:34 +02:00
KennyTV df495f8131 Remove accidental import 2020-06-07 16:29:15 +02:00
KennyTV 529da10615 Move ProtocolInfo into its own field 2020-06-07 12:19:36 +02:00
KennyTV f2d6691af7 Minor javadoc changes 2020-06-07 11:32:49 +02:00
creeper123123321 a8a1e9448e Netty handler tidy 2020-06-07 10:41:29 +02:00
Myles d58959fcca Merge pull request #1798 from KennyTV/abstraction
Add method to get protocol instance by class
2020-06-07 09:18:57 +01:00
KennyTV 5fca206b8d Add method to get protocol instance by class 2020-06-07 10:16:40 +02:00
Myles 67993364b4 Merge pull request #1797 from KennyTV/packetids
Print protocol and packet type when erroring
2020-06-06 15:32:47 +01:00
KennyTV 25652eab15 Print protocol and packet type when erroring 2020-06-06 16:16:38 +02:00
KennyTV f117239184 Further safety checks for correct packets types 2020-06-06 15:54:51 +02:00
KennyTV cc3dae127b Use correct packet type when warning for missing mapping 2020-06-06 15:33:20 +02:00
Myles 137050be16 Merge pull request #1795 from KennyTV/packetids
Packet type constants and auto channel mapping
2020-06-06 11:00:06 +01:00
KennyTV baf1b851c4 1.8 packet enum, add a small number of nullable annotations 2020-06-06 10:55:35 +02:00
KennyTV 545ab2de79 Enforce correct packet types with generics, 1.9 packet constant 2020-06-06 09:45:43 +02:00
KennyTV 38f845bb7e Consistency changes, 1.11->1.12 packet constants
Almost there! :>
2020-06-05 23:06:00 +02:00
KennyTV 9f80553749 Safety checks, packet type constants for 1.12->1.13 protocol 2020-06-05 22:33:48 +02:00
KennyTV d7d4e58106 Packet type constants and auto channel mapping 2020-06-05 20:48:35 +02:00
Myles 5293417900 Merge pull request #1793 from KennyTV/abstraction
1.16-pre1
2020-06-05 19:47:45 +01:00
KennyTV 9a59c40ce1 Fix dimension registry data 2020-06-05 14:02:09 +02:00
KennyTV 8a00e260f6 Pre 2 protocol bump 2020-06-05 13:22:58 +02:00
KennyTV 1285a0c6bf 1.16-pre1 2020-06-05 00:42:39 +02:00
KennyTV eb9d913cb6 Add toString, equals, and hashCode to Metadata 2020-06-03 11:19:54 +02:00
Myles a60340f330 Workaround for missing Protocol1_9to1_8 2020-05-30 21:31:28 +01:00
KennyTV 796a42c981 Send new 20w22a tags 2020-05-29 20:36:40 +02:00
Myles 63a81b939d Merge pull request #1788 from KennyTV/abstraction
20w22a
2020-05-29 14:20:07 +01:00
KennyTV a9e2544188 20w22a 2020-05-29 15:14:18 +02:00
KennyTV bea01bc794 Fix respawn reading 2020-05-23 12:46:15 +02:00
Myles 3db74c79ab Merge pull request #1784 from KennyTV/abstraction
Sound rewriter cleanup - don't send -1 sound ids
2020-05-23 10:20:17 +01:00
KennyTV 799c933d95 Make SoundRewriter fields protected 2020-05-23 11:14:50 +02:00
KennyTV 6b9e67f96b Sound rewriter cleanup - don't send -1 sound ids
Addresses #1783
2020-05-23 10:56:27 +02:00
Myles 062d846c37 Merge pull request #1782 from KennyTV/abstraction
20w21a
2020-05-20 16:18:26 +01:00
KennyTV af3023562d Fix dimension identifier 2020-05-20 17:02:22 +02:00
KennyTV 92f4e3dd81 20w21a 2020-05-20 16:44:12 +02:00
Myles f7eb445d61 Merge pull request #1775 from KennyTV/abstraction
20w20a
2020-05-16 16:22:35 +01:00
KennyTV 98b77278cd 20w20b 2020-05-14 11:53:27 +02:00
Myles 60461b9cff Merge pull request #1776 from Xernium/abstraction
I am sick of this-
2020-05-13 20:31:00 +01:00
FivePB (Xer) 1394c70981 Shouldn't try to write helpful messages when drunk 2020-05-13 20:56:15 +02:00
FivePB (Xer) 595b8c3b56 Yes much tree 2020-05-13 20:50:28 +02:00
FivePB (Xer) 27cbd844f0 Much fighting over this mess(age) 2020-05-13 20:48:51 +02:00
KennyTV 5c5c1ed402 20w20a 2020-05-13 18:08:33 +02:00
KennyTV 245c7e8219 Add wall_post_override blocktag 2020-05-12 22:51:02 +02:00
Myles 3079663ba9 Merge pull request #1769 from KennyTV/abstraction
Add runnable list to be executed before the full init
2020-05-09 09:28:11 +01:00
KennyTV 25d54ae229 Add runnable list to be executed before the full init 2020-05-09 09:46:15 +02:00
Myles 045c35243f Merge pull request #1768 from Gerrygames/abstraction
Handle new window type in 1.16
2020-05-08 08:32:33 +01:00
Gerrygames 5009ffbb5a handle new window type in 1.16 2020-05-08 01:36:24 +02:00
KennyTV 47b43402f5 20w19a 2020-05-06 19:11:05 +02:00
KennyTV a5dbec5303 Merge remote-tracking branch 'origin/master' into abstraction
# Conflicts:
#	pom.xml
2020-05-06 19:05:15 +02:00
Myles f3f82c4f1a Merge pull request #1765 from KennyTV/abstraction
Fix toggleglide listener swimming check
2020-05-06 09:03:41 +01:00
KennyTV 653ca4b322 Fix toggleglide listener swimming check 2020-05-06 09:30:16 +02:00
Myles b57800c2e2 Merge pull request #1760 from konwboj/master
Fix block connections causing issues with TNT
2020-05-05 19:43:49 +01:00
konwboy 222c03aa67 Fix block connections causing issues with TNT 2020-05-05 19:49:59 +02:00
Myles d5ff2b5b63 Merge pull request #1735 from KennyTV/abstraction
Add fire connection handler
2020-05-02 15:35:38 +01:00
Myles 0a95488146 Merge pull request #1750 from Gerrygames/abstraction
fix enchantments in enchanting table for 1.16
2020-04-29 20:14:03 +01:00
Gerrygames 93d21efd3d fix enchantments in enchanting table for 1.16 2020-04-29 21:10:05 +02:00
Myles d71cd20a39 Merge pull request #1749 from KennyTV/20w18a
20w18a
2020-04-29 18:50:11 +01:00
KennyTV 19201134a8 20w18a 2020-04-29 18:09:57 +02:00
KennyTV da2f153a43 Share JsonParser instance 2020-04-27 14:41:57 +02:00
Myles d96b88b967 Merge pull request #1743 from KennyTV/cache
Uncache UserConnection on channel close, say farewell to lombok
2020-04-25 12:24:44 +01:00
KennyTV d33482e200 Remove lombok at last 2020-04-25 11:56:20 +02:00
KennyTV 24ebb77860 Directly add dependent futures to the list instead of waiting for the extra boolean 2020-04-24 13:48:22 +02:00
KennyTV e4bac5f81a Improve shutdown of executor loader and mappings cache
Previously, the shutdown check would only happen once all futures were removed, as in a player joined that had to check the remaining protocols.
Now, the check will be done regularly once the plugin has fully been enabled and has the option to delay the shutdown until set on again (i.e. with ViaBackwards)
2020-04-24 13:27:29 +02:00
KennyTV 4b9a15b003 Some javadoc changes 2020-04-24 11:39:11 +02:00
KennyTV 32826467d3 Wrap reflectiveoperationexception in concurrentlist clone 2020-04-23 21:42:08 +02:00
KennyTV 886ac734f9 Add null check to channel close 2020-04-23 21:09:41 +02:00
KennyTV 762c66ff42 Farewell, lombok! 2020-04-23 21:07:12 +02:00
KennyTV 53b8c2328e Uncache UserConnection on channel close, fix memory leak 2020-04-23 20:24:16 +02:00
KennyTV 578c661730 Check if player is handled by Via on disconnect 2020-04-22 22:11:01 +02:00
KennyTV a82bbc4e66 Replace keyset map lookups with value iterator 2020-04-22 21:47:14 +02:00
KennyTV 867cd4ee39 Move heightmap code above block entity check 2020-04-22 21:46:14 +02:00
Myles f7b841faf3 Merge pull request #1742 from Gerrygames/abstraction
convert height maps, fix 1.16 chunk reading
2020-04-22 20:44:47 +01:00
Gerrygames b80902ec10 convert height maps, fix 1.16 chunk reading 2020-04-22 21:42:11 +02:00
Myles 90386cd0de Merge pull request #1741 from Gerrygames/abstraction
20w17a
2020-04-22 18:15:02 +01:00
Gerrygames e22bba0360 20w17a, update entity types renamed in 1.13 2020-04-22 19:04:53 +02:00
Myles f82b52b017 Fix disconnect / sendMessage on Bungee 2020-04-20 09:56:34 +01:00
Myles 2734b18d07 Block connections true by default
While we didn't have this enabled when it launched, most of the bugs are gone and the number of people using this option is pretty high.
2020-04-19 18:59:38 +01:00
KennyTV 3a5a47aaa2 Add fire connection handler 2020-04-19 15:57:59 +02:00
Myles c7bc9aa43c Merge pull request #1734 from KennyTV/abstraction
Add safety checks to skullowner conversion
2020-04-17 20:04:29 +01:00
KennyTV c956f23def Add safety checks to skullowner conversion 2020-04-17 21:02:51 +02:00
KennyTV 0f90efa05f Add subplatform versions to dumps 2020-04-17 20:52:55 +02:00
Myles e3821e1741 Merge pull request #1733 from KennyTV/abstraction
Add git commit hash to dumps
2020-04-16 23:21:30 +01:00
KennyTV 8bf9a910d5 Explicitly use parent version 2020-04-16 21:44:04 +02:00
KennyTV 83a6346a8d Add git commit hash to dumps 2020-04-16 21:39:28 +02:00
Myles d9291e6457 Merge pull request #1719 from creeper123123321/portedplayerschange
Remove portedPlayers field, let platform handle players
2020-04-15 23:11:09 +01:00
Myles 2bd2fa3228 Merge pull request #1728 from KennyTV/abstraction
20w16a
2020-04-15 22:18:05 +01:00
KennyTV b03dfa9951 20w16a 2020-04-15 17:53:02 +02:00
creeper123123321 dd5cbb0e4c Merge branch 'abstraction' of https://github.com/ViaVersion/ViaVersion into portedplayerschange 2020-04-15 11:39:13 -03:00
creeper123123321 18034a334c Merge branch 'portedplayerschange' of github.com:creeper123123321/ViaVersion into portedplayerschange 2020-04-15 11:36:01 -03:00
creeper123123321 17881b342a javadoc, remove ViaAPIs getPortedPlayers, fix ViaManager.getPortedPlayers name, rename to ViaAPI#isInjected 2020-04-15 11:35:09 -03:00
Myles 47e50d035f Merge pull request #1724 from KennyTV/abstraction
Fix 1.15 EntityToggleGlideEvent cancelling on Bukkit
2020-04-14 17:58:14 +01:00
Myles 5af9f025d8 Merge pull request #1379 from creeper123123321/1_8inconsistencyfix
Fix inconsistent types in block placement
2020-04-14 17:43:20 +01:00
creeper123123321 c12c43e79a SpongePlugin readd .getParentFile() 2020-04-14 12:47:44 -03:00
creeper123123321 9e4ed56384 Revert SpongePlugin sharedRoot change 2020-04-14 12:46:23 -03:00
KennyTV 8f08a32c5a Bai bai to more lombok usage once more 2020-04-13 20:58:24 +02:00
KennyTV fdb6137339 Create bukkit-legacy module for 1.8 magic method usage
No real changes to the classes other than them being moved
2020-04-13 20:19:55 +02:00
KennyTV f173cf73d4 Fix 1.15 EntityToggleGlideEvent cancelling on Bukkit
Since 1.15, cancelling can only be done by updating the player's metadata
2020-04-13 20:03:46 +02:00
creeper123123321 a91c72fb44 position fix 2020-04-13 14:42:48 -03:00
creeper123123321 99abe3994c use short 2020-04-13 14:33:00 -03:00
creeper123123321 a0e3d70a3f unsigned byte 2020-04-13 14:01:28 -03:00
creeper123123321 ee7eaecdb3 move field 2020-04-13 08:51:04 -03:00
creeper123123321 a105c5cb11 Make getPortedPlayers() private, update bungee-api, remove some lombok usage, create ViaConnectionManager 2020-04-12 16:47:32 -03:00
Myles 4d30cc2309 Merge pull request #1718 from creeper123123321/abstraction
#1717 Fix
2020-04-12 19:39:35 +01:00
creeper123123321 ca78bf9851 Remove portedPlayers field, let platform handle players 2020-04-12 15:37:08 -03:00
creeper123123321 d7027cc0e3 formatting 2020-04-12 15:18:44 -03:00
creeper123123321 f8def524aa Run Velocity server change logic on event loop 2020-04-12 14:50:54 -03:00
Myles 14532bfa9a Merge pull request #1709 from KennyTV/abstraction
20w15a
2020-04-09 00:11:10 +01:00
KennyTV 721808d71d 20w15a 2020-04-08 16:15:53 +02:00
Myles 3c9c61056d Merge pull request #1689 from KennyTV/abstraction
Asynchronously load mapping data
2020-04-05 21:54:04 +01:00
Myles 19f7800173 Merge pull request #1705 from KennyTV/1.16
Minor chunk type cleanup
2020-04-05 21:52:20 +01:00
KennyTV df702736bf Readd block entity wrapping 2020-04-04 00:37:06 +02:00
KennyTV 3737242226 Cleanup chunk types 2020-04-04 00:32:00 +02:00
KennyTV ebff5e2f4d Adapt tagdata loading 2020-04-03 19:57:07 +02:00
KennyTV 081781f223 Some cleanup 2020-04-03 19:32:31 +02:00
KennyTV c570f4a972 Minor change 2020-04-03 19:32:31 +02:00
KennyTV 563c5f830d Don't expose executor and future map 2020-04-03 19:32:30 +02:00
KennyTV 248fd92f6e Use CompletableFuture.runAsync 2020-04-03 19:32:30 +02:00
KennyTV 757654aa9d Minor changes 2020-04-03 19:32:30 +02:00
KennyTV e658304405 Asynchronously load mappings (until needed), create optional mappings cache for VB 2020-04-03 19:32:30 +02:00
KennyTV b5e5118450 Minor protocol cleanup
Removed unneeded integer boxing and empty method implementations of the user init
2020-04-03 19:32:30 +02:00
KennyTV 95db675de5 Add missing tags for client sending, cleanup 2020-04-03 17:29:40 +02:00
KennyTV cae6addf26 Fill beacon tag in case it's fully used by the client in the future 2020-04-03 16:47:38 +02:00
KennyTV ed26971724 Fix beacon item payment 2020-04-03 13:41:53 +02:00
KennyTV 7cdcdfa3c9 Minor cleanup to tagrewriter 2020-04-03 11:29:59 +02:00
KennyTV 8314f6c1db Send empty non_flammable_wood itemtag as well 2020-04-03 00:03:21 +02:00
KennyTV 297fe0a538 Send empty non_flammable_wood tag 2020-04-02 23:58:06 +02:00
KennyTV b6592b38ad Fix zombie id 2020-04-02 23:06:05 +02:00
Myles 8ef0221d43 Merge pull request #1703 from KennyTV/1.16
20w14a, entity name fixes, abstract tag rewriter
2020-04-02 21:40:42 +01:00
KennyTV b1d6a49a82 Fix entity remap 2020-04-02 21:42:21 +02:00
KennyTV 0fcba4f4ec Minor changes 2020-04-02 21:09:48 +02:00
KennyTV 0ee6369884 20w14a, entity name fixes, abstract tag rewriter 2020-04-02 21:03:05 +02:00
KennyTV b941a6a422 20w13b 2020-03-26 15:39:34 +01:00
Myles 2d05d601a0 Merge pull request #1692 from KennyTV/20w13a
20w13a
2020-03-25 21:56:41 +00:00
KennyTV 90f363a2be Use correct parent for hoglin and strider 2020-03-25 19:58:38 +01:00
KennyTV 875b85b0fc 20w13a 2020-03-25 19:42:06 +01:00
Myles 29c1623aab Merge pull request #1691 from KennyTV/chat
Update bungeecord-chat
2020-03-24 20:21:34 +00:00
KennyTV a914bc349a Update bungeecord-chat 2020-03-24 21:18:00 +01:00
Myles 88e20e2eb6 Bump version 2020-03-21 22:07:36 +00:00
Myles 9d343a3f29 Merge pull request #1683 from Gerrygames/abstraction
Fix skull items
2020-03-21 13:50:48 +00:00
Gerrygames 6b7f00ef76 fix skull items 2020-03-21 13:51:14 +01:00
Myles c2a1d289e1 Merge pull request #1680 from KennyTV/abstraction
Fix login packet reading on 1.16 servers, fix uuid nbt tags
2020-03-20 21:15:49 +00:00
KennyTV 20ce8cc288 Fix block entity uuid nbt, fix particles 2020-03-20 19:20:48 +01:00
KennyTV 6eaeb5a201 Fix login packet reading on 1.16 servers 2020-03-18 20:31:43 +01:00
Myles f245bb8263 Merge pull request #1679 from KennyTV/abstraction
20w12a
2020-03-18 18:26:34 +00:00
KennyTV f746fda5a8 Unroll uuid reading/writing 2020-03-18 19:21:48 +01:00
KennyTV a7ab4153ef 20w12a 2020-03-18 19:15:58 +01:00
KennyTV 5057ac3d3d Remove null check for channel in UserConnection again 2020-03-14 16:36:04 +01:00
Myles 4b9d3e34ea Merge pull request #1677 from KennyTV/abstraction
20w11a
2020-03-11 21:29:29 +00:00
KennyTV 7887e10bb6 20w11a 2020-03-11 22:14:08 +01:00
Myles ef88be547b Merge pull request #1674 from KennyTV/abstraction
Remove some lombok usage from the api package
2020-03-10 22:36:45 +00:00
KennyTV dd73ba4f72 Remove some lombok usage from the api package 2020-03-10 13:22:22 +01:00
Myles 467adbd3ed Merge pull request #1669 from KennyTV/abstraction
20w10a
2020-03-04 18:31:51 +00:00
KennyTV 2bf69c2df2 20w10a 2020-03-04 18:07:49 +01:00
Myles 7ccc0eb488 Merge pull request #1666 from KennyTV/abstraction
20w09a
2020-02-27 10:48:03 +00:00
KennyTV 97db997473 Fix typo 2020-02-26 18:51:27 +01:00
KennyTV efbc246a72 20w09a 2020-02-26 18:50:30 +01:00
Myles 9ce209ef42 Merge pull request #1664 from KennyTV/abstraction
20w08a
2020-02-19 19:51:03 +00:00
KennyTV df7ef32677 20w08a 2020-02-19 18:49:17 +01:00
KennyTV 1a4945eecd Merge branch 'master' into abstraction 2020-02-19 15:23:39 +01:00
Myles e3e88d449d Merge pull request #1646 from Jo0001/patch-1
Add link to krusics "Blocked Version Generator"
2020-02-17 10:01:42 +00:00
Myles 529f9a0e01 Fix double space and use a 2020-02-17 10:01:28 +00:00
Myles b5add583c9 Merge pull request #1662 from KennyTV/abstraction
20w07a
2020-02-14 20:54:54 +00:00
KennyTV c2d8b43eab Update hoglin, add piglin entity type 2020-02-14 15:56:55 +01:00
KennyTV 6d823263ac 20w07a 2020-02-14 15:48:12 +01:00
KennyTV a9b3640b69 Merge branch 'master' into abstraction 2020-02-14 15:47:42 +01:00
Myles 17323c715d Merge pull request #1656 from JLLeitschuh/fix/JLL/use_https_to_resolve_dependencies
[SECURITY] Use HTTPS to resolve dependencies in Maven Build
2020-02-11 16:31:27 +00:00
Jonathan Leitschuh 2420b8052e Use HTTPS instead of HTTP to resolve dependencies
This fixes a security vulnerability in this project where the `pom.xml`
files were configuring Maven to resolve dependencies over HTTP instead of
HTTPS.

Signed-off-by: Jonathan Leitschuh <Jonathan.Leitschuh@gmail.com>
2020-02-11 10:46:21 -05:00
KennyTV 5c54e8a08d Merge branch 'master' into abstraction 2020-02-10 15:55:09 +01:00
Myles fa220a93eb Merge pull request #1654 from KennyTV/master
Add vines blockconnection to prevent unwanted climbing
2020-02-10 13:58:40 +00:00
KennyTV 7e164b40c7 Add vines blockconnection to prevent unwanted climbing
Fixes #1640
2020-02-10 14:50:22 +01:00
Myles 323ceb9ced Merge pull request #1653 from KennyTV/abstraction
Remove deprecated api, remove a bit of magic
2020-02-10 09:10:11 +00:00
KennyTV 681a0dc0e4 Remove deprecated api, remove a bit of magic 2020-02-10 10:05:56 +01:00
Myles 7cbd20a038 Merge pull request #1652 from KennyTV/abstraction
Remove a bit of magic, use finals
2020-02-09 12:08:39 +00:00
KennyTV 3f5500c637 Remove a bit of magic, use finals 2020-02-09 13:06:23 +01:00
Myles 7513b0499d Merge pull request #1650 from KennyTV/abstraction
Handle items in cooldown packet
2020-02-08 21:24:45 +00:00
KennyTV c4b447f7b6 Handle items in cooldown packet 2020-02-08 21:33:44 +01:00
KennyTV 177b0fbf33 Fix particle mapping 2020-02-06 12:37:57 +01:00
Myles 7f5e53782b Merge pull request #1648 from KennyTV/abstraction
20w06a, more cleanup
2020-02-05 19:28:04 +00:00
KennyTV 2184ef19ca 20w06a, more cleanup 2020-02-05 20:09:06 +01:00
Myles 712aa0dbf0 Merge pull request #1647 from KennyTV/abstraction
Improvements to 1.11 EntityIdRewriter
2020-02-05 16:07:33 +00:00
KennyTV c33611d2d3 Cleanup 1.11 entityidrewriter 2020-02-04 15:33:36 +01:00
Jo0001 bf15415185 Add link to krusics "Blocked Version Generator" 2020-02-01 20:26:03 +01:00
Myles 7a38e8ceb9 Merge pull request #1644 from KennyTV/abstraction
Minor blockconnection cleanup, reduce map lookups
2020-01-28 14:23:19 +00:00
KennyTV 7f6c429a55 Minor blockconnection cleanup, reduce map lookups 2020-01-28 13:31:36 +01:00
Myles 6eeecb271b Merge pull request #1638 from KennyTV/abstraction
Do not unnecessarily register tasks/listeners, set api-version
2020-01-28 11:38:32 +00:00
Myles 109d5afcf5 Merge pull request #1643 from KennyTV/master
Option to (not) remap infested blocks to their normal variants
2020-01-28 11:37:58 +00:00
KennyTV 116706c09f Option to (not) remap infested blocks to their normal variants
Fixes #1642
2020-01-28 12:36:27 +01:00
KennyTV 598b51a4bf Do not unnecessarily register tasks/listeners 2020-01-22 14:55:39 +01:00
KennyTV b06b9c69ca Do not unnecessarily register tasks/listeners 2020-01-22 14:14:43 +01:00
KennyTV 704f946cf7 Merge remote-tracking branch 'origin/master' into abstraction
# Conflicts:
#	bukkit/pom.xml
#	bungee/pom.xml
#	common/pom.xml
#	jar/pom.xml
#	pom.xml
#	sponge-legacy/pom.xml
#	sponge/pom.xml
#	velocity/pom.xml
2020-01-21 16:07:42 +01:00
KennyTV 1ef9dc8de6 2.2.3 Release 2020-01-21 16:07:01 +01:00
KennyTV f9d10a9571 1.15.2 support 2020-01-21 16:05:26 +01:00
KennyTV 379c5791e6 Merge branch 'master' into dev 2020-01-20 22:15:41 +01:00
KennyTV 8569f47627 Merge branch 'dev' into abstraction 2020-01-19 19:09:57 +01:00
Myles 555bbb550f Merge pull request #1634 from Gerrygames/dev
1.15-pre2
2020-01-16 15:03:34 +00:00
Gerrygames 4cf09f2e34 1.15-pre2 2020-01-16 15:58:35 +01:00
Myles c9abd745c5 Merge pull request #1633 from KennyTV/abstraction
Put translation values into correct map
2020-01-16 09:50:45 +00:00
KennyTV 5d1b8dbb85 Put translation values into correct map 2020-01-16 10:39:31 +01:00
Myles ebeb1905b3 Merge pull request #1631 from KennyTV/abstraction
Convert (general) 1.12.2->1.13 statistics
2020-01-15 21:44:55 +00:00
KennyTV 605b217ba4 Convert (general) 1.12.2->1.13 statistics 2020-01-15 21:51:33 +01:00
KennyTV 814bd9d85e Merge remote-tracking branch 'origin/master' into abstraction 2020-01-15 19:13:33 +01:00
Myles 8d16ebf6ae Merge pull request #1630 from KennyTV/master
Fix 1.11 evocation id
2020-01-15 17:54:52 +00:00
KennyTV 7f0af23f96 Fix 1.11 evocation id
Fixes #1629
2020-01-15 18:53:26 +01:00
Myles 060370f356 Update fabric.mod.json 2020-01-14 20:11:09 +00:00
Myles ab384df279 Merge branch 'master' into abstraction 2020-01-14 19:14:42 +00:00
Myles 9a0cc02b86 Merge branch 'master' into dev 2020-01-14 19:14:38 +00:00
Myles 5fb86d8df3 *sobs* 2020-01-14 19:14:18 +00:00
Myles c64c27331a Merge branch 'master' into dev 2020-01-14 19:12:55 +00:00
Myles cd2ca76236 Merge branch 'master' into abstraction 2020-01-14 19:12:42 +00:00
Myles 9598e0e4f8 Update authors 2020-01-14 19:12:24 +00:00
Myles d29c2bdfb7 Merge pull request #1627 from KennyTV/master
Fix heightmaps
2020-01-14 18:24:51 +00:00
KennyTV 538b467fa6 Fix heightmaps 2020-01-14 19:18:02 +01:00
Myles 7deca33374 Merge pull request #1626 from Gerrygames/dev
1.15.2-pre1 + merge master
2020-01-14 17:07:19 +00:00
Gerrygames c704813a6c 1.15.2-pre1 2020-01-14 17:51:39 +01:00
Myles 86af7f054a Merge pull request #1601 from KennyTV/abstraction
Cleanup some block rewrite methods
2020-01-06 14:56:17 +00:00
Myles a6932bb71f Merge pull request #1617 from KennyTV/channelnames
Make plugin channel mappings modifiable
2020-01-06 14:55:38 +00:00
KennyTV 3384b6bc17 Only load mappings file from dir if manually copied 2020-01-06 10:52:42 +01:00
KennyTV 4bdb566fb5 Kept the wrong defaults 2020-01-05 21:23:40 +01:00
KennyTV 5ad62a03ed Make plugin channel mappings modifiable 2020-01-05 21:21:58 +01:00
KennyTV 280b6fae2a Merge master 2019-12-21 19:49:18 +01:00
Myles e07c994ddc Merge pull request #1599 from KennyTV/master
Fix Bungee injection on Java 12+
2019-12-21 07:18:23 +00:00
KennyTV 5d974858fe Some more cleanup 2019-12-20 17:53:14 +01:00
KennyTV 5cb5992d44 Fix Bungee injection on Java 12+
Fixes #1512
2019-12-20 16:35:10 +01:00
KennyTV fddbeda81e Back to snapshot 2019-12-20 16:29:10 +01:00
KennyTV 1c1ec10a0a Common methods for block rewriting 2019-12-17 18:29:38 +01:00
Myles cd9566fbc8 1.15.1 support 2019-12-17 15:28:43 +00:00
KennyTV 90b88f3cbf Update readme 2019-12-17 15:03:06 +01:00
Myles faf86b2439 Merge pull request #1590 from KennyTV/dev
1.15.1
2019-12-17 13:59:06 +00:00
KennyTV 5a1dadf476 1.15.1 2019-12-17 14:54:51 +01:00
Myles 6eabb17f67 Merge from master 2019-12-15 09:16:53 +00:00
Myles 4f72edeaee Merge branch 'master' into dev 2019-12-15 09:02:48 +00:00
Myles b0f3d04439 Merge branch 'master' of https://github.com/ViaVersion/ViaVersion 2019-12-15 09:02:03 +00:00
Myles 33a34fc149 Update README with new table 2019-12-15 09:01:49 +00:00
Myles 679f573444 Merge pull request #1587 from robinbraemer/patch-1
fix typo
2019-12-15 09:00:37 +00:00
Robin Brämer f35b931004 fix typo 2019-12-14 22:01:50 +01:00
Myles 7ca50291e3 Merge pull request #1585 from KennyTV/master
Fix book edit
2019-12-14 16:34:57 +00:00
KennyTV 9c8a8e2e9c Fix book edit 2019-12-14 16:22:24 +01:00
Myles d45a370a4d Merge pull request #1527 from creeper123123321/primitive_types
Use primitive types in Position and BlockFace, remove world block con…
2019-12-13 12:48:36 +00:00
Myles d5907711e1 Merge pull request #1576 from astei/remove-unneeded-indirection
Remove unneeded indirection
2019-12-13 08:30:22 +00:00
Andrew Steinborn 437463f1b4 Revert "Remove indirection in byte array writing"
This reverts commit ba08c3ad2f.

Breaks the API that ViaRewind and ViaBackwards depend on.
2019-12-12 20:45:03 -05:00
creeper123123321 d6b52bcc54 Merge remote-tracking branch 'upstream/abstraction' into primitive_types 2019-12-12 15:23:32 -03:00
Myles 3738459fa6 Merge pull request #1580 from KennyTV/dev
1.15.1-pre1
2019-12-12 15:35:36 +00:00
KennyTV be4d071250 1.15.1-pre1 2019-12-12 16:32:53 +01:00
Myles 91a2aa6781 Merge pull request #1575 from KennyTV/master
Fix biomedata on some custom Spigot versions
2019-12-12 09:33:20 +00:00
Andrew Steinborn ba08c3ad2f Remove indirection in byte array writing
This saves us from the cost of (un)boxing bytes on the fly.
2019-12-12 00:02:09 -05:00
Andrew Steinborn 220c45b800 Remove indirection in StringType decoding 2019-12-11 23:55:44 -05:00
Andrew Steinborn a42e724f50 Remove unneeded indirection in NBTType
ByteBufInputStream implements DataInput, ByteBufOutputStream implements DataOutput. Use them to exploit native Netty ByteBuf calls where possible.
2019-12-11 23:51:39 -05:00
KennyTV 1002ca4016 Fix biomedata on some custom Spigot versions 2019-12-11 20:36:49 +01:00
Myles c1b11a55d5 Back to SNAPSHOT 2019-12-11 11:16:05 +00:00
Myles a21a2079c6 2.2.1 2019-12-11 11:12:22 +00:00
Myles 07d219c77b Merge pull request #1569 from KennyTV/master
Ignore unneeded sound warnings
2019-12-11 11:10:01 +00:00
KennyTV b7b8bdc841 Ignore unneeded sound warnings 2019-12-11 12:07:22 +01:00
Myles dd5c1bb1a4 Merge pull request #1568 from KennyTV/abstraction
Merge master into abstraction
2019-12-11 09:11:56 +00:00
KennyTV 5f46dcbab0 Merge remote-tracking branch 'upstream/master' into abstraction
# Conflicts:
#	bukkit/pom.xml
#	bungee/pom.xml
#	common/pom.xml
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/FlowerPotHandler.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/EntityPackets.java
#	jar/pom.xml
#	pom.xml
#	sponge-legacy/pom.xml
#	sponge/pom.xml
#	velocity/pom.xml
2019-12-11 09:53:09 +01:00
Myles 66b9bfbbd5 Merge pull request #1567 from KennyTV/master
Fix acknowledge digging
2019-12-11 08:36:18 +00:00
KennyTV dfbe2e9739 Fix acknowledge digging
Fixes #1564
2019-12-11 09:30:51 +01:00
Myles 3d10c56aac Merge pull request #1565 from Gerrygames/master
fix entity metadata in spawn packet being ignored
2019-12-11 08:18:23 +00:00
Gerrygames 84624a4884 fix entity metadata in spawn packet being ignored 2019-12-11 02:10:16 +01:00
Myles 68ac978d45 Back to SNAPSHOT 2019-12-10 15:34:42 +00:00
Myles 8136eb15e1 Merge 1.15 support 2019-12-10 15:31:07 +00:00
Myles 2c95a1e71c README 2019-12-10 15:29:52 +00:00
Myles c85d4224ad 1.15 protocol + 2.2.0 2019-12-10 15:29:26 +00:00
Myles a74bee5bed Merge pull request #1562 from KennyTV/dev
Fix trade list
2019-12-09 18:30:46 +00:00
KennyTV 9dae40f455 Fix trade list 2019-12-09 19:30:09 +01:00
Myles fe7a5a2ae5 Merge pull request #1561 from Gerrygames/dev
fix wrong import - #1560
2019-12-09 18:26:05 +00:00
Gerrygames 44a3108982 fix wrong import - #1560 2019-12-09 19:24:18 +01:00
Myles c0beee9189 Merge pull request #1559 from Gerrygames/dev
1.15-pre7
2019-12-09 12:49:47 +00:00
Gerrygames ea045e6c34 1.15-pre7 2019-12-09 13:48:06 +01:00
Myles 7c38a77f60 Merge pull request #1558 from Gerrygames/abstraction
Merge dev into abstraction
2019-12-09 11:11:15 +00:00
Gerrygames 9174ad854c Merge branch 'dev' into abstraction
# Conflicts:
#	bukkit/pom.xml
#	bungee/pom.xml
#	common/pom.xml
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/EntityPackets.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/types/Chunk1_15Type.java
#	jar/pom.xml
#	pom.xml
#	sponge-legacy/pom.xml
#	sponge/pom.xml
#	velocity/pom.xml
2019-12-09 11:52:23 +01:00
Myles 2960f2a3bb Merge pull request #1557 from Gerrygames/dev
Fix 1.15 entity type ids
2019-12-09 10:46:13 +00:00
Gerrygames cfe073cd20 fix 1.15 entity type ids 2019-12-09 11:34:00 +01:00
Myles 459871257e Merge pull request #1528 from KennyTV/abstraction
Hold config values in fields, add extra mappings constructor, other fixes
2019-12-08 23:08:52 +00:00
Myles 4bb4b96a10 Merge pull request #1548 from KennyTV/dev
Convert biome data to 1.15 format
2019-12-07 10:35:44 +00:00
KennyTV 68a18df969 Take biome data from same indexes as Mojang ("middle" of 4x4x4 areas) 2019-12-07 11:31:00 +01:00
Myles 8c921f427c Merge pull request #1554 from KennyTV/pre6
1.15-pre6
2019-12-07 09:07:40 +00:00
KennyTV 90e1d7236e 1.15-pre6 2019-12-07 10:05:29 +01:00
KennyTV decb20d2d1 Convert biome data to 1.15 format 2019-12-07 10:02:11 +01:00
Myles ff7cb4bbbe Merge pull request #1552 from Gerrygames/dev
1.15-pre5
2019-12-05 14:08:47 +00:00
Gerrygames a68fca9dda 1.15-pre5 2019-12-05 15:03:45 +01:00
Myles 944bfe2b06 Merge pull request #1549 from Gerrygames/dev
1.15-pre4
2019-12-03 13:25:26 +00:00
Gerrygames 762151f067 1.15-rep4 2019-12-03 14:22:54 +01:00
Myles 0327b66a1d Merge pull request #1543 from KennyTV/dev
Fix blaze remap and entity destroy in 1.15
2019-11-30 18:32:05 +00:00
KennyTV 2c95229cfc Fix blaze remap and entity destroy in 1.15
Fixes #1542
2019-11-30 19:22:36 +01:00
Myles 18fa4062e6 Merge pull request #1537 from KennyTV/dev
1.15-pre3
2019-11-28 20:58:56 +00:00
KennyTV 5c7520f552 1.15-pre3 2019-11-28 20:10:19 +01:00
creeper123123321 875d2392b5 Fix position shifting, fix two layers of item copy 2019-11-27 16:39:06 -03:00
KennyTV a68eac7cd2 Add set cooldown register in ItemRewriter 2019-11-27 12:56:20 +01:00
KennyTV 42efec6e2b Add version to entity type warning 2019-11-27 00:55:33 +01:00
KennyTV bcb953a45a Fix 1.15 chunk read 2019-11-27 00:08:28 +01:00
KennyTV bca5b43a2a Fix entity type 2019-11-26 23:59:23 +01:00
KennyTV da704539f0 Rename suppress-warning config option 2019-11-26 20:14:56 +01:00
KennyTV bd9a1dda88 Fix last config issues 2019-11-26 18:22:33 +01:00
KennyTV 915258169e Fix inverted array read check 2019-11-26 13:51:37 +01:00
KennyTV 1b207251e8 Add extra mappings constructor for VB 2019-11-25 22:41:59 +01:00
Myles b7a0829e76 Merge pull request #1534 from KennyTV/dev
1.15-pre2
2019-11-25 20:52:28 +00:00
KennyTV 48feee2bfc Destroy 1.15 entities 2019-11-25 20:40:03 +01:00
KennyTV 08e145f831 1.15-pre2 2019-11-25 19:37:02 +01:00
Myles a44e28bbab Merge pull request #1532 from creeper123123321/sendtrap
Add exception for wrong protocol
2019-11-25 18:19:58 +00:00
KennyTV 21cad97f3f Some fixes, move blockconnection method to bukkit config 2019-11-25 18:34:55 +01:00
creeper123123321 de97b5b15f fix typo 2019-11-24 18:43:10 -03:00
creeper123123321 1e8d04a07d remove deprecated methods and constructor on item and position, inline some uses of position 2019-11-24 17:55:46 -03:00
creeper123123321 a8a33a3a2b add exception for wrong protocol 2019-11-24 09:04:37 -03:00
Myles adafcda13d Merge pull request #1531 from Gerrygames/dev
Fix missing boss bar packet remap
2019-11-24 10:57:59 +00:00
Gerrygames c478492227 fix missing boss bar packet remap 2019-11-24 11:52:04 +01:00
Myles 07b11b4f4a Merge pull request #1529 from creeper123123321/abstraction-update
Merge dev
2019-11-23 11:23:41 +00:00
creeper123123321 beed8437a4 merge dev 2019-11-23 07:23:20 -03:00
KennyTV 501adc503c Fix typo in simulatePlayerTick getter 2019-11-22 22:39:34 +01:00
KennyTV 907516eb71 Hold config values in fields 2019-11-22 22:00:41 +01:00
creeper123123321 9308fc7712 Fix wrong casting 2019-11-22 15:19:25 -03:00
creeper123123321 062d3759be Use primitive types in Position and BlockFace, remove world block connections on Sponge, clean code in 1.8 entity tracker, add constructor for cloning Item and Position 2019-11-22 15:13:41 -03:00
Myles c699baaa41 Merge pull request #1526 from Gerrygames/dev
1.15 pre1
2019-11-22 11:49:28 +00:00
Gerrygames 582e4a11d4 1.15 pre1 2019-11-21 18:34:29 +01:00
Myles 285744a274 Merge pull request #1520 from creeper123123321/dev
19w46b
2019-11-20 12:59:16 +00:00
Myles faaa252fa8 Merge pull request #1521 from creeper123123321/abstraction
Merge dev into abstraction
2019-11-20 12:58:53 +00:00
Myles b01fd89373 Merge pull request #1510 from creeper123123321/flowerpotrewrite
Pot handler rewrite
2019-11-20 12:58:21 +00:00
Myles ed5702188c Merge pull request #1515 from ForceUpdate1/dev_particle_type
Fix area effect cloud
2019-11-20 12:12:43 +00:00
creeper123123321 f9165a1b64 fixed mappings 2019-11-15 12:30:47 -03:00
creeper123123321 bd0ce3dd71 merge dev 2019-11-15 11:35:35 -03:00
creeper123123321 385a483a29 19w46b 2019-11-15 11:19:31 -03:00
Marco Neuhaus 3b97f843cd relocate classes 2019-11-13 22:28:23 +01:00
Myles 3766da5a3a Merge pull request #1518 from Gerrygames/dev
19w46a
2019-11-13 21:04:29 +00:00
Gerrygames c3fa950a9f 19w46a 2019-11-13 17:27:51 +01:00
Myles a114e56e06 Merge pull request #1499 from creeper123123321/abstraction
Add fabric metadata
2019-11-11 22:18:59 +00:00
Myles 04e60d95e4 Merge pull request #1514 from KennyTV/dev
19w45b
2019-11-11 22:14:40 +00:00
Marco Neuhaus 000313ee9a move particle type 2019-11-11 12:29:51 +01:00
Marco dc54551d0c fix area effect cloud
add 1.14 particle type
2019-11-10 16:38:12 +01:00
KennyTV b3dc05e5ce 19w45b 2019-11-08 14:26:20 +01:00
Myles 3c57127a6c Merge pull request #1513 from Gerrygames/dev
19w45a
2019-11-07 19:06:15 +00:00
Gerrygames d16a760466 19w45a 2019-11-07 18:42:05 +01:00
creeper123123321 3761ebf8c7 Pot handler rewrite 2019-11-04 17:36:16 -03:00
Myles a7d78f7f69 Merge pull request #1503 from creeper123123321/abstraction-update
Abstraction update
2019-11-02 14:28:58 +00:00
Myles f59c0722e0 Merge pull request #1507 from creeper123123321/primitivebytearray
primitive array types
2019-11-02 13:32:42 +00:00
creeper123123321 1735f48f23 primitive array types 2019-11-02 10:00:27 -03:00
creeper123123321 a280c1ad39 Add "install: true" in .travis.yml 2019-10-30 14:53:38 -03:00
creeper123123321 ce4ae73f55 forgotten merge conflict 2019-10-30 14:30:36 -03:00
creeper123123321 fd065fb7c5 merge dev 2019-10-30 14:24:22 -03:00
Myles 5ad2511e17 Merge pull request #1502 from ViaVersion/master
Merge master into dev
2019-10-30 16:59:47 +00:00
Myles 8fe47391bf Merge pull request #1501 from Gerrygames/dev
19w44a
2019-10-30 16:20:43 +00:00
Gerrygames 12279731ad 19w44a 2019-10-30 17:14:00 +01:00
creeper123123321 a13c417352 add fabric metadata 2019-10-27 09:15:45 -03:00
Myles a8d0a4dd14 Merge pull request #1491 from creeper123123321/abstraction
deduplicate minecraft compact array code/decode
2019-10-24 21:49:31 +01:00
Myles f8b4a6e28a Merge pull request #1496 from MrMicky-FR/master
Fix item hover event on 1.12
2019-10-24 21:48:09 +01:00
Myles 85e048f22a Merge pull request #1497 from KennyTV/abstraction
Bump version to 3.0.0-SNAPSHOT
2019-10-24 21:03:09 +01:00
KennyTV 3257c79e69 Major version bump to 3.0.0-SNAPSHOT 2019-10-24 21:58:22 +02:00
MrMicky ee54e153bf Fix item hover event for 1.12 players 2019-10-23 16:11:14 +02:00
creeper123123321 9ea6c34543 use setflatblock 2019-10-19 15:35:34 -03:00
creeper123123321 005c91eb4d deduplicate minecraft compact array code/decode 2019-10-19 15:31:50 -03:00
Myles 806312e248 Merge pull request #1487 from Gerrygames/dev
19w42a
2019-10-17 16:33:52 +01:00
Gerrygames bd805bfdc4 19w42a 2019-10-16 18:07:58 +02:00
Myles 98a8f7f072 Merge pull request #1480 from MrMicky-FR/master
Fix scoreboard colors on 1.13
2019-10-13 15:54:51 +01:00
Myles 28b7f6febc Merge pull request #1484 from KennyTV/abstraction
Item rewriter cleanup
2019-10-12 10:06:55 +01:00
Myles d2ad3aea44 Merge pull request #1481 from Gerrygames/dev
19w41a
2019-10-10 11:13:10 +01:00
Gerrygames 3ffc55b539 19w41a 2019-10-09 18:06:37 +02:00
MrMicky 96c58e7b1c Fix scoreboard colors on 1.13 2019-10-08 13:25:37 +02:00
KennyTV c8171b3f43 Item rewriter cleanup 2019-10-05 09:17:10 +02:00
Myles 857ae523cf Merge pull request #1477 from KennyTV/abstraction
Cleanup more entity tracking and rewriting
2019-10-04 13:40:48 +01:00
Myles 232f2494e3 Merge pull request #1479 from KennyTV/dev
Fix an error in the player spawn packet
2019-10-04 13:40:24 +01:00
KennyTV 626eb14960 Fix an error in the player spawn packet 2019-10-04 13:26:51 +02:00
KennyTV c131672870 Fix 2019-10-03 11:00:55 +02:00
Myles 10a2e6b959 Merge pull request #1478 from KennyTV/dev
19w40a, merge master
2019-10-02 15:23:37 +01:00
KennyTV a9c49d948a Merge remote-tracking branch 'upstream/master' into dev
# Conflicts:
#	bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java
#	bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java
#	common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java
#	common/src/main/resources/assets/viaversion/config.yml
#	sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaConfig.java
#	velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaConfig.java
2019-10-02 16:21:37 +02:00
KennyTV 79a2304728 19w40a 2019-10-02 16:19:56 +02:00
KennyTV 48edd01461 Readd second cancelOutgoing method for VB 2019-10-02 15:55:59 +02:00
KennyTV 3adffdc438 Minor fix 2019-10-02 15:14:03 +02:00
KennyTV 655ef137c1 Cleanup more entity tracking and rewriting 2019-10-02 15:09:50 +02:00
KennyTV b11456d86b Helper methods for cancelling packets 2019-10-02 11:17:55 +02:00
Myles abb5e27358 Merge pull request #1476 from KennyTV/abstraction
Merge master & restore merged branches' history
2019-10-02 08:59:18 +01:00
KennyTV 42a7b5a1b2 Merge upstream/dev into abstraction 2019-10-02 09:50:51 +02:00
KennyTV 7ba2630dd2 Finish merge 2019-10-02 09:37:18 +02:00
KennyTV bbeabd20b8 Merge remote-tracking branch 'upstream/master' into abstraction
# Conflicts:
#	bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java
#	bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java
#	common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14_1to1_14/Protocol1_14_1To1_14.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14_1to1_14/packets/EntityPackets.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/MetadataRewriter.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/MappingData.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java
#	common/src/main/resources/assets/viaversion/config.yml
#	velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaConfig.java
2019-10-02 09:31:42 +02:00
Nassim 7e323bc497 Untrack entities in 1.14.1 protocol (#1474) 2019-10-01 21:07:42 +01:00
Lukas 7e008226ec Fix 1.14+ walk animation (#1469)
* Do not send NaN health metadata to 1.14+ clients
* Added config option 'fix-1_14-health-nan'
2019-10-01 09:04:58 +01:00
Nassim 4e7c520abe Entity tracker and rewriter cleanup (#1464) 2019-09-27 19:25:18 +01:00
Gerrygames dce64a0b34 19w39a (#1465) 2019-09-27 16:17:40 +01:00
Nassim aa9a1df1ab Actually fix zombie sound rewrites (#1463) 2019-09-26 20:14:54 +01:00
Nassim 4537aaf339 Fix some sound rewrites (#1462)
Resolves #1434
2019-09-26 19:46:48 +01:00
Nassim 44a4ffb26a Migrate to Java optionals (#1458)
* Add fromEntityType method to 1.13 objecttypes

* Migrate guava optionals to java optionals
2019-09-21 10:57:28 +01:00
Nassim 9408946b36 Merge master into abstraction (#1457) 2019-09-19 10:22:06 +01:00
Nassim cad6e7604d Merge dev, update 1.15 to abstraction, reduce helper mapping (#1456) 2019-09-19 09:27:48 +01:00
Gerrygames e452289603 19w38b, fix bell remap (#1455)
* 19w38a, fix bell remap

* 19w38b
2019-09-18 17:32:13 +01:00
MrMaurice211 0c95eaa1c3 Added forge mappings. (#1452) 2019-09-12 08:08:28 +01:00
Gerrygames c1cce6be9a 19w37a (#1451)
* 19w36a

* 19w37a
2019-09-11 16:09:44 +01:00
Nassim 0afcb893e3 Fix plugin message pattern (#1448) 2019-09-11 13:51:17 +01:00
bundabrg c7050565b8 If Bungeecord ServerConnectEvent is cancelled then ignore the event (#1450) 2019-09-11 13:51:00 +01:00
Nassim 3c436c0259 Fix entity equipment packet for 1.9+ clients (#1449) 2019-09-10 17:09:11 +01:00
Nassim 8b6b3c77e4 Relieve the lightconversion of a little work (#1433) 2019-09-09 13:02:42 +01:00
Nassim 5eb3771704 Fix no light for non full blocks (#1414) 2019-09-09 13:02:30 +01:00
BlackBeltPanda 9fd4795cb3 Update mapping-lang-1.12-1.13.json (#1439)
Fixes Tool Smith and Weapon Smith Villager names
2019-09-08 16:01:35 +01:00
Gerrygames 23eadaeaee 19w36a (#1435) 2019-09-04 16:49:27 +01:00
Myles 8ccba70788 Merge pull request #1432 from KennyTV/master
Fix hitbox listener on 1.8.0 servers
2019-08-31 08:54:52 +01:00
KennyTV 91c2987cfe Minor change
Fixes #1431
(also trying the awesome GitHub auto-closing)
2019-08-31 09:28:56 +02:00
KennyTV 5b403da966 Fix hitbox listener for for 1.8.0 servers 2019-08-31 09:17:30 +02:00
Myles e6e7da89cc Merge pull request #1426 from KennyTV/abstraction
MappingData and minor ProtocolRegistry cleanup
2019-08-29 21:24:28 +01:00
KennyTV 64e0b6c711 Minor change 2019-08-29 22:24:01 +02:00
Myles 238c0e8d40 Merge pull request #1430 from KennyTV/dev
19w35a
2019-08-29 19:06:08 +01:00
KennyTV f35eb3054c Finish 19w35a 2019-08-29 19:56:30 +02:00
KennyTV ea25b559ed 19w35a (mappings for 34a still missing) 2019-08-28 19:28:23 +02:00
KennyTV ad8e723005 Mapping and protocolregistry cleanup 2019-08-23 22:14:32 +02:00
KennyTV 4542e9511b Set some object fields to finals, use lambdas 2019-08-23 22:13:37 +02:00
KennyTV c4b23b8c87 Merge remote-tracking branch 'upstream/master' into abstraction 2019-08-23 21:20:13 +02:00
KennyTV 6f19d2d6d1 Start working on 19w34a 2019-08-23 21:15:38 +02:00
Gerrygames 7cb4e1d00e Fix explosion block desync, fixes #1365 (#1419)
* fix explosion block desync, fixes #1365

* Remove unused import
2019-08-14 09:37:54 +01:00
creeper123123321 28e8339a32 Warn about outdated BungeeCord versions (#1405) 2019-07-29 11:21:31 +01:00
Thom 99ac42c168 Issue with the CanDestroy taglist (#1411)
* Fix for an issue with the CanDestroy tag

The CanDestroy taglist didn't go to lowercase when a 1.13+ user plays on a server equal to 1.12.2 or lower causing the taglist to not work any longer for items written in caps, this while a 1.12.2 client can use the item with the in caps written CanDestroy taglist on the server

* Added Locale.ROOT to the toLowerCase()

* Added the same functionality to CanPlaceOn
2019-07-29 11:19:30 +01:00
Myles 8d97391bf3 Merge pull request #1403 from creeper123123321/master2
change version to 2.1.4-SNAPSHOT
2019-07-20 13:24:44 +01:00
Myles 2836184de3 Merge pull request #1404 from creeper123123321/patch-2
oraclejdk8 doesn't work anymore
2019-07-20 13:24:19 +01:00
creeper123123321 196ff53927 oraclejdk8 doesn't work anymore 2019-07-20 09:14:05 -03:00
creeper123123321 aaba566b1e change version to 2.1.4-SNAPSHOT 2019-07-20 09:08:13 -03:00
Myles 7191dcaa15 Update README.md 2019-07-19 11:21:19 +01:00
Myles 437b16ccd5 Merge branch 'dev' 2019-07-19 11:20:24 +01:00
Myles e4b0a99141 Merge pull request #1402 from KennyTV/1.14.4
1.14.4
2019-07-19 11:19:26 +01:00
Myles 3e5300f03c Merge pull request #1401 from KennyTV/master
Fix 1.14 client lag on join
2019-07-19 11:14:23 +01:00
KennyTV abb09153f0 1.14.4 2019-07-18 16:40:34 +02:00
KennyTV 05437a3e70 Fix 1.14 client lag on join 2019-07-16 20:44:56 +02:00
Myles c697704d04 Merge pull request #1400 from KennyTV/dev
1.14.4-pre6 support
2019-07-15 14:36:31 +01:00
KennyTV bc09187dc1 1.14.4-pre6 support 2019-07-15 14:58:55 +02:00
Myles fd53881221 Merge pull request #1390 from KennyTV/dev
1.14.4-pre1 support
2019-07-03 20:46:35 +01:00
KennyTV 2024614b68 1.14.4-pre1 support 2019-07-03 19:36:30 +02:00
Myles 3521f9ac36 Merge branch 'master' into abstraction 2019-06-28 22:02:48 +01:00
Myles d6973a301b Fix #1382 2019-06-28 22:01:46 +01:00
creeper123123321 ae7fcbc8ad trying to fix inconsistent types in block placement 2019-06-24 17:14:01 -03:00
Myles b675018acf Merge pull request #1375 from KennyTV/master
Fix 1.13 clients unable to break infested blocks (#1370)
2019-06-24 20:37:08 +01:00
Myles 10984cbeb7 Merge branch 'master' into abstraction 2019-06-24 16:24:42 +01:00
Myles bae0cd5e3e Back to snapshot 2019-06-24 16:23:35 +01:00
Myles e4750249e9 1.14.3 support 2019-06-24 16:14:31 +01:00
KennyTV 662bae45b7 Fix 1.13 clients unable to break infested blocks (#1370) 2019-06-22 16:07:38 +02:00
Myles c0e56c7c19 1.14.3 Pre-4 support 2019-06-19 23:11:54 +01:00
Myles 390653a9a6 Merge branch 'master' into abstraction 2019-06-19 09:42:01 +01:00
Myles 0cd04381a4 Merge branch 'master' into dev 2019-06-19 09:41:06 +01:00
Myles dcefaa6b19 Merge pull request #1367 from Gerrygames/master
Fix 1.13 chunk reading, fix 1.9 chunk type not using global palette
2019-06-19 09:40:26 +01:00
Gerrygames 3063538ad0 fix 1.13 chunk reading, fix 1.9 chunk type not using global palette 2019-06-14 17:50:14 +02:00
Myles 604b694709 Merge pull request #1366 from KennyTV/dev
1.14.3 pre-3
2019-06-14 10:33:16 +01:00
KennyTV 1c9309ac98 1.14.3 pre-3 2019-06-14 11:17:38 +02:00
Myles e7c89f28ba Merge pull request #1363 from KennyTV/dev
1.14.3 pre-2
2019-06-07 13:41:30 +01:00
KennyTV 97a8f41e12 1.14.3 pre-2 2019-06-07 12:36:37 +02:00
Myles be5bf7961e Merge branch 'master' into dev 2019-06-05 15:56:29 +01:00
Myles 318db58be1 Servers older than 1.13.2 have a length limit on plugin message name 2019-06-05 15:55:55 +01:00
Myles 0deed6e00d Merge pull request #1359 from KennyTV/dev
1.14.3 pre-1
2019-06-03 21:01:57 +01:00
KennyTV 5ad9d51fb0 Set version to 2.1.2 2019-06-03 21:59:19 +02:00
KennyTV 907b5e020c Change new trade list boolean 2019-06-03 21:20:32 +02:00
KennyTV a8d13fadb3 1.14.3 pre-1 2019-06-03 20:21:33 +02:00
Myles 0137105a6d Fix #1358 by checking for null before processing 2019-05-31 20:43:02 +01:00
Myles 5364d89ca8 Implement hashCode for version 2019-05-27 18:10:57 +01:00
Myles 744fa25349 Fix several NPE cases, apply final to relevant fields, remove unused code
The suggested changes were found with FindBugs, some of these bugs may be rare cases.
2019-05-27 17:50:08 +01:00
Myles 3027490256 Merge branch 'master' into abstraction 2019-05-27 17:29:04 +01:00
Myles 89dfcaf626 Back to SNAPSHOT 2019-05-27 13:37:16 +01:00
Myles 4fb0738c1a Merge pull request #1356 from Gerrygames/1.14.2
1.14.2
2019-05-27 13:24:38 +01:00
Gerrygames e8f4f7049b 1.14.2 2019-05-27 14:23:00 +02:00
Myles 0087e382ed Merge pull request #1354 from Gerrygames/1.14.2
1.14.2-pre4
2019-05-24 17:37:27 +01:00
Gerrygames eb9e48ecdc 1.14.2-pre4 2019-05-24 18:25:55 +02:00
Myles 34f8451ac5 Merge pull request #1352 from KennyTV/master
Fix minecart mapping
2019-05-22 17:41:57 +01:00
KennyTV 894503d56b Fix minecart mapping 2019-05-22 18:35:50 +02:00
Myles ee8c3d609f Merge pull request #1351 from KennyTV/dev
1.14.2-pre3
2019-05-22 16:24:13 +01:00
KennyTV b2c1c24902 1.14.2-pre3 2019-05-22 16:54:25 +02:00
Myles 6e8ea8689b Merge pull request #1349 from KennyTV/master
Add dolphin to Entity1_13Types
2019-05-22 14:44:20 +01:00
KennyTV 7fcb489f38 Add dolphin to Entity1_13Types 2019-05-22 15:25:42 +02:00
Myles 10b0a6fbb6 Merge branch 'master' into dev 2019-05-21 18:07:00 +01:00
Myles ecc1cce033 Merge pull request #1348 from KennyTV/master
Fix suffocation damage for 1.14+ players in hitbox patch
2019-05-21 18:06:20 +01:00
KennyTV 10d8ce86b3 Use weakhashmap 2019-05-21 19:02:03 +02:00
Myles b0fc69c308 Merge pull request #1339 from KennyTV/abstraction
Remove duplicated code in configs and EntityType
2019-05-21 17:49:53 +01:00
KennyTV 5cc421cff9 Don't cancel normal suffocation 2019-05-20 10:30:42 +02:00
KennyTV ca1ba4f422 Fix suffocation damage for 1.14+ players in hitbox patch 2019-05-19 23:28:05 +02:00
Myles a2d9489ad5 Merge pull request #1344 from astei/dont-send-empty-register
Don't try to send register messages without channels
2019-05-17 23:08:43 +01:00
Andrew Steinborn 232ee9b63b Don't try to send register messages without channels
Bukkit interprets this as attempting to register the channel "" (the
empty string), which fails on Minecraft 1.13 and above.
2019-05-17 18:01:58 -04:00
Myles 7861c76730 Merge pull request #1342 from KennyTV/dev
1.14.2-pre2
2019-05-17 14:24:15 +01:00
KennyTV d7aa23681b 1.14.2-pre2 2019-05-17 15:15:21 +02:00
Myles b75016a186 Merge branch 'master' into dev 2019-05-17 11:59:59 +01:00
Myles 6882b7074c Fix #1333 pandas missing 2019-05-17 11:59:46 +01:00
Myles 83bca3c23f Merge pull request #1341 from Gerrygames/1.14.2
1.14.2-pre1
2019-05-16 18:26:55 +01:00
Gerrygames a075e31a4e 1.14.2-pre1 2019-05-16 19:21:26 +02:00
Myles bdd32688fa Merge pull request #1330 from kashike/cleanup
Reduce duplication in various classes
2019-05-15 22:24:27 +01:00
Myles cb857d828f Merge pull request #1340 from KennyTV/master
Support latest Velocity changes
2019-05-15 22:23:37 +01:00
KennyTV 440d469fa2 Update to latest Velocity build 2019-05-15 23:16:01 +02:00
KennyTV 82da5e5a60 Fix MappingData reference 2019-05-15 13:37:23 +02:00
KennyTV a191d0de16 Reduce code duplication MappingData in (also regarding future versions) 2019-05-15 13:32:29 +02:00
KennyTV ae6cff5325 Remove deprecated config methods 2019-05-15 12:48:40 +02:00
KennyTV eb9520cdc3 Reduce duplicated code in config classes 2019-05-15 12:22:56 +02:00
KennyTV f8f20097a9 Move some default methods to EntityType 2019-05-15 12:04:56 +02:00
KennyTV cbb0f87676 Remove overriding properties 2019-05-15 11:59:40 +02:00
Myles a6e1488545 Merge pull request #1331 from Gerrygames/abstraction
Java 8, FunctionalInterface remapper
2019-05-15 09:21:33 +01:00
kashike 34c009e4e5 Reduce duplication in various classes 2019-05-14 13:56:50 -07:00
Myles b67242c609 Merge pull request #1337 from Gerrygames/abstraction_1.14.1
fix missing final declaration
2019-05-14 11:25:12 +01:00
Gerrygames 6e4516272b fix missing final declaration 2019-05-14 10:27:55 +02:00
Myles 08383c9141 Merge pull request #1336 from Gerrygames/abstraction_1.14.1
Abstraction 1.14.1
2019-05-14 09:26:20 +01:00
Gerrygames 2e37175dc2 1.14.1 abstraction 2019-05-14 10:21:50 +02:00
Gerrygames f25442337d Merge remote-tracking branch 'Myles/master' into abstraction_1.14.1 2019-05-14 10:15:58 +02:00
Myles 56a34ec2f8 Update to 2.1.0 2019-05-13 13:15:14 +01:00
Myles 362962dfb3 Merge pull request #1332 from Gerrygames/1.14.1
1.14.1
2019-05-13 13:10:48 +01:00
Gerrygames 77d572190e 1.14.1 2019-05-13 14:00:37 +02:00
Gerrygames 18f7459070 Java 8, FunctionalInterface remapper 2019-05-13 12:43:38 +02:00
Myles e71b08de3f Merge pull request #1323 from Gerrygames/abstraction
Abstract EntityTracker and MetadataRewriter
2019-05-13 11:26:59 +01:00
Gerrygames e8f8473e1c IEntityType -> EntityType 2019-05-13 12:04:03 +02:00
Myles 1d0d032431 Merge branch 'master' into dev 2019-05-12 13:01:08 +01:00
Myles fac7dafca5 Use fixed locale for toUpperCase/toLower #1126 2019-05-12 13:00:14 +01:00
Myles fbebf2d75e Merge pull request #1321 from creeper123123321/master
Not tested workaround for #1312
2019-05-10 22:57:22 +01:00
creeper123123321 a51f347371 Use readableBytes 2019-05-10 16:02:17 -03:00
Myles 6cee137780 Merge pull request #1325 from Gerrygames/1.14.1
1.14.1-pre2
2019-05-09 17:33:24 +01:00
Gerrygames 56b48a803a 1.14.1-pre2 2019-05-09 18:32:53 +02:00
Myles 3318d682fd Merge pull request #1324 from Gerrygames/1.14.1
1.14-pre2
2019-05-09 16:28:23 +01:00
Gerrygames 1fe3c337e1 1.14-pre2 2019-05-09 17:26:56 +02:00
Gerrygames 2442520ef3 use spaces 2019-05-09 15:07:20 +02:00
Gerrygames 44183f19cd @Override and protected 2019-05-09 14:46:24 +02:00
Gerrygames 23b68a867c abstract MetadataRewriter 2019-05-09 14:43:48 +02:00
creeper123123321 4d16dbf76f Not tested workaround for #1312 2019-05-08 20:38:55 -03:00
Gerrygames 6911d061a7 abstract EntityTracker 2019-05-08 12:14:41 +02:00
Myles ab9c0434e1 Merge pull request #1320 from Gerrygames/1.14.1
1.14.1
2019-05-07 17:23:20 +01:00
Gerrygames 3b932bd6b3 1.14.1 pre1 2019-05-07 18:19:34 +02:00
Myles 256839765a Merge pull request #1319 from KennyTV/master
Update text usage for latest Velocity build
2019-05-07 11:03:35 +01:00
KennyTV 46f9967dba Update text usage for latest Velocity build 2019-05-07 11:48:57 +02:00
Myles d91d47a755 Merge pull request #1317 from creeper123123321/master
Register tabcompletethread once - fixes #1316
2019-05-05 19:25:29 +01:00
creeper123123321 5a2c047e7a Register tabcompletethread once - fixes #1316 2019-05-05 14:16:24 -03:00
Myles 5ca8b0aef8 Merge pull request #1315 from creeper123123321/master
Add some needed tags
2019-05-01 22:11:13 +01:00
creeper123123321 e249ea1f0a fix tag ids - not tested 2019-05-01 16:54:09 -03:00
creeper123123321 e1b06d3872 Add some needed tags 2019-05-01 16:37:17 -03:00
Myles a4ed1644f3 Merge pull request #1314 from creeper123123321/master
Send set view distance on server change - not tested
2019-05-01 17:01:39 +01:00
creeper123123321 ad12866bf4 Send set view distance on server change - not tested 2019-05-01 12:52:53 -03:00
Myles b04acf98c7 Merge pull request #1313 from creeper123123321/master
Send light update before chunk packet, maybe better ByteBuf releasing…
2019-05-01 15:34:38 +01:00
creeper123123321 6b58d86248 Make PipelineUtil.containsCause check if the instance is of the class type 2019-05-01 11:31:36 -03:00
creeper123123321 7f6069e76b Send light update before chunk packet, maybe better ByteBuf releasing, ignore cancel exception on UserConnection#send 2019-05-01 11:15:48 -03:00
Myles 04d5ae074a Merge pull request #1305 from creeper123123321/master
Pose handling for 1.14
2019-04-30 22:00:29 +01:00
Myles 85067b2574 Merge pull request #1310 from Gerrygames/master
Faster light writing
2019-04-29 18:07:45 +01:00
Gerrygames 06340e593d faster light writing 2019-04-29 19:02:14 +02:00
Myles a896961fc4 Merge pull request #1309 from KennyTV/master
Fix paperpatch
2019-04-29 10:07:32 +01:00
KennyTV 73a62b8123 Fix paperpatch 2019-04-29 11:03:54 +02:00
creeper123123321 6d8a763f4c Don't send pose to the client entity 2019-04-27 17:39:45 -03:00
creeper123123321 61b5c90aa7 Recalculate pose when using or leaving bed 2019-04-27 17:21:01 -03:00
creeper123123321 d7eff51805 Not tested pose handling 2019-04-27 16:23:24 -03:00
Myles da7a57026d Merge pull request #1303 from KennyTV/master
Some minor optimization
2019-04-27 18:47:46 +01:00
Myles 643e3dc2da Merge pull request #1302 from creeper123123321/master
Workaround for packet order issue in neighbour chunk updates
2019-04-27 18:43:56 +01:00
creeper123123321 13086c7cac Fixed connecting after sending the packet 2019-04-27 14:03:48 -03:00
KennyTV 41b22e8951 Forgot return 2019-04-27 19:01:45 +02:00
KennyTV d76e70b1f7 Don't cache Item 2019-04-27 18:59:18 +02:00
KennyTV c7c5c79365 Some minor optimization 2019-04-27 18:36:01 +02:00
creeper123123321 87eceb5264 Use cached cancel exception when not in debug mode 2019-04-27 13:34:35 -03:00
creeper123123321 7b29972af0 Fix wrong protocol class 2019-04-27 13:12:19 -03:00
creeper123123321 4258f52f86 Workaround for packet order issue in neighbour chunk updates 2019-04-27 13:03:53 -03:00
Myles c3a7abd5f2 Merge pull request #1296 from KennyTV/master
Fix sign and banner placement in paperpatch
2019-04-26 20:57:37 +01:00
KennyTV a5f5472853 Fix sign and banner placement in paperpatch 2019-04-26 11:16:53 +02:00
Myles 63fc733c88 Merge pull request #1292 from Gerrygames/palette_fix
fix setPaletteEntry
2019-04-25 22:53:07 +01:00
Myles b5944f66a7 Merge pull request #1291 from KennyTV/master
Fix oversight in last pr
2019-04-25 22:52:47 +01:00
Gerrygames c8a19a1d83 fix setPaletteEntry 2019-04-25 22:16:19 +02:00
KennyTV 6ab525be7b Fix blockconnection 2019-04-25 22:05:32 +02:00
Myles fd1932cfd8 Merge pull request #1288 from creeper123123321/master
Fix husks
2019-04-25 11:44:41 +01:00
Myles 2eb9fe7e62 Merge pull request #1289 from KennyTV/master
Minor optimizations
2019-04-25 11:21:13 +01:00
KennyTV ac1943758d Remove unnecessary heightmap entries 2019-04-25 12:11:14 +02:00
KennyTV 1f86c6ab21 Slightly reduce map lookups 2019-04-25 11:50:55 +02:00
creeper123123321 44f8f5e66d Fix husks 2019-04-24 18:37:29 -03:00
Myles 0be8a56ba3 Back to snapshot 2019-04-24 19:57:19 +01:00
Myles 0b4d49d760 2.0.1 2019-04-24 19:52:39 +01:00
Myles 2bd266cd69 Merge pull request #1284 from creeper123123321/master
Force resend center chunk on respawn
2019-04-24 19:49:18 +01:00
creeper123123321 0380d80138 Force resend center chunk on respawn 2019-04-24 15:45:28 -03:00
Myles e297d825e3 Merge pull request #1283 from Gerrygames/master
1.14 heightmap
2019-04-24 17:43:07 +01:00
Gerrygames 53a639e7ae 1.14 heightmap 2019-04-24 18:40:03 +02:00
Myles a23b6feb46 Merge pull request #1275 from creeper123123321/patch-2
Add Velocity to readme
2019-04-24 10:51:48 +01:00
creeper123123321 603fe9cbd8 Add Velocity to readme 2019-04-24 05:39:51 -03:00
Myles 17d61b51e9 Merge pull request #1272 from creeper123123321/master
Set center chunk to 0,0 on respawn
2019-04-23 22:55:21 +01:00
creeper123123321 8d85106ee8 Set center chunk to 0,0 on respawn 2019-04-23 18:52:46 -03:00
Myles 0834610f8e Fix sneaking NPE 2019-04-23 22:23:37 +01:00
Myles 2e289a1d18 Fix encoding of position
Huge thanks to those involved on this goose hunt.
2019-04-23 22:15:05 +01:00
Myles b4418c02ca Fix Entity Tracker on Bungee being incorrect after server switch #1215 2019-04-23 21:29:51 +01:00
Myles 52b46a17cd Update chart 2019-04-23 18:20:03 +01:00
Myles 05e056a28b Cancel packets correctly so they don't mess bungee up 2019-04-23 17:28:26 +01:00
Myles 7b1eefb115 Avoid relocation issues on BungeeCord 2019-04-23 17:22:57 +01:00
Myles d50ceaa172 Back to snapshot 2019-04-23 16:33:07 +01:00
Myles 34b0db57ae Get ready.... 2019-04-23 16:16:49 +01:00
Myles 0c9de82e99 Merging went wrong 2019-04-23 16:02:18 +01:00
Myles 11ce8524ac Merge with master 2019-04-23 15:40:47 +01:00
Myles 4a8534c164 Refactor class names for protocols
The inconsistency was too much for me.
2019-04-23 15:34:17 +01:00
Myles 593b6fc3ac Merge branch 'master' into dev 2019-04-23 13:03:37 +01:00
Myles 33315bc271 Relocate Bungee chat api 2019-04-23 13:03:20 +01:00
Myles c3e406e95b Workaround villager packet causing issues 2019-04-23 13:02:18 +01:00
Myles dad71f1179 Rewrite inventory names which use .name syntax 2019-04-23 10:30:21 +01:00
Myles 03382ea987 Bump chat api version 2019-04-23 09:48:25 +01:00
Myles 54eed43f94 Merge branch 'master' into dev 2019-04-23 08:57:42 +01:00
Myles 404bc6725b Merge pull request #1267 from creeper123123321/master
Bossbar fix for delay-switch-until-joingame Velocity branch
2019-04-23 07:34:26 +01:00
creeper123123321 1b7b3d1d28 Bossbar fix for delay-switch-until-joingame Velocity branch 2019-04-22 20:11:54 -03:00
Myles d3662d226b Merge branch 'master' into dev 2019-04-22 18:56:29 +01:00
Myles d699000dc3 Default to 'packet' blockconnection method 2019-04-22 18:56:05 +01:00
Myles a18a1875d3 Merge pull request #1266 from KennyTV/hitbox-fix
Add option to fix hitboxes
2019-04-22 15:33:54 +01:00
KennyTV bf523c93d1 Use constants for heights 2019-04-22 16:17:34 +02:00
KennyTV b58cbf85e5 Hitbox fix options 2019-04-22 15:55:38 +02:00
KennyTV e38bdffc84 Hitbox fix options 2019-04-22 14:38:22 +02:00
Myles 89a01b3997 Merge pull request #1265 from Gerrygames/1.14
only update center chunk when needed
2019-04-22 10:44:10 +01:00
Gerrygames a4085c1a5a only update center chunk when needed 2019-04-22 11:42:42 +02:00
Myles 4fa57fd642 Merge pull request #1262 from creeper123123321/dev2
attack metadata handling
2019-04-21 23:36:25 +01:00
Myles 5f670a88a4 Merge pull request #1263 from creeper123123321/master
Check SessionHandler type before getting knownChannels
2019-04-21 23:35:59 +01:00
creeper123123321 2cadde1187 Remove debug 2019-04-21 18:57:11 -03:00
creeper123123321 bd7e36e38c Check SessionHandler type before getting knownChannels 2019-04-21 18:56:01 -03:00
creeper123123321 4eb69eac66 Run zombie rewrite before zombie villager rewrite 2019-04-21 16:50:41 -03:00
creeper123123321 8b5f6d1e67 fixed some metadata 2019-04-21 16:32:59 -03:00
creeper123123321 3a4db0a675 fixed 2019-04-21 15:57:40 -03:00
creeper123123321 b2352105e6 Handle new attack mode flag in insentient 2019-04-21 15:34:23 -03:00
Myles 70cb461c32 Merge pull request #1261 from KennyTV/dev
Remap areaeffectcloud particles
2019-04-21 19:23:22 +01:00
KennyTV f2628097ce Remap areaeffectcloud particles 2019-04-21 20:03:07 +02:00
Myles 49e85e2b8a Merge pull request #1260 from KennyTV/dev
Fix tridents (and building)
2019-04-21 17:53:43 +01:00
KennyTV d7353e01b0 Remove ')' 2019-04-21 18:52:53 +02:00
KennyTV 6674423ea4 Merge branch 'dev' of https://github.com/ViaVersion/ViaVersion into dev 2019-04-21 18:51:07 +02:00
Myles 918ee46ecc Merge pull request #1259 from creeper123123321/dev2
Fix velocity in item and arrow
2019-04-21 17:49:57 +01:00
creeper123123321 e34c291bd6 fix velocity in item and arrow 2019-04-21 13:46:17 -03:00
KennyTV 6c39966fef Fix tridents 2019-04-21 18:36:21 +02:00
Myles 32d6fd5386 Merge pull request #1257 from Gerrygames/1.14
1.14 Pre-Release 5
2019-04-18 13:47:22 +01:00
Gerrygames f64d5446a4 1.14 Pre-Release 5 2019-04-18 14:18:48 +02:00
Myles ed17f1bb50 Merge pull request #1254 from Gerrygames/1.14
1.14 Pre-Release 3
2019-04-16 17:01:30 +01:00
Gerrygames 8c27ead19e 1.14 Pre-Release 3 2019-04-16 16:22:58 +02:00
Myles 247cc1ebe8 Merge pull request #1253 from Gerrygames/1.14
1.14 Pre-Release 2
2019-04-13 10:59:41 +01:00
Gerrygames ea5ab1c2f5 1.14 Pre-Release 2 2019-04-13 11:45:22 +02:00
Myles 1e53803353 Merge pull request #1252 from creeper123123321/dev2
Resync the inventory when selecting trade
2019-04-11 16:15:29 +01:00
creeper123123321 6d1464d3f4 fix leave bed 2019-04-10 16:48:21 -03:00
creeper123123321 2d6defba11 Resync the inventory when selecting trade
Closes #1237
2019-04-10 15:05:27 -03:00
Myles 658822166a Merge pull request #1250 from Gerrygames/1.14
fix horse equipment packet id
2019-04-10 16:45:16 +01:00
Gerrygames 4c6ee807a7 fix horse equipment packet id 2019-04-10 17:43:42 +02:00
Myles 32b7d37861 Merge pull request #1249 from Gerrygames/1.14
1.14 Pre-Release 1
2019-04-10 16:29:16 +01:00
Gerrygames afe767c6db 1.14 Pre-Release 1 2019-04-10 17:28:12 +02:00
Myles b37430994d Merge pull request #1248 from Gerrygames/1.14
fix open sign editor
2019-04-07 14:47:36 +01:00
Gerrygames c51373dc9a fix open sign editor 2019-04-07 15:39:10 +02:00
Myles 421a5e8141 Merge branch 'master' into dev 2019-04-06 13:31:44 +01:00
Myles 9fe19e763a Update GitHub + chat links 2019-04-06 13:31:33 +01:00
Myles 6731ade5d9 Merge pull request #1247 from creeper123123321/master
More plugin messages
2019-04-06 13:09:48 +01:00
creeper123123321 cf3eb8b993 More plugin messages 2019-04-06 09:05:23 -03:00
Myles 5333c38972 Merge pull request #1245 from creeper123123321/dev2
Use set center chunk packet
2019-04-05 21:33:27 +01:00
creeper123123321 d9e057eb4f Use set center chunk packet 2019-04-05 17:13:26 -03:00
Myles 33cd80da7e Merge pull request #1244 from Gerrygames/1.14
19w14b
2019-04-05 17:50:37 +01:00
Gerrygames 8231b3aebe 19w14b 2019-04-05 18:48:38 +02:00
Myles 7fbbc5f4b8 Merge pull request #1242 from KennyTV/dev
Actually fix book opening
2019-04-04 19:32:40 +01:00
KennyTV 91687339bf Actually fix book opening 2019-04-04 20:28:02 +02:00
Myles b3181d1429 Merge pull request #1241 from Gerrygames/1.14
19w14a
2019-04-03 18:41:57 +01:00
Gerrygames 3ef8aa9e7f 19w14a 2019-04-03 19:39:39 +02:00
Myles 1a7195386c Merge pull request #1239 from creeper123123321/master
Fix invisible renamed banners
2019-04-02 19:49:43 +01:00
creeper123123321 77acdc1a17 Fix invisible renamed banners 2019-04-02 15:40:19 -03:00
Myles aecf9fb9b1 Merge pull request #1236 from ViaVersion/master
merge master into dev
2019-03-30 18:23:09 +00:00
Myles c8d1304e7f Merge pull request #1230 from creeper123123321/dev2
read nbt in 1.14 chunk, pose metatype, don't change ping protocol if …
2019-03-30 14:07:22 +00:00
Myles 796a508af0 Merge pull request #1235 from creeper123123321/gerry1.14
19w13b + chunk loading on join fixes
2019-03-30 14:07:06 +00:00
creeper123123321 6751acb6c4 Generated mappings for 13b 2019-03-30 10:00:54 -03:00
creeper123123321 475fb97730 19w13b and workaround for chunks not loading near to world border on 1.13.2 on join 2019-03-30 09:26:31 -03:00
Gerrygames acee33aae6 fix chunk loading in 19w13a 2019-03-27 20:16:26 +01:00
Gerrygames 65f60098c8 19w13a 2019-03-27 19:08:53 +01:00
creeper123123321 19a75abaf3 read nbt in 1.14 chunk, pose metatype, don't change ping protocol if different from provider 2019-03-24 13:07:03 -03:00
Myles fa36de2c78 Merge pull request #1229 from creeper123123321/master
Update OpenNBT
2019-03-24 14:05:09 +00:00
creeper123123321 0f49ce2f9d Update OpenNBT 2019-03-24 10:59:51 -03:00
Myles 73b24657f5 Merge pull request #1225 from creeper123123321/master
Don't connect fences to stairs
2019-03-23 19:24:38 +00:00
creeper123123321 e03db26530 Fix numeric ids that doesn't need string remap 2019-03-23 16:23:15 -03:00
creeper123123321 3fd3777e8c Don't connect fences to stairs 2019-03-22 15:18:41 -03:00
Myles 7ad73cd476 Merge pull request #1223 from creeper123123321/master
convert numerical ids to string ids on canplaceon/candestroy
2019-03-21 21:07:34 +00:00
creeper123123321 c5e0fcae9a convert numerical ids to string ids on canplaceon/candestroy 2019-03-21 17:48:14 -03:00
Myles 4ca25df410 Merge pull request #1222 from Gerrygames/1.14
19w12b
2019-03-21 16:19:31 +00:00
Gerrygames 56b5986fc5 19w12b 2019-03-21 17:04:33 +01:00
Myles 05c1a31f00 Merge pull request #1221 from Gerrygames/1.14
19w12a
2019-03-20 18:09:06 +00:00
Gerrygames e0b88b750d 19w12a 2019-03-20 14:27:28 +01:00
Myles b0c2d6f71c Merge pull request #1219 from creeper123123321/master
ignore non-identifier format on plugin messages
2019-03-18 21:37:21 +00:00
creeper123123321 4e28a10aaa ignore non-identifier format on plugin messages 2019-03-18 15:11:35 -03:00
Myles 49205f0361 Merge branch 'master' into dev 2019-03-18 11:30:19 +00:00
Myles 47819180c4 Rework previous commit + Introduce injection information to dump 2019-03-18 11:30:02 +00:00
Myles be3fa19c0a Consistency: itruncate1_14Books -> isTruncate1_14Books 2019-03-17 16:11:36 +00:00
Myles 32a2734082 Merge branch 'master' into dev 2019-03-17 16:10:38 +00:00
Myles b28b0c3018 Fix last commit 2019-03-17 16:05:24 +00:00
Myles ee5eb59e42 Revert unnecessary synchronizes in ListWrapper
Usually the list we're wrapping is synchronized, so instead we'll ensure our code can be run concurrently.

There might be issues with other plugins and this change (but it's unlikely), open a issue if you see any of these after this change.
2019-03-17 16:04:13 +00:00
Myles d3f4d8dd41 Merge pull request #1217 from Gerrygames/1.14
19w11a
2019-03-15 20:27:18 +00:00
Gerrygames d44ecaabf7 send difficulty instead of ignoring it 2019-03-13 19:03:22 +01:00
Myles d133ca4a0f Merge pull request #1211 from creeper123123321/master
Trying to fix main hand on bungee, handle left handed on 1.8 using 0x80
2019-03-13 17:50:03 +00:00
Gerrygames f8df3239d5 "fix" trade list 2019-03-13 18:07:09 +01:00
Gerrygames f9d957a827 19w11a 2019-03-13 17:53:17 +01:00
creeper123123321 bef3e3d18f process translate on command block entity 2019-03-10 16:36:30 -03:00
creeper123123321 aca764c288 fix command block #1212 2019-03-10 16:18:41 -03:00
creeper123123321 3c0282b04f Fix missing villager sound remap 2019-03-10 07:30:09 -03:00
Myles d8c081b8d3 Merge pull request #1213 from KennyTV/dev
Try to fix particles
2019-03-08 14:46:30 +00:00
KennyTV 53ca96f158 Fix particles 2019-03-07 23:59:31 +01:00
KennyTV f8895c7c78 Try to fix particles 2019-03-07 23:11:09 +01:00
creeper123123321 12b45d95e0 Trying to fix main hand on bungee, handle left handed on 1.8 using 0x80 2019-03-05 19:47:58 -03:00
Myles 1cdfeadd86 Merge pull request #1210 from KennyTV/dev
Fix minecart data
2019-03-04 15:46:27 +00:00
KennyTV 15fec93bf1 Fix minecart data 2019-03-04 16:42:22 +01:00
Myles 64d2de010d Fix Minecart typo (thanks KennyTV) 2019-03-04 11:37:38 +00:00
Myles ad1cd2c993 Merge pull request #1208 from KennyTV/dev
Add option to truncate edited books with more than 50 pages on 1.14
2019-03-04 09:34:41 +00:00
KennyTV 687de97fcd Use read instead of passthrough 2019-03-04 10:30:06 +01:00
KennyTV 9d0331e190 Add option to truncate edited books with more than 50 pages 2019-03-04 10:14:52 +01:00
Myles ca863ba8c6 Merge pull request #1207 from KennyTV/dev
Fix book opening
2019-03-03 13:29:29 +00:00
Myles b9a2279966 Merge pull request #1206 from ViaVersion/master
merge master into dev
2019-03-03 13:29:00 +00:00
KennyTV 9a91250af7 Fix books 2019-03-03 13:40:17 +01:00
Myles 05d01e70b7 Merge pull request #1205 from creeper123123321/master
Fix 1.9 chunk missing blocks, update travis badge url
2019-03-02 20:08:50 +00:00
creeper123123321 6b313cb65e Fix 1.9 chunk missing blocks, update travis badge url 2019-03-02 17:07:23 -03:00
Myles a4de84b6da Merge pull request #1204 from Gerrygames/1.14
19w09a
2019-02-27 16:40:07 +00:00
Gerrygames 31550bd010 19w09a 2019-02-27 17:03:38 +01:00
Myles 5d63c359b3 Merge pull request #1202 from creeper123123321/master
Workaround packet order for team packets
2019-02-25 17:37:29 +00:00
creeper123123321 8283816418 Fix team remove 2019-02-24 15:53:43 -03:00
creeper123123321 44be8b3791 unnecessary cancel when auto-team is disabled 2019-02-24 15:07:34 -03:00
creeper123123321 f46a2bb618 Bungee auto-team, bump BungeeCord version, workaround for block connections 2019-02-24 15:02:09 -03:00
creeper123123321 96366aae42 Fix NPE when block connection is disabled 2019-02-23 20:12:49 -03:00
Myles fd8879b46d Merge branch 'master' into dev 2019-02-23 22:34:16 +00:00
creeper123123321 d962ef09ff workaround packet order for team packets 2019-02-23 13:44:41 -03:00
Myles b26d2ef906 Merge pull request #1201 from creeper123123321/master
Some block connection changes, fix memory leak on Velocity, Sponge and Bungee
2019-02-23 14:32:16 +00:00
creeper123123321 0613886659 Fix memory leak 2019-02-23 10:12:25 -03:00
creeper123123321 75d7ffb447 Should be 15 2019-02-23 09:30:07 -03:00
creeper123123321 0b5c173945 Send multi block change on chunk updates, use separate for loops 2019-02-23 09:01:40 -03:00
Myles f170aed1b9 Merge pull request #1199 from Gerrygames/1.14
19w08b
2019-02-22 15:51:18 +00:00
Gerrygames 1921b46a66 19w08b 2019-02-21 17:21:57 +01:00
Gerrygames bccf90b093 fix horse armor 2019-02-20 21:02:09 +01:00
Gerrygames deebc83f1e still send animation 2019-02-20 20:36:45 +01:00
Gerrygames a319df630d fix use/leave bed 2019-02-20 20:28:14 +01:00
Gerrygames ab5eb2c7ef 19w08a metadata changes 2019-02-20 20:12:20 +01:00
Gerrygames 3de06c269d 19w08a 2019-02-20 18:01:21 +01:00
Myles 876839348c Merge pull request #1193 from creeper123123321/master
Cleanup ConnectionData#update and fix doors
2019-02-17 10:30:49 +00:00
Myles 755e8a007a Merge pull request #1194 from creeper123123321/dev
firework boost, set metatype to the newer class
2019-02-16 16:52:08 +00:00
creeper123123321 6a2e1a8114 Support ViaBackwards 1.13 with Velocity modern forwarding 2019-02-15 13:51:54 -02:00
creeper123123321 11b25151f7 Remove uuid tracking 2019-02-13 17:00:01 -02:00
creeper123123321 35bb80d67a firework boost, set metatype to the newer class 2019-02-13 16:42:59 -02:00
creeper123123321 7859f5ebd6 Cleanup ConnectionData#update and fix doors 2019-02-13 16:03:22 -02:00
Myles f38d753341 Merge pull request #1192 from Gerrygames/1.14
19w07a
2019-02-13 17:22:52 +00:00
Gerrygames d1007bbb38 19w07a 2019-02-13 17:50:07 +01:00
Myles 0886fdabd3 Merge pull request #1190 from creeper123123321/master
NPE fixes, warn instead of exception
2019-02-11 19:22:33 +00:00
creeper123123321 891f8b143f Shift 4 bits to left in chunk unloading 2019-02-11 17:01:27 -02:00
creeper123123321 7856716a3a Warn instead of blowing up everything 2019-02-11 16:48:26 -02:00
creeper123123321 4eb4b2c37f Use ByteBuf#order, more sanity check on block entity handler 2019-02-10 16:05:32 -02:00
Myles 1be617c110 Merge branch 'master' into dev 2019-02-10 16:45:34 +00:00
Myles f1743e5912 Merge pull request #1186 from creeper123123321/tabdelay
Tab delaying
2019-02-10 16:42:05 +00:00
Myles 102c1f99a7 Merge pull request #1189 from creeper123123321/master
Fix duplicate packet registering
2019-02-10 16:41:39 +00:00
creeper123123321 ae3434cb89 Fix duplicate packet registering 2019-02-10 14:05:58 -02:00
creeper123123321 63b743f85b Use only one task for tab completing 2019-02-07 14:07:30 -02:00
Myles 73f6418db3 Merge pull request #1167 from KennyTV/master
Reduce memory use for blockconnections
2019-02-06 23:00:51 +00:00
KennyTV d9c25b1acc Merge master 2019-02-06 22:14:00 +01:00
Myles 6c18fdb175 Merge pull request #1156 from creeper123123321/master
trying to optimize block connection storage
2019-02-06 21:08:26 +00:00
Myles cd009388a4 Merge pull request #1187 from creeper123123321/snowygrass
Connect grass block to snow
2019-02-06 21:08:07 +00:00
creeper123123321 d66c2f2f5d Connect grass block to snow
(cherry picked from commit 69b0d43c9825d896374fc26246410530c5b7495f)
2019-02-06 18:55:17 -02:00
Myles 7534904737 Merge pull request #1185 from creeper123123321/fixparticleandtranslations
Fix particles and translations with %d
2019-02-06 20:54:26 +00:00
creeper123123321 bce3593110 Tab delaying
(cherry picked from commit 386de52b9db1454e0fcec56ef9bfcd2c3a0f8d4a)
2019-02-06 18:53:24 -02:00
creeper123123321 9a92d180d0 Fix typo 2019-02-06 18:51:04 -02:00
creeper123123321 a203c17e06 Fix reddust, particle metadata rewriting, translations 2019-02-06 18:50:31 -02:00
Myles 69b5134b5f Merge pull request #1184 from Gerrygames/1.14
19w06a
2019-02-06 17:00:06 +00:00
Gerrygames 8c543ee97f 19w06a 2019-02-06 17:56:19 +01:00
KennyTV bafa6edd28 Fix some stair and lever connections 2019-02-03 00:22:49 +01:00
Myles 799567579b Update License to 2019 2019-01-31 10:48:52 +00:00
Myles c10e61a165 Merge pull request #1178 from Gerrygames/1.14
remove 1.14 object type (Mojang removed objcet trype in 19w05a)
2019-01-30 16:53:13 +00:00
Gerrygames a27e439c99 remove 1.14 object type (Mojang removed objcet trype in 19w05a)
fix entity type remaps
2019-01-30 17:48:11 +01:00
Myles e224d9daa2 Merge pull request #1177 from Gerrygames/1.14
19w05a
2019-01-30 16:17:47 +00:00
Gerrygames 91d9f99c70 19w05a 2019-01-30 17:16:06 +01:00
Myles c57f0d90bb Merge pull request #1173 from creeper123123321/dev
Fix item deserializing
2019-01-27 14:19:40 +00:00
creeper123123321 e9198e7946 Arrow and firework metadata rewriting, remap ocelot to cat for now 2019-01-25 15:37:44 -02:00
creeper123123321 25d1b08a6f 19w04b 2019-01-25 14:28:24 -02:00
creeper123123321 50395da626 Fix item deserializing 2019-01-25 10:01:24 -02:00
Myles 2d0209b221 Merge pull request #1172 from Gerrygames/1.14
19w04a
2019-01-24 15:59:09 +00:00
Gerrygames 44330c98b7 19w04a 2019-01-24 16:58:37 +01:00
Gerrygames b7f72bf55d 19w04a 2019-01-24 16:56:59 +01:00
creeper123123321 f6d7976eff Use old ids and byte[] + NibbleArray for block connections 2019-01-21 12:58:05 -02:00
creeper123123321 f45a727396 remove short array used for checking if array is empty 2019-01-21 12:58:05 -02:00
creeper123123321 d5f65eceb0 don't create chunksection on remove 2019-01-21 12:58:05 -02:00
creeper123123321 2285c453da fixed encodeblockpos, use map<long, short[]> 2019-01-21 12:58:04 -02:00
creeper123123321 193084927b store constructor 2019-01-21 12:58:04 -02:00
creeper123123321 1325d53950 Don't use netty collections 2019-01-21 12:58:04 -02:00
creeper123123321 fa1b56a7cf use short 2019-01-21 12:58:04 -02:00
creeper123123321 de11f1f90b trying to optimize blockconnectionstorage 2019-01-21 12:57:56 -02:00
Myles 9ba70424e8 Fix armour update on item break #1157 2019-01-20 17:01:14 +00:00
Myles c5ba5b4647 Ensure pipeline parts exist before injecting #1168 2019-01-20 16:47:50 +00:00
KennyTV 8e47497edb Use keyset instead of entryset 2019-01-20 15:03:47 +01:00
KennyTV 7f7dcffdf0 Forgot to assign a value 2019-01-19 19:59:17 +01:00
KennyTV 9d8a2a9680 Don't cycle through mappings in every connection handler 2019-01-19 19:19:24 +01:00
KennyTV 880df7a482 Remove unmapped blockconnection data 2019-01-19 19:17:55 +01:00
Myles a016eade01 Merge pull request #1162 from creeper123123321/proxybossbarfix
Fix bungee and velocity boss bar, implement Velocity channel workaround
2019-01-19 15:58:12 +00:00
Myles b3167c450e Merge pull request #1166 from Gerrygames/master
fix powered levers
2019-01-19 15:57:42 +00:00
Gerrygames 6ea37c1f17 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion 2019-01-18 18:45:34 +01:00
Gerrygames 17c5849f33 fix powered levers 2019-01-18 18:45:05 +01:00
creeper123123321 7e8bd606fe remove commented code 2019-01-18 14:34:51 -02:00
Myles 51e4076084 Merge pull request #1165 from Gerrygames/1.14
fix the fix for stone slab mapping
2019-01-18 16:31:20 +00:00
Gerrygames ff0ec98a27 fix the fix for stone slab mapping 2019-01-18 17:29:48 +01:00
Myles bbe4e5e7f5 Merge pull request #1163 from Gerrygames/master
fix lever mapping
2019-01-18 16:20:43 +00:00
Myles 47c25a0e5e Merge pull request #1164 from Gerrygames/1.14
19w03c + stone slab mapping fix
2019-01-18 16:20:25 +00:00
Gerrygames 553e56fe4c fix stone slab mapping 2019-01-18 17:18:17 +01:00
Gerrygames bea5d39ed5 19w03c 2019-01-18 17:17:54 +01:00
Gerrygames f6932e09f7 fix lever mapping 2019-01-18 14:07:27 +01:00
creeper123123321 44ca95bf85 Fix bungee and velocity boss bar, implement Velocity channel workaround 2019-01-18 08:05:23 -02:00
Myles 5ba7c4ba2c Merge pull request #1160 from Gerrygames/master
fix fence connections to stairs
2019-01-17 11:48:17 +00:00
Gerrygames 605e63e1df fix fence connections to stairs, remove waterlogged blocks from stair data 2019-01-17 12:22:36 +01:00
Myles bf34ea11bd Merge pull request #1158 from Gerrygames/1.14
19w03a
2019-01-16 17:46:52 +00:00
Gerrygames 7102214c9e 19w03a 2019-01-16 18:44:37 +01:00
Myles e60447ecd2 Merge pull request #1154 from creeper123123321/dev
not tested villager metadata rewriting
2019-01-15 17:32:11 +00:00
Myles 77a57d2243 Merge branch 'master' into dev 2019-01-12 17:42:47 +00:00
Myles b129ef04f3 Merge pull request #1148 from KennyTV/master
Add fixes for custom flowerstems and snowcollision for 1.13 clients
2019-01-12 17:42:17 +00:00
Myles 1f41893aab Merge pull request #1150 from creeper123123321/master
Fix new velocity version
2019-01-12 15:08:31 +00:00
creeper123123321 c8e8f39f9d Fix new velocity version 2019-01-12 12:45:13 -02:00
Myles 4a79e23485 Merge pull request #1147 from Gerrygames/1.14
19w02a
2019-01-10 21:28:29 +00:00
KennyTV 20654b0a77 Add convenience config options
Add option to send all flowerparts for 1.13+ as stems if a block is above
Add option to send 1-layer snow as 2-layers for 1.13+ to fix collision
2019-01-09 21:48:04 +01:00
creeper123123321 8d77891f76 not tested villager metadata rewriting 2019-01-09 17:26:06 -02:00
Gerrygames bea74661d1 19w02a 2019-01-09 18:26:08 +01:00
Myles 6b7bf843a1 Merge branch 'master' into dev 2019-01-09 16:30:29 +00:00
Myles 200ccfd092 Use HTTPS for update checking 2019-01-09 16:29:10 +00:00
Myles 67a0a47778 Merge pull request #1143 from creeper123123321/master
Auto-team fix
2019-01-08 22:59:29 +00:00
creeper123123321 933e8cbaed set auto-team to false on join packet 2019-01-08 20:49:17 -02:00
creeper123123321 daac2baf8e Resend viaversion team when removed from the current team 2019-01-08 20:47:08 -02:00
Myles 4a2bcf6fde Merge pull request #1142 from creeper123123321/master
Use ProtocolInfo#getServerProtocolVersion for block connection, use b…
2019-01-08 16:04:15 +00:00
creeper123123321 cd7774f056 Use ProtocolInfo#getServerProtocolVersion for block connection, use bungee and velocity version if not ported 2019-01-08 13:58:24 -02:00
Myles 452fb4f990 Merge pull request #1139 from creeper123123321/dev
Fix lore
2019-01-07 19:30:54 +00:00
creeper123123321 1f72ddb8a1 Fix lore 2019-01-06 17:27:41 -02:00
Myles 9af078bb8c Merge pull request #1135 from creeper123123321/dev
fix sign crash
2019-01-06 11:27:04 +00:00
creeper123123321 c88655a2a0 fix player digging 2019-01-06 09:08:29 -02:00
creeper123123321 a27efd94c8 oops 2019-01-06 08:43:25 -02:00
creeper123123321 9a26ac380a send signs tags 2019-01-06 08:28:08 -02:00
Myles 240653c429 Merge pull request #1133 from creeper123123321/patch-1
Add "blockconnection-method" to VelocityViaConfig#UNSUPPORTED
2019-01-04 15:03:14 +00:00
creeper123123321 bac3a76d9a Add "blockconnection-method" to VelocityViaConfig#UNSUPPORTED 2019-01-04 12:26:30 -02:00
Myles 3a4aed0b34 Merge pull request #1122 from Gerrygames/1.14
fix book signing and opening in 18w50a
2018-12-15 20:16:30 +00:00
Gerrygames 7f5073476c fix book signing and opening in 18w50a 2018-12-15 20:57:17 +01:00
Myles 1abc3ebea6 Merge pull request #1121 from creeper123123321/master
CanPlaceOn, CanDestroy
2018-12-15 11:43:51 +00:00
creeper123123321 c21003e1b7 CanPlaceOn, CanDestroy 2018-12-15 09:13:19 -02:00
Myles 1fd0211725 Merge pull request #1120 from creeper123123321/master
ProtocolVersion#SUPPORTED_VERSIONS, relocate javassist
2018-12-13 11:57:05 +00:00
creeper123123321 1932c7af4f ProtocolVersion#SUPPORTED_VERSIONS, relocate javassist 2018-12-13 09:47:58 -02:00
Myles 94422dab77 Merge pull request #1119 from creeper123123321/master
Fix breaking change caused by VelocityPowered/Velocity@853fd22
2018-12-13 10:03:45 +00:00
creeper123123321 b10ca3ebcf Fix breaking change caused by VelocityPowered/Velocity@853fd22 2018-12-13 07:41:05 -02:00
Myles aa2ff4b741 Merge pull request #1118 from Gerrygames/1.14
18w50a
2018-12-12 19:57:23 +00:00
Gerrygames 284a462936 18w50a 2018-12-12 20:48:52 +01:00
Myles 858e0a5b21 Merge pull request #1117 from creeper123123321/master
Fix mappings, fixing shift click on furnaces
2018-12-10 19:46:09 +00:00
creeper123123321 eaa8e05373 Fix mappings, fixing shift click on furnaces 2018-12-10 17:23:29 -02:00
Myles 3e3d338ed0 Merge pull request #1116 from creeper123123321/master
Recipe book
2018-12-10 15:09:20 +00:00
creeper123123321 0c5f5c6e3f remove debug 2018-12-10 12:56:45 -02:00
creeper123123321 7c6118bd6f facepalm 2018-12-10 12:54:06 -02:00
creeper123123321 7fe99c98f0 clicking in recipe doesn't work 2018-12-10 12:54:06 -02:00
creeper123123321 d6c4c18d35 still not working 2018-12-10 12:54:06 -02:00
creeper123123321 649676e811 trying recipes, currently not working 2018-12-10 12:54:05 -02:00
Myles 98c0985657 Merge branch 'master' into dev 2018-12-07 21:15:49 +00:00
Myles 43e93e74b1 Merge pull request #1113 from creeper123123321/master
Fix chunk writing
2018-12-07 21:14:18 +00:00
creeper123123321 ba7817170b Fix chunk writing 2018-12-07 19:10:40 -02:00
Myles 88279906b5 Merge pull request #1108 from Gerrygames/1.14
18w49a
2018-12-06 08:45:13 +00:00
Gerrygames 134987cb20 18w49a 2018-12-06 09:32:53 +01:00
Myles 7b880ae967 Fix type being byte instead of int 2018-12-05 19:13:26 +00:00
Myles 7e8e3fef61 Merge branch 'master' into dev 2018-12-05 19:10:52 +00:00
Myles c1147cb9f7 Formatting 2018-12-05 19:08:55 +00:00
Myles 54b35ef075 Merge branch 'master' into dev 2018-12-05 19:02:50 +00:00
Myles fba0a59324 Merge pull request #1107 from creeper123123321/master
Change Chunk#getBiomeData() to int[]
2018-12-05 19:01:25 +00:00
creeper123123321 c5c7d36bd1 Change Chunk#getBiomeData() to int[] 2018-12-05 16:52:53 -02:00
Myles 83ba55dda5 Merge pull request #1104 from Gerrygames/block-connections-master
fix BlockConnectionStorage not being initialized
2018-12-03 08:26:46 +00:00
Gerrygames 000fff210a fix BlockConnectionStorage not being initialized 2018-12-03 09:21:07 +01:00
Myles 8965b22f6d Merge branch 'master' into dev 2018-12-02 12:38:10 +00:00
Myles 4023f2412d Merge pull request #1093 from Gerrygames/block-connections-master
Implement 'serverside-blockconnection' for block-connections.
2018-12-02 12:28:58 +00:00
Myles 27d56caa48 Merge pull request #1100 from creeper123123321/master
Make Travis test compiling with Java 11
2018-11-29 15:36:14 +00:00
Myles 0cc1146f0e Merge pull request #1103 from Gerrygames/1.14
18w48a
2018-11-29 15:34:53 +00:00
Gerrygames 8aa7b749ca 18w48a 2018-11-29 16:31:39 +01:00
creeper123123321 55fad45a6c Update Lombok to make compile on Java 11 2018-11-26 16:30:18 -02:00
creeper123123321 22cc12e7a9 Try to compile with Java 11 2018-11-26 16:30:12 -02:00
Myles 2812b121ab Merge pull request #1099 from creeper123123321/master
Fix Velocity platform breaking changes
2018-11-26 18:02:41 +00:00
creeper123123321 ad3465f0d3 Fix Velocity platform breaking changes 2018-11-26 15:58:17 -02:00
Marco Neuhaus fc8b55dce7 fix spelling mistake 2018-11-24 18:42:00 +01:00
Myles 62d67e9a38 Merge pull request #1095 from Gerrygames/1.14
18w47a
2018-11-21 16:23:30 +00:00
Gerrygames 079cd7210b 18w47a 2018-11-21 17:20:26 +01:00
Gerrygames b60c56f464 Tripwire connections 2018-11-19 09:28:37 +01:00
Gerrygames eb1571d3e4 init ConnectionData 2018-11-17 16:10:13 +01:00
Gerrygames 9a13eb36b3 Serverside block-connections! 2018-11-17 15:45:37 +01:00
Myles 9ba5cc1f98 Merge branch 'master' into dev 2018-11-17 14:11:04 +00:00
Myles 2778ec0d9d Merge pull request #1060 from creeper123123321/dev
Change item id to int, fix valid string being considered as invalid + tests
2018-11-17 13:48:31 +00:00
Myles 20b0954f8c Missed one - oops 2018-11-17 13:47:58 +00:00
Myles 69aa7be6c5 Refactor tests to be one general test per method and include plugin 2018-11-17 13:46:32 +00:00
Myles 73dccbaf24 Merge branch 'pr/1045' 2018-11-17 13:15:20 +00:00
Myles 66d836739c Merge pull request #1092 from Gerrygames/chunk-refactor
Chunk refactor
2018-11-17 13:14:27 +00:00
Myles ab1c44c4fb Propose 2.0.0 snapshot as this version contains several API breaking changes 2018-11-17 13:13:55 +00:00
Myles 8549c22567 Change the name of the config class to be more consistent 2018-11-17 13:12:19 +00:00
Myles d0300de136 Prevent initialization error 2018-11-17 13:08:51 +00:00
Marco Neuhaus 34c701e039 fix chunk unload packet 2018-11-17 13:46:53 +01:00
Gerrygames cf0bd6f021 Use List and Map, fixes duplicate block ids in palette causing issues 2018-11-17 13:38:48 +01:00
Gerrygames 3b14dd3b04 Use methods for palette rewriting, fix "value already present" 2018-11-17 13:38:42 +01:00
Gerrygames 9a87adf51b Use BiHashMap as palette 2018-11-17 13:38:29 +01:00
Gerrygames ce65c7f583 fix merge issues 2018-11-17 13:36:35 +01:00
Gerrygames 82013d5737 Keep Chunk as an interface 2018-11-17 13:35:44 +01:00
Gerrygames 14377ca354 Use types for ChunkSections 2018-11-17 13:35:34 +01:00
Myles 75664961b8 Merge pull request #1090 from Gerrygames/1.14
18w46a
2018-11-16 09:55:02 +00:00
Gerrygames c5969c303e 18w46a 2018-11-15 15:44:50 +01:00
Myles f4b6b1795e Merge pull request #1085 from Gerrygames/myles_master
fix #1076
2018-11-13 10:05:09 +00:00
Gerrygames b86950d0e7 fix #1076 2018-11-13 10:59:11 +01:00
creeper123123321 3ef1ac06df fix version, detect velocity implementation, fix npe, fix detectorservice 2018-11-12 15:05:52 -02:00
creeper123123321 4c07b6d28d Squash Velocity platform commits
incomplete velocity code

untested velocity version detector

update velocity module version

Injecting, but not working

facepalm

Fix handler type

Should work now

will it work now?

it works!!!

fix npe in command tab completion

Do not forward command to server

implement server changing with different versions
thanks @Leymooo

Fix memory leaks

maybe cleaner code?

trying to port mainhandpatch, added todo

fix version

Use separated protocol version, add todo

Trying to mitigate UserConnection#toServer concurrent issue

port elytrapatch

it works but horribly and needs a modification in velocity

replace with a semaphore and EventLoop#submit

Lock for incoming packets

fix version

remove some TODOs

Listen to DisconnectEvent

Relocate snakeyaml
2018-11-12 15:05:48 -02:00
Myles 7f77cbfd74 Merge pull request #1081 from creeper123123321/master
Use less ram on translation mappings
2018-11-12 16:45:19 +00:00
Myles ca716a65d2 Merge pull request #1084 from Gerrygames/faster_palette
Faster palette
2018-11-12 16:44:47 +00:00
Gerrygames 4be46cd51d Use List and Map, fixes duplicate block ids in palette causing issues 2018-11-12 17:10:19 +01:00
Gerrygames bb2b8bc538 Use methods for palette rewriting, fix "value already present" 2018-11-12 16:08:01 +01:00
Gerrygames 41ef4f6284 Use BiHashMap as palette 2018-11-12 14:36:01 +01:00
creeper123123321 cfd3179cb8 try to eat less ram 2018-11-11 11:57:33 -02:00
Myles 1a3170c7db Merge pull request #1077 from creeper123123321/translations
Translation rewriting
2018-11-10 10:45:21 +00:00
Myles 25463a929a Merge pull request #1078 from creeper123123321/master
fix set cooldown
2018-11-10 10:44:34 +00:00
creeper123123321 408bd49120 fix set cooldown 2018-11-10 08:41:22 -02:00
creeper123123321 3fc2d28b95 fix npe 2018-11-08 16:18:20 -02:00
creeper123123321 d9eff7bb5c Translation rewriting 2018-11-08 16:11:01 -02:00
Myles 4b1c291fca Merge pull request #1075 from Gerrygames/1.14
18w45a
2018-11-08 16:51:30 +00:00
Gerrygames 0b34b65f76 add sound and block id mappings 2018-11-08 14:40:02 +01:00
Gerrygames ccb5ceb9b3 use blockmapping for air ids 2018-11-08 13:46:02 +01:00
Gerrygames 9fac4f9de4 18w45a 2018-11-08 13:43:38 +01:00
Myles d84c4365c9 Merge pull request #1069 from creeper123123321/master
color rewriting changes
2018-11-04 13:08:10 +00:00
creeper123123321 bec27e0fa6 Use ChatColor.COLOR_CHAR 2018-11-04 10:51:29 -02:00
creeper123123321 437b02c961 color rewriting changes 2018-11-04 08:56:22 -02:00
Myles e6922eae46 Don't use -1 if provided by ProtocolDetectorService on Bungee #1064 2018-11-01 22:41:56 +00:00
Gerrygames b92f4070d4 calculate non-air blocks correctly 2018-11-01 19:07:10 +01:00
Myles b9750be745 Merge pull request #1066 from creeper123123321/master
Tolerate some identifiers. Should fix #1063
2018-11-01 15:58:31 +00:00
Gerrygames 973b473100 don't use NotImplementedException 2018-10-31 20:28:14 +01:00
creeper123123321 b7606aece0 Tolerate some identifiers. Should fix #1063 2018-10-31 16:26:55 -03:00
Gerrygames 3f62730404 forgot some entity ids 2018-10-31 18:57:18 +01:00
Gerrygames c58b28fd00 18w44a 2018-10-31 18:51:54 +01:00
creeper123123321 149b3c2e29 fix player digging 2018-10-31 14:48:28 -03:00
Myles a412df00c4 Merge pull request #1065 from Gerrygames/1.14
remap items in advancements for 18w43c
2018-10-29 19:40:50 +00:00
Gerrygames aa067d4073 Merge branch 'myles_dev' into 1.14
# Conflicts:
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java
2018-10-29 20:16:06 +01:00
Gerrygames 4c8917c6a0 remap items in advancements 2018-10-29 20:08:37 +01:00
Myles 78aefa936f Minor bug report typo 2018-10-28 16:38:53 +00:00
Myles 2c18adf202 Delete ISSUE_TEMPLATE.md 2018-10-28 16:38:08 +00:00
Myles 083f401ee5 Update issue templates 2018-10-28 16:30:26 +00:00
creeper123123321 6652a7fd83 Change item id to int, fix valid string being considered as invalid, tests 2018-10-27 11:55:17 -03:00
Myles d1b22b0f82 Update version 2018-10-27 12:30:39 +01:00
Myles 0fb08be6e9 Tidy up code to make it consistent 2018-10-27 12:25:42 +01:00
Gerrygames 2da9b99789 1.14 position changes 2018-10-26 18:36:35 +02:00
Gerrygames 28bb60244f fix merge issues 2018-10-26 17:09:26 +02:00
Gerrygames 928cd9de94 Merge branch 'chunk_section_rewrite' into 1.14
# Conflicts:
#	common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/chunks/ChunkSection1_13.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/types/Chunk1_14Type.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java
#	common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java
2018-10-26 17:02:01 +02:00
Gerrygames 0046fea684 Merge pull request #4 from creeper123123321/1.14
Sounds, calculate non-air blocks, getNewBlockId
2018-10-26 16:54:13 +02:00
Gerrygames 864715af40 Merge pull request #5 from Gerrygames/1.14_18w43c
Add support for 18w43c
2018-10-26 14:41:15 +02:00
Marco Neuhaus 3684d3f9a2 add support for 18w43c 2018-10-26 14:34:09 +02:00
creeper123123321 69c52c48ab Sounds, calculate non-air blocks, getNewBlockId 2018-10-25 18:25:57 -03:00
Gerrygames 9cf5a66e2f Keep Chunk as an interface 2018-10-25 20:26:24 +02:00
Gerrygames ae73ef1a33 Use types for ChunkSections 2018-10-25 13:56:40 +02:00
Gerrygames 4e2ba4f810 Merge pull request #3 from creeper123123321/1.14
fix light
2018-10-25 12:10:05 +02:00
creeper123123321 aef88cd82f send 4096 in chunk data short 2018-10-25 04:44:03 -03:00
creeper123123321 9cd40f3ec2 fix wrong order 2018-10-24 19:25:33 -03:00
creeper123123321 a368f0babc trying to implement lightning based on Pokechu22 documentation 2018-10-24 19:07:16 -03:00
Gerrygames 9565a47c22 fix chunk packets 2018-10-24 21:14:07 +02:00
Gerrygames 0df089b3cb 1.14 development 2018-10-24 19:05:14 +02:00
Myles 58efd6158f Back to SNAPSHOT 2018-10-22 17:45:17 +01:00
Myles 99bd1a52fb 1.13.2 update 2018-10-22 17:42:53 +01:00
Myles 8ba1725eae Merge pull request #1055 from Gerrygames/1.13.2
1.13.2
2018-10-22 17:35:25 +01:00
Myles 0a2524fec8 Merge pull request #1054 from Gerrygames/myles_master
fix #1052
2018-10-22 17:35:07 +01:00
Gerrygames 162d6aa33a 1.13.2 support 2018-10-22 15:18:23 +02:00
Gerrygames fdcdd0fe40 Merge remote-tracking branch 'Myles/master' into 1.13.2 2018-10-22 15:18:06 +02:00
Gerrygames 8532d388f8 fix #1052 2018-10-22 14:33:38 +02:00
Myles ccc144556b Merge pull request #1053 from Gerrygames/book_fix
fix #1044
2018-10-22 12:10:34 +01:00
Gerrygames 0b7e438128 fix #1044 2018-10-22 11:29:22 +02:00
Myles 2f11268dcc Merge pull request #1050 from Plancke/master
Fix scoreboard colors
2018-10-21 23:11:09 +01:00
Plancke 81514e4192 convert every color in the name 2018-10-21 23:19:54 +02:00
Plancke 7d5c59aa34 Don't read the array size 2018-10-21 23:06:24 +02:00
Plancke dc6d9367b0 Rewrite scoreboard team member names to fix the color changing 2018-10-21 22:56:11 +02:00
Myles 6c609a6b23 Merge pull request #1049 from Gerrygames/1.13.2
1.13.2-pre2 support
2018-10-20 10:32:02 +01:00
Gerrygames b7a3c8568f 1.13.2-pre2 support 2018-10-20 11:25:20 +02:00
Myles 80f84d4001 Merge pull request #1048 from Gerrygames/1.13.2
1.13.2
2018-10-17 16:21:53 +01:00
Gerrygames 5cecfd14d9 1.13.2-pre1 support 2018-10-17 15:38:59 +02:00
Myles 8bfcc550f7 Merge pull request #1036 from KennyTV/master
Remove some more unncessary/doubled map check
2018-10-03 17:12:47 +01:00
KennyTV e40be243de Return correct default protocol, whoops! 2018-10-03 10:12:13 +02:00
KennyTV 033d3bcd4d Remove some more unncessary/doubled map check 2018-09-30 21:19:18 +02:00
KennyTV 449ec15309 Remove unncessary/doubled map check 2018-09-30 20:48:23 +02:00
Myles 8b0ccd81e2 Merge pull request #1035 from KennyTV/master
Remove unncessary doubled map check
2018-09-30 16:16:51 +01:00
KennyTV a206fd7541 Remove unncessary doubled map check 2018-09-30 16:07:08 +02:00
Myles 77472cb9f4 Back to snapshot 2018-09-24 11:39:14 +01:00
Myles 5372d4b8e7 1.5.2 release 2018-09-24 11:33:20 +01:00
Myles 0255f3c42f Merge pull request #1030 from creeper123123321/master
Fix PacketWrapper#constructPacket
2018-09-24 08:44:14 +01:00
creeper123123321 eb5c10d375 Fix PacketWrapper#constructPacket 2018-09-24 03:42:08 -03:00
Myles 9f6766fb82 Back to 1.5.2-SNAPSHOT 2018-09-23 19:28:07 +01:00
Myles ab77eb98c0 Prepare for 1.5.1 release 2018-09-23 18:54:24 +01:00
Myles 85ab5d7741 Use Channel instead of SocketChannel
For better compatibility with third party software.
2018-09-23 18:52:26 +01:00
Myles 6457ff315f Merge branch 'pr/987' 2018-09-23 18:43:29 +01:00
Myles c09a9c88b4 Merge pull request #1005 from creeper123123321/sendpackettoserver
PacketWrapper#sendToServer changes
2018-09-23 18:18:00 +01:00
Myles e8dc4c893f Merge pull request #1013 from creeper123123321/master
Fix item particle
2018-09-23 18:17:29 +01:00
creeper123123321 b61edb0d8e javadoc, fix possible NPE 2018-09-21 14:46:22 -03:00
Myles 94b3b51602 Merge pull request #1021 from 7kasper/master
ViaVersion <3 ProtocolSupport
2018-09-12 19:51:19 +01:00
7kasper 5415a24f4e ViaVersion <3 ProtocolSupport 2018-09-12 19:59:42 +02:00
7kasper 048ae2fcd0 Merge pull request #1 from MylesIsCool/master
Update fork.
2018-09-12 17:00:25 +02:00
Myles 3a4d425a1c Merge pull request #1018 from 7kasper/patch-1
ProtocolSupport  <3 ViaVersion
2018-09-10 20:49:45 +01:00
7kasper 0a8fc31be1 3/2 Hopefully fix all the space thingies. 2018-09-10 21:45:26 +02:00
7kasper f6ae076731 Part 2/2 Import & register listener. 2018-09-10 21:29:27 +02:00
7kasper 76296d8d41 Part 1/2 generate PS Packet Listener 2018-09-10 21:27:34 +02:00
creeper123123321 5024375466 Fix item particle 2018-09-02 15:13:38 -03:00
Myles 527b5e6f99 Allow disabling of auto-complete in 1.13 via disable-1_13-auto-complete in config #891 2018-09-01 07:53:36 +01:00
creeper123123321 17115460b7 PacketWrapper#sendToServer changes 2018-08-28 14:02:48 -03:00
Myles 84aaec6bff Fix bossbars (credit to @JollyajaX) 2018-08-23 21:40:39 +01:00
Myles 0a8f740a14 Merge pull request #995 from creeper123123321/master
Rewrite arrow metadata and remove 0x10 metadata flag in 1.12.2 -> 1.13
2018-08-23 21:33:38 +01:00
creeper123123321 8bf230e057 Rewrite arrow metadata and remove 0x10 metadata flag in 1.12.2 -> 1.13 2018-08-23 17:18:59 -03:00
Myles 1f51ee7233 Merge pull request #991 from creeper123123321/master
Fix Villager GUI and declare recipes
2018-08-22 21:55:36 +01:00
creeper123123321 4cd70ee711 Fix rewriting 2018-08-22 17:27:21 -03:00
creeper123123321 3d1d73a81a Rewrite declare recipes and villager gui 2018-08-22 17:05:46 -03:00
Myles ad4d142e94 Update README 2018-08-22 17:33:50 +01:00
Myles 0f77da15ff Back to snapshot for dev 2018-08-22 17:32:47 +01:00
Myles a05ea7c1ce Prepare for 1.13.1 update 2018-08-22 17:05:24 +01:00
Myles 8945fc27d7 Merge branch 'master' into dev 2018-08-21 18:25:56 +01:00
Myles ac91ecc5f6 Ensure client disconnected on Bungee before removing 2018-08-21 18:25:41 +01:00
Myles 925aaf345c Merge branch 'master' into dev 2018-08-21 17:18:27 +01:00
Myles 2510751fdf Introduce 'suppress-1_13-conversion-errors' option 2018-08-21 16:26:04 +01:00
Myles 83e94dbf4a Fix tab complete support for 1.13.1-pre2 2018-08-21 16:07:24 +01:00
Myles 41ab131a4d Merge pull request #985 from ForceUpdate1/dev
Add support for 1.13.1-pre2
2018-08-21 15:13:19 +01:00
Marco Neuhaus 252c996abf update to 1.13.1-pre2 2018-08-20 20:08:02 +02:00
Myles acf5fc1ee4 Merge pull request #979 from ForceUpdate1/dev
update to 1.13.1-pre1
2018-08-16 22:18:25 +01:00
Marco Neuhaus c141d6efc7 fix tags packet 2018-08-16 23:14:08 +02:00
Marco Neuhaus 3b48f11f7b add support for 1.13.1-pre1 2018-08-16 22:38:22 +02:00
Myles 9ec8e2daf7 Update version to correspond to snapshot version 2018-08-12 20:33:24 +01:00
Myles 4f84200a47 Merge upstream 2018-08-12 20:29:30 +01:00
Myles e4a99c4a3d Merge pull request #942 from creeper123123321/buffer-changes
Replace Unpooled.buffer()
2018-08-12 20:27:44 +01:00
Myles 75adf7c9d4 Merge pull request #969 from creeper123123321/master
Metadata rewriting, noteblocks and enchanting
2018-08-12 20:26:44 +01:00
Myles 5fc693da22 Merge pull request #964 from creeper123123321/dev
Some untested code
2018-08-12 20:26:17 +01:00
creeper123123321 12e2f8b35a Make enchanting table show the enchantment correctly 2018-08-12 09:56:39 -03:00
creeper123123321 1e7dbac34e Reduce cooldown 2018-08-11 12:31:45 -03:00
creeper123123321 e39876ae67 Use unpowered note block 2018-08-11 06:54:38 -03:00
creeper123123321 ff3bc9a0cd Rewrite block action, effect, tags and advancements; palette rewriting 2018-08-10 19:21:35 -03:00
creeper123123321 dfe1850b93 Merge remote-tracking branch 'upstream/master' into dev 2018-08-10 18:34:32 -03:00
Myles 6f50fdc026 Merge pull request #962 from ForceUpdate1/master
add support for 18w32a
2018-08-09 21:00:47 +01:00
Marco Neuhaus 5c490be861 remove file header 2018-08-09 09:25:00 +02:00
Marco Neuhaus 849c7b4fcf fix wrong import 2018-08-08 23:35:14 +02:00
Marco Neuhaus fd5bb94cb5 code cleanup 2018-08-08 22:32:29 +02:00
Marco Neuhaus 647bbbedb0 add items remapping 2018-08-08 21:45:54 +02:00
Marco Neuhaus 6cfb21f660 add support for 18w32a 2018-08-08 18:58:25 +02:00
creeper123123321 c709b019e1 Use ChatRewriter.legacyTextToJson in metadata rewriting 2018-08-06 15:31:05 -03:00
Myles faabe5afb2 Merge pull request #958 from creeper123123321/master
Biomes / Bungee relay msgs
2018-08-05 22:04:52 +01:00
creeper123123321 798bf15155 Remove unused code 2018-08-05 17:54:17 -03:00
creeper123123321 543daa2628 Rewrite invalid biomes 2018-08-05 17:45:22 -03:00
creeper123123321 3bdf81158a Rewrite BungeeCord's plugin channel format 2018-08-05 17:26:14 -03:00
creeper123123321 9b42094273 Rewrite bungeecord relay messages 2018-08-04 07:37:33 -03:00
Myles 94f3fcba12 Merge pull request #953 from ForceUpdate1/master
Add support Snapshot 18w31a
2018-08-03 22:17:46 +01:00
Marco Neuhaus 58b30341ee remove comment headers 2018-08-03 23:15:59 +02:00
Marco Neuhaus 741e0f8fda add support for 18w31a 2018-08-01 20:20:52 +02:00
creeper123123321 d8885f9156 Put prefix last color into the start of suffix 2018-07-30 08:49:32 -03:00
creeper123123321 e9aa18fd6b Fix memory leak 2018-07-29 09:34:27 -03:00
creeper123123321 7518f8b98b Replace Unpooled.buffer()
(cherry picked from commit e9159cb2de)
2018-07-29 09:11:55 -03:00
Myles c9dab5402e Merge pull request #923 from creeper123123321/master
Named sound effect rewriting + Effect rewriting
2018-07-29 12:59:01 +01:00
creeper123123321 e5169378fc Revert "Replace Unpooled.buffer()"
This reverts commit e9159cb
2018-07-29 08:56:26 -03:00
creeper123123321 ca23750c28 merge upstream^2 + lowercase sound ids 2018-07-29 08:31:48 -03:00
creeper123123321 446fd84035 merge upstream 2018-07-29 08:30:58 -03:00
Myles fc264d0b0f Cleanup various debug code 2018-07-29 12:14:17 +01:00
Myles e9ad372039 Remap negative ids to air (workaround for #933) 2018-07-29 11:48:38 +01:00
creeper123123321 b1e8efb00b Fix memory leak 2018-07-28 17:53:17 -03:00
creeper123123321 73ee2498e8 More optimization 2018-07-25 18:12:38 -03:00
creeper123123321 6608877ef0 Rewrite palette instead of rewriting each block 2018-07-25 18:03:25 -03:00
creeper123123321 e9159cb2de Replace Unpooled.buffer() 2018-07-25 09:04:06 -03:00
creeper123123321 a403c7424c *facepalm* 2018-07-24 10:55:08 -03:00
creeper123123321 de2abdcab0 *facepalm* 2018-07-23 10:20:41 -03:00
creeper123123321 088ce93701 Use short[] for sound remapping 2018-07-23 10:15:55 -03:00
creeper123123321 b5a7c92c8d Add missing .toClient 2018-07-22 19:11:29 -03:00
creeper123123321 d4144264d5 Use short[] for block mappings 2018-07-22 19:03:22 -03:00
creeper123123321 b221530276 Update Protocol1_13To1_12_2.java 2018-07-22 18:02:17 -03:00
creeper123123321 8476c83d62 Merge branch 'master' into master 2018-07-22 18:01:04 -03:00
Matsv 9d624bc822 Reimplement advancements by rewriting the items to flat items 2018-07-22 22:58:18 +02:00
creeper123123321 f15c841b99 Hacky fix to noteblock 2018-07-22 17:51:18 -03:00
creeper123123321 019bccd24a Rewrite advancements 2018-07-22 17:06:43 -03:00
creeper123123321 584c0709e8 Block data 2018-07-22 16:24:38 -03:00
creeper123123321 d577088b8c Named sound effect rewriting + Effect rewriting (thanks @Pokechu22) 2018-07-22 15:15:40 -03:00
Mats 72f5d8addc Merge pull request #910 from creeper123123321/master
Fix bungee-chat italic, bold, obfuscated, underline, strikethrough
2018-07-22 03:24:51 +02:00
Mats 6d959169fa Merge pull request #914 from Pokechu22/wdl-channels
Remap WDL plugin channels
2018-07-22 03:23:33 +02:00
Mats 076d05c103 Merge pull request #911 from McPiraci/master
Fix rewriting of MC|StopSound plugin channel.
2018-07-22 03:22:55 +02:00
Pokechu22 1e91b21537 Remap WDL plugin channels 2018-07-21 14:18:49 -07:00
Michał Kasprzyk b64a0b065c Fix MC|StopSound plugin channel rewriting.
(ID of stop sound packet is 0x4C, not 0x4B)
2018-07-21 17:32:30 +02:00
creeper123123321 faf7e5d25f Fix bungee-chat italic, bold, obfuscated, underline, strikethrough 2018-07-21 11:48:31 -03:00
Mats fd37c6b040 Merge pull request #902 from Gerrygames/master
Fix reddust particle color for 1.13 clients
2018-07-21 12:45:02 +02:00
Gerrygames bb4b5d3080 Fix reddust particle color for 1.13 clients 2018-07-21 11:18:14 +02:00
Mats d27f17f74b Merge pull request #900 from Dinnerwolph/master
fix server icon
2018-07-21 02:58:46 +02:00
dinnerwolph 3646fad197 fix server icon 2018-07-21 02:51:07 +02:00
Myles 34491967e2 Back to snapshot 2018-07-20 23:29:25 +01:00
Myles 3df70055b0 1.4.1 release 2018-07-20 23:25:57 +01:00
Myles 7c0c4ee74d Implement prefix based team colours (based on code by @JollyAjax) 2018-07-20 21:21:24 +01:00
Myles ca415cc719 Merge pull request #896 from creeper123123321/master
Support custom enchantments
2018-07-20 20:02:38 +01:00
creeper123123321 6c17615ecb Accept int tag in level 2018-07-20 15:58:04 -03:00
creeper123123321 9a1376dcb3 Accept int tag 2018-07-20 15:54:52 -03:00
creeper123123321 32161333dd Fix custom enchantments 2018-07-20 15:47:05 -03:00
Myles a2f5120069 Merge pull request #894 from creeper123123321/memory-efficiency
Memory efficiency
2018-07-20 18:47:39 +01:00
creeper123123321 e067492cca Catch exception 2018-07-20 13:23:40 -03:00
creeper123123321 1cdf2ed1ef Make compatible with older netty 2018-07-20 13:16:34 -03:00
creeper123123321 dc90652853 Memory efficiency 2018-07-20 13:16:33 -03:00
Myles 459de30e9a Merge pull request #892 from Logics4/master
Don't use Paper block placement patch in 1.12.
2018-07-20 16:23:11 +01:00
Logics4 4fe68c2c93 Don't use Paper block placement patch in 1.12.
Apparently the bug that caused the block placement issues with Paper was fixed in 1.12 (according to Aikar from its development team). So, with this commit the patch to fix it won't run if the server is running Paper 1.12 or higher (which means it will only be used in 1.11.2 and lower server versions).
2018-07-20 16:12:00 +01:00
Myles 8b0eb9c9d0 Merge pull request #890 from creeper123123321/master
Remove redundant tags
2018-07-20 15:13:44 +01:00
creeper123123321 a2fce6f4a5 Update WorldPackets.java 2018-07-20 10:29:51 -03:00
creeper123123321 78b9e5d833 Fix biomes 2018-07-20 10:26:56 -03:00
creeper123123321 4e2156bd2b Remove redundant tags 2018-07-20 07:14:51 -03:00
Matsv fdc4d2c5d2 Merge remote-tracking branch 'upstream/master' into upmaster 2018-07-20 11:16:00 +02:00
Matsv 7a331bdb09 Rewrite entity names for spawners, fixes #884 2018-07-20 11:15:37 +02:00
Myles 5f50b4522c README.md - Fix typo in table 2018-07-19 20:42:01 +01:00
Myles 2a630bbc7d Update README.md 2018-07-19 20:29:46 +01:00
Matsv df32569af6 Flowerpot check for empty strings / return air 2018-07-19 13:18:34 +02:00
Mats 361c36349b Merge pull request #877 from creeper123123321/master
Rewrite StoredEnchantments
2018-07-19 13:13:00 +02:00
Matsv ddbbb14c72 Correct changed directions for item frames Fixes #874 2018-07-19 11:54:09 +02:00
Matsv a0899d4776 Fix falling / block dust particles 2018-07-19 09:52:53 +02:00
creeper123123321 4c8761b17b Rewrite StoredEnchantments 2018-07-19 04:51:38 -03:00
Matsv 7eb446d528 Bump to 1.4.1-SNAPSHOT 2018-07-19 09:18:31 +02:00
Myles d0230af5c9 ViaVersion 1.13 support
Thanks to Matsv, creeper123123321, Pokechu22, PureGero
2018-07-18 23:26:14 +01:00
Myles 17564506b5 Temporary force biomes to be ocean 2018-07-18 23:19:13 +01:00
Matsv dfd18d64c2 Correct directPallette check (Thanks @Pokechu22) 2018-07-18 23:39:23 +02:00
Myles c3eaf5a1b0 Remove some channel debug 2018-07-18 19:27:39 +01:00
Myles 152ef7fe38 Merge pull request #861 from creeper123123321/dev
Fix banners - not tested
2018-07-18 19:25:07 +01:00
creeper123123321 7ad59b7cb0 Fix banner items 2018-07-18 15:23:46 -03:00
creeper123123321 5d19697004 Fix patterns 2018-07-18 14:43:57 -03:00
Myles 8f7c090a23 Fix javadocs :P 2018-07-18 18:25:43 +01:00
Myles d39c59663a Merge pull request #858 from creeper123123321/dev
Update to 1.13 (not for production)
2018-07-18 18:16:53 +01:00
creeper123123321 9232ea4fd6 *facepalm* 2018-07-18 14:15:37 -03:00
creeper123123321 cd9ff95226 1.13!!!!! 2018-07-18 14:12:35 -03:00
creeper123123321 54ad8606dc Chunk1_13 - not tested 2018-07-18 14:12:35 -03:00
Myles 4e1ab821e1 Merge pull request #857 from PureGero/dev
Skulls don't have 'Rot'; Painting names
2018-07-18 18:03:09 +01:00
PureGero 3016e774ff Skulls don't have 'Rot'; Painting names
Skulls on walls don't always have a 'Rot' tag if it's rotation is 0.
'DonkeyKong', 'SkullAndRoses' and 'BurningSkull' weren't displaying.
2018-07-18 18:38:11 +10:00
Myles 666779b012 Merge pull request #855 from creeper123123321/dev
1.13-pre10 + some things
2018-07-17 22:08:45 +01:00
creeper123123321 ba9198bd45 *facepalm*³ 2018-07-17 17:51:31 -03:00
creeper123123321 29460a310b *facepalm*² 2018-07-17 17:49:35 -03:00
creeper123123321 3507c2016a *facepalm* 2018-07-17 17:44:46 -03:00
creeper123123321 6d996a93c8 Do not create unnecessary tag 2018-07-17 17:40:39 -03:00
creeper123123321 7cd1563805 1.13-pre10, fix flower pots, comment debug message 2018-07-17 17:15:43 -03:00
Myles 4ad51649cc Merge pull request #854 from creeper123123321/dev
1.13-pre9
2018-07-17 14:49:51 +01:00
creeper123123321 17023d6afd Correct comment 2018-07-17 10:41:05 -03:00
creeper123123321 ca85c9739a 1.13-pre9, RIP BaseProtocol1_13, use Type.VAR_INT_ARRAY 2018-07-16 15:45:41 -03:00
Mats b83b7ee2bc Merge pull request #853 from creeper123123321/dev
Changes on plugin channel rewriting
2018-07-15 14:48:39 +02:00
creeper123123321 c47d5dcba6 Changes on plugin channel rewriting 2018-07-15 09:26:26 -03:00
Matsv 7335c8ea98 Fix commandblock minecart 2018-07-15 13:56:42 +02:00
Myles 8d7ef29d3e Merge pull request #852 from creeper123123321/dev
Fix click window packet
2018-07-14 19:45:45 +01:00
creeper123123321 31a1bf35d9 More changes involving BaseProtocol - not tested yet 2018-07-14 09:11:17 -03:00
creeper123123321 051df7401e Fix click window packet 2018-07-14 07:53:31 -03:00
Myles e8cb0f561e Merge pull request #851 from creeper123123321/dev
1.13-pre8
2018-07-13 19:35:30 +01:00
creeper123123321 24f0eb1a2e Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev 2018-07-13 15:24:38 -03:00
creeper123123321 5f1fba0276 1.13-pre8 2018-07-13 15:23:07 -03:00
Myles c88face33e Merge pull request #850 from creeper123123321/dev
1.13-pre7 + Sponge tab-completion fix
2018-07-13 10:16:26 +01:00
creeper123123321 c4eedca28b Fix Sponge tab-complete again 2018-07-12 15:00:06 -03:00
creeper123123321 9ac3110d3e it should work 2018-07-12 14:29:15 -03:00
creeper123123321 251f8bccaa /tableflip 2018-07-11 11:31:56 -03:00
creeper123123321 84d3c0d3e8 update tags packet id 2018-07-11 10:46:42 -03:00
creeper123123321 074aa302bc missing id changes 2018-07-11 10:13:36 -03:00
creeper123123321 638165aad5 1.13-pre7 2018-07-11 09:47:13 -03:00
Myles 65798d17ac Merge pull request #849 from creeper123123321/dev
1.13-pre6
2018-07-05 12:04:22 +01:00
creeper123123321 aacce4f77b Sound rewriting with JSON 2018-07-05 07:34:09 -03:00
creeper123123321 2153377c0e client to server plugin message rewriting 2018-07-04 17:10:30 -03:00
creeper123123321 006fb177e6 1.13-pre6 2018-07-04 10:50:01 -03:00
creeper123123321 cabc010582 Update mappings 2018-07-04 10:33:37 -03:00
Myles ae693ed438 Merge pull request #848 from creeper123123321/feature/logo
Add logo
2018-07-03 19:06:02 +01:00
Myles 4c7b2bbb4e Merge pull request #847 from creeper123123321/1-13-base-protocol
1.13 BaseProtocol changes
2018-07-03 16:01:21 +01:00
creeper123123321 314af6d000 Brackets. 2018-07-03 11:26:00 -03:00
creeper123123321 697e883649 More BaseProtocol changes 2018-07-03 11:19:32 -03:00
creeper123123321 f81892ea74 BaseProtocol changes 2018-07-03 09:58:00 -03:00
creeper123123321 4e9a253cfa Add logo 2018-07-02 19:41:27 -03:00
Myles 2c62cc37e7 Merge pull request #844 from creeper123123321/platform-and-sponge-changes
Platform and Sponge changes
2018-07-02 22:50:12 +01:00
creeper123123321 2fe0ed2ca1 restoring providers is not simple, removing todo 2018-07-02 18:48:52 -03:00
Myles b5e7434c9a Merge pull request #845 from creeper123123321/dev
1.13-pre5
2018-07-02 21:47:15 +01:00
creeper123123321 e3f71c26e7 1.13-pre5 + revert some changes 2018-07-02 11:36:03 -03:00
creeper123123321 7fda025c0d maybe cleaner code? 2018-06-28 07:34:56 -03:00
creeper123123321 383cbe15a6 reduce code 2018-06-27 15:08:09 -03:00
creeper123123321 7cace1ee32 fixed flowerpots 2018-06-27 14:27:12 -03:00
creeper123123321 1be25079d4 *facepalm* 2018-06-27 14:16:01 -03:00
creeper123123321 16cc07c020 some modifications 2018-06-27 14:10:37 -03:00
creeper123123321 7d671c2908 Fix BaseProtocol 2018-06-27 09:51:41 -03:00
creeper123123321 df2d9ba3d8 1.13-pre4 + ProtocolPipeline changes 2018-06-27 09:39:38 -03:00
creeper123123321 ffa696b963 LoggerWrapper changes, @Getter 2018-06-22 14:37:29 -03:00
creeper123123321 6f98e35dec Update BlockStorage 2018-06-22 09:30:11 -03:00
creeper123123321 39419f4ca3 1.13-pre3 2018-06-22 09:19:57 -03:00
creeper123123321 e26b6d08e1 1.13-pre2 + merge master 2018-06-17 10:17:33 -03:00
creeper123123321 cb4fcde6f4 1.13-pre2 + merge master 2018-06-17 10:16:53 -03:00
creeper123123321 f12a210665 Platform and Sponge changes 2018-06-14 15:21:49 -03:00
Myles 684c25dc2c Merge pull request #842 from creeper123123321/bug-fix/tab-complete
Fix tab completion on Sponge
2018-06-14 18:05:09 +01:00
creeper123123321 b20dad57fe Fix tab completion on Sponge 2018-06-14 13:24:42 -03:00
Myles a41cbdde7f Merge pull request #841 from creeper123123321/dev2
Enchantment and display name rewriting, use a map for new to old items
2018-06-13 22:38:14 +01:00
creeper123123321 32ce40e19e Enchantment and display name rewriting, use a map for new to old items 2018-06-13 17:12:43 -03:00
Mats fe71654f5b Merge pull request #839 from creeper123123321/dev2
Fix block tags
2018-06-05 20:58:28 +02:00
creeper123123321 bef1f76e45 Fix block tags 2018-06-05 15:41:34 -03:00
Myles 752f039411 Merge pull request #838 from creeper123123321/dev2
1.13 Tags
2018-06-05 17:55:49 +01:00
creeper123123321 047bbe0edb Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev2 2018-06-05 13:51:00 -03:00
creeper123123321 f022a57b23 tags 2018-06-05 13:50:28 -03:00
Mats 235948a001 Merge pull request #837 from creeper123123321/dev2
Revert mappings changes and update handlers
2018-06-04 23:34:32 +02:00
creeper123123321 c650b5c0bb Revert "Update 1.13 mappings TODO fix 1.12 mappings"
This reverts commit e334486e96.
2018-06-04 18:08:44 -03:00
creeper123123321 81f9f5ec60 Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev2 2018-06-04 17:36:27 -03:00
Matsv 870a9ba68f Regenerate 1.12 mappings with LI, TODO: diagnose wrong 1.13 items 2018-06-04 22:25:50 +02:00
Matsv e334486e96 Update 1.13 mappings TODO fix 1.12 mappings 2018-06-04 20:42:23 +02:00
Matsv e9633c6522 Bump to 1.13-pre1 2018-06-04 20:32:27 +02:00
creeper123123321 2ea42eab62 update handlers 2018-05-31 17:20:41 -03:00
Myles 06056de6bb Merge pull request #836 from creeper123123321/dev2
18w22c
2018-05-31 20:18:47 +01:00
creeper123123321 067da7e1d9 18w22c 2018-05-31 12:03:45 -03:00
Mats 8c02947c05 Merge pull request #834 from creeper123123321/dev2
18w21b
2018-05-26 14:38:01 +02:00
creeper123123321 9d39bb2d62 18w21b 2018-05-26 08:52:31 -03:00
creeper123123321 6a4f2f6830 18w21a 2018-05-23 15:28:22 -03:00
creeper123123321 120b12feeb 18w20c 2018-05-17 14:09:36 -03:00
Myles 40853ae92b Merge pull request #831 from creeper123123321/dev2
18w20b
2018-05-16 21:40:36 +01:00
creeper123123321 bb64329b07 18w20b 2018-05-16 17:12:43 -03:00
creeper123123321 5878c53aa4 18w20a + mapping changes
(cherry picked from commit 57b5a0d)
2018-05-15 17:00:14 -03:00
Myles f4d1c3fcf2 Merge pull request #829 from creeper123123321/dev2
18w19b
2018-05-13 14:45:03 +01:00
creeper123123321 136adaebd5 18w19b 2018-05-09 15:45:09 -03:00
creeper123123321 188cc5019f Maybe better performance? 2018-04-21 11:11:12 -03:00
creeper123123321 e41f445e92 18w16a 2018-04-19 19:39:30 -03:00
Myles bd283910fc Merge pull request #823 from creeper123123321/dev2
18w16a
2018-04-19 20:54:30 +01:00
creeper123123321 1e0113a58a 18w16a 2018-04-19 16:29:50 -03:00
Matsv 8bf43648ce Regenerate EntityTypeRewriter 2018-04-14 10:23:35 +02:00
Matsv 7d5451558d Generate sound changes for 18w15a 2018-04-13 09:55:49 +02:00
Matsv c61d5d480e Regenerate EntityTypes 2018-04-12 22:30:00 +02:00
Matsv 960f8ddce7 Bump 16w15a (TODO auto regenerate entities with PAaaS) 2018-04-12 21:59:51 +02:00
Matsv dc758b767f Reimplement spawnegg items 2018-04-08 17:02:46 +02:00
Matsv 3176d892dd Regenerate 1.12 items using codename GT 2018-04-08 14:26:36 +02:00
Matsv 495d162ef2 Handle block entities to identifier correctly 1.10->1.11 (TODO handle correctly in ViaBackwards) 2018-04-07 18:00:18 +02:00
Matsv b61b52c57e Fix AreaEffectCloud metadata rewriting when index [9,10,11] is not provided 2018-04-06 21:02:02 +02:00
Matsv f2f485731f Update to 18w14b 2018-04-06 19:52:45 +02:00
Matsv 1aad25776c Handle AreaEffectCloud metadata 2018-04-05 19:18:14 +02:00
Matsv 07fa0f3e55 Handle (id+(data<<12)) encoded particle blocks; finish particle rewriting (: 2018-04-05 19:01:37 +02:00
Matsv 45105d8c6a Handle particle BlockTypes 2018-04-04 22:51:42 +02:00
Matsv 613001a600 Handle removed particles 2018-04-04 21:46:59 +02:00
Matsv 0ec5777f12 Fix particle arguments, randomize reddustHandler 2018-04-04 21:45:23 +02:00
Matsv d066c2596b Handle particles with 0 parameters 2018-04-04 21:09:54 +02:00
Mats c0c1a6bbcf Merge pull request #820 from creeper123123321/dev
Fix setFlatBlock, update mappings and change some things on item rewriting
2018-04-04 20:22:40 +02:00
creeper123123321 b7fde6390e Update mappings, change some things on item rewriter 2018-04-04 14:58:20 -03:00
creeper123123321 feba8785d7 Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev 2018-04-04 13:17:26 -03:00
Matsv 4a172a27ad Bump protocol (TODO handle new item? (regenerate mappings)) 2018-04-04 18:12:23 +02:00
Matsv ace9c2d9ec Progress on ParticleRewriter. (TODO finish data types / cleanup code) 2018-04-02 20:24:44 +02:00
Matsv 70e106eeab Start working on particles 2018-04-02 17:06:25 +02:00
Matsv 4d38ca1b3c Fix invisible banners on placement (#819). Send the blockupdate before the Update Block Entity is sent. 2018-04-02 15:51:56 +02:00
Matsv 576bee40fc Change default cobblestone_wall to up=true 2018-04-02 15:07:04 +02:00
Matsv 0efb17af83 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2018-03-29 20:43:45 +02:00
Matsv 0228a2849d Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into upmaster 2018-03-29 20:42:48 +02:00
Matsv af53a96f67 Rip anonymous GitHub gists. :( Use ViaVersion dump! :D 2018-03-29 20:42:11 +02:00
creeper123123321 7eab459195 Fix missing setFlatBlock 2018-03-24 16:39:48 -03:00
Mats 5801cd1e0f Merge pull request #816 from creeper123123321/dev
Fix last pull request
2018-03-20 18:52:14 +01:00
creeper123123321 6bb0f2145e thinking that i fixed 2018-03-20 14:48:32 -03:00
Mats 15f67392dc Merge pull request #815 from creeper123123321/dev
Block and item rewriting changes
2018-03-20 18:41:43 +01:00
creeper123123321 6571c42c39 shield mapping 2018-03-20 14:36:15 -03:00
Matsv 851fa4ca54 Handle packet 'Recipe Book Data' changes (ignore for now) 2018-03-20 18:35:58 +01:00
creeper123123321 39dea80d9c todo 2018-03-20 14:27:47 -03:00
creeper123123321 c102ca7f15 shield, damageable, map item rewriting 2018-03-20 14:21:37 -03:00
creeper123123321 9fe187c049 Fix block and item rewriting 2018-03-20 13:46:26 -03:00
Matsv f56971e5ac Remove debug code 2018-03-20 17:21:04 +01:00
Matsv fbaaa78b81 Transform FallingBlock to the new block format 2018-03-20 17:19:35 +01:00
Matsv acb960bfdf Transform Minecart metadata (9) to the new block format 2018-03-20 16:56:32 +01:00
Matsv 0ada2496de Handle new Zombie metatag & change reset color to 21 (as documented on wiki.vg) 2018-03-20 15:55:27 +01:00
Matsv b7ca30efe8 Fix crash on scoreboard deletion 2018-03-20 14:31:14 +01:00
Matsv db57916af4 Handle PacketMultiBlockChange correctly 2018-03-20 11:28:44 +01:00
Matsv 4f3074eca8 Correct x, z for BlockStorage 2018-03-20 10:14:47 +01:00
Matsv a6af99fdbc Handle dog color changes 2018-03-19 20:09:07 +01:00
Matsv d6df48430b Cleanup Entity1_13Types 2018-03-18 14:28:54 +01:00
Matsv 7a01376144 Generate Entity1_13Types 2018-03-18 14:11:40 +01:00
Matsv 2fb9533575 Auto-generate entity id changes to prepare for PAaaS EnityTypes generation 2018-03-17 17:25:35 +01:00
Mats 66a4d7c2ee Merge pull request #812 from creeper123123321/dev
18w11a sounds + mappings
2018-03-17 15:27:35 +01:00
creeper123123321 c66c277221 grass path 2018-03-17 11:22:47 -03:00
creeper123123321 98a731e5df 18w11a sounds 2018-03-17 10:58:04 -03:00
creeper123123321 74cb0d5167 18w11a mappings 2018-03-17 10:43:11 -03:00
creeper123123321 478812d648 Merge pull request #2 from MylesIsCool/dev
Pull @creeper123123321 's work and bump to 18w11a!
2018-03-17 10:37:48 -03:00
Matsv e759fbb5db Pull @creeper123123321 's work and bump to 18w11a! 2018-03-17 14:28:53 +01:00
creeper123123321 c24485b5f9 18w10d - todo entities 2018-03-12 17:05:08 -03:00
creeper123123321 8eae83f218 18w09a 2018-03-03 11:59:19 -03:00
creeper123123321 09495695f2 18w09a 2018-03-03 11:58:53 -03:00
creeper123123321 14a86160d6 18w08b trying to not crash 2018-02-24 07:04:12 -03:00
creeper123123321 f59f178cec Merge pull request #1 from MylesIsCool/master
merge master
2018-02-24 06:55:10 -03:00
creeper123123321 6498c010f8 18w08b trying entity rewrite^2 2018-02-24 06:28:36 -03:00
creeper123123321 909bbc43d0 18w08b trying entity rewrite but didn't worked 2018-02-23 17:46:56 -03:00
creeper123123321 ce326e24e6 18w08b trying entity rewrite but didn't worked 2018-02-23 17:38:50 -03:00
creeper123123321 4de081efda 18w08a sound rewrite 2018-02-21 19:25:56 -03:00
creeper123123321 8848758578 todo 2018-02-19 19:19:20 -03:00
creeper123123321 326c6cb158 18w07c - Fix skull handler 2018-02-19 14:44:14 -03:00
creeper123123321 4e4b35b2e7 18w07c - Fix skull handler 2018-02-19 14:42:54 -03:00
creeper123123321 d7caf2ae3c 18w07c - Handlers 2018-02-18 12:38:26 -03:00
creeper123123321 700f0c293e 18w07c - Fix some inventory issues + mappings, thanks Gerrygames 2018-02-18 05:55:52 -03:00
creeper123123321 00dedaa1ff 18w07c - Fix some inventory issues + mappings, thanks Gerrygames 2018-02-18 05:53:57 -03:00
creeper123123321 34cba80fd8 18w07c* - MISSING MAPPINGS 2018-02-17 20:43:08 -02:00
mmxw11 172ac19585 18w07b - MISSING MAPPINGS 2018-02-17 20:37:50 -02:00
Myles 05617a95b7 Merge pull request #802 from mmxw11/master
Fix inventory issues + support jdk9
2018-02-05 21:55:44 +00:00
mmxw11 c46bdcf42b Fix inventory handling
fixes #780 & #800
2018-01-22 21:32:22 +02:00
mmxw11 f739060ebb Update Lombok
...to make it work with jdk9
2018-01-21 11:55:48 +02:00
Matsv b9e4466ef0 Update protocol to 18w03b 2018-01-19 11:12:05 +01:00
Matsv be4af60ad1 Merge branches 'dev' and 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2018-01-19 11:06:18 +01:00
Matsv 721297bf21 Correct runRepeatingSync order 2018-01-19 11:05:16 +01:00
Matsv 9ff20f3fea 18w02a 2018-01-11 16:14:34 +01:00
Matsv 566c9dbda0 Remove debug message 2018-01-07 17:28:50 +01:00
Matsv ff5bb8acc6 Handle new Pumpkin Carve sound & handle new StopSound packet 2018-01-07 17:22:54 +01:00
Matsv 195b89f24c Change Sun's NotImplementedException to UnsupportedOperationException 2018-01-06 15:29:34 +01:00
Matsv 012aac97ee Handle changed block entities. Fixes banners,beds & flowerpots 2018-01-06 15:23:49 +01:00
Matsv ba70dae9ad Handle team packet changes 2018-01-05 15:50:01 +01:00
Matsv c43e702ed9 Cancel the packet that caused non x character crash for now & check for empty custom names 2018-01-04 16:00:55 +01:00
Matsv 9dfbe3b263 Read FlatItem correctly & fix incoming Item type 2018-01-04 15:41:10 +01:00
Matsv 444eabcebf Handle metadata correctly, implement new MetaTypes & bump protocol to 18w01a (non-stable) 2018-01-04 14:59:59 +01:00
Myles ede4fa5a5d Rewrite BlockId, cancel changed packets, rewrite metadata even if type not found 2017-12-24 12:20:09 +00:00
Matsv cc4ae6eb80 Bump to 17w50a (no stable). 2017-12-24 13:08:20 +01:00
Myles 0a37031418 Correctly convert between ITEM -> FLAT_ITEM 2017-12-18 15:48:25 +00:00
Myles bd9096ef6d Flat item should only write NBT when id != 0 2017-12-16 22:17:12 +00:00
Myles 246dc34835 Fix tab completion not completing mid-word, also makes code simpler 2017-12-14 21:25:42 +00:00
Myles f90029319e Recipe packets are fine, remap scoreboard objectives 2017-12-14 21:19:03 +00:00
Myles 18dc323f7f Named Sound Effect has no changes (apart from id changes) 2017-12-14 19:46:01 +00:00
Myles a948503895 Better tab support (handle spacing properly) 2017-12-14 19:45:29 +00:00
Myles 616c9474ce Better fallback for block mismatch 2017-12-14 18:45:29 +00:00
Myles 77dc403bb9 Implement tab complete for the snapshot 2017-12-14 18:45:16 +00:00
Myles 6fd1ee227f Implement item conversation so it will map back properly 2017-12-13 21:52:24 +00:00
Myles 19eb478067 [WIP] 17w49a Basic block + item support (inventory transactions are broken / some issues with wrong block)
This will be fully implemented over the coming weeks. Please don't report missing features etc.
2017-12-11 23:39:34 +00:00
Myles 54540fb8ef Merge branch 'master' into dev 2017-12-11 12:20:49 +00:00
Myles 5a74e129a4 Change 'quick-move-action-fix' to default disabled.
This is until we can ensure no bugs happen with it if we're required to release.
See #780
2017-11-28 15:17:02 +00:00
Myles 12c21c9b0a Add a few extra null checks into ProtocolDetectorService
Under certain conditions these can be null.
2017-11-26 13:45:39 +00:00
Myles 61836895b0 Update to 17w45b 2017-11-10 20:58:30 +00:00
Myles 5f36302057 Base 17w45a update (missing areaeffectcloud remap) 2017-11-08 18:12:15 +00:00
Matsv 1b9bf4b36e 16w43b 2017-10-26 16:05:25 +02:00
Matsv 9b9cdf8b8f Support for 17w43a 2017-10-26 15:39:57 +02:00
Myles ab1a586b4c Merge pull request #765 from Pokechu22/mc-111054
Backport fix for MC-111054
2017-10-22 14:18:42 +01:00
Pokechu22 030a3fe4ac Backport fix for MC-111054
The max length of the locale was increased in 1.12-pre3; we need to undo that.
2017-10-21 12:05:23 -07:00
Myles fd01b9a6d2 Don't display achievement broadcasts to 1.12+ #757 2017-10-11 21:12:02 +01:00
Myles 11be597d11 Torch support for paper patch #758 2017-10-11 20:48:45 +01:00
Myles 875e5d7252 Merge pull request #754 from mmxw11/master
Improve inventory handling for Bukkit servers
2017-10-11 20:43:57 +01:00
Myles e372a56827 Refactor code to make field / class names better 2017-10-08 15:33:43 +01:00
mmxw11 471f1ae71d Try make it compile with Travis...
... don't use diamond operators?
2017-10-05 22:11:06 +03:00
mmxw11 a27808ade1 Add config for quick move action patch 2017-10-05 22:05:53 +03:00
mmxw11 2703e849cb Increase the waiting time 2017-09-28 20:47:13 +03:00
mmxw11 d57ef2b303 Fix inv provider not working on 1.8 servers 2017-09-28 20:44:49 +03:00
mmxw11 5a7626f280 Merge pull request #1 from mmxw11/dev
Merge branches 'dev' and 'master' of https://github.com/mmxw11/ViaVersion into master
2017-09-25 21:55:14 +03:00
mmxw11 1c4e0051a0 Finish inventory provider
+ Support 1.9+ servers
2017-09-25 21:49:43 +03:00
mmxw11 b3d3921f6e Support item provider on a 1.8 server
... 1.9 is on the way
2017-09-25 18:04:39 +03:00
mmxw11 976c418c9e Start implementing inv update task 2017-09-25 16:13:56 +03:00
mmxw11 b2669129f2 More work on the inv provider 2017-09-24 22:11:54 +03:00
mmxw11 343e316e4c Make InvContainerItemProvider 2017-09-24 21:35:38 +03:00
mmxw11 ce219e208c Check the right type 2017-09-24 21:17:07 +03:00
Myles 358267d6e3 Merge pull request #752 from mmxw11/master
Format the book data correctly, fixes #737 + spaces
2017-09-24 17:19:01 +01:00
mmxw11 786788aa23 Oops forgot to remove the note 2017-09-22 17:18:21 +03:00
mmxw11 49b20e37cb Properly format book data 2017-09-22 17:16:04 +03:00
Myles 3f5362a857 1.12.2 Support 2017-09-18 10:28:05 +01:00
Myles c7c61df0b8 Minecraft 1.12.2 Pre-release 1 Support 2017-09-13 15:45:45 +01:00
Myles 298835be42 Move config to assets/viaversion & refactor Config
Config loading is done by the implementing class.
Platforms can now specify the URL of the default config.
2017-09-11 13:10:54 +01:00
Myles 4a51958da4 Merge pull request #727 from RapidTheNerd/patch-1
Pls fix
2017-08-05 23:04:23 +01:00
George Marr cff23db7d3 Pls fix
DO IT
2017-08-05 23:03:06 +01:00
Myles f70059b4b6 Ensure it's a string 2017-08-03 17:36:48 +01:00
Myles 757d22da23 Switch back to snapshot 2017-08-03 16:02:50 +01:00
Myles 4bc4aa26a4 Fix grammar in command errors. 2017-08-03 16:01:00 +01:00
Matsv cbc0a12dd6 1.12.1 update 2017-08-03 14:59:03 +02:00
Matsv 100a147a4a Add packet names 2017-08-03 14:45:11 +02:00
Matsv c405424500 Compatibility for 1.12.1-pre1 2017-08-02 13:44:14 +02:00
Matsv 23091d60ff Change maven version 2017-08-01 17:30:26 +02:00
Matsv f0968408b6 Cancel the new packet for now 2017-08-01 16:42:15 +02:00
Matsv 2bf2be071d Handle incoming packet id changes 2017-08-01 16:18:38 +02:00
Matsv c502e2cf7e Handle outgoing packet id changes 2017-08-01 16:04:47 +02:00
Matsv 2d8446b4e3 Start 1.12.1 development 2017-08-01 15:34:22 +02:00
Myles 279162d720 Ensure only 1 server saves config value at a time. 2017-07-31 15:25:04 +01:00
Myles a64c21da8b Fix invalid json nbt chat messages, #712 2017-07-31 15:24:25 +01:00
Myles 4d58c717cd Fix auto-team not sending in the right order, #699 2017-06-29 20:04:40 +01:00
Myles 634f92b5cd Fix inventory crashes in recent commit #701 2017-06-26 13:51:18 +01:00
Myles 24c4af486c Fix breaking change in last commit 2017-06-24 21:17:10 +01:00
Myles 280fe1aed0 Fix Evocation Illager animation on 1.12 2017-06-24 16:27:14 +01:00
Myles 7cfa78557e 1.12 beds will now be red, #689 2017-06-24 16:26:42 +01:00
Myles f599583856 Fix 1.11 entity id rewriting not applying to dropped items 2017-06-24 15:40:09 +01:00
Myles 10688a7067 Don't produce errors while ViaVersion is not active during boot, #686 2017-06-12 18:22:09 +01:00
Myles 188419feb0 1.1.1 SNAPSHOT 2017-06-09 19:10:56 +01:00
Myles fd44e2e9bd 1.1.1 release 2017-06-09 17:04:05 +01:00
Matsv e19d7e88bd Implement 1.12 Meta Type & Remove Pre6 support since Spigot released 1.12 2017-06-08 16:59:33 +02:00
Matsv 2446577188 Read all the remaining bytes fixes #681 2017-06-08 12:11:44 +02:00
Myles fef435b9fb As per popular request, 1.12 clients for 1.12-pre6 servers. 2017-06-07 16:50:22 +01:00
Myles 1cb3b985a7 Fix hologram patch not working on 1.12 2017-06-07 15:13:04 +01:00
Myles 2292175e9a Ensure Bungee protocol order as well as ensuring it picks a protocol that viaversion knows. 2017-06-07 14:01:08 +01:00
Myles ef04346019 Move back to snapshot for 1.1.1 ViaVersion 2017-06-07 13:07:05 +01:00
Myles 381ff1e5d3 1.12 update 2017-06-07 12:58:51 +01:00
Matsv 079f8df6e0 Merge branches 'dev' and 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2017-06-01 21:47:37 +02:00
Myles 56637f50bc Merge pull request #676 from RaynLegends/master
Improved the shield handling (1.9->1.8)
2017-06-01 19:11:31 +01:00
Matsv 914888dade Refactor Snapshot to 1.12 as preparation for tomorrows release 2017-06-01 18:49:07 +02:00
RaynLegends 8e20df57a9 Improved the shield handling (1.9->1.8) 2017-06-01 18:23:16 +02:00
Matsv 7d5191fa2f Implement 1.12 MetaTypes 2017-06-01 16:00:35 +02:00
Matsv 08528a1745 Addd get/setBlock to the interface of ChunkSection 2017-06-01 15:44:41 +02:00
Matsv a8e3d9ec95 Update to 1.12-pre7 2017-05-31 14:05:18 +02:00
Matsv e5dd9b61a4 Remove wrong EntityType 2017-05-31 00:26:28 +02:00
Matsv 6ee2d0574f Bump version from 1.0.5 -to 1.1.0 since this won't be just a bugfix update. 2017-05-29 20:23:54 +02:00
Myles 91b5a8036c 1.12-pre6 2017-05-29 13:59:02 +01:00
Myles 24ab0d8590 Merge branch 'master' into dev 2017-05-27 20:41:19 +01:00
Myles d8f55006ff Ensure connection isn’t null (reloads etc), fixes #674 2017-05-27 20:41:00 +01:00
Matsv 0817d28b88 Merge branches 'dev' and 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2017-05-27 16:39:43 +02:00
Matsv 577c8b4eaf Add a getBlock method in ChunkSection1_9_3_4.java 2017-05-27 16:39:07 +02:00
Matsv 5b5f0dce24 Manually hide Entity BossBars on (from 1.8.x) server switch. Fixes #666 2017-05-25 18:14:56 +02:00
Myles a818b9a9d4 Add discord server 2017-05-22 15:50:22 +01:00
Myles 3160c076f0 Add discord server 2017-05-22 15:49:42 +01:00
Myles 6d0b28fac4 Merge branch 'master' into dev 2017-05-22 13:38:37 +01:00
Myles ce286cf322 Remove unnecessary synchronising 2017-05-22 13:38:22 +01:00
Myles 7d001c61a8 Fix packet id typo causing random dc’s #669 2017-05-22 13:17:24 +01:00
Myles a09e8b9f4d Fix comment with 1.12-pre5 2017-05-19 22:35:24 +01:00
Myles 395d020411 Update to 1.12-pre5 2017-05-19 22:32:21 +01:00
Myles ece4455130 Fix chunk sending #667 2017-05-18 22:58:27 +01:00
Matsv cc64ffff98 Update to 1.12-pre4 2017-05-18 15:03:27 +02:00
Matsv dd332420e5 Fix invisible beds for 1.12-pre3 2017-05-17 21:52:36 +02:00
Myles ce8ba6a5af Merge branch 'master' into dev 2017-05-17 19:44:00 +01:00
Myles 21eb824395 Better support for nbt arrays rereading in chunks 2017-05-17 19:43:48 +01:00
Myles 246e5ca742 Merge branch 'master' into dev 2017-05-17 18:16:07 +01:00
Myles 2bd03ad92c Fix chunks on 1.11 encoder 2017-05-17 18:15:52 +01:00
Myles 7971dc797b Handle packet 2017-05-17 18:14:47 +01:00
Myles 36c047bfa0 Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev 2017-05-17 17:09:27 +01:00
Myles d7daab7e64 1.12-pre3 2017-05-17 16:26:12 +01:00
Matsv b925e91bbb Merge branch 'upmaster' into dev 2017-05-14 17:13:04 +02:00
Matsv 3b1341f2b3 Cleanup code 2017-05-14 16:15:21 +02:00
Matsv 667ad0d059 Rewrite Spawner entity ID, fix #643 2017-05-14 16:02:04 +02:00
Matsv da98722470 Merge branches 'dev' and 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2017-05-14 14:50:44 +02:00
Matsv c92fcc9f9a Add NullCheck for #657 fixes #663 2017-05-14 14:50:00 +02:00
Matsv 8d66ce776c Add NullCheck for #657 fixes #663 2017-05-14 14:47:00 +02:00
Matsv 412202e105 Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev 2017-05-14 14:39:02 +02:00
Matsv 35c9e4e268 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2017-05-14 14:38:45 +02:00
Matsv 81ea78e003 Update dependencies fix #662 2017-05-14 14:34:51 +02:00
Myles 833698fe8a Update to 1.12-pre2 2017-05-11 18:05:20 +01:00
Myles 70964e9ba9 Merge branch 'master' into dev 2017-05-11 18:02:50 +01:00
Myles 255a4d516e Merge pull request #657 from KernelFreeze/master
Fixing item count on 1.11, where size <= 0. (#553)
2017-05-10 20:52:22 +01:00
Matsv 11d26c13b8 1.12-pre1 2017-05-10 18:03:15 +02:00
Matsv 00b4396f86 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2017-05-10 18:00:18 +02:00
KernelFreeze 1d5d0012e6 Item count on 1.11. 2017-05-09 23:32:32 -05:00
KernelFreeze 18c706ab8a Fixing item count on 1.11, where size <= 0. Fixes #553 2017-05-09 23:19:23 -05:00
Myles 6a65a35dee 17w18b 2017-05-04 18:51:38 +01:00
Myles 37aab2c759 ViaVersion for 17w18a 2017-05-03 15:00:37 +01:00
Myles 18ad5da081 17w17b 2017-04-27 15:02:17 +01:00
Myles 9f65e727c9 17w17a 2017-04-26 15:34:24 +01:00
xBytez efa6e8ec31 Fix README.md typo that prevents the table from showing. (#654)
* Fix README.md typo that prevents the table from showing.

* Remove extra unneeded bracket from README.md
2017-04-26 13:33:10 +01:00
Myles a7df7715b1 Update to 17w16b 2017-04-21 21:26:30 +01:00
Myles a9831c842c 1.8.8 -> 1.9.4, fix hand item being sent in different tick 2017-04-20 22:03:09 +01:00
Myles 439a5f90c1 Merge branch 'dev' of https://github.com/MylesIsCool/ViaVersion into dev 2017-04-20 16:31:57 +01:00
Myles a6491cf792 17w16a support 2017-04-20 16:31:11 +01:00
Myles e1025afb54 1716a support 2017-04-20 16:23:09 +01:00
AlfieC a5dddf371d Fix critical bug (#636) 2017-04-12 18:20:27 +01:00
DoNotSpamPls fe95bbf312 1.0.4 -> 1.0.5 (#649) 2017-04-12 18:20:18 +01:00
Myles 0bab4f62de Update to 17w15a, (some sound stuff may of changed) 2017-04-12 11:55:32 +01:00
Myles 981b5cf3bf Add sound shifting for snapshot 2017-04-05 20:24:19 +01:00
Matsv 89f47c6a6a Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into dev 2017-04-05 21:09:47 +02:00
Matsv 9fd1687348 Use PacketWrapper for BossBar's instead of raw 2017-04-05 21:08:27 +02:00
Myles 899eac0e7e Fix ProtocolSupport not working on new versions #629 (+1 ProtocolSupport having nice code) 2017-04-05 20:05:08 +01:00
Myles efad8f41a1 13w14a 2017-04-05 18:09:36 +01:00
Myles ee81935a74 Update to 17w13b
Note: I had an issue with some packet not working, if you have steps to replicate please make an issue.
2017-04-01 21:55:51 +01:00
Myles e3c4253c13 Merge branch 'master' into dev 2017-04-01 00:07:32 +01:00
Myles 9d991cdd26 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion 2017-02-17 14:15:45 +00:00
Myles 3fdbf5b062 Revert previous Server protocol check, add a call to ProtocolRegistry to force class load. 2017-02-17 14:15:27 +00:00
Phineas 40937acfa0 Update to 2017 (#632) 2017-02-15 18:31:22 +00:00
Myles 99e4ab22e3 Only inject channels when server protocol is known #631 2017-02-13 17:22:52 +00:00
Myles 8da0c4310c Update to 17w06a 2017-02-08 14:10:18 +00:00
Myles 280da6b8e9 Update README 2017-02-03 16:33:34 +00:00
Myles 71ff8a773b Back to dev 2017-02-03 16:32:56 +00:00
Myles e3c1b9bf64 1.0.4 Release 2017-02-03 16:27:18 +00:00
Myles a52552dcb4 Save boss bars to BungeeCord which are made by Withers / Enderdragons 2017-02-03 16:24:14 +00:00
Myles e8039e158f Fix horse spawn eggs 2017-02-01 15:58:53 +00:00
Myles c37ef71f72 Fix spawn eggs for 1.11+ #598 2017-01-30 18:02:12 +00:00
Myles 0388f340cc Don’t support older versions if protocol support is installed, fixes #615 2017-01-30 17:15:47 +00:00
Myles 5e437d26d9 Fix typo 2017-01-12 22:10:05 +00:00
Myles c10c3547b9 Move dumps to gists #608 2017-01-03 15:53:20 +00:00
Myles 528a8e5587 Update OpenNBT 2016-12-24 17:27:59 +00:00
Myles ea4487e33f Back to dev 2016-12-20 21:46:19 +00:00
Myles c2578bd212 Bump to 1.0.3 2016-12-20 21:06:23 +00:00
Myles a1347dd669 Move 1.11.1 support to new class, fixes any other support issues (or just upgrade bungee etc) 2016-12-20 20:54:28 +00:00
Myles 3228ba65ae Fix #587 2016-12-20 20:13:19 +00:00
Myles 08b2d5b7e8 Fix #604 2016-12-20 20:11:21 +00:00
Myles 2b89dbce0e Back to snapshot 2016-12-20 16:14:13 +00:00
Myles f256309487 Bump version to 1.0.2 2016-12-20 16:07:37 +00:00
Myles 462abb1ef9 Update to snapshot 1.11.1 2016-12-15 15:39:38 +00:00
Myles a35408d14f New config option for disabling piston animation for 1.11 clients #570 2016-12-15 15:32:54 +00:00
Myles 81d4deaea7 Fix block metadata #580 2016-11-28 23:47:49 +00:00
Myles 9103f89aff 1.0.2-SNAPSHOT 2016-11-16 19:58:59 +00:00
Myles 8e4c2648a3 1.0.1 Release 2016-11-16 19:57:20 +00:00
Myles ad020ec329 Fix wrong packet format for 1.8 brewing #562 2016-11-16 18:14:47 +00:00
Matsv df3be302af Send the chunkbulk packets immediately. Fixes #535 2016-11-16 17:15:36 +01:00
Gianluca Falcomer 8e3b8cb572 Update ViaCommandHandler.java (#558) 2016-11-16 16:15:24 +01:00
Myles ff1554556e Fixed 1.7 UUID, oops. Thanks @MineTheCube 2016-11-15 21:17:39 +00:00
Myles b15c93c416 Use length for UUID compat as contains is expensive 2016-11-15 19:53:22 +00:00
Myles 071b42c9e0 Fix 1.7.2 support when used with ProtocolSupport 2016-11-15 19:11:40 +00:00
Matsv 304f9b34fd Send empty metadata flags on server switch to prevent an Elytra glitch on 1.8 fixes #555 2016-11-15 18:10:14 +01:00
Myles c817a0e9cb Add null check to hand patch 2016-11-15 17:07:31 +00:00
Myles 744252d492 Don't handle null users 2016-11-15 17:01:22 +00:00
Myles 9186361a29 Change ConcurrentHashMaps to just Maps for Java 7 support 2016-11-15 15:17:16 +00:00
Myles bf01c9ea0e Fix getting connection twice 2016-11-15 08:17:15 +00:00
Myles bee260e2b4 Ignore null users 2016-11-14 23:42:29 +00:00
Myles 21811991f1 Correct elytra dropping, fixes #545 2016-11-14 23:35:47 +00:00
Myles a2809f8d5c Add count to /viaver list, #540 2016-11-14 22:38:39 +00:00
Myles 95f2b597da This is billy, he got lost on his way to the last commit, apologies. 2016-11-14 22:20:08 +00:00
Myles fa348fbc23 Fix villager trading on 1.11 #534 2016-11-14 22:17:23 +00:00
Matsv d277701caa Ignore if the setMainHand doesn't exist 2016-11-14 21:13:18 +01:00
Matsv 9b7f68a888 Store the mainHand and change it on serverChange for Bungee, fixes #536 2016-11-14 20:59:06 +01:00
Myles 7e837ef9db Ensure we don't save and load config at same time 2016-11-14 18:46:27 +00:00
Myles eb78fe4bfc Better flexibility with number loading 2016-11-14 18:29:45 +00:00
Matsv 689f0fd5db Back to the snapshots 2016-11-14 19:17:20 +01:00
Myles 32316cf3ab Fix character limit to 100 for messages, #530 2016-11-14 18:14:49 +00:00
Matsv d450c9b4d6 1.11 and bump version 2016-11-14 16:15:20 +01:00
Myles 622673d1d3 Small javadoc tweaks 2016-11-14 13:21:06 +00:00
Myles 1209beb47d Allow servers to manually be probed with API 2016-11-14 12:38:39 +00:00
Myles f4eeb94a2e Better support for malformed json packets #528 2016-11-14 12:03:22 +00:00
Myles fac7eab59e Prepare for 1.0.0 2016-11-13 14:04:56 +00:00
Myles e430bfce06 Fix uninjection when different handler order 2016-11-13 13:34:22 +00:00
Matsv dd55cc3cf2 Merge branch '1.11-DEV' of https://github.com/MylesIsCool/ViaVersion into 1.11-DEV 2016-11-13 14:26:21 +01:00
Matsv 9937a173d1 Use the correct platform name and version for Sponge 2016-11-13 14:26:04 +01:00
Myles 1c584040ca Use logger instead of System.out 2016-11-13 13:25:56 +00:00
Myles 10a2df5a7d Use plugin description from project pom.xml and fix sponge.
This disables the sponge plugin annotation processor and uses our own mcmod.info
2016-11-13 13:15:26 +00:00
Matsv 1bec3cf1d0 Change the metadata transformer fail message 2016-11-13 13:36:03 +01:00
Matsv 4142797380 Implement PlatformVersion for better dump output 2016-11-13 12:36:48 +01:00
Matsv 68fc884d2a Change the platform name to the full name that includes the version 2016-11-12 13:16:27 +01:00
Matsv 2872bdd1c3 Update the snapshot comment to 1.11-pre1 2016-11-08 16:09:00 +01:00
Matsv 7d29a0c0af 1.11-pre1 2016-11-08 16:02:11 +01:00
Matsv dd6423de06 Remove event-based commandblock listeners 2016-11-06 11:30:28 +01:00
Matsv 52bbf1affe Handle the actionbar packet change 2016-11-06 10:37:26 +01:00
Matsv cfaded6cf8 Make CommandBlocks work on BungeeCord with 1.8.8 child servers 2016-11-02 18:14:57 +01:00
Matsv 69e444f83d Fix Bungee constant entity ids 2016-11-02 18:07:21 +01:00
Matsv c896ed5f63 Move the Bungee server switch handler to an event instead of inside the encoder, this will also make ViaBackwards work correctly 2016-11-02 17:17:41 +01:00
Myles 9f8456a336 16w43a compatibility 2016-10-27 13:23:30 +01:00
Myles bd11c98e45 Better support for ChannelInitializer detection (incase they do something funny, fixes latest PS dev) 2016-10-26 17:34:09 +01:00
Myles 55fccba711 Support for new PS when package isn't found 2016-10-26 17:33:16 +01:00
Matsv 783542401b Update sounds to 16w42a 2016-10-25 19:31:32 +02:00
Matsv 2424057536 Translate messages from legacy, fix #521 2016-10-25 18:34:20 +02:00
Myles b6dbe82d16 Fix lower version support (default to client version if we can't port it instead of server) #519 2016-10-23 21:18:18 +01:00
Max Qian f92b7e5b80 Tell ProtocolSupport to decode MINECRAFT_FUTURE packets using the default decoder (for 1.9.4) 2016-10-19 14:44:25 +01:00
Myles 8093c424e2 WIP fix, ping works but it still doesn't connect 2016-10-19 14:44:25 +01:00
Matsv 839d46f5ed Merge remote-tracking branch 'upstream/1.11-DEV' into 1.11-DEV 2016-10-19 15:31:45 +02:00
Matsv de0b9a2a68 16w42a 2016-10-19 15:31:29 +02:00
Myles c3bd45cd58 Better naming for version info 2016-10-17 23:05:21 +01:00
Myles c4bab6c9af Optimise reflection in some cases where method isn't cached. 2016-10-16 16:25:53 +01:00
Myles f33d22531b Merge branch 'master' into 1.11-DEV 2016-10-14 23:07:50 +01:00
Myles 9ccbdb69c5 Fix #515 Disconnect Message not being fixed json 2016-10-14 23:06:11 +01:00
Myles e9008923eb Revert "Add json fixing to login disconnect #515"
This reverts commit 301e84d698.
2016-10-14 23:03:40 +01:00
Myles 301e84d698 Add json fixing to login disconnect #515 2016-10-14 23:02:11 +01:00
Matsv 5aad3306eb 16w41a 2016-10-13 17:01:04 +02:00
Matsv d30bbcd4a3 16w40a 2016-10-06 16:40:47 +02:00
Matsv 003197b476 Change circle.yml to java 8 since Sponge uses Java 8 2016-10-05 20:10:22 +02:00
Myles a3e15bce4d Use correct tags for javadocs 2016-10-04 21:57:14 +01:00
Matsv e43026231e Move sponge-legacy up 2016-10-04 21:20:59 +02:00
Matsv f100f6e3f0 Rename Snapshot to 1.11 2016-10-04 20:04:49 +02:00
Mats 8ae2842e5f Merge pull request #509 from MylesIsCool/modular
Merge modular into 1.11
2016-10-04 19:57:24 +02:00
Matsv 54be03bf77 Merge branches '1.11-DEV' and 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-10-04 19:35:48 +02:00
Matsv 27fc4dd684 Rewrite sounds, thanks @Pokechu22 for open-sourcing your forks of Hamburglar & Burger Vitrine :) 2016-10-04 19:35:20 +02:00
Myles 2a1f0f812b Move Sponge to API 5, add legacy support module 2016-10-04 00:26:27 +01:00
Myles 64cde13ea7 Ensure order is kept with maps & yaml (as well as concurrency with maps) 2016-10-02 20:50:34 +01:00
Matsv 7d23b12f85 Implement the UpdateListener for Bungee 2016-10-02 21:35:54 +02:00
Myles 4b3f757881 Rename scan servers to probe 2016-10-02 19:45:55 +01:00
Myles d0e7f05d50 Remove commented line 2016-10-02 19:41:02 +01:00
Myles 21c957b8d5 Config for protocol versions
Also make config concurrent
2016-10-02 19:40:38 +01:00
Matsv 3fe25f68b1 Fix another infinite loop, @MylesIsCool and I are great at creating them ;) 2016-10-02 12:03:56 +02:00
Matsv 3354a46283 Remove some more debug messages 2016-10-02 11:41:18 +02:00
Matsv 975743c76f Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-10-02 11:28:10 +02:00
Matsv d3b214965b Add server info to the dump (#505) 2016-10-02 11:27:45 +02:00
Myles eb8065ad20 Tab complete for bungee 2016-10-01 21:30:39 +01:00
Matsv 7d3548956e Fix 16w39c 2016-10-01 20:56:14 +02:00
Matsv 3de961f641 Remove infinite loop 2016-10-01 20:26:04 +02:00
Matsv 59620f7f93 Add a command to force search versions @ Bungee 2016-10-01 15:38:53 +02:00
Matsv ba3aa4566e Remove some debug messages that prevent Jenkins from building. 2016-10-01 14:56:08 +02:00
Matsv 8445a6d9db Fix wrong handling if the client and child server have the same protocol id 2016-10-01 14:27:39 +02:00
Matsv f53c8c67e2 Fix Bukkit config NPE, only change the protocol id if ViaVersion can support it and support unsupported Bungee protocol ids (Not working correctly yet) 2016-10-01 13:31:14 +02:00
Myles b4976bd302 Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-10-01 00:11:08 +01:00
Myles ec848d7201 Reflection for Bungee stuffs 2016-10-01 00:10:54 +01:00
Matsv 8c03a296c2 Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-10-01 00:59:56 +02:00
Matsv 65a6e25f1b Remove debug message 2016-10-01 00:59:42 +02:00
Myles 178b625ca0 Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-09-30 23:55:21 +01:00
Matsv 152993f749 Get bungee protocol version detection working. Still some odd issues. 2016-10-01 00:53:50 +02:00
Matsv ca246f9d95 Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-09-30 23:02:53 +02:00
Matsv f1d53bb7ac Start working on Bungee protocol id detection. 2016-09-30 23:02:34 +02:00
Myles 30950a7d74 Don't include guava in the jar & go for lower version for bukkit compatibility 2016-09-30 20:51:01 +01:00
Myles 305f6b7ce2 Implement Hand Item Cache for Sponge 2016-09-30 20:48:02 +01:00
Matsv 313b794285 Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-09-30 20:09:03 +02:00
Matsv 7031d431da Implement 1_11 entity / parent class structure and patch holograms the other way around! Thanks for fixing Mojang :-) #482 2016-09-30 20:08:39 +02:00
Myles 655e14b36e Make dumping pretty print + add Bungee dumping 2016-09-30 16:30:28 +01:00
Matsv f881f3d484 Merge branches '1.11-DEV' and 'modular' of https://github.com/MylesIsCool/ViaVersion into modular
# Conflicts:
#	pom.xml
2016-09-30 17:19:51 +02:00
Matsv 4d3302a926 Support for 16w39c 2016-09-30 17:14:14 +02:00
Matsv b2df970af5 Implement removePortedClient on Bungee 2016-09-30 16:20:29 +02:00
Myles b7b322a525 Full config api for all platforms using snakeyaml + comments 2016-09-30 00:34:16 +01:00
Myles 771c00b146 Implement Task Ids 2016-09-29 22:55:08 +01:00
Myles 23f1589c28 Update commands to add new platform specific command also add platform to updater. 2016-09-29 22:35:51 +01:00
Myles eb72db9a5f Update TODO 2016-09-29 21:30:09 +01:00
Myles 10fc8f846d Fix PacketWrapper sending and implement Movement Transmitter for Bungee 2016-09-29 21:29:58 +01:00
Myles 31c9332e56 Fix chunks for BungeeCord 2016-09-29 20:46:31 +01:00
Myles b0d64bfebd Fix a bug in chunks (still not working fully)
Also remove bungeecord-proxy
2016-09-29 20:40:58 +01:00
Matsv ffbd399993 16w39b 2016-09-29 18:43:13 +02:00
Matsv aeec7e5f95 Start working on packet-level chunk bulks 2016-09-29 16:33:14 +02:00
Myles 36301a595b Fix Bungee Support (Excluding Chunks) + Rename Handlers 2016-09-29 15:25:18 +01:00
Matsv a864bf7c18 Support for 16w39a 2016-09-28 16:14:52 +02:00
Matsv 0454169588 Add viaver alias 2016-09-27 19:38:13 +02:00
Matsv 8ea3623a79 Stop using new Gson() everywhere (#505) 2016-09-27 19:15:39 +02:00
Myles 866e494d3c Remove Commons 2016-09-27 17:48:56 +01:00
Myles d5108061c1 Implement World Change 2016-09-27 17:38:56 +01:00
Myles 396998c7fc Factor & Javadoc update 2016-09-27 17:31:10 +01:00
Matsv ff3d76a387 Move the todo list to #505 2016-09-26 22:45:54 +02:00
Matsv 51c469882b Port Bukkit listeners to Sponge 2016-09-26 22:30:59 +02:00
Myles 8b9a1750de Basic Config API for sponge, need to do comments 2016-09-26 20:12:34 +01:00
Myles 3411c3d144 Add encoder name 2016-09-26 17:57:36 +01:00
Myles cdab5b3f5b Inject into Bungee, (does not get past login from when i've tested)
Also add commands
2016-09-26 14:48:46 +01:00
Myles 42edffb309 Change reflection to NMSUtil, and start work on Bungee (doesn't work) 2016-09-26 13:50:20 +01:00
Matsv 42efc736c3 Cleanup metadata 2016-09-26 14:36:10 +02:00
Myles 30bb91fc8a Revert Mats moving the repo 2016-09-26 13:14:38 +01:00
Myles 14daca5fea Fix 1.9.4+ support and also fix sponge support to work better.
Tested on SpongeVanilla + SpongeForge
(1.8.8 & 1.9.4)
2016-09-26 13:11:46 +01:00
Matsv 8396c5a3e3 Merge branch 'modular' of https://github.com/MylesIsCool/ViaVersion into modular 2016-09-26 13:25:47 +02:00
Matsv e136d1db94 Basic Bungee structure 2016-09-26 13:25:28 +02:00
Myles 90dabce0d2 Sponge: Fix dump, add load message, move loading, handle reload
And fix travis
2016-09-26 11:48:06 +01:00
Matsv 9a8a6e5b16 Implement PPS for Sponge 2016-09-26 11:16:20 +02:00
Matsv 4840db095c Fix metadata 2016-09-26 11:02:54 +02:00
Myles b371c14a27 Add Sponge Support 2016-09-26 01:44:21 +01:00
Myles a1fbca11f0 Queue tasks & Fix PPS 2016-09-25 21:02:12 +01:00
Myles 0fe9ccf4a8 Make pom.xml better 2016-09-25 20:43:32 +01:00
Matsv 08713947b7 Add BukkitViaLoader to the builder and limit the builder methods 2016-09-25 21:42:22 +02:00
Matsv e56bce2f31 Create builder for ViaManager 2016-09-25 21:33:47 +02:00
Matsv 573374866b Optimize imports & reformat code 2016-09-25 21:17:09 +02:00
Matsv 32afa2a9a3 Fix building and change versions 2016-09-25 21:10:41 +02:00
Myles 669cbcd142 Fix maven so it compiles 2016-09-25 20:05:58 +01:00
Myles 471076cbe1 Update Changelog 2016-09-25 19:44:05 +01:00
Matsv 79d353d458 Basic configuration api and add platform specific dump info 2016-09-25 20:41:34 +02:00
Myles 30d477c6d2 Add Bulk Chunks, need to do full packet reading as a fallback though 2016-09-25 19:34:24 +01:00
Myles d3f5ebdba7 Update TODO 2016-09-25 18:52:37 +01:00
Matsv 4b94c8ad02 Map all entity and object ids / parents and fix metadata searcher 2016-09-25 19:50:50 +02:00
Myles 7a7c3f15d8 Add required provider for movement (for reflection caching) 2016-09-25 18:26:14 +01:00
Myles 52610f7c66 Use HandItemProvider for 1.8 hand items 2016-09-25 18:06:04 +01:00
Matsv 84ee4410a6 Use generics for bossbars 2016-09-25 18:20:42 +02:00
Myles 49d51de263 Start moving listeners away 2016-09-25 17:17:07 +01:00
Myles 848b0cf113 Make ViaCommandSender better, fix quite a few of the commands. 2016-09-25 16:03:03 +01:00
Myles c4ffdc1b7c Migrate to our own types + use ids instead of materials 2016-09-25 15:40:30 +01:00
Myles 49b602994a Migrate Environment to our own type (todo javadocs for it) 2016-09-25 15:00:05 +01:00
Myles 05930ad791 Add ViaManager and abstraction / Add todo list 2016-09-25 14:39:37 +01:00
Matsv e7ab232b28 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into modular 2016-09-25 12:49:22 +02:00
Matsv 3f88a16c6c Merge branches '1.11-DEV' and 'master' of https://github.com/MylesIsCool/ViaVersion into 1.11-DEV 2016-09-25 12:48:22 +02:00
Matsv 1a6b98deca Cancel second-hand packets to prevent double interact Fix #502 2016-09-25 12:19:23 +02:00
Matsv 598863d43a Add onCommand and onTabComplete to the interface 2016-09-24 20:12:12 +02:00
Matsv b146257b1a Abstract the BossBar for multi-platform support 2016-09-24 19:31:41 +02:00
Myles dc01fb59b8 Doesn't compile but start work towards seperating into modules... (with legacy support hopefully for basic API) 2016-09-23 18:49:59 +01:00
Myles 58ed2c0d9e Merge branch 'master' into 1.11-DEV 2016-09-23 15:55:47 +01:00
Matsv 3762a9d3b1 Actually fix #500, mode changed to VarIntEnum at 1.8->1.9 but we never changed it. 2016-09-21 15:26:06 +02:00
Matsv 5a88963929 Fix #500 2016-09-21 15:14:31 +02:00
Nick 1b69243326 Update README.md (#498) 2016-09-20 19:23:21 +01:00
Matsv 3e2a391348 Looks like Intellij didn't commit the 16w38a changes 2016-09-20 16:53:01 +02:00
Matsv a330d2b148 Compatibility for 16w38a and sync with master 2016-09-20 16:43:42 +02:00
Nick 573f769825 Update Bungee.java (#494) 2016-09-13 18:56:26 +02:00
Myles 9de49176fb Add Matsv to authors 2016-09-12 17:59:15 +01:00
Mats e6220f39e5 Support for 16w36a 2016-09-08 18:31:27 +02:00
Myles 8f656d9dac Fix ListWrapper, I'm not even sure why I did this... but hey! 2016-09-05 12:24:33 +01:00
Matsv 15bcf3f065 Support for 16w35a 2016-09-01 15:57:25 +02:00
Myles 536e2e33e0 Update Description & Don't use BungeeCord ChatColor 2016-08-28 11:38:38 +01:00
Mats ae58f0c1ab Update the issue template 2016-08-25 18:00:16 +02:00
Myles 7d9cd5bfbf We're gonna use 0.9.10 until 1.11 release which we'll use 1.0.0 2016-08-25 16:56:01 +01:00
Myles 25a7915c7f 0.9.9 Version 2016-08-25 16:52:34 +01:00
Myles 822d582074 Deprecate isPorted, we port all players use getPlayerVersion instead. 2016-08-24 20:40:53 +01:00
Matsv d815c0e682 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into 1.11-DEV 2016-08-24 16:46:47 +02:00
Matsv f8a73d5fc2 Merge branch 'master' of https://github.com/Matsv/ViaVersion into upmaster 2016-08-22 21:38:19 +02:00
Matsv a0ad97947d Add the configuration to the dump command, also add a toString method to the ProtocolVersion class. 2016-08-22 21:37:51 +02:00
Myles 6ea5d0849d Missed a bit off the README 2016-08-21 15:52:59 +01:00
Myles eba512ef0b Update README with IRC 2016-08-21 15:51:21 +01:00
Matsv 725ab0f713 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into 1.11-DEV 2016-08-20 16:29:01 +02:00
Matsv 0f96c24c78 Merge branch 'master' of https://github.com/Matsv/ViaVersion into dumpthemall 2016-08-20 16:21:19 +02:00
Matsv f2e4c37cd9 Add ViaVersion dump command to get all the relevant info we need by bug reports. 2016-08-20 16:19:44 +02:00
Myles f159a2250c SemVer compatibility, also change up the messages a bit. 2016-08-20 13:47:09 +01:00
Myles ed311e4059 Clean up some messages to be more understandable. 2016-08-20 12:03:23 +01:00
AlfieC 6aae98a8a9 typo (#485) 2016-08-17 23:32:21 +02:00
Matsv 99f9cf3340 Support for 16w33a 2016-08-17 16:45:33 +02:00
Matsv 2074039285 Merge branch '1.11-DEV' of https://github.com/MylesIsCool/ViaVersion into 1.11-DEV 2016-08-11 17:07:57 +02:00
Matsv b438ff61a2 Support for 16w32b 2016-08-11 17:07:35 +02:00
Myles c36e43b573 Remove unused imports 2016-08-10 20:36:34 +01:00
Matsv be383a524c Woops, remove ; 2016-08-10 21:34:13 +02:00
Matsv 9c6cd22817 Gotta catch them all 2016-08-10 21:33:32 +02:00
Myles 85de7c35ea Fix metadata :) 2016-08-10 20:23:13 +01:00
Matsv 0dd8c33aa9 Handle villager profession 2016-08-10 20:48:45 +02:00
Myles 8cc2538e6c Push type converting to new entity types. 2016-08-10 19:38:59 +01:00
Matsv 04d87ebba7 Merge branch '1.11-DEV' of https://github.com/MylesIsCool/ViaVersion into 1.11-DEV
# Conflicts:
#	src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java
2016-08-10 20:14:11 +02:00
Matsv 8c4b5b613c Fix spawneggs 2016-08-10 20:12:27 +02:00
Myles 6add512fe1 Start work on Remapping Types 2016-08-10 19:10:05 +01:00
Myles 73b8a2fc9a Start support for entity type id tracking 2016-08-10 18:54:56 +01:00
Myles 03cc48c991 Use constant of 1 for collect, (Tested). 2016-08-10 16:11:39 +01:00
Matsv 44544925a1 map packet changes. 2016-08-10 15:59:13 +02:00
Matsv 7cadf832f5 Preparations for the snapshot. 2016-08-10 14:51:32 +02:00
Matsv 0f3daa5dc4 Merge branch 'chunkFix' of https://github.com/Matsv/ViaVersion into upmaster 2016-08-08 18:00:40 +02:00
Matsv f258cf8c89 Stop depending on versions for the ChunkTypes. fix cast exceptions by using a ChunkType in front of it. 2016-08-08 17:38:11 +02:00
Matsv ca759c056e Add some missing sounds 2016-08-07 17:53:08 +02:00
Matsv d715607826 Implement 1_8 writing 2016-08-05 20:17:39 +02:00
inventivetalent afca92d122 update requests to use /v2 (#479) 2016-08-04 20:42:03 +01:00
Myles ae37b34692 Snapshot 2016-08-01 14:07:33 +01:00
Myles 9e42a368e0 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion 2016-08-01 14:06:11 +01:00
Myles 27982efd29 Bump version to 0.9.8 2016-08-01 14:05:07 +01:00
Mason c3b343fbc8 Allow non-solid blocks to be placed at feet (#472) 2016-07-22 21:06:51 +01:00
Matsv 9bedb6c741 Move some classes to other packages 2016-07-17 12:00:46 +02:00
Matsv 873f4dd298 Give it some protection 2016-07-11 22:06:00 +02:00
Matsv 693990644f Rename the Meta(List)1_9_1_10Type to Metadata(List)1_9Type and cleanup the listeners 2016-07-11 20:27:44 +02:00
Matsv b2680d76a6 WIP cleanup 2016-07-11 15:52:06 +02:00
Matsv db935b454f Make the Metadata types version based and remove the NoGravity tag init since it doesn't seem needed. 2016-07-11 13:48:48 +02:00
Myles c207a9bfff Count other worlds as nether instead of imploding. 2016-07-10 12:35:46 +01:00
Myles f5bd041c7b Fix PacketListenerAPI load to be before Via, fixes #463. Tested with NickNamer 2016-07-09 15:21:17 +01:00
Myles 07d89b24af Custom reload message #459 2016-07-09 14:41:07 +01:00
Myles 1d0c0c527c Snapshot 2016-07-08 12:56:34 +01:00
Myles 7a9cb86563 0.9.7 release 2016-07-08 12:55:05 +01:00
Myles 87b1919863 Let the normal send go through the event loop. Fix signs are sent before the chunks on a 1.9.4 server with a 1.9-1.9.2 client (#460) 2016-07-03 12:05:32 +01:00
Myles d164e413c2 Snapshot 2016-07-02 23:34:31 +01:00
Myles 76d7db044f Version bump + small dead code fix 2016-07-02 23:28:54 +01:00
Myles 046ebb8ecc Fix chunk bug 2016-07-02 23:22:44 +01:00
Myles bccde04ace Back to snapshot 2016-07-02 22:37:29 +01:00
Myles 9385f03722 Bump version and tiny bit of formatting fix 2016-07-02 22:33:54 +01:00
Myles b48fc17ead Transform block 36 for 1.9.2 reading, and also use PartialType. 2016-07-02 22:32:40 +01:00
Myles b50d0075ca PacketWrapper allow returning of ChannelFuture with send, and fix blocked protocols disconnect.
Also remove a TODO.
2016-07-02 22:19:43 +01:00
Myles 84d006c71d Merge branch 'lenis-patch' 2016-07-02 22:06:39 +01:00
Myles 212da9c46c Fix resetReader being wrong, ty @Matsv for helping solve this 2016-07-02 22:05:08 +01:00
Myles 8edb7048a1 Code cleanup and implement index fix by @Matsv 2016-07-02 21:23:28 +01:00
Myles abe3c4b0c9 Identify unsigned byte properly 2016-07-02 21:07:41 +01:00
Myles c6d3c97c65 Fix clearing of wrapper 2016-07-02 21:07:22 +01:00
Matsv 13c6a9d612 Change getBlockId to get instead of indexOf 2016-07-02 20:45:34 +02:00
Myles 7d2ef743ac Fix stupidity, thanks @Pokechu22 <3 2016-07-02 19:09:38 +01:00
Myles 598d0f96d8 Not sure if i'm working forward or backwards on this, but pushing for progress 2016-07-01 20:17:25 +01:00
Matsv cbc22922d3 Set default force-sign-transformer to false 2016-07-01 18:51:42 +02:00
Myles 49783d36c2 Add link to docs. 2016-07-01 17:13:01 +01:00
Myles 70d91b4f87 Blocked versions now included when server sends supported versions, javadoc fixes & simple colour for blocked-msg. 2016-07-01 16:36:19 +01:00
Myles 17f3d13267 Fix #450, ProtocolSupport concurrency issues, also make listwrapper sync'd 2016-06-30 00:26:12 +01:00
Myles 559674bf58 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion 2016-06-29 16:43:42 +01:00
Myles fbc298bc30 Add some more detail to the config 2016-06-29 16:38:38 +01:00
Matsv e36902c441 Add possibility to block specific protocol versions 2016-06-29 12:26:03 +02:00
Matsv 805c78989a Port all the clients to prevent issues like ViaVersions BossBarAPI not working for clients on the same protocol. (If you use the api on a 1.9> server) 2016-06-29 11:35:15 +02:00
Mats 85e416171c Let the transformer handle the signs (#456) 2016-06-28 13:16:36 +02:00
Mats b55c0d0783 Possibility to force the json transformer (#455)
* Possibility to force the json transform

* Escape all the Strings. Who likes double quotes anyways.
2016-06-26 21:47:08 +01:00
Myles 33b4b3835f Update Contributors and version in README 2016-06-25 23:38:04 +01:00
Matsv 8ccd772105 Change the formatting a bit. merged #421 2016-06-25 13:22:18 +02:00
Matsv 8677c632df Merge remote-tracking branch 'jor/potion' into upmaster 2016-06-25 13:19:14 +02:00
Myles 560476c56f Should fix #452 2016-06-24 14:02:29 +01:00
lenis0012 20bbe7cec6 Support 1.9.2 servers
This code basically reads 1.9 data so it can then be transformed to add
in the tile entities.
it geta a little funky when it already loaded it as a 1.8 chunk tho, so
i had to add some methods to the chunk api.

in short: I hate minecraft
2016-06-23 04:00:59 +02:00
Myles 1a002486d0 Move back to snapshot, oops 2016-06-22 23:37:58 +01:00
Myles 26fcdfe3bc Allow ability to replace piston extension block to prevent crashing. 2016-06-22 23:34:32 +01:00
Mats 4af98b220c Fix piston tile entity crash (#443) 2016-06-22 21:37:53 +01:00
Myles f91fcb4ea8 Bump version 2016-06-22 21:33:25 +01:00
Myles b3060e0dc8 Start work on 1.9.2 chunk stuff, no where near done bit stuck on detecting skylight. 2016-06-22 21:32:26 +01:00
Myles 808a9a7d82 Small PPS change to allow %pps to be used as a placeholder. 2016-06-22 21:31:27 +01:00
Myles 32c43e6023 Fix chunks not being written and array type being weird. 2016-06-22 21:22:19 +01:00
Matsv 4c9c50f939 WIP: Move the TileEntities writer to the 1.9 transformer. 2016-06-22 22:00:24 +02:00
Matsv ac1b35379e Remove not required tags, and remove tested todo's 2016-06-22 20:38:40 +02:00
Myles b743589d77 This works but lags, only for 1.8 server. 2016-06-22 19:22:38 +01:00
Myles 9dad0a0d5e Fix the arrays 2016-06-22 18:20:42 +01:00
Matsv f5b49bc9ce Experimental implementation for block entities into chunks 2016-06-22 19:07:46 +02:00
Matsv b3612a68b0 Merge branch '1.10.1-chunkrefactor' of https://github.com/MylesIsCool/ViaVersion into 1.10.1 2016-06-22 18:36:42 +02:00
Myles 7385db02c2 Reorganise packages and push initial interface 2016-06-22 17:35:07 +01:00
Matsv 501d2ec3a2 Rewrite block tile entities. Not tested yet 2016-06-22 18:03:27 +02:00
Myles 1217a9b7e2 Make versions ordered by the index inserted. (Seems to work best over alphabetical) 2016-06-19 23:32:41 +01:00
Myles 6740c5c6dc Spring cleaning & make /viaver pps say when no players. 2016-06-19 22:36:15 +01:00
Myles 44e8056fb3 Add more versions & use ProtocolSupport API if not ported. 2016-06-19 22:35:49 +01:00
Myles d1da412cf7 Disable our system when an unknown handshake happens, fixes support for older mc versions. 2016-06-19 22:04:54 +01:00
Myles 6534a5414e Basic compatibility with ProtocolSupport, doesn't seem to work with 1.6.4 due to issues with our Login Handler. 2016-06-19 18:08:49 +01:00
Myles 91344a0b50 Cleanup some of the block placement code. 2016-06-19 18:07:00 +01:00
Myles cdd9ff4469 Back to snapshot 2016-06-15 19:47:10 +01:00
Myles d88b76db85 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion 2016-06-15 19:45:28 +01:00
Myles bc1d57853c Bump version 2016-06-15 19:44:25 +01:00
Troy Frew 27d6c12556 Added TacoSpigot to the block place fix. (#437)
TacoSpigot is a fork of PaperSpigot that people use.
2016-06-13 09:29:10 +02:00
Mats a76dd1ba49 Merge pull request #427 from Harry5573/master
Correct hologram Y offset
2016-06-10 15:38:52 +02:00
Mats 1a4388b3e7 Convert the Elytra sound properly they added in 1.9.2. Fix #430 (#432)
* Convert the Elytra sound properly they added in 1.9.2. Fix #430

* Change wrong version in comment

* Remove the passthrough
2016-06-09 16:03:01 +01:00
Mats f1b81f77d6 Use Myles new Magic transformer for the ArmorListener (#429)
* Use Myles new Magic transformer for the ArmorListener

* Use Myles new Magic transformer for the CommandBlockListener
2016-06-09 10:49:31 +01:00
Myles d6edec3a55 Allow packets to be transformed after sent by specifying the current protocol, woo! 2016-06-09 02:44:12 +01:00
Harry 094f4c6d58 Correct hologram Y offset
https://github.com/filoghost/HolographicDisplays/blob/master/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/Offsets.java#L15 The offset is by default -1.25 for 1.8, however 1.9 clients require only -0.29. (-1.25 - -0.29) = -0.96 which should be the correct offset.
2016-06-08 21:43:15 +01:00
Matsv c57d0f60f9 Change to DEV version 2016-06-08 20:40:50 +02:00
Matsv dd5cd1ca48 Remove experimental message from readme 2016-06-08 20:38:39 +02:00
joserobjr ab4a565700 Update README.md (#426) 2016-06-08 20:36:29 +02:00
Myles f8ac54e237 Fix splash potion crash. 2016-06-08 19:02:11 +01:00
joserobjr 089e07fe49 Changes the random chest sounds to normal chest. (#424) 2016-06-08 19:09:19 +02:00
yzimroni 1d3b8f802c Update names from 'snapshot' to '1.10' (#422) 2016-06-08 18:00:21 +02:00
Myles 27283e48a2 Bump the version to avoid bad downloads. 2016-06-08 16:10:59 +01:00
Matsv d22584afbc Bye bungee we will not miss you, you eat our memory 2016-06-08 17:02:13 +02:00
Matsv 249ab01425 Rename package 2016-06-08 16:41:00 +02:00
Matsv 851097de44 Rename package 2016-06-08 16:38:59 +02:00
Matsv c095a51f7c 1.10 support and version bump 2016-06-08 16:35:06 +02:00
Matsv 5e62b7001e Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into 1.10 2016-06-08 15:35:55 +02:00
joserobjr a79533bf72 Fixed uncraftable potion conversions from 1.8 to 1.9 2016-06-08 10:31:03 -03:00
joserobjr e3510d01d6 Fixes potion data conversion from 1.8 to 1.9 2016-06-08 08:09:13 -03:00
Mats 8cc4ba168a Patch EchoPet wrong metadata value (#419) 2016-06-08 11:29:08 +01:00
Matsv 264a21d092 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into 1.10 2016-06-08 11:37:23 +02:00
Mats e2585db350 Make the main class cleaner by giving the config his own class (#418) 2016-06-07 19:18:48 +02:00
Matsv a2f7a52d31 Support for 1.10-pre2 2016-06-07 17:29:30 +02:00
Matsv d04121202d Modify the config comments to & 1.10 2016-06-07 09:11:33 +02:00
Matsv 95517ade2c Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into 1.10 2016-06-03 22:18:28 +02:00
Matsv c9441de7e4 Change from info to severe 2016-06-03 21:15:53 +02:00
Matsv dc946cb845 An amazing feature. 2016-06-03 20:49:06 +02:00
Myles 5fa30d9adb Merge branch 'master' into 1.10 2016-06-03 18:52:52 +01:00
Myles a7043424ec Support ProtocolLib + late-bind, also it now tells you the plugin to blame if it goes wrong. How nice! 2016-06-03 18:52:25 +01:00
Matsv e1b3d21732 Woops, the sounds were still broken. Now it should be fixed. no lies this time 2016-06-02 21:19:48 +02:00
Matsv 8ffc056a7e Cleanup and change class/package names from 1.9.3 2016-06-02 21:00:18 +02:00
Matsv 7c274fb03d Handle new sounds 2016-06-02 20:52:55 +02:00
Matsv 3b533b5138 Compatibility with 1.10-pre1 (number 2, git didn't push everything for some reason) 2016-06-02 18:37:05 +02:00
Matsv 5665510f7e Compatibility with 1.10-pre1 2016-06-02 18:34:04 +02:00
Matsv 47faa21ef4 Add latest build to readme & auto-build test 2016-05-27 19:44:21 +02:00
Myles 575f457830 0.8.5 SNAPSHOT 2016-05-27 18:37:34 +01:00
Matsv d5bf7909e8 Sync with master 2016-05-27 19:16:22 +02:00
Myles fdf90b7931 0.8.4 Release 2016-05-27 18:05:46 +01:00
Myles e3305e4eae Automatically buffer unknown entities, removes 2 config values and deprecate api 2016-05-27 01:00:01 +01:00
Matsv 15fe8d394e Support for 16w21b 2016-05-26 19:02:06 +02:00
Matsv 082db38c40 Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion into 1.10 2016-05-26 17:03:40 +02:00
Myles be54dc41d1 Add SkinRestorer to plugin.yml unsure if this will fix anything 2016-05-26 14:27:27 +01:00
Myles 487e79c043 Fix javadocs 2016-05-26 13:54:22 +01:00
Matsv ef6390a0b8 Update version for the buildserver 2016-05-26 11:16:12 +02:00
Matsv 9d9fc65633 Support for 16w21a, how fun. A snapshot without packet changes 2016-05-25 16:44:20 +02:00
Matsv 6eac61c912 Sync with master 2016-05-24 21:17:30 +02:00
Matsv d89362a271 Sync with master 2016-05-24 21:13:28 +02:00
Matsv 0a407069fa Add Burger to sources :) 2016-05-24 21:09:04 +02:00
Myles 661fdb1127 Bump version 2016-05-22 11:42:53 +01:00
Myles 9e6c0f72a8 Update version to be 1.9.3/4 2016-05-22 11:41:59 +01:00
Myles 70ad2613f1 Update config to look a bit more nicer, doesn't have the extra space when generated by bukkit. 2016-05-22 11:41:27 +01:00
Myles 9052946c45 Merge branch 'master' into 1.10 2016-05-21 22:12:10 +01:00
Myles 3ddc43bf7b Implement isSpigot() in the API and make it so xray does not activate if they do not use spigot. 2016-05-21 22:07:20 +01:00
Matsv cdb757eae5 Implement Myles idea to just use templates instead of defining compatibility 2016-05-21 21:19:20 +02:00
Matsv 50a3e03649 Possibility to add 'isCompatible' with other types. Fixes crashes on a 1.8 server 2016-05-21 20:54:26 +02:00
Matsv 957284930e Fix sounds 2016-05-21 16:19:12 +02:00
Matsv 198a24371c Sync with master 2016-05-21 15:01:25 +02:00
Mats bcc994b0dd Add possibility to get the supported versions from the api and status response (#402)
* Possibility  to send the Supported versions inside the status response packet

* Make lowercase
2016-05-19 18:56:42 +01:00
Matsv f870bd5a32 Transform pitch correctly 2016-05-19 13:07:51 +02:00
Matsv a14abd6f4f Handle the new Metadata value for 16w20a 2016-05-19 12:18:04 +02:00
Matsv 2456c3cf17 Basic support for the new 1.10 snapshot 16w20a 2016-05-18 16:43:57 +02:00
Myles 9828e4ae1d Add maven default goal.
Requested by our lord and saviour @Aikar
2016-05-17 23:40:00 +01:00
Myles 030aa887c7 Version bump to 0.8.3-SNAPSHOT #hype 2016-05-17 22:56:52 +01:00
Myles ba624a2b48 1.9.4 backport (#399)
Allow 1.9.4 spigot to handle 1.9, 1.9.1, 1.9.2
2016-05-17 22:48:56 +01:00
Myles e7582cb1ec Change license to be more appropriate, this one is more open and allows much more creativity. 2016-05-11 14:19:30 +01:00
Mats 82bf11fcbc Fix anti-xray for 1.9 (#393)
* Fix anti-xray for 1.9

* Bye NMS.

* Perform

* Add config option
2016-05-10 19:53:37 +01:00
Myles ac6e8b1709 Bump version 2016-05-10 15:03:55 +01:00
Myles 00cc545795 Using javassist add compatibility for Spigot builds with protocol compatibility (eg. 1.9.1 & 1.9.2)
Also fix issue with protocol passthrough
*whew*
2016-05-10 14:37:31 +01:00
Myles c7ee816aba Merge branch 'master' of https://github.com/MylesIsCool/ViaVersion 2016-05-10 10:27:32 +01:00
Myles e7f85e67f6 Change our data structures to use concurrent equivalents, netty is multi-threaded. 2016-05-10 10:26:49 +01:00
Mats d239d2f967 Stop depending the bossbar metadata rewriter on the bukkit api (#391)
* Don't depend the bossbar metadata rewriter on the bukkit api

* Rename field
2016-05-09 17:44:10 +01:00
617 changed files with 190776 additions and 6666 deletions

No files matched your search

+31
View File
@@ -0,0 +1,31 @@
---
name: Bug report
about: Create a bug report so we can fix it
---
**Describe the bug, provide any errors**
A clear and concise description of what the bug is. If present, can you paste the error to https://paste.gg/?
**How can we reproduce it?**
Steps to reproduce the behavior:
1. Login on 1.12'
2. Click on '....'
3. The '....' is displayed wrong
**Expected behaviour**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**ViaVersion Dump**
- Type /viaversion dump, and put the link here.
**Additional server info**
Do you use a proxy (eg. BungeeCord)? What software do you use and what plugins?
**Checklist**
- [ ] I have included a Viaversion dump
- [ ] If applicable, I have included a paste (not a screenshot) of the error
- [ ] I have tried a build from https://ci.viaversion.com/ and the issue still persists
+1
View File
@@ -0,0 +1 @@
blank_issues_enabled: false
+17
View File
@@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for ViaVersion
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Which versions is this for?**
Does the feature apply to any specific versions? If so put them here.
-3
View File
@@ -19,9 +19,6 @@ hs_err_pid*
# Ignore IDEA directory
.idea/*
# Include the project's code style settings file
!.idea/codeStyleSettings.xml
# Include the project's dictionary
!.idea/dictionaries/
!.idea/dictionaries/*
+7 -4
View File
@@ -1,12 +1,15 @@
sudo: false
language: java
jdk: oraclejdk7
jdk:
- openjdk11
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.m2/repository'
script:
- mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false
- mvn clean install -B -U
- mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false
- mvn clean install -B -U
install: true
-12
View File
@@ -1,12 +0,0 @@
### What version of ViaVersion are you using? Type /ver viaversion
### What version of Spigot are you using? Type /ver
### What plugins are you using? Type /plugins
### Are you using any additional software like BungeeCord? If so, what software and version? (Please list your plugins as well)
### How does this error happen? login? Using an item?
### Is there an error in the console? Use pastebin.com. Is there a kick message?
+21 -3
View File
@@ -1,3 +1,21 @@
License:
--------
You may modify this work, all rights are still owned by myself excluding any files in the spacebase package as they belong to the respected contributors. Please credit the original author (myself) when forking etc. (or if it helped you understand the new protocol or netty!)
MIT License
Copyright (c) 2019
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+17 -39
View File
@@ -1,50 +1,30 @@
# ViaVersion 0.8.0
[![Build Status](https://travis-ci.org/MylesIsCool/ViaVersion.svg?branch=master)](https://travis-ci.org/MylesIsCool/ViaVersion)
[![Gitter](https://badges.gitter.im/MylesIsCool/ViaVersion.svg)](https://gitter.im/MylesIsCool/ViaVersion)
# ViaVersion 3.0.1 - Spigot, Sponge, BungeeCord, Velocity
[![Build Status](https://travis-ci.com/ViaVersion/ViaVersion.svg?branch=master)](https://travis-ci.com/ViaVersion/ViaVersion)
[![Discord](https://img.shields.io/badge/chat-on%20discord-blue.svg)](https://viaversion.com/discord)
**Allows the connection of 1.9 clients to 1.8**
**Allows the connection of higher client versions to lower server versions**
This plugin modifies netty to allow connection of 1.9 clients to 1.8,
Supported Versions:
###*Don't use late bind*
![Table (https://i.imgur.com/0u20Y2u.png)](https://i.imgur.com/0u20Y2u.png)
This uses our new API, we currently don't have javadocs yet but look at one of our protocols on how to get started then use ProtocolRegistry.registerProtocol()
On Bukkit you may also use ProtocolSupport, but ensure you have the right build for your server version.
**User Docs:** https://docs.viaversion.com/display/VIAVERSION/
This took 100s hours of work, so if you enjoy this consider looking into contacting me and supporting my projects.
**Contributor Chat:** https://gitter.im/MylesIsCool/ViaVersion
Sources:
--------
**wiki.vg** (Used for various information, we also contribute back)
**wiki.vg** (Protocol info, though I did have to find a lot myself)
**Burger** (See [PAaaS](https://github.com/Matsv/Paaas))
**OpenNBT** (used for slot rewriting)
Contributors:
--------
**Myself** (harhar)
**Matsv/StamBoom**
**HugoDaBosss**
**SanderGielisse**
**Paulomart**
**gigosaurus**
**fillefilip8**
**lenis0012**
Releases / Dev Builds:
--------
You can find official releases here:
@@ -54,20 +34,18 @@ https://www.spigotmc.org/resources/viaversion.19254/history
----------
You can find unofficial dev builds here:
You can find official dev builds here:
**Terrobility's Build Server:** https://ci.terrocidepvp.net/job/ViaVersion/
**Jenkins:** https://ci.viaversion.com
**sgdc3's Build Server:** http://ci.xephi.fr/job/ViaVersion/
**sgdc3's Maven:** http://ci.xephi.fr/plugin/repository/everything/
**JavaDocs:** https://jd.viaversion.com
**JavaDocs:** https://jd.matsv.nl/
**Maven Repo:** https://repo.viaversion.com
License:
--------
You may modify this work, all rights are still owned by myself excluding any files in the spacebase package as they belong to the respected contributors. Please credit the original author (myself) when forking etc. (or if it helped you understand the new protocol or netty!)
MIT License, see LICENSE for more details.
Thanks!
Special thanks to all our [Contributors](https://github.com/ViaVersion/ViaVersion/graphs/contributors)
+63
View File
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>viaversion-parent</artifactId>
<groupId>us.myles</groupId>
<version>3.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>viaversion-bukkit-legacy</artifactId>
<properties>
<bukkitVersion>1.8.8-R0.1-SNAPSHOT</bukkitVersion>
</properties>
<build>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>src/main/resources/</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
</build>
<dependencies>
<!-- Common Module -->
<dependency>
<groupId>us.myles</groupId>
<artifactId>viaversion-common</artifactId>
<version>${project.parent.version}</version>
<scope>provided</scope>
</dependency>
<!-- Bukkit API, http://www.spigotmc.org/ or http://bukkit.org/ -->
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>${bukkitVersion}</version>
<scope>provided</scope>
<optional>true</optional>
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>persistence-api</artifactId>
<groupId>javax.persistence</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,52 @@
package us.myles.ViaVersion.bukkit.listeners;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.api.ViaListener;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.Protocol;
public class ViaBukkitListener extends ViaListener implements Listener {
private final Plugin plugin;
public ViaBukkitListener(Plugin plugin, Class<? extends Protocol> requiredPipeline) {
super(requiredPipeline);
this.plugin = plugin;
}
/**
* Get the UserConnection from a player
*
* @param player Player object
* @return The UserConnection
*/
protected UserConnection getUserConnection(Player player) {
return getUserConnection(player.getUniqueId());
}
/**
* Checks if the player is on the selected pipe
*
* @param player Player Object
* @return True if on pipe
*/
protected boolean isOnPipe(Player player) {
return isOnPipe(player.getUniqueId());
}
/**
* Register as Bukkit event
*/
@Override
public void register() {
if (isRegistered()) return;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
setRegistered(true);
}
public Plugin getPlugin() {
return plugin;
}
}
@@ -0,0 +1,113 @@
package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8;
import org.bukkit.Bukkit;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemBreakEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.ArmorType;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
import java.util.UUID;
public class ArmorListener extends ViaBukkitListener {
private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150");
public ArmorListener(Plugin plugin) {
super(plugin, Protocol1_9To1_8.class);
}
public void sendArmorUpdate(Player player) {
// Ensure that the player is on our pipe
if (!isOnPipe(player)) return;
int armor = 0;
for (ItemStack stack : player.getInventory().getArmorContents()) {
armor += ArmorType.findById(stack.getTypeId()).getArmorPoints();
}
PacketWrapper wrapper = new PacketWrapper(0x4B, null, getUserConnection(player));
try {
wrapper.write(Type.VAR_INT, player.getEntityId()); // Player ID
wrapper.write(Type.INT, 1); // only 1 property
wrapper.write(Type.STRING, "generic.armor");
wrapper.write(Type.DOUBLE, 0D); //default 0 armor
wrapper.write(Type.VAR_INT, 1); // 1 modifier
wrapper.write(Type.UUID, ARMOR_ATTRIBUTE); // armor modifier uuid
wrapper.write(Type.DOUBLE, (double) armor); // the modifier value
wrapper.write(Type.BYTE, (byte) 0);// the modifier operation, 0 is add number
wrapper.send(Protocol1_9To1_8.class);
} catch (Exception e) {
e.printStackTrace();
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent e) {
HumanEntity human = e.getWhoClicked();
if (human instanceof Player && e.getInventory() instanceof CraftingInventory) {
final Player player = (Player) human;
if (e.getCurrentItem() != null) {
if (ArmorType.isArmor(e.getCurrentItem().getTypeId())) {
sendDelayedArmorUpdate(player);
return;
}
}
if (e.getRawSlot() >= 5 && e.getRawSlot() <= 8) {
sendDelayedArmorUpdate(player);
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onInteract(PlayerInteractEvent e) {
if (e.getItem() != null) {
if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) {
final Player player = e.getPlayer();
// Due to odd bugs it's 3 ticks later
Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), () -> sendArmorUpdate(player), 3L);
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onItemBreak(PlayerItemBreakEvent e) {
sendDelayedArmorUpdate(e.getPlayer());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onJoin(PlayerJoinEvent e) {
sendDelayedArmorUpdate(e.getPlayer());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onRespawn(PlayerRespawnEvent e) {
sendDelayedArmorUpdate(e.getPlayer());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onWorldChange(PlayerChangedWorldEvent e) {
sendArmorUpdate(e.getPlayer());
}
public void sendDelayedArmorUpdate(final Player player) {
if (!isOnPipe(player)) return; // Don't start a task if the player is not on the pipe
Via.getPlatform().runSync(() -> sendArmorUpdate(player));
}
}
@@ -0,0 +1,28 @@
package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.api.minecraft.Position;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9;
public class BlockListener extends ViaBukkitListener {
public BlockListener(Plugin plugin) {
super(plugin, Protocol1_9To1_8.class);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void placeBlock(BlockPlaceEvent e) {
if (isOnPipe(e.getPlayer())) {
Block b = e.getBlockPlaced();
getUserConnection(e.getPlayer())
.get(EntityTracker1_9.class)
.addBlockInteraction(new Position(b.getX(), (short) b.getY(), b.getZ()));
}
}
}
@@ -0,0 +1,59 @@
package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
public class DeathListener extends ViaBukkitListener {
public DeathListener(Plugin plugin) {
super(plugin, Protocol1_9To1_8.class);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onDeath(PlayerDeathEvent e) {
Player p = e.getEntity();
if (isOnPipe(p) && Via.getConfig().isShowNewDeathMessages() && checkGamerule(p.getWorld()) && e.getDeathMessage() != null)
sendPacket(p, e.getDeathMessage());
}
public boolean checkGamerule(World w) {
try {
return Boolean.parseBoolean(w.getGameRuleValue("showDeathMessages"));
} catch (Exception e) {
return false;
}
}
private void sendPacket(final Player p, final String msg) {
Via.getPlatform().runSync(new Runnable() {
@Override
public void run() {
// If online
UserConnection userConnection = getUserConnection(p);
if (userConnection != null) {
PacketWrapper wrapper = new PacketWrapper(0x2C, null, userConnection);
try {
wrapper.write(Type.VAR_INT, 2); // Event - Entity dead
wrapper.write(Type.VAR_INT, p.getEntityId()); // Player ID
wrapper.write(Type.INT, p.getEntityId()); // Entity ID
Protocol1_9To1_8.FIX_JSON.write(wrapper, msg); // Message
wrapper.send(Protocol1_9To1_8.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
}
@@ -1,31 +1,27 @@
package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners;
package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import us.myles.ViaVersion.api.minecraft.item.Item;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class HandItemCache extends BukkitRunnable {
public static boolean CACHE = false;
private static ConcurrentHashMap<UUID, Item> handCache = new ConcurrentHashMap<>();
public static Item getHandItem(UUID player) {
if (!handCache.containsKey(player))
return null;
return handCache.get(player);
}
private final Map<UUID, Item> handCache = new ConcurrentHashMap<>();
@Override
public void run() {
List<UUID> players = new ArrayList<>(handCache.keySet());
for (Player p : Bukkit.getOnlinePlayers()) {
handCache.put(p.getUniqueId(), Item.getItem(p.getItemInHand()));
handCache.put(p.getUniqueId(), convert(p.getItemInHand()));
players.remove(p.getUniqueId());
}
// Remove offline players
@@ -33,4 +29,13 @@ public class HandItemCache extends BukkitRunnable {
handCache.remove(uuid);
}
}
public Item getHandItem(UUID player) {
return handCache.get(player);
}
public static Item convert(ItemStack itemInHand) {
if (itemInHand == null) return new Item(0, (byte) 0, (short) 0, null);
return new Item(itemInHand.getTypeId(), (byte) itemInHand.getAmount(), itemInHand.getDurability(), null);
}
}
@@ -1,36 +1,41 @@
package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners;
package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockPlaceEvent;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.api.ViaVersion;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
public class PaperPatch implements Listener {
public class PaperPatch extends ViaBukkitListener {
public PaperPatch(Plugin plugin) {
super(plugin, Protocol1_9To1_8.class);
}
/*
This patch is applied when Paper is detected.
I'm unsure of what causes this but essentially,
placing blocks where your standing works?
placing blocks where you're standing works?
If there is a better fix then we'll replace this.
*/
@EventHandler(ignoreCancelled = true)
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlace(BlockPlaceEvent e) {
if (ViaVersion.getInstance().isPorted(e.getPlayer())) {
UserConnection userConnection = ((ViaVersionPlugin) ViaVersion.getInstance()).getConnection(e.getPlayer());
if (userConnection == null) return;
if (!userConnection.get(ProtocolInfo.class).getPipeline().contains(Protocol1_9TO1_8.class)) return;
Location diff = e.getPlayer().getLocation().subtract(e.getBlock().getLocation().add(0.5D, 0, 0.5D));
if (e.getPlayer().getLocation().getBlock().equals(e.getBlock())) {
if (isOnPipe(e.getPlayer())) {
Location location = e.getPlayer().getLocation();
Location diff = location.clone().subtract(e.getBlock().getLocation().add(0.5D, 0, 0.5D));
Material block = e.getBlockPlaced().getType();
if (isPlacable(block)) {
return;
}
if (location.getBlock().equals(e.getBlock())) {
e.setCancelled(true);
} else {
if (e.getPlayer().getLocation().getBlock().getRelative(BlockFace.UP).equals(e.getBlock())) {
if (location.getBlock().getRelative(BlockFace.UP).equals(e.getBlock())) {
e.setCancelled(true);
} else {
// Within radius of block
@@ -52,4 +57,18 @@ public class PaperPatch implements Listener {
}
}
}
private boolean isPlacable(Material material) {
if (!material.isSolid()) return true;
// signs and banners
switch (material.getId()) {
case 63:
case 68:
case 176:
case 177:
return true;
default:
return false;
}
}
}
@@ -0,0 +1,41 @@
package us.myles.ViaVersion.bukkit.providers;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.minecraft.Position;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.providers.BlockConnectionProvider;
import java.util.UUID;
public class BukkitBlockConnectionProvider extends BlockConnectionProvider {
private Chunk lastChunk;
@Override
public int getWorldBlockData(UserConnection user, int bx, int by, int bz) {
UUID uuid = user.getProtocolInfo().getUuid();
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
World world = player.getWorld();
int x = bx >> 4;
int z = bz >> 4;
if (world.isChunkLoaded(x, z)) {
Chunk c = getChunk(world, x, z);
Block b = c.getBlock(bx, by, bz);
return b.getTypeId() << 4 | b.getData();
}
}
return 0;
}
public Chunk getChunk(World world, int x, int z) {
if (lastChunk != null && lastChunk.getX() == x && lastChunk.getZ() == z) {
return lastChunk;
}
return lastChunk = world.getChunkAt(x, z);
}
}
+72
View File
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>viaversion-parent</artifactId>
<groupId>us.myles</groupId>
<version>3.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>viaversion-bukkit</artifactId>
<properties>
<!-- Change server version HERE! -->
<serverVersion>1.16.1-R0.1-SNAPSHOT</serverVersion>
</properties>
<build>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>src/main/resources/</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
</build>
<dependencies>
<!-- Common Module -->
<dependency>
<groupId>us.myles</groupId>
<artifactId>viaversion-common</artifactId>
<version>${project.parent.version}</version>
<scope>provided</scope>
</dependency>
<!-- Bukkit API, http://www.spigotmc.org/ or http://bukkit.org/ -->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>${serverVersion}</version>
<scope>provided</scope>
<optional>true</optional>
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>persistence-api</artifactId>
<groupId>javax.persistence</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- Legacy Support -->
<dependency>
<groupId>us.myles</groupId>
<artifactId>viaversion-bukkit-legacy</artifactId>
<version>${project.parent.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,291 @@
package us.myles.ViaVersion;
import com.google.gson.JsonObject;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.ViaAPI;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import us.myles.ViaVersion.api.configuration.ConfigurationProvider;
import us.myles.ViaVersion.api.data.MappingDataLoader;
import us.myles.ViaVersion.api.platform.TaskId;
import us.myles.ViaVersion.api.platform.ViaConnectionManager;
import us.myles.ViaVersion.api.platform.ViaPlatform;
import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator;
import us.myles.ViaVersion.bukkit.commands.BukkitCommandHandler;
import us.myles.ViaVersion.bukkit.commands.BukkitCommandSender;
import us.myles.ViaVersion.bukkit.platform.BukkitTaskId;
import us.myles.ViaVersion.bukkit.platform.BukkitViaAPI;
import us.myles.ViaVersion.bukkit.platform.BukkitViaConfig;
import us.myles.ViaVersion.bukkit.platform.BukkitViaInjector;
import us.myles.ViaVersion.bukkit.platform.BukkitViaLoader;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.dump.PluginInfo;
import us.myles.ViaVersion.util.GsonUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform<Player> {
private static ViaVersionPlugin instance;
private final ViaConnectionManager connectionManager = new ViaConnectionManager();
private final BukkitCommandHandler commandHandler;
private final BukkitViaConfig conf;
private final ViaAPI<Player> api = new BukkitViaAPI(this);
private final List<Runnable> queuedTasks = new ArrayList<>();
private final List<Runnable> asyncQueuedTasks = new ArrayList<>();
private final boolean protocolSupport;
private boolean compatSpigotBuild;
private boolean spigot = true;
private boolean lateBind;
public ViaVersionPlugin() {
instance = this;
// Command handler
commandHandler = new BukkitCommandHandler();
// Init platform
Via.init(ViaManager.builder()
.platform(this)
.commandHandler(commandHandler)
.injector(new BukkitViaInjector())
.loader(new BukkitViaLoader(this))
.build());
// Config magic
conf = new BukkitViaConfig();
// Check if we're using protocol support too
protocolSupport = Bukkit.getPluginManager().getPlugin("ProtocolSupport") != null;
if (protocolSupport) {
getLogger().info("Hooking into ProtocolSupport, to prevent issues!");
try {
BukkitViaInjector.patchLists();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onLoad() {
// Spigot detector
try {
Class.forName("org.spigotmc.SpigotConfig");
} catch (ClassNotFoundException e) {
spigot = false;
}
// Check if it's a spigot build with a protocol mod
try {
NMSUtil.nms("PacketEncoder").getDeclaredField("version");
compatSpigotBuild = true;
} catch (Exception e) {
compatSpigotBuild = false;
}
if (getServer().getPluginManager().getPlugin("ViaBackwards") != null) {
MappingDataLoader.enableMappingsCache();
}
// Generate classes needed (only works if it's compat or ps)
ClassGenerator.generate();
lateBind = !BukkitViaInjector.isBinded();
getLogger().info("ViaVersion " + getDescription().getVersion() + (compatSpigotBuild ? "compat" : "") + " is now loaded" + (lateBind ? ", waiting for boot. (late-bind)" : ", injecting!"));
if (!lateBind) {
Via.getManager().init();
}
}
@Override
public void onEnable() {
if (lateBind) {
Via.getManager().init();
}
getCommand("viaversion").setExecutor(commandHandler);
getCommand("viaversion").setTabCompleter(commandHandler);
// Warn them if they have anti-xray on and they aren't using spigot
if (conf.isAntiXRay() && !spigot) {
getLogger().info("You have anti-xray on in your config, since you're not using spigot it won't fix xray!");
}
// Run queued tasks
for (Runnable r : queuedTasks) {
Bukkit.getScheduler().runTask(this, r);
}
queuedTasks.clear();
// Run async queued tasks
for (Runnable r : asyncQueuedTasks) {
Bukkit.getScheduler().runTaskAsynchronously(this, r);
}
asyncQueuedTasks.clear();
}
@Override
public void onDisable() {
Via.getManager().destroy();
}
@Override
public String getPlatformName() {
return Bukkit.getServer().getName();
}
@Override
public String getPlatformVersion() {
return Bukkit.getServer().getVersion();
}
@Override
public String getPluginVersion() {
return getDescription().getVersion();
}
@Override
public TaskId runAsync(Runnable runnable) {
if (isPluginEnabled()) {
return new BukkitTaskId(getServer().getScheduler().runTaskAsynchronously(this, runnable).getTaskId());
} else {
asyncQueuedTasks.add(runnable);
return new BukkitTaskId(null);
}
}
@Override
public TaskId runSync(Runnable runnable) {
if (isPluginEnabled()) {
return new BukkitTaskId(getServer().getScheduler().runTask(this, runnable).getTaskId());
} else {
queuedTasks.add(runnable);
return new BukkitTaskId(null);
}
}
@Override
public TaskId runSync(Runnable runnable, Long ticks) {
return new BukkitTaskId(getServer().getScheduler().runTaskLater(this, runnable, ticks).getTaskId());
}
@Override
public TaskId runRepeatingSync(Runnable runnable, Long ticks) {
return new BukkitTaskId(getServer().getScheduler().runTaskTimer(this, runnable, 0, ticks).getTaskId());
}
@Override
public void cancelTask(TaskId taskId) {
if (taskId == null) return;
if (taskId.getObject() == null) return;
if (taskId instanceof BukkitTaskId) {
getServer().getScheduler().cancelTask((Integer) taskId.getObject());
}
}
@Override
public ViaCommandSender[] getOnlinePlayers() {
ViaCommandSender[] array = new ViaCommandSender[Bukkit.getOnlinePlayers().size()];
int i = 0;
for (Player player : Bukkit.getOnlinePlayers()) {
array[i++] = new BukkitCommandSender(player);
}
return array;
}
@Override
public void sendMessage(UUID uuid, String message) {
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
player.sendMessage(message);
}
}
@Override
public boolean kickPlayer(UUID uuid, String message) {
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
player.kickPlayer(message);
return true;
} else {
return false;
}
}
@Override
public boolean isPluginEnabled() {
return Bukkit.getPluginManager().getPlugin("ViaVersion").isEnabled();
}
@Override
public ConfigurationProvider getConfigurationProvider() {
return conf;
}
@Override
public void onReload() {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) {
getLogger().severe("ViaVersion is already loaded, we're going to kick all the players... because otherwise we'll crash because of ProtocolLib.");
for (Player player : Bukkit.getOnlinePlayers()) {
player.kickPlayer(ChatColor.translateAlternateColorCodes('&', conf.getReloadDisconnectMsg()));
}
} else {
getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting.");
}
}
@Override
public JsonObject getDump() {
JsonObject platformSpecific = new JsonObject();
List<PluginInfo> plugins = new ArrayList<>();
for (Plugin p : Bukkit.getPluginManager().getPlugins())
plugins.add(new PluginInfo(p.isEnabled(), p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), p.getDescription().getAuthors()));
platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins));
// TODO more? ProtocolLib things etc?
return platformSpecific;
}
@Override
public boolean isOldClientsAllowed() {
return !protocolSupport; // Use protocolsupport for older clients
}
@Override
public BukkitViaConfig getConf() {
return conf;
}
@Override
public ViaAPI<Player> getApi() {
return api;
}
public boolean isCompatSpigotBuild() {
return compatSpigotBuild;
}
public boolean isSpigot() {
return this.spigot;
}
public boolean isProtocolSupport() {
return protocolSupport;
}
public static ViaVersionPlugin getInstance() {
return instance;
}
@Override
public ViaConnectionManager getConnectionManager() {
return connectionManager;
}
}
@@ -0,0 +1,32 @@
package us.myles.ViaVersion.boss;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.api.boss.BossBar;
import us.myles.ViaVersion.api.boss.BossColor;
import us.myles.ViaVersion.api.boss.BossStyle;
public class ViaBossBar extends CommonBoss<Player> {
public ViaBossBar(String title, float health, BossColor color, BossStyle style) {
super(title, health, color, style);
}
@Override
public BossBar addPlayer(Player player) {
addPlayer(player.getUniqueId());
return this;
}
@Override
public BossBar addPlayers(Player... players) {
for (Player p : players)
addPlayer(p);
return this;
}
@Override
public BossBar removePlayer(Player player) {
removePlayer(player.getUniqueId());
return this;
}
}
@@ -0,0 +1,19 @@
package us.myles.ViaVersion.bukkit.classgenerator;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.MessageToByteEncoder;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler;
import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler;
public class BasicHandlerConstructor implements HandlerConstructor {
@Override
public BukkitEncodeHandler newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) {
return new BukkitEncodeHandler(info, minecraftEncoder);
}
@Override
public BukkitDecodeHandler newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) {
return new BukkitDecodeHandler(info, minecraftDecoder);
}
}
@@ -0,0 +1,295 @@
package us.myles.ViaVersion.bukkit.classgenerator;
import javassist.*;
import javassist.expr.ConstructorCall;
import javassist.expr.ExprEditor;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.EventException;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.EventExecutor;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler;
import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import java.lang.reflect.Method;
//TODO maybe clean this up a bit 👀
public class ClassGenerator {
private static HandlerConstructor constructor = new BasicHandlerConstructor();
private static String psPackage;
private static Class psConnectListener;
public static HandlerConstructor getConstructor() {
return constructor;
}
public static void generate() {
if (ViaVersionPlugin.getInstance().isCompatSpigotBuild() || ViaVersionPlugin.getInstance().isProtocolSupport()) {
try {
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(new LoaderClassPath(Bukkit.class.getClassLoader()));
for (Plugin p : Bukkit.getPluginManager().getPlugins()) {
pool.insertClassPath(new LoaderClassPath(p.getClass().getClassLoader()));
}
if (ViaVersionPlugin.getInstance().isCompatSpigotBuild()) {
Class decodeSuper = NMSUtil.nms("PacketDecoder");
Class encodeSuper = NMSUtil.nms("PacketEncoder");
// Generate the classes
addSpigotCompatibility(pool, BukkitDecodeHandler.class, decodeSuper);
addSpigotCompatibility(pool, BukkitEncodeHandler.class, encodeSuper);
} else {
// ProtocolSupport compatibility
Class encodeSuper;
Class decodeSuper;
if (isMultiplatformPS()) {
psConnectListener = makePSConnectListener(pool, shouldUseNewHandshakeVersionMethod());
return;
} else {
String psPackage = getOldPSPackage();
decodeSuper = Class.forName(psPackage.equals("unknown") ? "protocolsupport.protocol.pipeline.common.PacketDecoder" : psPackage + ".wrapped.WrappedDecoder");
encodeSuper = Class.forName(psPackage.equals("unknown") ? "protocolsupport.protocol.pipeline.common.PacketEncoder" : psPackage + ".wrapped.WrappedEncoder");
}
// Generate the classes
addPSCompatibility(pool, BukkitDecodeHandler.class, decodeSuper);
addPSCompatibility(pool, BukkitEncodeHandler.class, encodeSuper);
}
// Implement Constructor
CtClass generated = pool.makeClass("us.myles.ViaVersion.classgenerator.generated.GeneratedConstructor");
CtClass handlerInterface = pool.get(HandlerConstructor.class.getName());
generated.setInterfaces(new CtClass[]{handlerInterface});
// Import required classes
pool.importPackage("us.myles.ViaVersion.classgenerator.generated");
pool.importPackage("us.myles.ViaVersion.classgenerator");
pool.importPackage("us.myles.ViaVersion.api.data");
pool.importPackage("io.netty.handler.codec");
// Implement Methods
generated.addMethod(CtMethod.make("public MessageToByteEncoder newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) {\n" +
" return new BukkitEncodeHandler(info, minecraftEncoder);\n" +
" }", generated));
generated.addMethod(CtMethod.make("public ByteToMessageDecoder newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) {\n" +
" return new BukkitDecodeHandler(info, minecraftDecoder);\n" +
" }", generated));
constructor = (HandlerConstructor) generated.toClass(HandlerConstructor.class.getClassLoader()).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
private static Class addSpigotCompatibility(ClassPool pool, Class input, Class superclass) {
String newName = "us.myles.ViaVersion.classgenerator.generated." + input.getSimpleName();
try {
CtClass generated = pool.getAndRename(input.getName(), newName);
if (superclass != null) {
CtClass toExtend = pool.get(superclass.getName());
generated.setSuperclass(toExtend);
// If it's NMS satisfy constructor.
if (superclass.getName().startsWith("net.minecraft")) {
// Modify constructor to call super
if (generated.getConstructors().length != 0) {
generated.getConstructors()[0].instrument(new ExprEditor() {
@Override
public void edit(ConstructorCall c) throws CannotCompileException {
if (c.isSuper()) {
// Constructor for both has a stats thing.
c.replace("super(null);");
}
super.edit(c);
}
});
}
}
}
return generated.toClass(HandlerConstructor.class.getClassLoader());
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}
return null;
}
private static Class addPSCompatibility(ClassPool pool, Class input, Class superclass) {
boolean newPS = getOldPSPackage().equals("unknown");
String newName = "us.myles.ViaVersion.classgenerator.generated." + input.getSimpleName();
try {
CtClass generated = pool.getAndRename(input.getName(), newName);
if (superclass != null) {
CtClass toExtend = pool.get(superclass.getName());
generated.setSuperclass(toExtend);
if (!newPS) {
// Override setRealEncoder / setRealDecoder
pool.importPackage(getOldPSPackage());
pool.importPackage(getOldPSPackage() + ".wrapped");
if (superclass.getName().endsWith("Decoder")) {
// Decoder
generated.addMethod(CtMethod.make("public void setRealDecoder(IPacketDecoder dec) {\n" +
" ((WrappedDecoder) this.minecraftDecoder).setRealDecoder(dec);\n" +
" }", generated));
} else {
// Encoder
pool.importPackage("protocolsupport.api");
pool.importPackage("java.lang.reflect");
generated.addMethod(CtMethod.make("public void setRealEncoder(IPacketEncoder enc) {\n" +
" try {\n" +
// Tell ProtocolSupport to decode MINECRAFT_FUTURE packets using the default decoder (for 1.9.4)
" Field field = enc.getClass().getDeclaredField(\"version\");\n" +
" field.setAccessible(true);\n" +
" ProtocolVersion version = (ProtocolVersion) field.get(enc);\n" +
" if (version == ProtocolVersion.MINECRAFT_FUTURE) enc = enc.getClass().getConstructor(\n" +
" new Class[]{ProtocolVersion.class}).newInstance(new Object[] {ProtocolVersion.getLatest()});\n" +
" } catch (Exception e) {\n" +
// I guess we're not on 1.9.4
" }\n" +
" ((WrappedEncoder) this.minecraftEncoder).setRealEncoder(enc);\n" +
" }", generated));
}
}
}
return generated.toClass(HandlerConstructor.class.getClassLoader());
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}
return null;
}
private static Class makePSConnectListener(ClassPool pool, boolean newVersionMethod) {
try {
// Reference classes
CtClass toExtend = pool.get("protocolsupport.api.Connection$PacketListener");
CtClass connectListenerClazz = pool.makeClass("us.myles.ViaVersion.classgenerator.generated.ProtocolSupportConnectListener");
connectListenerClazz.setSuperclass(toExtend);
// Import packages
pool.importPackage("java.util.Arrays");
pool.importPackage("us.myles.ViaVersion.api.protocol.ProtocolRegistry");
pool.importPackage("protocolsupport.api.ProtocolVersion");
pool.importPackage("protocolsupport.api.ProtocolType");
pool.importPackage("protocolsupport.api.Connection");
pool.importPackage("protocolsupport.api.Connection.PacketListener");
pool.importPackage("protocolsupport.api.Connection.PacketListener.PacketEvent");
pool.importPackage("protocolsupport.protocol.ConnectionImpl");
pool.importPackage(NMSUtil.nms("PacketHandshakingInSetProtocol").getName());
// Add connection reference field
connectListenerClazz.addField(CtField.make("private ConnectionImpl connection;", connectListenerClazz));
// Bake constructor
connectListenerClazz.addConstructor(CtNewConstructor.make(
"public ProtocolSupportConnectListener (ConnectionImpl connection) {\n"
+ " this.connection = connection;\n"
+ "}", connectListenerClazz));
// Add the listening method
connectListenerClazz.addMethod(CtNewMethod.make(
// On packet receive
"public void onPacketReceiving(protocolsupport.api.Connection.PacketListener.PacketEvent event) {\n"
// Check if we are getting handshake packet.
+ " if (event.getPacket() instanceof PacketHandshakingInSetProtocol) {\n"
// Get protocol version.
+ " PacketHandshakingInSetProtocol packet = (PacketHandshakingInSetProtocol) event.getPacket();\n"
+ (newVersionMethod ? (
" int protoVersion = packet.getProtocolVersion();\n"
) : (
" int protoVersion = packet.b();\n"
))
// ViaVersion has at this point already spoofed the connectionversion. (Since it is higher up the pipeline)
// If via has put the protoVersion to the server we can spoof ProtocolSupport's version.
+ " if (connection.getVersion() == ProtocolVersion.MINECRAFT_FUTURE && protoVersion == us.myles.ViaVersion.api.protocol.ProtocolRegistry.SERVER_PROTOCOL) {\n"
+ " connection.setVersion(ProtocolVersion.getLatest(ProtocolType.PC));\n"
+ " }\n"
+ " }\n"
// Id version is not serverversion viaversion will not spoof. ProtocolSupport will handle the rest.
// In any case, remove the packet listener and wrap up.
+ " connection.removePacketListener(this);\n"
+ "}", connectListenerClazz));
return connectListenerClazz.toClass(HandlerConstructor.class.getClassLoader());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void registerPSConnectListener(ViaVersionPlugin plugin) {
if (getPSConnectListener() != null) {
try {
Class<? extends Event> connectionOpenEvent = (Class<? extends Event>) Class.forName("protocolsupport.api.events.ConnectionOpenEvent");
Bukkit.getPluginManager().registerEvent(connectionOpenEvent, new Listener() { }, EventPriority.HIGH, new EventExecutor() {
@Override
public void execute(Listener listener, Event event) throws EventException {
try {
Object connection = event.getClass().getMethod("getConnection").invoke(event);
Object connectListener = getPSConnectListener().getConstructor(connection.getClass()).newInstance(connection);
Method addConnectListener = connection.getClass().getMethod("addPacketListener", Class.forName("protocolsupport.api.Connection$PacketListener"));
addConnectListener.invoke(connection, connectListener);
} catch (Exception e) {
e.printStackTrace();
}
}
}, plugin);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static Class getPSConnectListener() {
return psConnectListener;
}
public static String getOldPSPackage() {
if (psPackage == null) {
try {
Class.forName("protocolsupport.protocol.core.IPacketDecoder");
psPackage = "protocolsupport.protocol.core";
} catch (ClassNotFoundException e) {
try {
Class.forName("protocolsupport.protocol.pipeline.IPacketDecoder");
psPackage = "protocolsupport.protocol.pipeline";
} catch (ClassNotFoundException e1) {
psPackage = "unknown";
}
}
}
return psPackage;
}
public static boolean isMultiplatformPS() {
try {
Class.forName("protocolsupport.zplatform.impl.spigot.network.pipeline.SpigotPacketEncoder");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
public static boolean shouldUseNewHandshakeVersionMethod() {
try {
NMSUtil.nms("PacketHandshakingInSetProtocol").getMethod("getProtocolVersion");
return true;
} catch (Exception e) {
return false;
}
}
}
@@ -0,0 +1,11 @@
package us.myles.ViaVersion.bukkit.classgenerator;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.MessageToByteEncoder;
import us.myles.ViaVersion.api.data.UserConnection;
public interface HandlerConstructor {
public MessageToByteEncoder newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder);
public ByteToMessageDecoder newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder);
}
@@ -0,0 +1,21 @@
package us.myles.ViaVersion.bukkit.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import us.myles.ViaVersion.commands.ViaCommandHandler;
import java.util.List;
public class BukkitCommandHandler extends ViaCommandHandler implements CommandExecutor, TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return onCommand(new BukkitCommandSender(sender), args);
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return onTabComplete(new BukkitCommandSender(sender), args);
}
}
@@ -0,0 +1,39 @@
package us.myles.ViaVersion.bukkit.commands;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import java.util.UUID;
public class BukkitCommandSender implements ViaCommandSender {
private final CommandSender sender;
public BukkitCommandSender(CommandSender sender) {
this.sender = sender;
}
@Override
public boolean hasPermission(String permission) {
return sender.hasPermission(permission);
}
@Override
public void sendMessage(String msg) {
sender.sendMessage(msg);
}
@Override
public UUID getUUID() {
if (sender instanceof Player) {
return ((Player) sender).getUniqueId();
} else {
return UUID.fromString(getName());
}
}
@Override
public String getName() {
return sender.getName();
}
}
@@ -1,4 +1,4 @@
package us.myles.ViaVersion.handlers;
package us.myles.ViaVersion.bukkit.handlers;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
@@ -7,15 +7,17 @@ import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.MessageToByteEncoder;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolPipeline;
import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator;
import us.myles.ViaVersion.bukkit.classgenerator.HandlerConstructor;
import java.lang.reflect.Method;
public class ViaVersionInitializer extends ChannelInitializer<SocketChannel> {
public class BukkitChannelInitializer extends ChannelInitializer<SocketChannel> {
private final ChannelInitializer<SocketChannel> original;
private Method method;
public ViaVersionInitializer(ChannelInitializer<SocketChannel> oldInit) {
public BukkitChannelInitializer(ChannelInitializer<SocketChannel> oldInit) {
this.original = oldInit;
try {
this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class);
@@ -36,10 +38,12 @@ public class ViaVersionInitializer extends ChannelInitializer<SocketChannel> {
new ProtocolPipeline(info);
// Add originals
this.method.invoke(this.original, socketChannel);
HandlerConstructor constructor = ClassGenerator.getConstructor();
// Add our transformers
ViaEncodeHandler encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder"));
ViaDecodeHandler decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder"));
ViaPacketHandler chunkHandler = new ViaPacketHandler(info);
MessageToByteEncoder encoder = constructor.newEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder"));
ByteToMessageDecoder decoder = constructor.newDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder"));
BukkitPacketHandler chunkHandler = new BukkitPacketHandler(info);
socketChannel.pipeline().replace("encoder", "encoder", encoder);
socketChannel.pipeline().replace("decoder", "decoder", decoder);
@@ -0,0 +1,67 @@
package us.myles.ViaVersion.bukkit.handlers;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.exception.CancelCodecException;
import us.myles.ViaVersion.exception.CancelDecoderException;
import us.myles.ViaVersion.exception.InformativeException;
import us.myles.ViaVersion.packets.State;
import us.myles.ViaVersion.util.PipelineUtil;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class BukkitDecodeHandler extends ByteToMessageDecoder {
private final ByteToMessageDecoder minecraftDecoder;
private final UserConnection info;
public BukkitDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) {
this.info = info;
this.minecraftDecoder = minecraftDecoder;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List<Object> list) throws Exception {
if (!info.checkIncomingPacket()) {
bytebuf.clear(); // Don't accumulate
throw CancelDecoderException.generate(null);
}
ByteBuf transformedBuf = null;
try {
if (info.shouldTransformPacket()) {
transformedBuf = ctx.alloc().buffer().writeBytes(bytebuf);
info.transformIncoming(transformedBuf, CancelDecoderException::generate);
}
try {
list.addAll(PipelineUtil.callDecode(this.minecraftDecoder, ctx, transformedBuf == null ? bytebuf : transformedBuf));
} catch (InvocationTargetException e) {
if (e.getCause() instanceof Exception) {
throw (Exception) e.getCause();
} else if (e.getCause() instanceof Error) {
throw (Error) e.getCause();
}
}
} finally {
if (transformedBuf != null) {
transformedBuf.release();
}
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
if (PipelineUtil.containsCause(cause, CancelCodecException.class)) return; // ProtocolLib compat
super.exceptionCaught(ctx, cause);
if (!NMSUtil.isDebugPropertySet() && PipelineUtil.containsCause(cause, InformativeException.class)
&& (info.getProtocolInfo().getState() != State.HANDSHAKE || Via.getManager().isDebug())) {
cause.printStackTrace(); // Print if CB doesn't already do it
}
}
}
@@ -0,0 +1,79 @@
package us.myles.ViaVersion.bukkit.handlers;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.exception.CancelCodecException;
import us.myles.ViaVersion.exception.CancelEncoderException;
import us.myles.ViaVersion.exception.InformativeException;
import us.myles.ViaVersion.handlers.ChannelHandlerContextWrapper;
import us.myles.ViaVersion.handlers.ViaHandler;
import us.myles.ViaVersion.packets.State;
import us.myles.ViaVersion.util.PipelineUtil;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class BukkitEncodeHandler extends MessageToByteEncoder implements ViaHandler {
private static Field versionField;
static {
try {
versionField = NMSUtil.nms("PacketEncoder").getDeclaredField("version");
versionField.setAccessible(true);
} catch (Exception e) {
// Not compat version
}
}
private final UserConnection info;
private final MessageToByteEncoder minecraftEncoder;
public BukkitEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) {
this.info = info;
this.minecraftEncoder = minecraftEncoder;
}
@Override
protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception {
if (versionField != null) {
versionField.set(minecraftEncoder, versionField.get(this));
}
// handle the packet type
if (!(o instanceof ByteBuf)) {
// call minecraft encoder
try {
PipelineUtil.callEncode(this.minecraftEncoder, new ChannelHandlerContextWrapper(ctx, this), o, bytebuf);
} catch (InvocationTargetException e) {
if (e.getCause() instanceof Exception) {
throw (Exception) e.getCause();
} else if (e.getCause() instanceof Error) {
throw (Error) e.getCause();
}
}
}
transform(bytebuf);
}
@Override
public void transform(ByteBuf bytebuf) throws Exception {
info.checkOutgoingPacket();
if (!info.shouldTransformPacket()) return;
info.transformOutgoing(bytebuf, CancelEncoderException::generate);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
if (PipelineUtil.containsCause(cause, CancelCodecException.class)) return; // ProtocolLib compat
super.exceptionCaught(ctx, cause);
if (!NMSUtil.isDebugPropertySet() && PipelineUtil.containsCause(cause, InformativeException.class)
&& (info.getProtocolInfo().getState() != State.HANDSHAKE || Via.getManager().isDebug())) {
cause.printStackTrace(); // Print if CB doesn't already do it
}
}
}
@@ -1,4 +1,4 @@
package us.myles.ViaVersion.handlers;
package us.myles.ViaVersion.bukkit.handlers;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
@@ -8,23 +8,23 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.util.List;
public class ViaPacketHandler extends MessageToMessageEncoder {
public class BukkitPacketHandler extends MessageToMessageEncoder {
private final UserConnection info;
public ViaPacketHandler(UserConnection info) {
public BukkitPacketHandler(UserConnection info) {
this.info = info;
}
@Override
protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception {
// Split chunk bulk packet up in to single chunk packets before it reached the encoder.
// This will prevent issues with several plugins and other protocol handlers due to the chunk being sent twice.
// It also sends the chunk in the right order possible resolving some issues with added chunk/block/entity data.
// Split chunks bulk packet up in to single chunks packets before it reached the encoder.
// This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice.
// It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data.
if (!(o instanceof ByteBuf)) {
info.setLastPacket(o);
/* This transformer is more for fixing issues which we find hard at packet level :) */
if (info.isActive()) {
if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) {
if (info.getProtocolInfo().getPipeline().filter(o, list)) {
return;
}
}
@@ -1,22 +1,18 @@
package us.myles.ViaVersion.update;
import lombok.RequiredArgsConstructor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import us.myles.ViaVersion.ViaVersionPlugin;
@RequiredArgsConstructor
public class UpdateListener implements Listener {
private final ViaVersionPlugin plugin;
@EventHandler
public void onJoin(PlayerJoinEvent e) {
if (e.getPlayer().hasPermission("viaversion.update")
&& plugin.isCheckForUpdates()) {
UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId(), plugin);
}
}
}
package us.myles.ViaVersion.bukkit.listeners;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.update.UpdateUtil;
public class UpdateListener implements Listener {
@EventHandler
public void onJoin(PlayerJoinEvent e) {
if (e.getPlayer().hasPermission("viaversion.update")
&& Via.getConfig().isCheckForUpdates()) {
UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId());
}
}
}
@@ -0,0 +1,137 @@
package us.myles.ViaVersion.bukkit.listeners.multiversion;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
public class PlayerSneakListener extends ViaBukkitListener {
private static final float STANDING_HEIGHT = 1.8F;
private static final float HEIGHT_1_14 = 1.5F;
private static final float HEIGHT_1_9 = 1.6F;
private static final float DEFAULT_WIDTH = 0.6F;
private final boolean is1_9Fix;
private final boolean is1_14Fix;
private Map<Player, Boolean> sneaking; // true = 1.14+, else false
private Set<UUID> sneakingUuids;
private final Method getHandle;
private Method setSize;
private boolean useCache;
public PlayerSneakListener(ViaVersionPlugin plugin, boolean is1_9Fix, boolean is1_14Fix) throws ReflectiveOperationException {
super(plugin, null);
this.is1_9Fix = is1_9Fix;
this.is1_14Fix = is1_14Fix;
final String packageName = plugin.getServer().getClass().getPackage().getName();
getHandle = Class.forName(packageName + ".entity.CraftPlayer").getMethod("getHandle");
final Class<?> entityPlayerClass = Class.forName(packageName
.replace("org.bukkit.craftbukkit", "net.minecraft.server") + ".EntityPlayer");
try {
setSize = entityPlayerClass.getMethod("setSize", Float.TYPE, Float.TYPE);
} catch (NoSuchMethodException e) {
// Don't catch this one
setSize = entityPlayerClass.getMethod("a", Float.TYPE, Float.TYPE);
}
// From 1.9 upwards the server hitbox is set in every entity tick, so we have to reset it everytime
if (ProtocolRegistry.SERVER_PROTOCOL >= ProtocolVersion.v1_9.getId()) {
sneaking = new WeakHashMap<>();
useCache = true;
plugin.getServer().getScheduler().runTaskTimer(plugin, new Runnable() {
@Override
public void run() {
for (Map.Entry<Player, Boolean> entry : sneaking.entrySet()) {
setHeight(entry.getKey(), entry.getValue() ? HEIGHT_1_14 : HEIGHT_1_9);
}
}
}, 1, 1);
}
// Suffocation removal only required for 1.14+ clients.
if (is1_14Fix) {
sneakingUuids = new HashSet<>();
}
}
@EventHandler(ignoreCancelled = true)
public void playerToggleSneak(PlayerToggleSneakEvent event) {
Player player = event.getPlayer();
UserConnection userConnection = getUserConnection(player);
if (userConnection == null) return;
ProtocolInfo info = userConnection.getProtocolInfo();
if (info == null) return;
int protocolVersion = info.getProtocolVersion();
if (is1_14Fix && protocolVersion >= ProtocolVersion.v1_14.getId()) {
setHeight(player, event.isSneaking() ? HEIGHT_1_14 : STANDING_HEIGHT);
if (event.isSneaking())
sneakingUuids.add(player.getUniqueId());
else
sneakingUuids.remove(player.getUniqueId());
if (!useCache) return;
if (event.isSneaking())
sneaking.put(player, true);
else
sneaking.remove(player);
} else if (is1_9Fix && protocolVersion >= ProtocolVersion.v1_9.getId()) {
setHeight(player, event.isSneaking() ? HEIGHT_1_9 : STANDING_HEIGHT);
if (!useCache) return;
if (event.isSneaking())
sneaking.put(player, false);
else
sneaking.remove(player);
}
}
@EventHandler(ignoreCancelled = true)
public void playerDamage(EntityDamageEvent event) {
if (!is1_14Fix) return;
if (event.getCause() != EntityDamageEvent.DamageCause.SUFFOCATION) return;
if (event.getEntityType() != EntityType.PLAYER) return;
Player player = (Player) event.getEntity();
if (!sneakingUuids.contains(player.getUniqueId())) return;
// Don't cancel when they should actually be suffocating; Essentially cancel when the head is in the top block only ever so slightly
// ~0.041 should suffice, but gotta stay be safe
double y = player.getEyeLocation().getY() + 0.045;
y -= (int) y;
if (y < 0.09) {
event.setCancelled(true);
}
}
@EventHandler
public void playerQuit(PlayerQuitEvent event) {
if (sneaking != null)
sneaking.remove(event.getPlayer());
if (sneakingUuids != null)
sneakingUuids.remove(event.getPlayer().getUniqueId());
}
private void setHeight(Player player, float height) {
try {
setSize.invoke(getHandle.invoke(player), DEFAULT_WIDTH, height);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,75 @@
package us.myles.ViaVersion.bukkit.listeners.protocol1_15to1_14_4;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityToggleGlideEvent;
import org.bukkit.potion.PotionEffectType;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_14;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.api.type.types.version.Types1_14;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.Protocol1_15To1_14_4;
import java.util.Arrays;
public class EntityToggleGlideListener extends ViaBukkitListener {
private boolean swimmingMethodExists;
public EntityToggleGlideListener(ViaVersionPlugin plugin) {
super(plugin, Protocol1_15To1_14_4.class);
try {
Player.class.getMethod("isSwimming");
swimmingMethodExists = true;
} catch (NoSuchMethodException ignored) {
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void entityToggleGlide(EntityToggleGlideEvent event) {
if (!(event.getEntity() instanceof Player)) return;
Player player = (Player) event.getEntity();
if (!isOnPipe(player)) return;
// Cancelling can only be done by updating the player's metadata
if (event.isGliding() && event.isCancelled()) {
PacketWrapper packet = new PacketWrapper(0x44, null, getUserConnection(player));
try {
packet.write(Type.VAR_INT, player.getEntityId());
byte bitmask = 0;
// Collect other metadata for the mitmask
if (player.getFireTicks() > 0) {
bitmask |= 0x01;
}
if (player.isSneaking()) {
bitmask |= 0x02;
}
// 0x04 is unused
if (player.isSprinting()) {
bitmask |= 0x08;
}
if (swimmingMethodExists && player.isSwimming()) {
bitmask |= 0x10;
}
if (player.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
bitmask |= 0x20;
}
if (player.isGlowing()) {
bitmask |= 0x40;
}
// leave 0x80 as 0 to stop gliding
packet.write(Types1_14.METADATA_LIST, Arrays.asList(new Metadata(0, MetaType1_14.Byte, bitmask)));
packet.send(Protocol1_15To1_14_4.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@@ -0,0 +1,16 @@
package us.myles.ViaVersion.bukkit.platform;
import us.myles.ViaVersion.api.platform.TaskId;
public class BukkitTaskId implements TaskId {
private final Integer object;
public BukkitTaskId(Integer object) {
this.object = object;
}
@Override
public Integer getObject() {
return object;
}
}
@@ -0,0 +1,108 @@
package us.myles.ViaVersion.bukkit.platform;
import io.netty.buffer.ByteBuf;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.ViaAPI;
import us.myles.ViaVersion.api.boss.BossBar;
import us.myles.ViaVersion.api.boss.BossColor;
import us.myles.ViaVersion.api.boss.BossStyle;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.boss.ViaBossBar;
import us.myles.ViaVersion.bukkit.util.ProtocolSupportUtil;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
public class BukkitViaAPI implements ViaAPI<Player> {
private final ViaVersionPlugin plugin;
public BukkitViaAPI(ViaVersionPlugin plugin) {
this.plugin = plugin;
}
@Override
public int getPlayerVersion(Player player) {
return getPlayerVersion(player.getUniqueId());
}
@Override
public int getPlayerVersion(UUID uuid) {
if (!isInjected(uuid))
return getExternalVersion(Bukkit.getPlayer(uuid));
return Via.getManager().getConnection(uuid).getProtocolInfo().getProtocolVersion();
}
private int getExternalVersion(Player player) {
if (!isProtocolSupport()) {
return ProtocolRegistry.SERVER_PROTOCOL;
} else {
return ProtocolSupportUtil.getProtocolVersion(player);
}
}
@Override
public boolean isInjected(UUID playerUUID) {
return Via.getManager().isClientConnected(playerUUID);
}
@Override
public String getVersion() {
return plugin.getDescription().getVersion();
}
@Override
public void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException {
if (!isInjected(uuid)) throw new IllegalArgumentException("This player is not controlled by ViaVersion!");
UserConnection ci = Via.getManager().getConnection(uuid);
ci.sendRawPacket(packet);
}
@Override
public void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException {
sendRawPacket(player.getUniqueId(), packet);
}
@Override
public BossBar<Player> createBossBar(String title, BossColor color, BossStyle style) {
return new ViaBossBar(title, 1F, color, style);
}
@Override
public BossBar<Player> createBossBar(String title, float health, BossColor color, BossStyle style) {
return new ViaBossBar(title, health, color, style);
}
@Override
public SortedSet<Integer> getSupportedVersions() {
SortedSet<Integer> outputSet = new TreeSet<>(ProtocolRegistry.getSupportedVersions());
outputSet.removeAll(Via.getPlatform().getConf().getBlockedProtocols());
return outputSet;
}
/**
* Returns if this version is a compatibility build for spigot.
* Eg. 1.9.1 / 1.9.2 allow certain versions to connect
*
* @return true if compat Spigot build
*/
public boolean isCompatSpigotBuild() {
return plugin.isCompatSpigotBuild();
}
/**
* Returns if ProtocolSupport is also being used.
*
* @return true if ProtocolSupport is used
*/
public boolean isProtocolSupport() {
return plugin.isProtocolSupport();
}
}
@@ -0,0 +1,74 @@
package us.myles.ViaVersion.bukkit.platform;
import org.bukkit.plugin.Plugin;
import us.myles.ViaVersion.AbstractViaConfig;
import us.myles.ViaVersion.api.Via;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class BukkitViaConfig extends AbstractViaConfig {
private static final List<String> UNSUPPORTED = Arrays.asList("bungee-ping-interval", "bungee-ping-save", "bungee-servers", "velocity-ping-interval", "velocity-ping-save", "velocity-servers");
private boolean antiXRay;
private boolean quickMoveActionFix;
private boolean hitboxFix1_9;
private boolean hitboxFix1_14;
private String blockConnectionMethod;
public BukkitViaConfig() {
super(new File(((Plugin) Via.getPlatform()).getDataFolder(), "config.yml"));
reloadConfig();
}
@Override
protected void loadFields() {
super.loadFields();
antiXRay = getBoolean("anti-xray-patch", true);
quickMoveActionFix = getBoolean("quick-move-action-fix", false);
hitboxFix1_9 = getBoolean("change-1_9-hitbox", false);
hitboxFix1_14 = getBoolean("change-1_14-hitbox", false);
blockConnectionMethod = getString("blockconnection-method", "packet");
}
@Override
public URL getDefaultConfigURL() {
return BukkitViaConfig.class.getClassLoader().getResource("assets/viaversion/config.yml");
}
@Override
protected void handleConfig(Map<String, Object> config) {
}
@Override
public boolean isAntiXRay() {
return antiXRay;
}
@Override
public boolean is1_12QuickMoveActionFix() {
return quickMoveActionFix;
}
@Override
public boolean is1_9HitboxFix() {
return hitboxFix1_9;
}
@Override
public boolean is1_14HitboxFix() {
return hitboxFix1_14;
}
@Override
public String getBlockConnectionMethod() {
return blockConnectionMethod;
}
@Override
public List<String> getUnsupportedOptions() {
return UNSUPPORTED;
}
}
@@ -0,0 +1,342 @@
package us.myles.ViaVersion.bukkit.platform;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import org.bukkit.plugin.PluginDescriptionFile;
import us.myles.ViaVersion.api.Pair;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.platform.ViaInjector;
import us.myles.ViaVersion.bukkit.handlers.BukkitChannelInitializer;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.util.ConcurrentList;
import us.myles.ViaVersion.util.ListWrapper;
import us.myles.ViaVersion.util.ReflectionUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class BukkitViaInjector implements ViaInjector {
private final List<ChannelFuture> injectedFutures = new ArrayList<>();
private final List<Pair<Field, Object>> injectedLists = new ArrayList<>();
@Override
public void inject() throws Exception {
try {
Object connection = getServerConnection();
if (connection == null) {
throw new Exception("We failed to find the core component 'ServerConnection', please file an issue on our GitHub.");
}
for (Field field : connection.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object value = field.get(connection);
if (value instanceof List) {
// Inject the list
List wrapper = new ListWrapper((List) value) {
@Override
public void handleAdd(Object o) {
if (o instanceof ChannelFuture) {
try {
injectChannelFuture((ChannelFuture) o);
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
injectedLists.add(new Pair<>(field, connection));
field.set(connection, wrapper);
// Iterate through current list
synchronized (wrapper) {
for (Object o : (List) value) {
if (o instanceof ChannelFuture) {
injectChannelFuture((ChannelFuture) o);
} else {
break; // not the right list.
}
}
}
}
}
} catch (Exception e) {
Via.getPlatform().getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version.");
throw e;
}
}
private void injectChannelFuture(ChannelFuture future) throws Exception {
try {
List<String> names = future.channel().pipeline().names();
ChannelHandler bootstrapAcceptor = null;
// Pick best
for (String name : names) {
ChannelHandler handler = future.channel().pipeline().get(name);
try {
ReflectionUtil.get(handler, "childHandler", ChannelInitializer.class);
bootstrapAcceptor = handler;
} catch (Exception e) {
// Not this one
}
}
// Default to first (Also allows blame to work)
if (bootstrapAcceptor == null) {
bootstrapAcceptor = future.channel().pipeline().first();
}
try {
ChannelInitializer<SocketChannel> oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class);
ChannelInitializer newInit = new BukkitChannelInitializer(oldInit);
ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit);
injectedFutures.add(future);
} catch (NoSuchFieldException e) {
// let's find who to blame!
ClassLoader cl = bootstrapAcceptor.getClass().getClassLoader();
if (cl.getClass().getName().equals("org.bukkit.plugin.java.PluginClassLoader")) {
PluginDescriptionFile yaml = ReflectionUtil.get(cl, "description", PluginDescriptionFile.class);
throw new Exception("Unable to inject, due to " + bootstrapAcceptor.getClass().getName() + ", try without the plugin " + yaml.getName() + "?");
} else {
throw new Exception("Unable to find core component 'childHandler', please check your plugins. issue: " + bootstrapAcceptor.getClass().getName());
}
}
} catch (Exception e) {
Via.getPlatform().getLogger().severe("We failed to inject ViaVersion, have you got late-bind enabled with something else?");
throw e;
}
}
@Override
public void uninject() {
// TODO: Uninject from players currently online to prevent protocol lib issues.
for (ChannelFuture future : injectedFutures) {
List<String> names = future.channel().pipeline().names();
ChannelHandler bootstrapAcceptor = null;
// Pick best
for (String name : names) {
ChannelHandler handler = future.channel().pipeline().get(name);
try {
ChannelInitializer<SocketChannel> oldInit = ReflectionUtil.get(handler, "childHandler", ChannelInitializer.class);
if (oldInit instanceof BukkitChannelInitializer) {
bootstrapAcceptor = handler;
}
} catch (Exception e) {
// Not this one
}
}
// Default to first
if (bootstrapAcceptor == null) {
bootstrapAcceptor = future.channel().pipeline().first();
}
try {
ChannelInitializer<SocketChannel> oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class);
if (oldInit instanceof BukkitChannelInitializer) {
ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((BukkitChannelInitializer) oldInit).getOriginal());
}
} catch (Exception e) {
Via.getPlatform().getLogger().severe("Failed to remove injection handler, reload won't work with connections, please reboot!");
}
}
injectedFutures.clear();
for (Pair<Field, Object> pair : injectedLists) {
try {
Object o = pair.getKey().get(pair.getValue());
if (o instanceof ListWrapper) {
pair.getKey().set(pair.getValue(), ((ListWrapper) o).getOriginalList());
}
} catch (IllegalAccessException e) {
Via.getPlatform().getLogger().severe("Failed to remove injection, reload won't work with connections, please reboot!");
}
}
injectedLists.clear();
}
@Override
public int getServerProtocolVersion() throws Exception {
try {
Class<?> serverClazz = NMSUtil.nms("MinecraftServer");
Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer");
Class<?> pingClazz = NMSUtil.nms("ServerPing");
Object ping = null;
// Search for ping method
for (Field f : serverClazz.getDeclaredFields()) {
if (f.getType() != null) {
if (f.getType().getSimpleName().equals("ServerPing")) {
f.setAccessible(true);
ping = f.get(server);
}
}
}
if (ping != null) {
Object serverData = null;
for (Field f : pingClazz.getDeclaredFields()) {
if (f.getType() != null) {
if (f.getType().getSimpleName().endsWith("ServerData")) {
f.setAccessible(true);
serverData = f.get(ping);
}
}
}
if (serverData != null) {
int protocolVersion = -1;
for (Field f : serverData.getClass().getDeclaredFields()) {
if (f.getType() != null) {
if (f.getType() == int.class) {
f.setAccessible(true);
protocolVersion = (int) f.get(serverData);
}
}
}
if (protocolVersion != -1) {
return protocolVersion;
}
}
}
} catch (Exception e) {
throw new Exception("Failed to get server", e);
}
throw new Exception("Failed to get server");
}
@Override
public String getEncoderName() {
return "encoder";
}
@Override
public String getDecoderName() {
return "decoder";
}
public static Object getServerConnection() throws Exception {
Class<?> serverClazz = NMSUtil.nms("MinecraftServer");
Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer");
Object connection = null;
for (Method m : serverClazz.getDeclaredMethods()) {
if (m.getReturnType() != null) {
if (m.getReturnType().getSimpleName().equals("ServerConnection")) {
if (m.getParameterTypes().length == 0) {
connection = m.invoke(server);
}
}
}
}
return connection;
}
public static boolean isBinded() {
try {
Object connection = getServerConnection();
if (connection == null) {
return false;
}
for (Field field : connection.getClass().getDeclaredFields()) {
field.setAccessible(true);
final Object value = field.get(connection);
if (value instanceof List) {
// Inject the list
synchronized (value) {
for (Object o : (List) value) {
if (o instanceof ChannelFuture) {
return true;
} else {
break; // not the right list.
}
}
}
}
}
} catch (Exception e) {
}
return false;
}
@Override
public JsonObject getDump() {
JsonObject data = new JsonObject();
// Generate information about current injections
JsonArray injectedChannelInitializers = new JsonArray();
for (ChannelFuture cf : injectedFutures) {
JsonObject info = new JsonObject();
info.addProperty("futureClass", cf.getClass().getName());
info.addProperty("channelClass", cf.channel().getClass().getName());
// Get information about the pipes for this channel future
JsonArray pipeline = new JsonArray();
for (String pipeName : cf.channel().pipeline().names()) {
JsonObject pipe = new JsonObject();
pipe.addProperty("name", pipeName);
if (cf.channel().pipeline().get(pipeName) != null) {
pipe.addProperty("class", cf.channel().pipeline().get(pipeName).getClass().getName());
try {
Object child = ReflectionUtil.get(cf.channel().pipeline().get(pipeName), "childHandler", ChannelInitializer.class);
pipe.addProperty("childClass", child.getClass().getName());
if (child instanceof BukkitChannelInitializer) {
pipe.addProperty("oldInit", ((BukkitChannelInitializer) child).getOriginal().getClass().getName());
}
} catch (Exception e) {
// Don't display
}
}
// Add to the pipeline array
pipeline.add(pipe);
}
info.add("pipeline", pipeline);
// Add to the list
injectedChannelInitializers.add(info);
}
data.add("injectedChannelInitializers", injectedChannelInitializers);
// Generate information about lists we've injected into
JsonObject wrappedLists = new JsonObject();
JsonObject currentLists = new JsonObject();
try {
for (Pair<Field, Object> pair : injectedLists) {
Object list = pair.getKey().get(pair.getValue());
// Note down the current value (could be overridden by another plugin)
currentLists.addProperty(pair.getKey().getName(), list.getClass().getName());
// Also if it's not overridden we can display what's inside our list (possibly another plugin)
if (list instanceof ListWrapper) {
wrappedLists.addProperty(pair.getKey().getName(), ((ListWrapper) list).getOriginalList().getClass().getName());
}
}
data.add("wrappedLists", wrappedLists);
data.add("currentLists", currentLists);
} catch (Exception e) {
// Ignored, fields won't be present
}
data.addProperty("binded", isBinded());
return data;
}
public static void patchLists() throws Exception {
Object connection = getServerConnection();
if (connection == null) {
Via.getPlatform().getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub.");
return;
}
for (Field field : connection.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object value = field.get(connection);
if (!(value instanceof List)) continue;
if (value instanceof ConcurrentList) continue;
ConcurrentList list = new ConcurrentList();
list.addAll((Collection) value);
field.set(connection, list);
}
}
}
@@ -0,0 +1,169 @@
package us.myles.ViaVersion.bukkit.platform;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitTask;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.minecraft.item.Item;
import us.myles.ViaVersion.api.platform.ViaPlatformLoader;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator;
import us.myles.ViaVersion.bukkit.listeners.UpdateListener;
import us.myles.ViaVersion.bukkit.listeners.multiversion.PlayerSneakListener;
import us.myles.ViaVersion.bukkit.listeners.protocol1_15to1_14_4.EntityToggleGlideListener;
import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.ArmorListener;
import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.BlockListener;
import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.DeathListener;
import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.HandItemCache;
import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.PaperPatch;
import us.myles.ViaVersion.bukkit.providers.BukkitBlockConnectionProvider;
import us.myles.ViaVersion.bukkit.providers.BukkitInventoryQuickMoveProvider;
import us.myles.ViaVersion.bukkit.providers.BukkitViaBulkChunkTranslator;
import us.myles.ViaVersion.bukkit.providers.BukkitViaMovementTransmitter;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InventoryQuickMoveProvider;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.ConnectionData;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.providers.BlockConnectionProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
public class BukkitViaLoader implements ViaPlatformLoader {
private final ViaVersionPlugin plugin;
private final Set<Listener> listeners = new HashSet<>();
private final Set<BukkitTask> tasks = new HashSet<>();
private HandItemCache handItemCache;
public BukkitViaLoader(ViaVersionPlugin plugin) {
this.plugin = plugin;
}
public void registerListener(Listener listener) {
Bukkit.getPluginManager().registerEvents(storeListener(listener), plugin);
}
public <T extends Listener> T storeListener(T listener) {
listeners.add(listener);
return listener;
}
@Override
public void load() {
// Update Listener
registerListener(new UpdateListener());
/* Base Protocol */
final ViaVersionPlugin plugin = (ViaVersionPlugin) Bukkit.getPluginManager().getPlugin("ViaVersion");
// Add ProtocolSupport ConnectListener if necessary.
ClassGenerator.registerPSConnectListener(plugin);
/* 1.9 client to 1.8 server */
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) {
storeListener(new ArmorListener(plugin)).register();
storeListener(new DeathListener(plugin)).register();
storeListener(new BlockListener(plugin)).register();
if (plugin.getConf().isItemCache()) {
handItemCache = new HandItemCache();
tasks.add(handItemCache.runTaskTimerAsynchronously(plugin, 2L, 2L)); // Updates player's items :)
}
}
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_14.getId()) {
boolean use1_9Fix = plugin.getConf().is1_9HitboxFix() && ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId();
if (use1_9Fix || plugin.getConf().is1_14HitboxFix()) {
try {
storeListener(new PlayerSneakListener(plugin, use1_9Fix, plugin.getConf().is1_14HitboxFix())).register();
} catch (ReflectiveOperationException e) {
Via.getPlatform().getLogger().warning("Could not load hitbox fix - please report this on our GitHub");
e.printStackTrace();
}
}
}
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_15.getId()) {
try {
Class.forName("org.bukkit.event.entity.EntityToggleGlideEvent");
storeListener(new EntityToggleGlideListener(plugin)).register();
} catch (ClassNotFoundException ignored) {
}
}
if ((Bukkit.getVersion().toLowerCase(Locale.ROOT).contains("paper")
|| Bukkit.getVersion().toLowerCase(Locale.ROOT).contains("taco")
|| Bukkit.getVersion().toLowerCase(Locale.ROOT).contains("torch"))
&& ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_12.getId()) {
plugin.getLogger().info("Enabling Paper/TacoSpigot/Torch patch: Fixes block placement.");
storeListener(new PaperPatch(plugin)).register();
}
/* Providers */
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) {
Via.getManager().getProviders().use(BulkChunkTranslatorProvider.class, new BukkitViaBulkChunkTranslator());
Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BukkitViaMovementTransmitter());
Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() {
@Override
public Item getHandItem(final UserConnection info) {
if (handItemCache != null) {
return handItemCache.getHandItem(info.getProtocolInfo().getUuid());
}
try {
return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), () -> {
UUID playerUUID = info.getProtocolInfo().getUuid();
Player player = Bukkit.getPlayer(playerUUID);
if (player != null) {
return HandItemCache.convert(player.getItemInHand());
}
return null;
}).get(10, TimeUnit.SECONDS);
} catch (Exception e) {
Via.getPlatform().getLogger().severe("Error fetching hand item: " + e.getClass().getName());
if (Via.getManager().isDebug())
e.printStackTrace();
return null;
}
}
});
}
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_12.getId()) {
if (plugin.getConf().is1_12QuickMoveActionFix()) {
Via.getManager().getProviders().use(InventoryQuickMoveProvider.class, new BukkitInventoryQuickMoveProvider());
}
}
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_13.getId()) {
if (Via.getConfig().getBlockConnectionMethod().equalsIgnoreCase("world")) {
BukkitBlockConnectionProvider blockConnectionProvider = new BukkitBlockConnectionProvider();
Via.getManager().getProviders().use(BlockConnectionProvider.class, blockConnectionProvider);
ConnectionData.blockConnectionProvider = blockConnectionProvider;
}
}
}
@Override
public void unload() {
for (Listener listener : listeners) {
HandlerList.unregisterAll(listener);
}
listeners.clear();
for (BukkitTask task : tasks) {
task.cancel();
}
tasks.clear();
}
}
@@ -0,0 +1,195 @@
package us.myles.ViaVersion.bukkit.providers;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bukkit.tasks.protocol1_12to1_11_1.BukkitInventoryUpdateTask;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InventoryQuickMoveProvider;
import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage.ItemTransaction;
import us.myles.ViaVersion.util.ReflectionUtil;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
public class BukkitInventoryQuickMoveProvider extends InventoryQuickMoveProvider {
private final Map<UUID, BukkitInventoryUpdateTask> updateTasks = new ConcurrentHashMap<>();
private final boolean supported;
// packet class
private Class<?> windowClickPacketClass;
private Object clickTypeEnum;
// Use for nms
private Method nmsItemMethod;
private Method craftPlayerHandle;
private Field connection;
private Method packetMethod;
public BukkitInventoryQuickMoveProvider() {
this.supported = isSupported();
setupReflection();
}
@Override
public boolean registerQuickMoveAction(short windowId, short slotId, short actionId, UserConnection userConnection) {
if (!supported) {
return false;
}
if (slotId < 0) { // clicked out of inv slot
return false;
}
if (windowId == 0) {
/**
* windowId is always 0 for player inventory.
* This has almost definitely something to do with the offhand slot.
*/
if (slotId >= 36 && slotId <= 44) {
int protocolId = ProtocolRegistry.SERVER_PROTOCOL;
// this seems to be working just fine.
if (protocolId == ProtocolVersion.v1_8.getId()) {
return false;
}
}
}
ProtocolInfo info = userConnection.getProtocolInfo();
UUID uuid = info.getUuid();
BukkitInventoryUpdateTask updateTask = updateTasks.get(uuid);
final boolean registered = updateTask != null;
if (!registered) {
updateTask = new BukkitInventoryUpdateTask(this, uuid);
updateTasks.put(uuid, updateTask);
}
// http://wiki.vg/index.php?title=Protocol&oldid=13223#Click_Window
updateTask.addItem(windowId, slotId, actionId);
if (!registered) {
Via.getPlatform().runSync(updateTask, 5L);
}
return true;
}
public Object buildWindowClickPacket(Player p, ItemTransaction storage) {
if (!supported) {
return null;
}
InventoryView inv = p.getOpenInventory();
short slotId = storage.getSlotId();
Inventory tinv = inv.getTopInventory();
InventoryType tinvtype = tinv == null ? null : tinv.getType(); // can this even be null?
if (tinvtype != null) {
int protocolId = ProtocolRegistry.SERVER_PROTOCOL;
if (protocolId == ProtocolVersion.v1_8.getId()) {
if (tinvtype == InventoryType.BREWING) {
// 1.9 added the blaze powder slot to brewing stand fix for 1.8 servers
if (slotId >= 5 && slotId <= 40) {
slotId -= 1;
}
}
}
}
ItemStack itemstack = null;
// must be after top inventory slot check
if (slotId <= inv.countSlots()) {
itemstack = inv.getItem(slotId);
} else {
// if not true we got too many slots (version inventory slot changes)?
String cause = "Too many inventory slots: slotId: " + slotId + " invSlotCount: " + inv.countSlots()
+ " invType: " + inv.getType() + " topInvType: " + tinvtype;
Via.getPlatform().getLogger().severe("Failed to get an item to create a window click packet. Please report this issue to the ViaVersion Github: " + cause);
}
Object packet = null;
try {
packet = windowClickPacketClass.getDeclaredConstructor().newInstance();
Object nmsItem = itemstack == null ? null : nmsItemMethod.invoke(null, itemstack);
ReflectionUtil.set(packet, "a", (int) storage.getWindowId());
ReflectionUtil.set(packet, "slot", (int) slotId);
ReflectionUtil.set(packet, "button", 0); // shift + left mouse click
ReflectionUtil.set(packet, "d", storage.getActionId());
ReflectionUtil.set(packet, "item", nmsItem);
int protocolId = ProtocolRegistry.SERVER_PROTOCOL;
if (protocolId == ProtocolVersion.v1_8.getId()) {
ReflectionUtil.set(packet, "shift", 1);
} else if (protocolId >= ProtocolVersion.v1_9.getId()) { // 1.9+
ReflectionUtil.set(packet, "shift", clickTypeEnum);
}
} catch (Exception e) {
Via.getPlatform().getLogger().log(Level.SEVERE, "Failed to create a window click packet. Please report this issue to the ViaVersion Github: " + e.getMessage(), e);
}
return packet;
}
public boolean sendPacketToServer(Player p, Object packet) {
if (packet == null) {
// let the other packets pass through
return true;
}
try {
Object entityPlayer = craftPlayerHandle.invoke(p);
Object playerConnection = connection.get(entityPlayer);
// send
packetMethod.invoke(playerConnection, packet);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
return false;
}
return true;
}
public void onTaskExecuted(UUID uuid) {
updateTasks.remove(uuid);
}
private void setupReflection() {
if (!supported) {
return;
}
try {
this.windowClickPacketClass = NMSUtil.nms("PacketPlayInWindowClick");
int protocolId = ProtocolRegistry.SERVER_PROTOCOL;
if (protocolId >= ProtocolVersion.v1_9.getId()) {
Class<?> eclassz = NMSUtil.nms("InventoryClickType");
Object[] constants = eclassz.getEnumConstants();
this.clickTypeEnum = constants[1]; // QUICK_MOVE
}
Class<?> craftItemStack = NMSUtil.obc("inventory.CraftItemStack");
this.nmsItemMethod = craftItemStack.getDeclaredMethod("asNMSCopy", ItemStack.class);
} catch (Exception e) {
throw new RuntimeException("Couldn't find required inventory classes", e);
}
try {
this.craftPlayerHandle = NMSUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle");
} catch (NoSuchMethodException | ClassNotFoundException e) {
throw new RuntimeException("Couldn't find CraftPlayer", e);
}
try {
this.connection = NMSUtil.nms("EntityPlayer").getDeclaredField("playerConnection");
} catch (NoSuchFieldException | ClassNotFoundException e) {
throw new RuntimeException("Couldn't find Player Connection", e);
}
try {
this.packetMethod = NMSUtil.nms("PlayerConnection").getDeclaredMethod("a", windowClickPacketClass);
} catch (NoSuchMethodException | ClassNotFoundException e) {
throw new RuntimeException("Couldn't find CraftPlayer", e);
}
}
private boolean isSupported() {
int protocolId = ProtocolRegistry.SERVER_PROTOCOL;
if (protocolId >= ProtocolVersion.v1_8.getId() && protocolId <= ProtocolVersion.v1_11_1.getId()) {
return true; // 1.8-1.11.2
}
// this is not needed on 1.12+ servers
return false;
}
}
@@ -0,0 +1,87 @@
package us.myles.ViaVersion.bukkit.providers;
import com.google.common.collect.Lists;
import us.myles.ViaVersion.ViaVersionPlugin;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks;
import us.myles.ViaVersion.util.ReflectionUtil;
import java.lang.reflect.Method;
import java.util.List;
import java.util.logging.Level;
public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider {
// Reflection
private static ReflectionUtil.ClassReflection mapChunkBulkRef;
private static ReflectionUtil.ClassReflection mapChunkRef;
private static Method obfuscateRef;
static {
try {
mapChunkBulkRef = new ReflectionUtil.ClassReflection(NMSUtil.nms("PacketPlayOutMapChunkBulk"));
mapChunkRef = new ReflectionUtil.ClassReflection(NMSUtil.nms("PacketPlayOutMapChunk"));
if (((ViaVersionPlugin) Via.getPlatform()).isSpigot()) {
obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, NMSUtil.nms("World"));
}
} catch (ClassNotFoundException e) {
// Ignore as server is probably 1.9+
} catch (Exception e) {
Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e);
}
}
@Override
public List<Object> transformMapChunkBulk(Object packet, ClientChunks clientChunks) {
List<Object> list = Lists.newArrayList();
try {
int[] xcoords = mapChunkBulkRef.getFieldValue("a", packet, int[].class);
int[] zcoords = mapChunkBulkRef.getFieldValue("b", packet, int[].class);
Object[] chunkMaps = mapChunkBulkRef.getFieldValue("c", packet, Object[].class);
if (Via.getConfig().isAntiXRay() && ((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { //Spigot anti-xray patch
try {
Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class);
Object spigotConfig = ReflectionUtil.getPublic(world, "spigotConfig", Object.class);
Object antiXrayInstance = ReflectionUtil.getPublic(spigotConfig, "antiXrayInstance", Object.class);
for (int i = 0; i < xcoords.length; ++i) {
// TODO: Possibly optimise this
Object b = ReflectionUtil.get(chunkMaps[i], "b", Object.class);
Object a = ReflectionUtil.get(chunkMaps[i], "a", Object.class);
obfuscateRef.invoke(antiXrayInstance, xcoords[i], zcoords[i], b, a, world);
}
} catch (Exception e) {
// not spigot, or it failed.
}
}
for (int i = 0; i < chunkMaps.length; i++) {
int x = xcoords[i];
int z = zcoords[i];
Object chunkMap = chunkMaps[i];
Object chunkPacket = mapChunkRef.newInstance();
mapChunkRef.setFieldValue("a", chunkPacket, x);
mapChunkRef.setFieldValue("b", chunkPacket, z);
mapChunkRef.setFieldValue("c", chunkPacket, chunkMap);
mapChunkRef.setFieldValue("d", chunkPacket, true); // Chunk bulk chunks are always ground-up
clientChunks.getBulkChunks().add(ClientChunks.toLong(x, z)); // Store for later
list.add(chunkPacket);
}
} catch (Exception e) {
Via.getPlatform().getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e);
}
return list;
}
@Override
public boolean isFiltered(Class<?> packetClass) {
return packetClass.getName().endsWith("PacketPlayOutMapChunkBulk");
}
@Override
public boolean isPacketLevel() {
return false;
}
}
@@ -0,0 +1,103 @@
package us.myles.ViaVersion.bukkit.providers;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bukkit.util.NMSUtil;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BukkitViaMovementTransmitter extends MovementTransmitterProvider {
private static boolean USE_NMS = true;
// Used for packet mode
private Object idlePacket;
private Object idlePacket2;
// Use for nms
private Method getHandle;
private Field connection;
private Method handleFlying;
public BukkitViaMovementTransmitter() {
USE_NMS = Via.getConfig().isNMSPlayerTicking();
Class<?> idlePacketClass;
try {
idlePacketClass = NMSUtil.nms("PacketPlayInFlying");
} catch (ClassNotFoundException e) {
return; // We'll hope this is 1.9.4+
}
try {
idlePacket = idlePacketClass.newInstance();
idlePacket2 = idlePacketClass.newInstance();
Field flying = idlePacketClass.getDeclaredField("f");
flying.setAccessible(true);
flying.set(idlePacket2, true);
} catch (NoSuchFieldException | InstantiationException | IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException("Couldn't make player idle packet, help!", e);
}
if (USE_NMS) {
try {
getHandle = NMSUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle");
} catch (NoSuchMethodException | ClassNotFoundException e) {
throw new RuntimeException("Couldn't find CraftPlayer", e);
}
try {
connection = NMSUtil.nms("EntityPlayer").getDeclaredField("playerConnection");
} catch (NoSuchFieldException | ClassNotFoundException e) {
throw new RuntimeException("Couldn't find Player Connection", e);
}
try {
handleFlying = NMSUtil.nms("PlayerConnection").getDeclaredMethod("a", idlePacketClass);
} catch (NoSuchMethodException | ClassNotFoundException e) {
throw new RuntimeException("Couldn't find CraftPlayer", e);
}
}
}
@Override
public Object getFlyingPacket() {
if (idlePacket == null)
throw new NullPointerException("Could not locate flying packet");
return idlePacket2;
}
@Override
public Object getGroundPacket() {
if (idlePacket == null)
throw new NullPointerException("Could not locate flying packet");
return idlePacket;
}
@Override
public void sendPlayer(UserConnection info) {
if (USE_NMS) {
Player player = Bukkit.getPlayer(info.getProtocolInfo().getUuid());
if (player != null) {
try {
// Tick player
Object entityPlayer = getHandle.invoke(player);
Object pc = connection.get(entityPlayer);
if (pc != null) {
handleFlying.invoke(pc, (info.get(MovementTracker.class).isGround() ? idlePacket2 : idlePacket));
// Tick world
info.get(MovementTracker.class).incrementIdlePacket();
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
} else {
super.sendPlayer(info);
}
}
}
@@ -0,0 +1,52 @@
package us.myles.ViaVersion.bukkit.tasks.protocol1_12to1_11_1;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.bukkit.providers.BukkitInventoryQuickMoveProvider;
import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage.ItemTransaction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
public class BukkitInventoryUpdateTask implements Runnable {
private final BukkitInventoryQuickMoveProvider provider;
private final UUID uuid;
private final List<ItemTransaction> items;
public BukkitInventoryUpdateTask(BukkitInventoryQuickMoveProvider provider, UUID uuid) {
this.provider = provider;
this.uuid = uuid;
this.items = Collections.synchronizedList(new ArrayList<ItemTransaction>());
}
public void addItem(short windowId, short slotId, short actionId) {
ItemTransaction storage = new ItemTransaction(windowId, slotId, actionId);
items.add(storage);
}
@Override
public void run() {
Player p = Bukkit.getServer().getPlayer(uuid);
if (p == null) {
provider.onTaskExecuted(uuid);
return;
}
try {
synchronized (items) {
for (ItemTransaction storage : items) {
Object packet = provider.buildWindowClickPacket(p, storage);
boolean result = provider.sendPacketToServer(p, packet);
if (!result) {
break;
}
}
items.clear();
}
} finally {
provider.onTaskExecuted(uuid);
}
}
}
@@ -0,0 +1,38 @@
package us.myles.ViaVersion.bukkit.util;
import org.bukkit.Bukkit;
public class NMSUtil {
private static final String BASE = Bukkit.getServer().getClass().getPackage().getName();
private static final String NMS = BASE.replace("org.bukkit.craftbukkit", "net.minecraft.server");
private static final boolean DEBUG_PROPERTY = loadDebugProperty();
private static boolean loadDebugProperty() {
try {
Class<?> serverClass = nms("MinecraftServer");
Object server = serverClass.getDeclaredMethod("getServer").invoke(null);
return (boolean) serverClass.getMethod("isDebugging").invoke(server);
} catch (ReflectiveOperationException e) {
return false;
}
}
public static Class<?> nms(String className) throws ClassNotFoundException {
return Class.forName(NMS + "." + className);
}
public static Class<?> obc(String className) throws ClassNotFoundException {
return Class.forName(BASE + "." + className);
}
public static String getVersion() {
return BASE.substring(BASE.lastIndexOf('.') + 1);
}
/**
* @return true if debug=true is set in the server.properties (added by CB)
*/
public static boolean isDebugPropertySet() {
return DEBUG_PROPERTY;
}
}
@@ -0,0 +1,33 @@
package us.myles.ViaVersion.bukkit.util;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ProtocolSupportUtil {
private static Method protocolVersionMethod = null;
private static Method getIdMethod = null;
static {
try {
protocolVersionMethod = Class.forName("protocolsupport.api.ProtocolSupportAPI").getMethod("getProtocolVersion", Player.class);
getIdMethod = Class.forName("protocolsupport.api.ProtocolVersion").getMethod("getId");
} catch (Exception e) {
// ProtocolSupport not installed.
}
}
public static int getProtocolVersion(Player player) {
if (protocolVersionMethod == null) return -1;
try {
Object version = protocolVersionMethod.invoke(null, player);
return (int) getIdMethod.invoke(version);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return -1;
}
}
+13
View File
@@ -0,0 +1,13 @@
name: ViaVersion
main: us.myles.ViaVersion.ViaVersionPlugin
authors: [_MylesC, creeper123123321, Gerrygames, KennyTV, Matsv]
version: ${project.version}
description: ${project.description}
load: postworld
api-version: 1.13
loadbefore: [ProtocolLib, ProxyPipe, SpigotLib, SkinRestorer]
softdepend: [ProtocolSupport, PacketListenerApi]
commands:
viaversion:
description: Shows ViaVersion Version and more.
aliases: [viaver, vvbukkit]
+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>viaversion-parent</artifactId>
<groupId>us.myles</groupId>
<version>3.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>viaversion-bungee</artifactId>
<build>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>src/main/resources/</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
</build>
<dependencies>
<!-- BungeeCord API -->
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.15-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- Common Module -->
<dependency>
<groupId>us.myles</groupId>
<artifactId>viaversion-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,199 @@
package us.myles.ViaVersion;
import com.google.gson.JsonObject;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.protocol.ProtocolConstants;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.ViaAPI;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import us.myles.ViaVersion.api.configuration.ConfigurationProvider;
import us.myles.ViaVersion.api.data.MappingDataLoader;
import us.myles.ViaVersion.api.platform.TaskId;
import us.myles.ViaVersion.api.platform.ViaConnectionManager;
import us.myles.ViaVersion.api.platform.ViaPlatform;
import us.myles.ViaVersion.bungee.commands.BungeeCommand;
import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler;
import us.myles.ViaVersion.bungee.commands.BungeeCommandSender;
import us.myles.ViaVersion.bungee.platform.BungeeTaskId;
import us.myles.ViaVersion.bungee.platform.BungeeViaAPI;
import us.myles.ViaVersion.bungee.platform.BungeeViaConfig;
import us.myles.ViaVersion.bungee.platform.BungeeViaInjector;
import us.myles.ViaVersion.bungee.platform.BungeeViaLoader;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
import us.myles.ViaVersion.dump.PluginInfo;
import us.myles.ViaVersion.util.GsonUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
public class BungeePlugin extends Plugin implements ViaPlatform<ProxiedPlayer>, Listener {
private final ViaConnectionManager connectionManager = new ViaConnectionManager();
private BungeeViaAPI api;
private BungeeViaConfig config;
@Override
public void onLoad() {
try {
ProtocolConstants.class.getField("MINECRAFT_1_15_2");
} catch (NoSuchFieldException e) {
getLogger().warning(" / \\");
getLogger().warning(" / \\");
getLogger().warning(" / | \\");
getLogger().warning(" / | \\ BUNGEECORD IS OUTDATED");
getLogger().warning(" / \\ VIAVERSION MAY NOT WORK AS INTENDED");
getLogger().warning(" / o \\");
getLogger().warning("/_____________\\");
}
api = new BungeeViaAPI();
config = new BungeeViaConfig(getDataFolder());
BungeeCommandHandler commandHandler = new BungeeCommandHandler();
ProxyServer.getInstance().getPluginManager().registerCommand(this, new BungeeCommand(commandHandler));
// Init platform
Via.init(ViaManager.builder()
.platform(this)
.injector(new BungeeViaInjector())
.loader(new BungeeViaLoader(this))
.commandHandler(commandHandler)
.build());
}
@Override
public void onEnable() {
if (ProxyServer.getInstance().getPluginManager().getPlugin("ViaBackwards") != null) {
MappingDataLoader.enableMappingsCache();
}
// Inject
Via.getManager().init();
}
@Override
public String getPlatformName() {
return getProxy().getName();
}
@Override
public String getPlatformVersion() {
return getProxy().getVersion();
}
@Override
public String getPluginVersion() {
return getDescription().getVersion();
}
@Override
public TaskId runAsync(Runnable runnable) {
return new BungeeTaskId(getProxy().getScheduler().runAsync(this, runnable).getId());
}
@Override
public TaskId runSync(Runnable runnable) {
return runAsync(runnable);
}
@Override
public TaskId runSync(Runnable runnable, Long ticks) {
return new BungeeTaskId(getProxy().getScheduler().schedule(this, runnable, ticks * 50, TimeUnit.MILLISECONDS).getId());
}
@Override
public TaskId runRepeatingSync(Runnable runnable, Long ticks) {
return new BungeeTaskId(getProxy().getScheduler().schedule(this, runnable, 0, ticks * 50, TimeUnit.MILLISECONDS).getId());
}
@Override
public void cancelTask(TaskId taskId) {
if (taskId == null) return;
if (taskId.getObject() == null) return;
if (taskId instanceof BungeeTaskId) {
getProxy().getScheduler().cancel((Integer) taskId.getObject());
}
}
@Override
public ViaCommandSender[] getOnlinePlayers() {
ViaCommandSender[] array = new ViaCommandSender[getProxy().getPlayers().size()];
int i = 0;
for (ProxiedPlayer player : getProxy().getPlayers()) {
array[i++] = new BungeeCommandSender(player);
}
return array;
}
@Override
public void sendMessage(UUID uuid, String message) {
getProxy().getPlayer(uuid).sendMessage(message);
}
@Override
public boolean kickPlayer(UUID uuid, String message) {
if (getProxy().getPlayer(uuid) != null) {
getProxy().getPlayer(uuid).disconnect(message);
return true;
}
return false;
}
@Override
public boolean isPluginEnabled() {
return true;
}
@Override
public ViaAPI<ProxiedPlayer> getApi() {
return api;
}
@Override
public BungeeViaConfig getConf() {
return config;
}
@Override
public ConfigurationProvider getConfigurationProvider() {
return config;
}
@Override
public void onReload() {
// Injector prints a message <3
}
@Override
public JsonObject getDump() {
JsonObject platformSpecific = new JsonObject();
List<PluginInfo> plugins = new ArrayList<>();
for (Plugin p : ProxyServer.getInstance().getPluginManager().getPlugins())
plugins.add(new PluginInfo(
true,
p.getDescription().getName(),
p.getDescription().getVersion(),
p.getDescription().getMain(),
Collections.singletonList(p.getDescription().getAuthor())
));
platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins));
platformSpecific.add("servers", GsonUtil.getGson().toJsonTree(ProtocolDetectorService.getDetectedIds()));
return platformSpecific;
}
@Override
public boolean isOldClientsAllowed() {
return true;
}
@Override
public ViaConnectionManager getConnectionManager() {
return connectionManager;
}
}
@@ -0,0 +1,24 @@
package us.myles.ViaVersion.bungee.commands;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;
public class BungeeCommand extends Command implements TabExecutor {
private final BungeeCommandHandler handler;
public BungeeCommand(BungeeCommandHandler handler) {
super("viaversion", "", "viaver", "vvbungee"); // The CommandHandler will handle the permission
this.handler = handler;
}
@Override
public void execute(CommandSender commandSender, String[] strings) {
handler.onCommand(new BungeeCommandSender(commandSender), strings);
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] strings) {
return handler.onTabComplete(new BungeeCommandSender(commandSender), strings);
}
}
@@ -0,0 +1,16 @@
package us.myles.ViaVersion.bungee.commands;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.bungee.commands.subs.ProbeSubCmd;
import us.myles.ViaVersion.commands.ViaCommandHandler;
public class BungeeCommandHandler extends ViaCommandHandler {
public BungeeCommandHandler() {
try {
registerSubCommand(new ProbeSubCmd());
} catch (Exception e) {
Via.getPlatform().getLogger().severe("Failed to register Bungee subcommands");
e.printStackTrace();
}
}
}
@@ -0,0 +1,39 @@
package us.myles.ViaVersion.bungee.commands;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import java.util.UUID;
public class BungeeCommandSender implements ViaCommandSender {
private final CommandSender sender;
public BungeeCommandSender(CommandSender sender) {
this.sender = sender;
}
@Override
public boolean hasPermission(String permission) {
return sender.hasPermission(permission);
}
@Override
public void sendMessage(String msg) {
sender.sendMessage(msg);
}
@Override
public UUID getUUID() {
if (sender instanceof ProxiedPlayer) {
return ((ProxiedPlayer) sender).getUniqueId();
} else {
return UUID.fromString(getName());
}
}
@Override
public String getName() {
return sender.getName();
}
}
@@ -0,0 +1,28 @@
package us.myles.ViaVersion.bungee.commands.subs;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import us.myles.ViaVersion.api.command.ViaSubCommand;
import us.myles.ViaVersion.bungee.platform.BungeeViaConfig;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
public class ProbeSubCmd extends ViaSubCommand {
@Override
public String name() {
return "probe";
}
@Override
public String description() {
return "Forces ViaVersion to scan server protocol versions " +
(((BungeeViaConfig) Via.getConfig()).getBungeePingInterval() == -1 ?
"" : "(Also happens at an interval)");
}
@Override
public boolean execute(ViaCommandSender sender, String[] args) {
ProtocolDetectorService.getInstance().run();
sendMessage(sender, "&6Started searching for protocol versions");
return true;
}
}
@@ -0,0 +1,45 @@
package us.myles.ViaVersion.bungee.handlers;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolPipeline;
import java.lang.reflect.Method;
public class BungeeChannelInitializer extends ChannelInitializer<Channel> {
private final ChannelInitializer<Channel> original;
private Method method;
public BungeeChannelInitializer(ChannelInitializer<Channel> oldInit) {
this.original = oldInit;
try {
this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class);
this.method.setAccessible(true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
@Override
protected void initChannel(Channel socketChannel) throws Exception {
UserConnection info = new UserConnection(socketChannel);
// init protocol
new ProtocolPipeline(info);
// Add originals
this.method.invoke(this.original, socketChannel);
if (socketChannel.pipeline().get("packet-encoder") == null) return; // Don't inject if no packet-encoder
if (socketChannel.pipeline().get("packet-decoder") == null) return; // Don't inject if no packet-decoder
// Add our transformers
BungeeEncodeHandler encoder = new BungeeEncodeHandler(info);
BungeeDecodeHandler decoder = new BungeeDecodeHandler(info);
socketChannel.pipeline().addBefore("packet-encoder", "via-encoder", encoder);
socketChannel.pipeline().addBefore("packet-decoder", "via-decoder", decoder);
}
public ChannelInitializer<Channel> getOriginal() {
return original;
}
}
@@ -0,0 +1,43 @@
package us.myles.ViaVersion.bungee.handlers;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.exception.CancelDecoderException;
import us.myles.ViaVersion.exception.CancelCodecException;
import java.util.List;
@ChannelHandler.Sharable
public class BungeeDecodeHandler extends MessageToMessageDecoder<ByteBuf> {
private final UserConnection info;
public BungeeDecodeHandler(UserConnection info) {
this.info = info;
}
@Override
protected void decode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List<Object> out) throws Exception {
if (!info.checkIncomingPacket()) throw CancelDecoderException.generate(null);
if (!info.shouldTransformPacket()) {
out.add(bytebuf.retain());
return;
}
ByteBuf transformedBuf = ctx.alloc().buffer().writeBytes(bytebuf);
try {
info.transformIncoming(transformedBuf, CancelDecoderException::generate);
out.add(transformedBuf.retain());
} finally {
transformedBuf.release();
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
if (cause instanceof CancelCodecException) return;
super.exceptionCaught(ctx, cause);
}
}
@@ -0,0 +1,84 @@
package us.myles.ViaVersion.bungee.handlers;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bungee.util.BungeePipelineUtil;
import us.myles.ViaVersion.exception.CancelEncoderException;
import us.myles.ViaVersion.exception.CancelCodecException;
import java.util.List;
@ChannelHandler.Sharable
public class BungeeEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
private final UserConnection info;
private boolean handledCompression;
public BungeeEncodeHandler(UserConnection info) {
this.info = info;
}
@Override
protected void encode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List<Object> out) throws Exception {
info.checkOutgoingPacket();
if (!info.shouldTransformPacket()) {
out.add(bytebuf.retain());
return;
}
ByteBuf transformedBuf = ctx.alloc().buffer().writeBytes(bytebuf);
try {
boolean needsCompress = handleCompressionOrder(ctx, transformedBuf);
info.transformOutgoing(transformedBuf, CancelEncoderException::generate);
if (needsCompress) {
recompress(ctx, transformedBuf);
}
out.add(transformedBuf.retain());
} finally {
transformedBuf.release();
}
}
private boolean handleCompressionOrder(ChannelHandlerContext ctx, ByteBuf buf) {
boolean needsCompress = false;
if (!handledCompression) {
if (ctx.pipeline().names().indexOf("compress") > ctx.pipeline().names().indexOf("via-encoder")) {
// Need to decompress this packet due to bad order
ByteBuf decompressed = BungeePipelineUtil.decompress(ctx, buf);
try {
buf.clear().writeBytes(decompressed);
} finally {
decompressed.release();
}
ChannelHandler dec = ctx.pipeline().get("via-decoder");
ChannelHandler enc = ctx.pipeline().get("via-encoder");
ctx.pipeline().remove(dec);
ctx.pipeline().remove(enc);
ctx.pipeline().addAfter("decompress", "via-decoder", dec);
ctx.pipeline().addAfter("compress", "via-encoder", enc);
needsCompress = true;
handledCompression = true;
}
}
return needsCompress;
}
private void recompress(ChannelHandlerContext ctx, ByteBuf buf) {
ByteBuf compressed = BungeePipelineUtil.compress(ctx, buf);
try {
buf.clear().writeBytes(compressed);
} finally {
compressed.release();
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
if (cause instanceof CancelCodecException) return;
super.exceptionCaught(ctx, cause);
}
}
@@ -0,0 +1,259 @@
package us.myles.ViaVersion.bungee.handlers;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.score.Team;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
import net.md_5.bungee.protocol.packet.PluginMessage;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.Pair;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.ExternalJoinGameListener;
import us.myles.ViaVersion.api.data.StoredObject;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.api.protocol.ProtocolPipeline;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
import us.myles.ViaVersion.bungee.storage.BungeeStorage;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.InventoryPackets;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.EntityIdProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
public class BungeeServerHandler implements Listener {
private static Method getHandshake;
private static Method getRelayMessages;
private static Method setProtocol;
private static Method getEntityMap = null;
private static Method setVersion = null;
private static Field entityRewrite = null;
private static Field channelWrapper = null;
static {
try {
getHandshake = Class.forName("net.md_5.bungee.connection.InitialHandler").getDeclaredMethod("getHandshake");
getRelayMessages = Class.forName("net.md_5.bungee.connection.InitialHandler").getDeclaredMethod("getRelayMessages");
setProtocol = Class.forName("net.md_5.bungee.protocol.packet.Handshake").getDeclaredMethod("setProtocolVersion", int.class);
getEntityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class);
setVersion = Class.forName("net.md_5.bungee.netty.ChannelWrapper").getDeclaredMethod("setVersion", int.class);
channelWrapper = Class.forName("net.md_5.bungee.UserConnection").getDeclaredField("ch");
channelWrapper.setAccessible(true);
entityRewrite = Class.forName("net.md_5.bungee.UserConnection").getDeclaredField("entityRewrite");
entityRewrite.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
// Set the handshake version every time someone connects to any server
@EventHandler(priority = 120)
public void onServerConnect(ServerConnectEvent e) {
if (e.isCancelled()) {
return;
}
UserConnection user = Via.getManager().getConnection(e.getPlayer().getUniqueId());
if (user == null) return;
if (!user.has(BungeeStorage.class)) {
user.put(new BungeeStorage(user, e.getPlayer()));
}
int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName());
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(user.getProtocolInfo().getProtocolVersion(), protocolId);
// Check if ViaVersion can support that version
try {
//Object pendingConnection = getPendingConnection.invoke(e.getPlayer());
Object handshake = getHandshake.invoke(e.getPlayer().getPendingConnection());
setProtocol.invoke(handshake, protocols == null ? user.getProtocolInfo().getProtocolVersion() : protocolId);
} catch (InvocationTargetException | IllegalAccessException e1) {
e1.printStackTrace();
}
}
@EventHandler(priority = -120)
public void onServerConnected(ServerConnectedEvent e) {
try {
checkServerChange(e, Via.getManager().getConnection(e.getPlayer().getUniqueId()));
} catch (Exception e1) {
e1.printStackTrace();
}
}
@EventHandler(priority = -120)
public void onServerSwitch(ServerSwitchEvent e) {
// Update entity id
UserConnection userConnection = Via.getManager().getConnection(e.getPlayer().getUniqueId());
if (userConnection == null) return;
int playerId;
try {
playerId = Via.getManager().getProviders().get(EntityIdProvider.class).getEntityId(userConnection);
} catch (Exception ex) {
return; // Ignored
}
for (StoredObject storedObject : userConnection.getStoredObjects().values()) {
if (storedObject instanceof ExternalJoinGameListener) {
((ExternalJoinGameListener) storedObject).onExternalJoinGame(playerId);
}
}
}
public void checkServerChange(ServerConnectedEvent e, UserConnection user) throws Exception {
if (user == null) return;
// Auto-team handling
// Handle server/version change
if (user.has(BungeeStorage.class)) {
BungeeStorage storage = user.get(BungeeStorage.class);
ProxiedPlayer player = storage.getPlayer();
if (e.getServer() != null) {
if (!e.getServer().getInfo().getName().equals(storage.getCurrentServer())) {
// Clear auto-team
EntityTracker1_9 oldEntityTracker = user.get(EntityTracker1_9.class);
if (oldEntityTracker != null) {
if (oldEntityTracker.isAutoTeam() && oldEntityTracker.isTeamExists()) {
oldEntityTracker.sendTeamPacket(false, true);
}
}
String serverName = e.getServer().getInfo().getName();
storage.setCurrentServer(serverName);
int protocolId = ProtocolDetectorService.getProtocolId(serverName);
if (protocolId <= ProtocolVersion.v1_8.getId()) { // 1.8 doesn't have BossBar packet
if (storage.getBossbar() != null) {
// TODO: Verify whether this packet needs to be sent when 1.8 -> 1.9 protocol isn't present in the pipeline
// This ensures we can encode it properly as only the 1.9 protocol is currently implemented.
if (user.getProtocolInfo().getPipeline().contains(Protocol1_9To1_8.class)) {
for (UUID uuid : storage.getBossbar()) {
PacketWrapper wrapper = new PacketWrapper(0x0C, null, user);
wrapper.write(Type.UUID, uuid);
wrapper.write(Type.VAR_INT, 1); // remove
wrapper.send(Protocol1_9To1_8.class, true, true);
}
}
storage.getBossbar().clear();
}
}
ProtocolInfo info = user.getProtocolInfo();
int previousServerProtocol = info.getServerProtocolVersion();
// Refresh the pipes
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId);
ProtocolPipeline pipeline = user.getProtocolInfo().getPipeline();
user.clearStoredObjects();
pipeline.cleanPipes();
if (protocols == null) {
// TODO Check Bungee Supported Protocols? *shrugs*
protocolId = info.getProtocolVersion();
} else {
for (Pair<Integer, Protocol> prot : protocols) {
pipeline.add(prot.getValue());
}
}
info.setServerProtocolVersion(protocolId);
// Add version-specific base Protocol
pipeline.add(ProtocolRegistry.getBaseProtocol(protocolId));
// Workaround 1.13 server change
Object relayMessages = getRelayMessages.invoke(e.getPlayer().getPendingConnection());
for (Object message : (List) relayMessages) {
PluginMessage plMsg = (PluginMessage) message;
String channel = plMsg.getTag();
int id1_13 = ProtocolVersion.v1_13.getId();
if (previousServerProtocol != -1) {
String oldChannel = channel;
if (previousServerProtocol < id1_13 && protocolId >= id1_13) {
channel = InventoryPackets.getNewPluginChannelId(channel);
if (channel == null) {
throw new RuntimeException(oldChannel + " found in relayMessages");
}
if (channel.equals("minecraft:register")) {
plMsg.setData(Arrays.stream(new String(plMsg.getData(), StandardCharsets.UTF_8).split("\0"))
.map(InventoryPackets::getNewPluginChannelId)
.filter(Objects::nonNull)
.collect(Collectors.joining("\0")).getBytes(StandardCharsets.UTF_8));
}
} else if (previousServerProtocol >= id1_13 && protocolId < id1_13) {
channel = InventoryPackets.getOldPluginChannelId(channel);
if (channel == null) {
throw new RuntimeException(oldChannel + " found in relayMessages");
}
if (channel.equals("REGISTER")) {
plMsg.setData(Arrays.stream(new String(plMsg.getData(), StandardCharsets.UTF_8).split("\0"))
.map(InventoryPackets::getOldPluginChannelId)
.filter(Objects::nonNull)
.collect(Collectors.joining("\0")).getBytes(StandardCharsets.UTF_8));
}
}
}
plMsg.setTag(channel);
}
user.put(info);
user.put(storage);
user.setActive(protocols != null);
// Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist.
for (Protocol protocol : pipeline.pipes()) {
protocol.init(user);
}
EntityTracker1_9 newTracker = user.get(EntityTracker1_9.class);
if (newTracker != null) {
if (Via.getConfig().isAutoTeam()) {
String currentTeam = null;
for (Team team : player.getScoreboard().getTeams()) {
if (team.getPlayers().contains(info.getUsername())) {
currentTeam = team.getName();
}
}
// Reinitialize auto-team
newTracker.setAutoTeam(true);
if (currentTeam == null) {
// Send auto-team as it was cleared above
newTracker.sendTeamPacket(true, true);
newTracker.setCurrentTeam("viaversion");
} else {
// Auto-team will be sent when bungee send remove packet
newTracker.setAutoTeam(Via.getConfig().isAutoTeam());
newTracker.setCurrentTeam(currentTeam);
}
}
}
Object wrapper = channelWrapper.get(player);
setVersion.invoke(wrapper, protocolId);
Object entityMap = getEntityMap.invoke(null, protocolId);
entityRewrite.set(player, entityMap);
}
}
}
}
}
@@ -0,0 +1,45 @@
package us.myles.ViaVersion.bungee.listeners;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.api.type.types.version.Types1_9;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9;
import java.util.Collections;
/*
* This patches https://github.com/ViaVersion/ViaVersion/issues/555
*/
public class ElytraPatch implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void onServerConnected(ServerConnectedEvent event) {
UserConnection user = Via.getManager().getConnection(event.getPlayer().getUniqueId());
if (user == null) return;
try {
if (user.getProtocolInfo().getPipeline().contains(Protocol1_9To1_8.class)) {
int entityId = user.get(EntityTracker1_9.class).getProvidedEntityId();
PacketWrapper wrapper = new PacketWrapper(0x39, null, user);
wrapper.write(Type.VAR_INT, entityId);
wrapper.write(Types1_9.METADATA_LIST, Collections.singletonList(new Metadata(0, MetaType1_9.Byte, (byte) 0)));
wrapper.send(Protocol1_9To1_8.class);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,18 @@
package us.myles.ViaVersion.bungee.listeners;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.update.UpdateUtil;
public class UpdateListener implements Listener {
@EventHandler
public void onJoin(PostLoginEvent e) {
if (e.getPlayer().hasPermission("viaversion.update")
&& Via.getConfig().isCheckForUpdates()) {
UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId());
}
}
}
@@ -0,0 +1,34 @@
package us.myles.ViaVersion.bungee.platform;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import us.myles.ViaVersion.api.boss.BossBar;
import us.myles.ViaVersion.api.boss.BossColor;
import us.myles.ViaVersion.api.boss.BossStyle;
import us.myles.ViaVersion.boss.CommonBoss;
public class BungeeBossBar extends CommonBoss<ProxiedPlayer> {
public BungeeBossBar(String title, float health, BossColor color, BossStyle style) {
super(title, health, color, style);
}
@Override
public BossBar addPlayer(ProxiedPlayer player) {
addPlayer(player.getUniqueId());
return this;
}
@Override
public BossBar addPlayers(ProxiedPlayer... players) {
for (ProxiedPlayer p : players)
addPlayer(p);
return this;
}
@Override
public BossBar removePlayer(ProxiedPlayer player) {
removePlayer(player.getUniqueId());
return this;
}
}
@@ -0,0 +1,16 @@
package us.myles.ViaVersion.bungee.platform;
import us.myles.ViaVersion.api.platform.TaskId;
public class BungeeTaskId implements TaskId {
private final Integer object;
public BungeeTaskId(Integer object) {
this.object = object;
}
@Override
public Integer getObject() {
return object;
}
}
@@ -0,0 +1,87 @@
package us.myles.ViaVersion.bungee.platform;
import io.netty.buffer.ByteBuf;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.ViaAPI;
import us.myles.ViaVersion.api.boss.BossBar;
import us.myles.ViaVersion.api.boss.BossColor;
import us.myles.ViaVersion.api.boss.BossStyle;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
public class BungeeViaAPI implements ViaAPI<ProxiedPlayer> {
@Override
public int getPlayerVersion(ProxiedPlayer player) {
UserConnection conn = Via.getManager().getConnection(player.getUniqueId());
if (conn == null) {
return player.getPendingConnection().getVersion();
}
return conn.getProtocolInfo().getProtocolVersion();
}
@Override
public int getPlayerVersion(UUID uuid) {
return getPlayerVersion(ProxyServer.getInstance().getPlayer(uuid));
}
@Override
public boolean isInjected(UUID playerUUID) {
return Via.getManager().isClientConnected(playerUUID);
}
@Override
public String getVersion() {
return Via.getPlatform().getPluginVersion();
}
@Override
public void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException {
if (!isInjected(uuid)) {
throw new IllegalArgumentException("This player is not controlled by ViaVersion!");
}
UserConnection ci = Via.getManager().getConnection(uuid);
ci.sendRawPacket(packet);
}
@Override
public void sendRawPacket(ProxiedPlayer player, ByteBuf packet) throws IllegalArgumentException {
sendRawPacket(player.getUniqueId(), packet);
}
@Override
public BossBar createBossBar(String title, BossColor color, BossStyle style) {
return new BungeeBossBar(title, 1F, color, style);
}
@Override
public BossBar createBossBar(String title, float health, BossColor color, BossStyle style) {
return new BungeeBossBar(title, health, color, style);
}
@Override
public SortedSet<Integer> getSupportedVersions() {
SortedSet<Integer> outputSet = new TreeSet<>(ProtocolRegistry.getSupportedVersions());
outputSet.removeAll(Via.getPlatform().getConf().getBlockedProtocols());
return outputSet;
}
/**
* Forces ViaVersion to probe a server
*
* @param serverInfo The serverinfo to probe
*/
public void probeServer(ServerInfo serverInfo) {
ProtocolDetectorService.probeServer(serverInfo);
}
}
@@ -0,0 +1,110 @@
package us.myles.ViaVersion.bungee.platform;
import us.myles.ViaVersion.AbstractViaConfig;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider;
import java.io.File;
import java.net.URL;
import java.util.*;
public class BungeeViaConfig extends AbstractViaConfig {
private static final List<String> UNSUPPORTED = Arrays.asList("nms-player-ticking", "item-cache", "anti-xray-patch", "quick-move-action-fix", "velocity-ping-interval", "velocity-ping-save", "velocity-servers", "blockconnection-method", "change-1_9-hitbox", "change-1_14-hitbox");
private int bungeePingInterval;
private boolean bungeePingSave;
private Map<String, Integer> bungeeServerProtocols;
public BungeeViaConfig(File configFile) {
super(new File(configFile, "config.yml"));
reloadConfig();
}
@Override
protected void loadFields() {
super.loadFields();
bungeePingInterval = getInt("bungee-ping-interval", 60);
bungeePingSave = getBoolean("bungee-ping-save", true);
bungeeServerProtocols = get("bungee-servers", Map.class, new HashMap<>());
}
@Override
public URL getDefaultConfigURL() {
return BungeeViaConfig.class.getClassLoader().getResource("assets/viaversion/config.yml");
}
@Override
protected void handleConfig(Map<String, Object> config) {
// Parse servers
Map<String, Object> servers;
if (!(config.get("bungee-servers") instanceof Map)) {
servers = new HashMap<>();
} else {
servers = (Map) config.get("bungee-servers");
}
// Convert any bad Protocol Ids
for (Map.Entry<String, Object> entry : new HashSet<>(servers.entrySet())) {
if (!(entry.getValue() instanceof Integer)) {
if (entry.getValue() instanceof String) {
ProtocolVersion found = ProtocolVersion.getClosest((String) entry.getValue());
if (found != null) {
servers.put(entry.getKey(), found.getId());
} else {
servers.remove(entry.getKey()); // Remove!
}
} else {
servers.remove(entry.getKey()); // Remove!
}
}
}
// Ensure default exists
if (!servers.containsKey("default")) {
servers.put("default", BungeeVersionProvider.getLowestSupportedVersion());
}
// Put back
config.put("bungee-servers", servers);
}
@Override
public List<String> getUnsupportedOptions() {
return UNSUPPORTED;
}
@Override
public boolean isItemCache() {
return false;
}
@Override
public boolean isNMSPlayerTicking() {
return false;
}
/**
* What is the interval for checking servers via ping
* -1 for disabled
*
* @return Ping interval in seconds
*/
public int getBungeePingInterval() {
return bungeePingInterval;
}
/**
* Should the bungee ping be saved to the config on change.
*
* @return True if it should save
*/
public boolean isBungeePingSave() {
return bungeePingSave;
}
/**
* Get the listed server protocols in the config.
* default will be listed as default.
*
* @return Map of String, Integer
*/
public Map<String, Integer> getBungeeServerProtocols() {
return bungeeServerProtocols;
}
}
@@ -0,0 +1,97 @@
package us.myles.ViaVersion.bungee.platform;
import com.google.gson.JsonObject;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.platform.ViaInjector;
import us.myles.ViaVersion.bungee.handlers.BungeeChannelInitializer;
import us.myles.ViaVersion.util.ReflectionUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.List;
public class BungeeViaInjector implements ViaInjector {
@Override
public void inject() throws Exception {
try {
Class<?> pipelineUtils = Class.forName("net.md_5.bungee.netty.PipelineUtils");
Field field = pipelineUtils.getDeclaredField("SERVER_CHILD");
field.setAccessible(true);
// Remove the final modifier (unless removed by a fork)
int modifiers = field.getModifiers();
if (Modifier.isFinal(modifiers)) {
try {
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, modifiers & ~Modifier.FINAL);
} catch (NoSuchFieldException e) {
// Java 12 compatibility *this is fine*
Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
getDeclaredFields0.setAccessible(true);
Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false);
for (Field classField : fields) {
if ("modifiers".equals(classField.getName())) {
classField.setAccessible(true);
classField.set(field, modifiers & ~Modifier.FINAL);
break;
}
}
}
}
BungeeChannelInitializer newInit = new BungeeChannelInitializer((ChannelInitializer<Channel>) field.get(null));
field.set(null, newInit);
} catch (Exception e) {
Via.getPlatform().getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version.");
throw e;
}
}
@Override
public void uninject() {
Via.getPlatform().getLogger().severe("ViaVersion cannot remove itself from Bungee without a reboot!");
}
@Override
public int getServerProtocolVersion() throws Exception {
return (int) ReflectionUtil.getStatic(Class.forName("net.md_5.bungee.protocol.ProtocolConstants"), "SUPPORTED_VERSION_IDS", List.class).get(0);
}
@Override
public String getEncoderName() {
return "via-encoder";
}
@Override
public String getDecoderName() {
return "via-decoder";
}
private ChannelInitializer<Channel> getChannelInitializer() throws Exception {
Class<?> pipelineUtils = Class.forName("net.md_5.bungee.netty.PipelineUtils");
Field field = pipelineUtils.getDeclaredField("SERVER_CHILD");
field.setAccessible(true);
return (ChannelInitializer<Channel>) field.get(null);
}
@Override
public JsonObject getDump() {
JsonObject data = new JsonObject();
try {
ChannelInitializer<Channel> initializer = getChannelInitializer();
data.addProperty("currentInitializer", initializer.getClass().getName());
if (initializer instanceof BungeeChannelInitializer) {
data.addProperty("originalInitializer", ((BungeeChannelInitializer) initializer).getOriginal().getClass().getName());
}
} catch (Exception e) {
// Ignored, not printed in the dump
}
return data;
}
}
@@ -0,0 +1,83 @@
package us.myles.ViaVersion.bungee.platform;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.scheduler.ScheduledTask;
import us.myles.ViaVersion.BungeePlugin;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.platform.ViaPlatformLoader;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bungee.handlers.BungeeServerHandler;
import us.myles.ViaVersion.bungee.listeners.ElytraPatch;
import us.myles.ViaVersion.bungee.listeners.UpdateListener;
import us.myles.ViaVersion.bungee.providers.*;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
import us.myles.ViaVersion.protocols.base.VersionProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BossBarProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.EntityIdProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MainHandProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class BungeeViaLoader implements ViaPlatformLoader {
private final BungeePlugin plugin;
private final Set<Listener> listeners = new HashSet<>();
private final Set<ScheduledTask> tasks = new HashSet<>();
public BungeeViaLoader(BungeePlugin plugin) {
this.plugin = plugin;
}
private void registerListener(Listener listener) {
listeners.add(listener);
ProxyServer.getInstance().getPluginManager().registerListener(plugin, listener);
}
@Override
public void load() {
// Listeners
registerListener(plugin);
registerListener(new UpdateListener());
registerListener(new BungeeServerHandler());
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) {
registerListener(new ElytraPatch());
}
// Providers
Via.getManager().getProviders().use(VersionProvider.class, new BungeeVersionProvider());
Via.getManager().getProviders().use(EntityIdProvider.class, new BungeeEntityIdProvider());
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) {
Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter());
Via.getManager().getProviders().use(BossBarProvider.class, new BungeeBossBarProvider());
Via.getManager().getProviders().use(MainHandProvider.class, new BungeeMainHandProvider());
}
if (plugin.getConf().getBungeePingInterval() > 0) {
tasks.add(plugin.getProxy().getScheduler().schedule(
plugin,
new ProtocolDetectorService(plugin),
0, plugin.getConf().getBungeePingInterval(),
TimeUnit.SECONDS
));
}
}
@Override
public void unload() {
for (Listener listener : listeners) {
ProxyServer.getInstance().getPluginManager().unregisterListener(listener);
}
listeners.clear();
for (ScheduledTask task : tasks) {
task.cancel();
}
tasks.clear();
}
}
@@ -0,0 +1,30 @@
package us.myles.ViaVersion.bungee.providers;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bungee.storage.BungeeStorage;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BossBarProvider;
import java.util.UUID;
public class BungeeBossBarProvider extends BossBarProvider {
@Override
public void handleAdd(UserConnection user, UUID barUUID) {
if (user.has(BungeeStorage.class)) {
BungeeStorage storage = user.get(BungeeStorage.class);
// Check if bossbars are supported by bungee, static maybe
if (storage.getBossbar() != null) {
storage.getBossbar().add(barUUID);
}
}
}
@Override
public void handleRemove(UserConnection user, UUID barUUID) {
if (user.has(BungeeStorage.class)) {
BungeeStorage storage = user.get(BungeeStorage.class);
if (storage.getBossbar() != null) {
storage.getBossbar().remove(barUUID);
}
}
}
}
@@ -0,0 +1,28 @@
package us.myles.ViaVersion.bungee.providers;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.bungee.storage.BungeeStorage;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.EntityIdProvider;
import java.lang.reflect.Method;
public class BungeeEntityIdProvider extends EntityIdProvider {
private static Method getClientEntityId;
static {
try {
getClientEntityId = Class.forName("net.md_5.bungee.UserConnection").getDeclaredMethod("getClientEntityId");
} catch (NoSuchMethodException | ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
public int getEntityId(UserConnection user) throws Exception {
BungeeStorage storage = user.get(BungeeStorage.class);
ProxiedPlayer player = storage.getPlayer();
return (int) getClientEntityId.invoke(player);
}
}
@@ -0,0 +1,42 @@
package us.myles.ViaVersion.bungee.providers;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MainHandProvider;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/*
This solves the wrong mainhand issue when you join with BungeeCord on a 1.8 server, and switch to a 1.9 or higher.
*/
public class BungeeMainHandProvider extends MainHandProvider {
private static Method getSettings = null;
private static Method setMainHand = null;
static {
try {
getSettings = Class.forName("net.md_5.bungee.UserConnection").getDeclaredMethod("getSettings");
setMainHand = Class.forName("net.md_5.bungee.protocol.packet.ClientSettings").getDeclaredMethod("setMainHand", int.class);
} catch (Exception ignored) {
}
}
@Override
public void setMainHand(UserConnection user, int hand) {
ProtocolInfo info = user.getProtocolInfo();
if (info == null || info.getUuid() == null) return;
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(info.getUuid());
if (player == null) return;
try {
Object settings = getSettings.invoke(player);
if (settings != null) {
setMainHand.invoke(settings, hand);
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,35 @@
package us.myles.ViaVersion.bungee.providers;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.packets.State;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker;
public class BungeeMovementTransmitter extends MovementTransmitterProvider {
@Override
public Object getFlyingPacket() {
return null;
}
@Override
public Object getGroundPacket() {
return null;
}
public void sendPlayer(UserConnection userConnection) {
if (userConnection.getProtocolInfo().getState() == State.PLAY) {
PacketWrapper wrapper = new PacketWrapper(0x03, null, userConnection);
wrapper.write(Type.BOOLEAN, userConnection.get(MovementTracker.class).isGround());
try {
wrapper.sendToServer(Protocol1_9To1_8.class);
} catch (Exception e) {
e.printStackTrace();
}
// PlayerPackets will increment idle
}
}
}
@@ -0,0 +1,74 @@
package us.myles.ViaVersion.bungee.providers;
import com.google.common.collect.Lists;
import net.md_5.bungee.api.ProxyServer;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.base.VersionProvider;
import us.myles.ViaVersion.util.ReflectionUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BungeeVersionProvider extends VersionProvider {
private static Class<?> ref;
static {
try {
ref = Class.forName("net.md_5.bungee.protocol.ProtocolConstants");
} catch (Exception e) {
Via.getPlatform().getLogger().severe("Could not detect the ProtocolConstants class");
e.printStackTrace();
}
}
@Override
public int getServerProtocol(UserConnection user) throws Exception {
if (ref == null)
return super.getServerProtocol(user);
// TODO Have one constant list forever until restart? (Might limit plugins if they change this)
List<Integer> list = ReflectionUtil.getStatic(ref, "SUPPORTED_VERSION_IDS", List.class);
List<Integer> sorted = new ArrayList<>(list);
Collections.sort(sorted);
ProtocolInfo info = user.getProtocolInfo();
// Bungee supports it
if (sorted.contains(info.getProtocolVersion()))
return info.getProtocolVersion();
// Older than bungee supports, get the lowest version
if (info.getProtocolVersion() < sorted.get(0)) {
return getLowestSupportedVersion();
}
// Loop through all protocols to get the closest protocol id that bungee supports (and that viaversion does too)
// TODO: This needs a better fix, i.e checking ProtocolRegistry to see if it would work.
// This is more of a workaround for snapshot support by bungee.
for (Integer protocol : Lists.reverse(sorted)) {
if (info.getProtocolVersion() > protocol && ProtocolVersion.isRegistered(protocol))
return protocol;
}
Via.getPlatform().getLogger().severe("Panic, no protocol id found for " + info.getProtocolVersion());
return info.getProtocolVersion();
}
public static int getLowestSupportedVersion() {
List<Integer> list;
try {
list = ReflectionUtil.getStatic(ref, "SUPPORTED_VERSION_IDS", List.class);
return list.get(0);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// Fallback
return ProxyServer.getInstance().getProtocolVersion();
}
}
@@ -0,0 +1,92 @@
package us.myles.ViaVersion.bungee.service;
import net.md_5.bungee.api.Callback;
import net.md_5.bungee.api.ServerPing;
import net.md_5.bungee.api.config.ServerInfo;
import us.myles.ViaVersion.BungeePlugin;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.bungee.platform.BungeeViaConfig;
import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ProtocolDetectorService implements Runnable {
private static final Map<String, Integer> detectedProtocolIds = new ConcurrentHashMap<>();
private static ProtocolDetectorService instance;
private final BungeePlugin plugin;
public ProtocolDetectorService(BungeePlugin plugin) {
this.plugin = plugin;
instance = this;
}
public static Integer getProtocolId(String serverName) {
// Step 1. Check Config
Map<String, Integer> servers = ((BungeeViaConfig) Via.getConfig()).getBungeeServerProtocols();
Integer protocol = servers.get(serverName);
if (protocol != null) {
return protocol;
}
// Step 2. Check Detected
Integer detectedProtocol = detectedProtocolIds.get(serverName);
if (detectedProtocol != null) {
return detectedProtocol;
}
// Step 3. Use Default
Integer defaultProtocol = servers.get("default");
if (defaultProtocol != null) {
return defaultProtocol;
}
// Step 4: Use bungee lowest supported... *cries*
return BungeeVersionProvider.getLowestSupportedVersion();
}
@Override
public void run() {
for (final Map.Entry<String, ServerInfo> lists : plugin.getProxy().getServers().entrySet()) {
probeServer(lists.getValue());
}
}
public static void probeServer(final ServerInfo serverInfo) {
final String key = serverInfo.getName();
serverInfo.ping(new Callback<ServerPing>() {
@Override
public void done(ServerPing serverPing, Throwable throwable) {
if (throwable == null && serverPing != null && serverPing.getVersion() != null) {
// Ensure protocol is positive, some services will return -1
if (serverPing.getVersion().getProtocol() > 0) {
detectedProtocolIds.put(key, serverPing.getVersion().getProtocol());
if (((BungeeViaConfig) Via.getConfig()).isBungeePingSave()) {
Map<String, Integer> servers = ((BungeeViaConfig) Via.getConfig()).getBungeeServerProtocols();
Integer protocol = servers.get(key);
if (protocol != null && protocol == serverPing.getVersion().getProtocol()) {
return;
}
// Ensure we're the only ones writing to the config
synchronized (Via.getPlatform().getConfigurationProvider()) {
servers.put(key, serverPing.getVersion().getProtocol());
}
// Save
Via.getPlatform().getConfigurationProvider().saveConfig();
}
}
}
}
});
}
public static Map<String, Integer> getDetectedIds() {
return new HashMap<>(detectedProtocolIds);
}
public static ProtocolDetectorService getInstance() {
return instance;
}
public BungeePlugin getPlugin() {
return plugin;
}
}
@@ -0,0 +1,79 @@
package us.myles.ViaVersion.bungee.storage;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import us.myles.ViaVersion.api.data.StoredObject;
import us.myles.ViaVersion.api.data.UserConnection;
import java.lang.reflect.Field;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
public class BungeeStorage extends StoredObject {
private static Field bossField;
static {
try {
Class<?> user = Class.forName("net.md_5.bungee.UserConnection");
bossField = user.getDeclaredField("sentBossBars");
bossField.setAccessible(true);
} catch (ClassNotFoundException e) {
// Not supported *shrug* probably modified
} catch (NoSuchFieldException e) {
// Not supported, old version probably
}
}
private final ProxiedPlayer player;
private String currentServer;
private Set<UUID> bossbar;
public BungeeStorage(UserConnection user, ProxiedPlayer player) {
super(user);
this.player = player;
this.currentServer = "";
// Get bossbar list if it's supported
if (bossField != null) {
try {
bossbar = (Set<UUID>) bossField.get(player);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public ProxiedPlayer getPlayer() {
return player;
}
public String getCurrentServer() {
return currentServer;
}
public void setCurrentServer(String currentServer) {
this.currentServer = currentServer;
}
public Set<UUID> getBossbar() {
return bossbar;
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BungeeStorage that = (BungeeStorage) o;
if (!Objects.equals(player, that.player)) return false;
if (!Objects.equals(currentServer, that.currentServer)) return false;
return Objects.equals(bossbar, that.bossbar);
}
@Override
public int hashCode() {
int result = player != null ? player.hashCode() : 0;
result = 31 * result + (currentServer != null ? currentServer.hashCode() : 0);
result = 31 * result + (bossbar != null ? bossbar.hashCode() : 0);
return result;
}
}
@@ -0,0 +1,69 @@
package us.myles.ViaVersion.bungee.util;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import io.netty.handler.codec.MessageToMessageDecoder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class BungeePipelineUtil {
private static Method DECODE_METHOD;
private static Method ENCODE_METHOD;
static {
try {
DECODE_METHOD = MessageToMessageDecoder.class.getDeclaredMethod("decode", ChannelHandlerContext.class, Object.class, List.class);
DECODE_METHOD.setAccessible(true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
ENCODE_METHOD = MessageToByteEncoder.class.getDeclaredMethod("encode", ChannelHandlerContext.class, Object.class, ByteBuf.class);
ENCODE_METHOD.setAccessible(true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
public static List<Object> callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, ByteBuf input) throws InvocationTargetException {
List<Object> output = new ArrayList<>();
try {
BungeePipelineUtil.DECODE_METHOD.invoke(decoder, ctx, input, output);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return output;
}
public static ByteBuf callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, ByteBuf input) throws InvocationTargetException {
ByteBuf output = ctx.alloc().buffer();
try {
BungeePipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, input, output);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return output;
}
public static ByteBuf decompress(ChannelHandlerContext ctx, ByteBuf bytebuf) {
try {
return (ByteBuf) callDecode((MessageToMessageDecoder) ctx.pipeline().get("decompress"), ctx.pipeline().context("decompress"), bytebuf).get(0);
} catch (InvocationTargetException e) {
e.printStackTrace();
return ctx.alloc().buffer();
}
}
public static ByteBuf compress(ChannelHandlerContext ctx, ByteBuf bytebuf) {
try {
return callEncode((MessageToByteEncoder) ctx.pipeline().get("compress"), ctx.pipeline().context("compress"), bytebuf);
} catch (InvocationTargetException e) {
e.printStackTrace();
return ctx.alloc().buffer();
}
}
}
+5
View File
@@ -0,0 +1,5 @@
name: ViaVersion
main: us.myles.ViaVersion.BungeePlugin
description: ${project.description}
author: _MylesC, creeper123123321, Gerrygames, KennyTV, Matsv
version: ${project.version}
+4 -4
View File
@@ -1,11 +1,11 @@
machine:
java:
version: oraclejdk7
version: oraclejdk8
general:
artifacts:
- "target/*.jar"
- "target/*.jar"
test:
override:
- mvn clean install -B
- mvn clean install -B
post:
- cp ./target/*.jar $CIRCLE_ARTIFACTS
- cp ./target/*.jar $CIRCLE_ARTIFACTS
+31
View File
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>viaversion-parent</artifactId>
<groupId>us.myles</groupId>
<version>3.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>viaversion-common</artifactId>
<dependencies>
<!-- Snake YAML -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.18</version>
<scope>compile</scope> <!-- Velocity doesn't have snakeyaml -->
</dependency>
<!-- FastUtil for performance increases -->
<dependency>
<groupId>it.unimi.dsi</groupId>
<artifactId>fastutil</artifactId>
<version>8.3.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,373 @@
package us.myles.ViaVersion;
import us.myles.ViaVersion.api.ViaVersionConfig;
import us.myles.ViaVersion.util.Config;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
public abstract class AbstractViaConfig extends Config implements ViaVersionConfig {
private boolean checkForUpdates;
private boolean preventCollision;
private boolean useNewEffectIndicator;
private boolean useNewDeathmessages;
private boolean suppressMetadataErrors;
private boolean shieldBlocking;
private boolean hologramPatch;
private boolean pistonAnimationPatch;
private boolean bossbarPatch;
private boolean bossbarAntiFlicker;
private double hologramOffset;
private int maxPPS;
private String maxPPSKickMessage;
private int trackingPeriod;
private int warningPPS;
private int maxPPSWarnings;
private String maxPPSWarningsKickMessage;
private boolean sendSupportedVersions;
private boolean simulatePlayerTick;
private boolean itemCache;
private boolean nmsPlayerTicking;
private boolean replacePistons;
private int pistonReplacementId;
private boolean autoTeam;
private boolean forceJsonTransform;
private boolean nbtArrayFix;
private Set<Integer> blockedProtocols;
private String blockedDisconnectMessage;
private String reloadDisconnectMessage;
private boolean suppressConversionWarnings;
private boolean disable1_13TabComplete;
private boolean minimizeCooldown;
private boolean teamColourFix;
private boolean serversideBlockConnections;
private boolean reduceBlockStorageMemory;
private boolean flowerStemWhenBlockAbove;
private boolean vineClimbFix;
private boolean snowCollisionFix;
private boolean infestedBlocksFix;
private int tabCompleteDelay;
private boolean truncate1_14Books;
private boolean leftHandedHandling;
private boolean fullBlockLightFix;
private boolean healthNaNFix;
private boolean instantRespawn;
private boolean ignoreLongChannelNames;
protected AbstractViaConfig(File configFile) {
super(configFile);
}
@Override
public void reloadConfig() {
super.reloadConfig();
loadFields();
}
protected void loadFields() {
checkForUpdates = getBoolean("checkforupdates", true);
preventCollision = getBoolean("prevent-collision", true);
useNewEffectIndicator = getBoolean("use-new-effect-indicator", true);
useNewDeathmessages = getBoolean("use-new-deathmessages", true);
suppressMetadataErrors = getBoolean("suppress-metadata-errors", false);
shieldBlocking = getBoolean("shield-blocking", true);
hologramPatch = getBoolean("hologram-patch", false);
pistonAnimationPatch = getBoolean("piston-animation-patch", false);
bossbarPatch = getBoolean("bossbar-patch", true);
bossbarAntiFlicker = getBoolean("bossbar-anti-flicker", false);
hologramOffset = getDouble("hologram-y", -0.96D);
maxPPS = getInt("max-pps", 800);
maxPPSKickMessage = getString("max-pps-kick-msg", "Sending packets too fast? lag?");
trackingPeriod = getInt("tracking-period", 6);
warningPPS = getInt("tracking-warning-pps", 120);
maxPPSWarnings = getInt("tracking-max-warnings", 3);
maxPPSWarningsKickMessage = getString("tracking-max-kick-msg", "You are sending too many packets, :(");
sendSupportedVersions = getBoolean("send-supported-versions", false);
simulatePlayerTick = getBoolean("simulate-pt", true);
itemCache = getBoolean("item-cache", true);
nmsPlayerTicking = getBoolean("nms-player-ticking", true);
replacePistons = getBoolean("replace-pistons", false);
pistonReplacementId = getInt("replacement-piston-id", 0);
autoTeam = getBoolean("auto-team", true);
forceJsonTransform = getBoolean("force-json-transform", false);
nbtArrayFix = getBoolean("chat-nbt-fix", true);
blockedProtocols = new HashSet<>(getIntegerList("block-protocols"));
blockedDisconnectMessage = getString("block-disconnect-msg", "You are using an unsupported Minecraft version!");
reloadDisconnectMessage = getString("reload-disconnect-msg", "Server reload, please rejoin!");
minimizeCooldown = getBoolean("minimize-cooldown", true);
teamColourFix = getBoolean("team-colour-fix", true);
suppressConversionWarnings = getBoolean("suppress-conversion-warnings", false);
disable1_13TabComplete = getBoolean("disable-1_13-auto-complete", false);
serversideBlockConnections = getBoolean("serverside-blockconnections", true);
reduceBlockStorageMemory = getBoolean("reduce-blockstorage-memory", false);
flowerStemWhenBlockAbove = getBoolean("flowerstem-when-block-above", false);
vineClimbFix = getBoolean("vine-climb-fix", false);
snowCollisionFix = getBoolean("fix-low-snow-collision", false);
infestedBlocksFix = getBoolean("fix-infested-block-breaking", true);
tabCompleteDelay = getInt("1_13-tab-complete-delay", 0);
truncate1_14Books = getBoolean("truncate-1_14-books", false);
leftHandedHandling = getBoolean("left-handed-handling", true);
fullBlockLightFix = getBoolean("fix-non-full-blocklight", false);
healthNaNFix = getBoolean("fix-1_14-health-nan", true);
instantRespawn = getBoolean("use-1_15-instant-respawn", false);
ignoreLongChannelNames = getBoolean("ignore-long-1_16-channel-names", true);
}
@Override
public boolean isCheckForUpdates() {
return checkForUpdates;
}
@Override
public boolean isPreventCollision() {
return preventCollision;
}
@Override
public boolean isNewEffectIndicator() {
return useNewEffectIndicator;
}
@Override
public boolean isShowNewDeathMessages() {
return useNewDeathmessages;
}
@Override
public boolean isSuppressMetadataErrors() {
return suppressMetadataErrors;
}
@Override
public boolean isShieldBlocking() {
return shieldBlocking;
}
@Override
public boolean isHologramPatch() {
return hologramPatch;
}
@Override
public boolean isPistonAnimationPatch() {
return pistonAnimationPatch;
}
@Override
public boolean isBossbarPatch() {
return bossbarPatch;
}
@Override
public boolean isBossbarAntiflicker() {
return bossbarAntiFlicker;
}
@Override
public double getHologramYOffset() {
return hologramOffset;
}
@Override
public int getMaxPPS() {
return maxPPS;
}
@Override
public String getMaxPPSKickMessage() {
return maxPPSKickMessage;
}
@Override
public int getTrackingPeriod() {
return trackingPeriod;
}
@Override
public int getWarningPPS() {
return warningPPS;
}
@Override
public int getMaxWarnings() {
return maxPPSWarnings;
}
@Override
public String getMaxWarningsKickMessage() {
return maxPPSWarningsKickMessage;
}
@Override
public boolean isAntiXRay() {
return false;
}
@Override
public boolean isSendSupportedVersions() {
return sendSupportedVersions;
}
@Override
public boolean isSimulatePlayerTick() {
return simulatePlayerTick;
}
@Override
public boolean isItemCache() {
return itemCache;
}
@Override
public boolean isNMSPlayerTicking() {
return nmsPlayerTicking;
}
@Override
public boolean isReplacePistons() {
return replacePistons;
}
@Override
public int getPistonReplacementId() {
return pistonReplacementId;
}
@Override
public boolean isAutoTeam() {
// Collision has to be enabled first
return preventCollision && autoTeam;
}
@Override
public boolean isForceJsonTransform() {
return forceJsonTransform;
}
@Override
public boolean is1_12NBTArrayFix() {
return nbtArrayFix;
}
@Override
public boolean is1_12QuickMoveActionFix() {
return false;
}
@Override
public Set<Integer> getBlockedProtocols() {
return blockedProtocols;
}
@Override
public String getBlockedDisconnectMsg() {
return blockedDisconnectMessage;
}
@Override
public String getReloadDisconnectMsg() {
return reloadDisconnectMessage;
}
@Override
public boolean isMinimizeCooldown() {
return minimizeCooldown;
}
@Override
public boolean is1_13TeamColourFix() {
return teamColourFix;
}
@Override
public boolean isSuppressConversionWarnings() {
return suppressConversionWarnings;
}
@Override
public boolean isDisable1_13AutoComplete() {
return disable1_13TabComplete;
}
@Override
public boolean isServersideBlockConnections() {
return serversideBlockConnections;
}
@Override
public String getBlockConnectionMethod() {
return "packet";
}
@Override
public boolean isReduceBlockStorageMemory() {
return reduceBlockStorageMemory;
}
@Override
public boolean isStemWhenBlockAbove() {
return flowerStemWhenBlockAbove;
}
@Override
public boolean isVineClimbFix() {
return vineClimbFix;
}
@Override
public boolean isSnowCollisionFix() {
return snowCollisionFix;
}
@Override
public boolean isInfestedBlocksFix() {
return infestedBlocksFix;
}
@Override
public int get1_13TabCompleteDelay() {
return tabCompleteDelay;
}
@Override
public boolean isTruncate1_14Books() {
return truncate1_14Books;
}
@Override
public boolean isLeftHandedHandling() {
return leftHandedHandling;
}
@Override
public boolean is1_9HitboxFix() {
return false;
}
@Override
public boolean is1_14HitboxFix() {
return false;
}
@Override
public boolean isNonFullBlockLightFix() {
return fullBlockLightFix;
}
@Override
public boolean is1_14HealthNaNFix() {
return healthNaNFix;
}
@Override
public boolean is1_15InstantRespawn() {
return instantRespawn;
}
@Override
public boolean isIgnoreLong1_16ChannelNames() {
return ignoreLongChannelNames;
}
}
@@ -0,0 +1,259 @@
package us.myles.ViaVersion;
import org.jetbrains.annotations.Nullable;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.platform.TaskId;
import us.myles.ViaVersion.api.platform.ViaConnectionManager;
import us.myles.ViaVersion.api.platform.ViaInjector;
import us.myles.ViaVersion.api.platform.ViaPlatform;
import us.myles.ViaVersion.api.platform.ViaPlatformLoader;
import us.myles.ViaVersion.api.platform.providers.ViaProviders;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.commands.ViaCommandHandler;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.TabCompleteThread;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.ViaIdleThread;
import us.myles.ViaVersion.update.UpdateUtil;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class ViaManager {
private final ViaPlatform<?> platform;
private final ViaProviders providers = new ViaProviders();
// Internals
private final ViaInjector injector;
private final ViaCommandHandler commandHandler;
private final ViaPlatformLoader loader;
private final Set<String> subPlatforms = new HashSet<>();
private List<Runnable> enableListeners = new ArrayList<>();
private TaskId mappingLoadingTask;
private boolean debug;
public ViaManager(ViaPlatform<?> platform, ViaInjector injector, ViaCommandHandler commandHandler, ViaPlatformLoader loader) {
this.platform = platform;
this.injector = injector;
this.commandHandler = commandHandler;
this.loader = loader;
}
public static ViaManagerBuilder builder() {
return new ViaManagerBuilder();
}
public void init() {
if (System.getProperty("ViaVersion") != null) {
// Reload?
platform.onReload();
}
// Check for updates
if (platform.getConf().isCheckForUpdates()) {
UpdateUtil.sendUpdateMessage();
}
// Force class load
ProtocolRegistry.init();
// Inject
try {
injector.inject();
} catch (Exception e) {
platform.getLogger().severe("ViaVersion failed to inject:");
e.printStackTrace();
return;
}
// Mark as injected
System.setProperty("ViaVersion", platform.getPluginVersion());
for (Runnable listener : enableListeners) {
listener.run();
}
enableListeners = null;
// If successful
platform.runSync(this::onServerLoaded);
}
public void onServerLoaded() {
// Load Server Protocol
try {
ProtocolRegistry.SERVER_PROTOCOL = injector.getServerProtocolVersion();
} catch (Exception e) {
platform.getLogger().severe("ViaVersion failed to get the server protocol!");
e.printStackTrace();
}
// Check if there are any pipes to this version
if (ProtocolRegistry.SERVER_PROTOCOL != -1) {
platform.getLogger().info("ViaVersion detected server version: " + ProtocolVersion.getProtocol(ProtocolRegistry.SERVER_PROTOCOL));
if (!ProtocolRegistry.isWorkingPipe()) {
platform.getLogger().warning("ViaVersion does not have any compatible versions for this server version!");
platform.getLogger().warning("Please remember that ViaVersion only adds support for versions newer than the server version.");
platform.getLogger().warning("If you need support for older versions you may need to use one or more ViaVersion addons too.");
platform.getLogger().warning("In that case please read the ViaVersion resource page carefully, and if you're");
platform.getLogger().warning("still unsure, feel free to join our Discord-Server for further assistance.");
}
}
// Load Listeners / Tasks
ProtocolRegistry.onServerLoaded();
// Load Platform
loader.load();
// Common tasks
mappingLoadingTask = Via.getPlatform().runRepeatingSync(() -> {
if (ProtocolRegistry.checkForMappingCompletion()) {
platform.cancelTask(mappingLoadingTask);
mappingLoadingTask = null;
}
}, 10L);
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) {
if (Via.getConfig().isSimulatePlayerTick()) {
Via.getPlatform().runRepeatingSync(new ViaIdleThread(), 1L);
}
}
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_13.getId()) {
if (Via.getConfig().get1_13TabCompleteDelay() > 0) {
Via.getPlatform().runRepeatingSync(new TabCompleteThread(), 1L);
}
}
// Refresh Versions
ProtocolRegistry.refreshVersions();
}
public void destroy() {
// Uninject
platform.getLogger().info("ViaVersion is disabling, if this is a reload and you experience issues consider rebooting.");
try {
injector.uninject();
} catch (Exception e) {
platform.getLogger().severe("ViaVersion failed to uninject:");
e.printStackTrace();
}
// Unload
loader.unload();
}
public Set<UserConnection> getConnections() {
return platform.getConnectionManager().getConnections();
}
/**
* @deprecated use getConnectedClients()
*/
@Deprecated
public Map<UUID, UserConnection> getPortedPlayers() {
return getConnectedClients();
}
public Map<UUID, UserConnection> getConnectedClients() {
return platform.getConnectionManager().getConnectedClients();
}
public UUID getConnectedClientId(UserConnection conn) {
return platform.getConnectionManager().getConnectedClientId(conn);
}
/**
* @see ViaConnectionManager#isClientConnected(UUID)
*/
public boolean isClientConnected(UUID player) {
return platform.getConnectionManager().isClientConnected(player);
}
public void handleLoginSuccess(UserConnection info) {
platform.getConnectionManager().onLoginSuccess(info);
}
public ViaPlatform<?> getPlatform() {
return platform;
}
public ViaProviders getProviders() {
return providers;
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
public ViaInjector getInjector() {
return injector;
}
public ViaCommandHandler getCommandHandler() {
return commandHandler;
}
public ViaPlatformLoader getLoader() {
return loader;
}
/**
* Returns a mutable set of self-added subplatform version strings.
* This set is expanded by the subplatform itself (e.g. ViaBackwards), and may not contain all running ones.
*
* @return mutable set of subplatform versions
*/
public Set<String> getSubPlatforms() {
return subPlatforms;
}
/**
* @see ViaConnectionManager#getConnectedClient(UUID)
*/
@Nullable
public UserConnection getConnection(UUID playerUUID) {
return platform.getConnectionManager().getConnectedClient(playerUUID);
}
/**
* Adds a runnable to be executed when ViaVersion has finished its init before the full server load.
*
* @param runnable runnable to be executed
*/
public void addEnableListener(Runnable runnable) {
enableListeners.add(runnable);
}
public static final class ViaManagerBuilder {
private ViaPlatform<?> platform;
private ViaInjector injector;
private ViaCommandHandler commandHandler;
private ViaPlatformLoader loader;
public ViaManagerBuilder platform(ViaPlatform<?> platform) {
this.platform = platform;
return this;
}
public ViaManagerBuilder injector(ViaInjector injector) {
this.injector = injector;
return this;
}
public ViaManagerBuilder loader(ViaPlatformLoader loader) {
this.loader = loader;
return this;
}
public ViaManagerBuilder commandHandler(ViaCommandHandler commandHandler) {
this.commandHandler = commandHandler;
return this;
}
public ViaManager build() {
return new ViaManager(platform, injector, commandHandler, loader);
}
}
}
@@ -0,0 +1,537 @@
package us.myles.ViaVersion.api;
import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.api.remapper.ValueCreator;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.api.type.TypeConverter;
import us.myles.ViaVersion.exception.CancelException;
import us.myles.ViaVersion.exception.InformativeException;
import us.myles.ViaVersion.packets.Direction;
import us.myles.ViaVersion.packets.State;
import us.myles.ViaVersion.util.PipelineUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
public class PacketWrapper {
public static final int PASSTHROUGH_ID = 1000;
private final ByteBuf inputBuffer;
private final UserConnection userConnection;
private boolean send = true;
private int id = -1;
private final LinkedList<Pair<Type, Object>> readableObjects = new LinkedList<>();
private final List<Pair<Type, Object>> packetValues = new ArrayList<>();
public PacketWrapper(int packetID, ByteBuf inputBuffer, UserConnection userConnection) {
this.id = packetID;
this.inputBuffer = inputBuffer;
this.userConnection = userConnection;
}
/**
* Get a part from the output
*
* @param type The type of the part you wish to get.
* @param <T> The return type of the type you wish to get.
* @param index The index of the part (relative to the type)
* @return The requested type or throws ArrayIndexOutOfBounds
* @throws InformativeException If it fails to find it, an exception will be thrown.
*/
public <T> T get(Type<T> type, int index) throws Exception {
int currentIndex = 0;
for (Pair<Type, Object> packetValue : packetValues) {
if (packetValue.getKey() == type) { // Ref check
if (currentIndex == index) {
return (T) packetValue.getValue();
}
currentIndex++;
}
}
Exception e = new ArrayIndexOutOfBoundsException("Could not find type " + type.getTypeName() + " at " + index);
throw new InformativeException(e).set("Type", type.getTypeName()).set("Index", index).set("Packet ID", getId()).set("Data", packetValues);
}
/**
* Check if a type is at an index
*
* @param type The type of the part you wish to get.
* @param index The index of the part (relative to the type)
* @return True if the type is at the index
*/
public boolean is(Type type, int index) {
int currentIndex = 0;
for (Pair<Type, Object> packetValue : packetValues) {
if (packetValue.getKey() == type) { // Ref check
if (currentIndex == index) {
return true;
}
currentIndex++;
}
}
return false;
}
/**
* Check if a type is at an index
*
* @param type The type of the part you wish to get.
* @param index The index of the part (relative to the type)
* @return True if the type is at the index
*/
public boolean isReadable(Type type, int index) {
int currentIndex = 0;
for (Pair<Type, Object> packetValue : readableObjects) {
if (packetValue.getKey().getBaseClass() == type.getBaseClass()) { // Ref check
if (currentIndex == index) {
return true;
}
currentIndex++;
}
}
return false;
}
/**
* Set a currently existing part in the output
*
* @param type The type of the part you wish to set.
* @param <T> The return type of the type you wish to set.
* @param index The index of the part (relative to the type)
* @param value The value of the part you wish to set it to.
* @throws InformativeException If it fails to set it, an exception will be thrown.
*/
public <T> void set(Type<T> type, int index, T value) throws Exception {
int currentIndex = 0;
for (Pair<Type, Object> packetValue : packetValues) {
if (packetValue.getKey() == type) { // Ref check
if (currentIndex == index) {
packetValue.setValue(value);
return;
}
currentIndex++;
}
}
Exception e = new ArrayIndexOutOfBoundsException("Could not find type " + type.getTypeName() + " at " + index);
throw new InformativeException(e).set("Type", type.getTypeName()).set("Index", index).set("Packet ID", getId());
}
/**
* Read a type from the input.
*
* @param type The type you wish to read
* @param <T> The return type of the type you wish to read.
* @return The requested type
* @throws InformativeException If it fails to read
*/
public <T> T read(Type<T> type) throws Exception {
if (type == Type.NOTHING) return null;
if (readableObjects.isEmpty()) {
Preconditions.checkNotNull(inputBuffer, "This packet does not have an input buffer.");
// We could in the future log input read values, but honestly for things like bulk maps, mem waste D:
try {
return type.read(inputBuffer);
} catch (Exception e) {
throw new InformativeException(e).set("Type", type.getTypeName()).set("Packet ID", getId()).set("Data", packetValues);
}
} else {
Pair<Type, Object> read = readableObjects.poll();
Type rtype = read.getKey();
if (rtype.equals(type) || (type.getBaseClass().equals(rtype.getBaseClass()) && type.getOutputClass().equals(rtype.getOutputClass()))) {
return (T) read.getValue();
} else {
if (rtype == Type.NOTHING) {
return read(type); // retry
} else {
Exception e = new IOException("Unable to read type " + type.getTypeName() + ", found " + read.getKey().getTypeName());
throw new InformativeException(e).set("Type", type.getTypeName()).set("Packet ID", getId()).set("Data", packetValues);
}
}
}
}
/**
* Write a type to the output.
*
* @param type The type to write.
* @param <T> The return type of the type you wish to write.
* @param value The value of the type to write.
*/
public <T> void write(Type<T> type, T value) {
if (value != null) {
if (!type.getOutputClass().isAssignableFrom(value.getClass())) {
// attempt conversion
if (type instanceof TypeConverter) {
value = (T) ((TypeConverter) type).from(value);
} else {
Via.getPlatform().getLogger().warning("Possible type mismatch: " + value.getClass().getName() + " -> " + type.getOutputClass());
}
}
}
packetValues.add(new Pair<Type, Object>(type, value));
}
/**
* Take a value from the input and write to the output.
*
* @param type The type to read and write.
* @param <T> The return type of the type you wish to pass through.
* @return The type which was read/written.
* @throws Exception If it failed to read or write
*/
public <T> T passthrough(Type<T> type) throws Exception {
T value = read(type);
write(type, value);
return value;
}
/**
* Take all the inputs and write them to the output.
*
* @throws Exception If it failed to read or write
*/
public void passthroughAll() throws Exception {
// Copy previous objects
packetValues.addAll(readableObjects);
readableObjects.clear();
// If the buffer has readable bytes, copy them.
if (inputBuffer.readableBytes() > 0) {
passthrough(Type.REMAINING_BYTES);
}
}
/**
* Write the current output to a buffer.
*
* @param buffer The buffer to write to.
* @throws InformativeException Throws an exception if it fails to write a value.
*/
public void writeToBuffer(ByteBuf buffer) throws Exception {
if (id != -1) {
Type.VAR_INT.writePrimitive(buffer, id);
}
if (!readableObjects.isEmpty()) {
packetValues.addAll(readableObjects);
readableObjects.clear();
}
int index = 0;
for (Pair<Type, Object> packetValue : packetValues) {
try {
Object value = packetValue.getValue();
if (value != null) {
if (!packetValue.getKey().getOutputClass().isAssignableFrom(value.getClass())) {
// attempt conversion
if (packetValue.getKey() instanceof TypeConverter) {
value = ((TypeConverter) packetValue.getKey()).from(value);
} else {
Via.getPlatform().getLogger().warning("Possible type mismatch: " + value.getClass().getName() + " -> " + packetValue.getKey().getOutputClass());
}
}
}
packetValue.getKey().write(buffer, value);
} catch (Exception e) {
throw new InformativeException(e).set("Index", index).set("Type", packetValue.getKey().getTypeName()).set("Packet ID", getId()).set("Data", packetValues);
}
index++;
}
writeRemaining(buffer);
}
/**
* Clear the input buffer / readable objects
*/
public void clearInputBuffer() {
if (inputBuffer != null) {
inputBuffer.clear();
}
readableObjects.clear(); // :(
}
/**
* Clear the packet, used if you have to change the packet completely
*/
public void clearPacket() {
clearInputBuffer();
packetValues.clear();
}
private void writeRemaining(ByteBuf output) {
if (inputBuffer != null) {
output.writeBytes(inputBuffer, inputBuffer.readableBytes());
}
}
/**
* Send this packet to the associated user.
* Be careful not to send packets twice.
* (Sends it after current)
*
* @param packetProtocol The protocol version of the packet.
* @param skipCurrentPipeline Skip the current pipeline
* @throws Exception if it fails to write
*/
public void send(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline) throws Exception {
send(packetProtocol, skipCurrentPipeline, false);
}
/**
* Send this packet to the associated user.
* Be careful not to send packets twice.
* (Sends it after current)
*
* @param packetProtocol The protocol version of the packet.
* @param skipCurrentPipeline Skip the current pipeline
* @param currentThread Run in the same thread
* @throws Exception if it fails to write
*/
public void send(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, boolean currentThread) throws Exception {
if (!isCancelled()) {
try {
ByteBuf output = constructPacket(packetProtocol, skipCurrentPipeline, Direction.OUTGOING);
user().sendRawPacket(output, currentThread);
} catch (Exception e) {
if (!PipelineUtil.containsCause(e, CancelException.class)) {
throw e;
}
}
}
}
/**
* Let the packet go through the protocol pipes and write it to ByteBuf
*
* @param packetProtocol The protocol version of the packet.
* @param skipCurrentPipeline Skip the current pipeline
* @return Packet buffer
* @throws Exception if it fails to write
*/
private ByteBuf constructPacket(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, Direction direction) throws Exception {
// Apply current pipeline
List<Protocol> protocols = new ArrayList<>(user().getProtocolInfo().getPipeline().pipes());
if (direction == Direction.OUTGOING) {
// Other way if outgoing
Collections.reverse(protocols);
}
int index = -1;
for (int i = 0; i < protocols.size(); i++) {
if (protocols.get(i).getClass().equals(packetProtocol)) {
index = skipCurrentPipeline ? (i + 1) : (i);
break;
}
}
if (index == -1) throw new NoSuchElementException(packetProtocol.getCanonicalName());
// Reset reader before we start
resetReader();
// Apply other protocols
apply(direction, user().getProtocolInfo().getState(), index, protocols);
// Send
ByteBuf output = inputBuffer == null ? user().getChannel().alloc().buffer() : inputBuffer.alloc().buffer();
writeToBuffer(output);
return output;
}
/**
* Send this packet to the associated user.
* Be careful not to send packets twice.
* (Sends it after current)
*
* @param packetProtocol The protocol version of the packet.
* @throws Exception if it fails to write
*/
public void send(Class<? extends Protocol> packetProtocol) throws Exception {
send(packetProtocol, true);
}
/**
* Send this packet to the associated user.
* Be careful not to send packets twice.
* (Sends it after current)
* Also returns the packets ChannelFuture
*
* @param packetProtocol The protocol version of the packet.
* @return The packets ChannelFuture
* @throws Exception if it fails to write
*/
public ChannelFuture sendFuture(Class<? extends Protocol> packetProtocol) throws Exception {
if (!isCancelled()) {
ByteBuf output = constructPacket(packetProtocol, true, Direction.OUTGOING);
return user().sendRawPacketFuture(output);
}
return user().getChannel().newFailedFuture(new Exception("Cancelled packet"));
}
/**
* Send this packet to the associated user.
* Be careful not to send packets twice.
* (Sends it after current)
* <b>This method is no longer used, it's favoured to use {@link #send(Class)} as it will handle the pipeline properly.</b>
*
* @throws Exception if it fails to write
*/
@Deprecated
public void send() throws Exception {
if (!isCancelled()) {
// Send
ByteBuf output = inputBuffer == null ? user().getChannel().alloc().buffer() : inputBuffer.alloc().buffer();
writeToBuffer(output);
user().sendRawPacket(output);
}
}
/**
* Create a new packet for the target of this packet.
*
* @param packetID The ID of the new packet
* @return The newly created packet wrapper
*/
public PacketWrapper create(int packetID) {
return new PacketWrapper(packetID, null, user());
}
/**
* Create a new packet with values.
*
* @param packetID The ID of the new packet
* @param init A ValueCreator to write to the packet.
* @return The newly created packet wrapper
* @throws Exception If it failed to write the values from the ValueCreator.
*/
public PacketWrapper create(int packetID, ValueCreator init) throws Exception {
PacketWrapper wrapper = create(packetID);
init.write(wrapper);
return wrapper;
}
/**
* Applies a pipeline from an index to the wrapper
*
* @param direction The direction
* @param state The state
* @param index The index to start from
* @param pipeline The pipeline
* @return The current packetwrapper
* @throws Exception If it fails to transform a packet, exception will be thrown
*/
public PacketWrapper apply(Direction direction, State state, int index, List<Protocol> pipeline) throws Exception {
for (int i = index; i < pipeline.size(); i++) { // Copy to prevent from removal.
pipeline.get(i).transform(direction, state, this);
// Reset the reader for the packetWrapper (So it can be recycled across packets)
resetReader();
}
return this;
}
/**
* Cancel this packet from sending
*/
public void cancel() {
this.send = false;
}
/**
* Check if this packet is cancelled.
*
* @return True if the packet won't be sent.
*/
public boolean isCancelled() {
return !this.send;
}
/**
* Get the user associated with this Packet
*
* @return The user
*/
public UserConnection user() {
return this.userConnection;
}
/**
* Reset the reader, so that it can be read again.
*/
public void resetReader() {
// Move readable objects are packet values
this.packetValues.addAll(readableObjects);
this.readableObjects.clear();
// Move all packet values to the readable for next packet.
this.readableObjects.addAll(packetValues);
this.packetValues.clear();
}
/**
* Send the current packet to the server.
* (Ensure the ID is suitable for viaversion)
*
* @throws Exception If it failed to write
*/
@Deprecated
public void sendToServer() throws Exception {
if (!isCancelled()) {
ByteBuf output = inputBuffer == null ? user().getChannel().alloc().buffer() : inputBuffer.alloc().buffer();
writeToBuffer(output);
user().sendRawPacketToServer(output, true);
}
}
/**
* Send this packet to the server.
*
* @param packetProtocol The protocol version of the packet.
* @param skipCurrentPipeline Skip the current pipeline
* @param currentThread Run in the same thread
* @throws Exception if it fails to write
*/
public void sendToServer(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline, boolean currentThread) throws Exception {
if (!isCancelled()) {
try {
ByteBuf output = constructPacket(packetProtocol, skipCurrentPipeline, Direction.INCOMING);
user().sendRawPacketToServer(output, currentThread);
} catch (Exception e) {
if (!PipelineUtil.containsCause(e, CancelException.class)) {
throw e;
}
}
}
}
public void sendToServer(Class<? extends Protocol> packetProtocol, boolean skipCurrentPipeline) throws Exception {
sendToServer(packetProtocol, skipCurrentPipeline, false);
}
public void sendToServer(Class<? extends Protocol> packetProtocol) throws Exception {
sendToServer(packetProtocol, true);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "PacketWrapper{" +
"packetValues=" + packetValues +
", readableObjects=" + readableObjects +
", id=" + id +
'}';
}
}
@@ -0,0 +1,48 @@
package us.myles.ViaVersion.api;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class Pair<X, Y> {
private final X key;
private Y value;
public Pair(@Nullable X key, @Nullable Y value) {
this.key = key;
this.value = value;
}
public X getKey() {
return key;
}
public Y getValue() {
return value;
}
public void setValue(@Nullable Y value) {
this.value = value;
}
@Override
public String toString() {
return "Pair{" + key + ", " + value + '}';
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair<?, ?> pair = (Pair<?, ?>) o;
if (!Objects.equals(key, pair.key)) return false;
return Objects.equals(value, pair.value);
}
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
}
@@ -0,0 +1,55 @@
package us.myles.ViaVersion.api;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class Triple<A, B, C> {
private final A first;
private final B second;
private final C third;
public Triple(@Nullable A first, @Nullable B second, @Nullable C third) {
this.first = first;
this.second = second;
this.third = third;
}
@Nullable
public A getFirst() {
return first;
}
@Nullable
public B getSecond() {
return second;
}
@Nullable
public C getThird() {
return third;
}
@Override
public String toString() {
return "Triple{" + first + ", " + second + ", " + third + '}';
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Triple<?, ?, ?> triple = (Triple<?, ?, ?>) o;
if (!Objects.equals(first, triple.first)) return false;
if (!Objects.equals(second, triple.second)) return false;
return Objects.equals(third, triple.third);
}
@Override
public int hashCode() {
int result = first != null ? first.hashCode() : 0;
result = 31 * result + (second != null ? second.hashCode() : 0);
result = 31 * result + (third != null ? third.hashCode() : 0);
return result;
}
}
@@ -0,0 +1,50 @@
package us.myles.ViaVersion.api;
import com.google.common.base.Preconditions;
import us.myles.ViaVersion.ViaManager;
import us.myles.ViaVersion.api.platform.ViaPlatform;
public class Via {
private static ViaPlatform platform;
private static ViaManager manager;
/**
* Register the ViaManager associated with the platform.
*
* @param viaManager The ViaManager
*/
public static void init(ViaManager viaManager) {
Preconditions.checkArgument(manager == null, "ViaManager is already set");
Via.platform = viaManager.getPlatform();
Via.manager = viaManager;
}
/**
* Get the API associated with the current platform.
*
* @return API instance
*/
public static ViaAPI getAPI() {
Preconditions.checkArgument(platform != null, "ViaVersion has not loaded the Platform");
return Via.platform.getApi();
}
/**
* Get the config associated with the current platform.
*
* @return Config instance
*/
public static ViaVersionConfig getConfig() {
Preconditions.checkArgument(platform != null, "ViaVersion has not loaded the Platform");
return Via.platform.getConf();
}
public static ViaPlatform getPlatform() {
return platform;
}
public static ViaManager getManager() {
return manager;
}
}
@@ -1,104 +1,111 @@
package us.myles.ViaVersion.api;
import io.netty.buffer.ByteBuf;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.api.boss.BossBar;
import us.myles.ViaVersion.api.boss.BossColor;
import us.myles.ViaVersion.api.boss.BossStyle;
import us.myles.ViaVersion.api.command.ViaVersionCommand;
import java.util.UUID;
public interface ViaVersionAPI {
/**
* Is the player connection modified by ViaVersion?
*
* @param player Bukkit player object
* @return True if the client is modified (At the moment it also means version 1.9 and higher)
*/
boolean isPorted(Player player);
/**
* Get protocol number from a player
*
* @param player Bukkit player object
* @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1)
*/
int getPlayerVersion(Player player);
/**
* Get protocol number from a player
*
* @param uuid UUID of a player
* @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1)
*/
int getPlayerVersion(UUID uuid);
/**
* Is player using 1.9?
*
* @param playerUUID
* @return True if the client is on 1.9
*/
boolean isPorted(UUID playerUUID);
/**
* Get the version of the plugin
*
* @return Plugin version
*/
String getVersion();
/**
* Send a raw packet to the player (Use new IDs)
*
* @param player The player to send packet
* @param packet The packet, you need a VarInt ID then the packet contents.
* @throws IllegalArgumentException If not on 1.9 throws IllegalArg
*/
void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException;
/**
* Send a raw packet to the player (Use new IDs)
*
* @param uuid The uuid from the player to send packet
* @param packet The packet, you need a VarInt ID then the packet contents.
* @throws IllegalArgumentException If not on 1.9 throws IllegalArg
*/
void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException;
/**
* Create a new bossbar instance
*
* @param title The title
* @param color The color
* @param style The style
* @return Bossbar instance
*/
BossBar createBossBar(String title, BossColor color, BossStyle style);
/**
* Create a new bossbar instance
*
* @param title The title
* @param health Number between 0 and 1
* @param color The color
* @param style The style
* @return Bossbar instance
*/
BossBar createBossBar(String title, float health, BossColor color, BossStyle style);
/**
* Get if global debug is enabled
*
* @return true if debug is enabled
*/
boolean isDebug();
/**
* Get ViaVersions command handler
*
* @return command handler
*/
ViaVersionCommand getCommandHandler();
}
package us.myles.ViaVersion.api;
import io.netty.buffer.ByteBuf;
import us.myles.ViaVersion.api.boss.BossBar;
import us.myles.ViaVersion.api.boss.BossColor;
import us.myles.ViaVersion.api.boss.BossStyle;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import java.util.SortedSet;
import java.util.UUID;
/**
* Represents the ViaAPI
*
* @param <T> The player type for the specific platform, for bukkit it's {@code ViaAPI<Player>}
*/
public interface ViaAPI<T> {
/**
* Get protocol number from a player
* Will also retrieve version from ProtocolSupport if it's being used.
*
* @param player Platform player object, eg. Bukkit this is Player
* @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1)
*/
int getPlayerVersion(T player);
/**
* Get protocol number from a player
*
* @param uuid UUID of a player
* @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1)
*/
int getPlayerVersion(UUID uuid);
/**
* Returns if the player is ported by Via.
*
* @param playerUUID UUID of a player
* @return true if Via has a cached userconnection for this player
* @deprecated use {@link #isInjected(UUID)}
* @see #isInjected(UUID)
*/
@Deprecated
default boolean isPorted(UUID playerUUID) {
return isInjected(playerUUID);
}
/**
* Returns if Via injected into this player connection
*
* @param playerUUID UUID of a player
* @return true if Via has a cached UserConnection for this player
*/
boolean isInjected(UUID playerUUID);
/**
* Get the version of the plugin
*
* @return Plugin version
*/
String getVersion();
/**
* Send a raw packet to the player (Use new IDs)
*
* @param player Platform player object, eg. Bukkit this is Player
* @param packet The packet, you need a VarInt ID then the packet contents.
* @throws IllegalArgumentException if the player is not injected by Via
*/
void sendRawPacket(T player, ByteBuf packet);
/**
* Send a raw packet to the player (Use new IDs)
*
* @param uuid The uuid from the player to send packet
* @param packet The packet, you need a VarInt ID then the packet contents.
* @throws IllegalArgumentException if the player is not injected by Via
*/
void sendRawPacket(UUID uuid, ByteBuf packet);
/**
* Create a new bossbar instance
*
* @param title The title
* @param color The color
* @param style The style
* @return BossBar instance
*/
BossBar createBossBar(String title, BossColor color, BossStyle style);
/**
* Create a new bossbar instance
*
* @param title The title
* @param health Number between 0 and 1
* @param color The color
* @param style The style
* @return BossBar instance
*/
BossBar createBossBar(String title, float health, BossColor color, BossStyle style);
/**
* Get the supported protocol versions
* This method removes any blocked protocol versions.
*
* @return a list of protocol versions
* @see ProtocolRegistry#getSupportedVersions() for full list.
*/
SortedSet<Integer> getSupportedVersions();
}
@@ -0,0 +1,57 @@
package us.myles.ViaVersion.api;
import org.jetbrains.annotations.Nullable;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.util.UUID;
public abstract class ViaListener {
private final Class<? extends Protocol> requiredPipeline;
private boolean registered;
public ViaListener(Class<? extends Protocol> requiredPipeline) {
this.requiredPipeline = requiredPipeline;
}
/**
* Get the UserConnection from an UUID
*
* @param uuid UUID object
* @return The UserConnection
*/
@Nullable
protected UserConnection getUserConnection(UUID uuid) {
return Via.getManager().getConnection(uuid);
}
/**
* Checks if the UUID is on the selected pipe
*
* @param uuid UUID Object
* @return True if on pipe
*/
protected boolean isOnPipe(UUID uuid) {
UserConnection userConnection = getUserConnection(uuid);
return userConnection != null &&
(requiredPipeline == null || userConnection.getProtocolInfo().getPipeline().contains(requiredPipeline));
}
/**
* Register the event
*/
public abstract void register();
protected Class<? extends Protocol> getRequiredPipeline() {
return requiredPipeline;
}
protected boolean isRegistered() {
return registered;
}
protected void setRegistered(boolean registered) {
this.registered = registered;
}
}
@@ -0,0 +1,361 @@
package us.myles.ViaVersion.api;
import java.util.Set;
public interface ViaVersionConfig {
/**
* Get if the plugin should check for updates
*
* @return true if update checking is enabled
*/
boolean isCheckForUpdates();
/**
* Get if collision preventing for players is enabled
*
* @return true if collision preventing is enabled
*/
boolean isPreventCollision();
/**
* Get if 1.9 &amp; 1.10 clients are shown the new effect indicator in the top-right corner
*
* @return true if the using of the new effect indicator is enabled
*/
boolean isNewEffectIndicator();
/**
* Get if 1.9 &amp; 1.10 clients are shown the new death message on the death screen
*
* @return true if enabled
*/
boolean isShowNewDeathMessages();
/**
* Get if metadata errors will be suppressed
*
* @return true if metadata errors suppression is enabled
*/
boolean isSuppressMetadataErrors();
/**
* Get if blocking in 1.9 &amp; 1.10 appears as a player holding a shield
*
* @return true if shield blocking is enabled
*/
boolean isShieldBlocking();
/**
* Get if armor stand positions are fixed so holograms show up at the correct height in 1.9 &amp; 1.10
*
* @return true if hologram patching is enabled
*/
boolean isHologramPatch();
/**
* Get if the 1.11 piston animation patch is enabled
*
* @return true if the piston patch is enabled.
*/
boolean isPistonAnimationPatch();
/**
* Get if boss bars are fixed for 1.9 &amp; 1.10 clients
*
* @return true if boss bar patching is enabled
*/
boolean isBossbarPatch();
/**
* Get if the boss bars for 1.9 &amp; 1.10 clients are being stopped from flickering
* This will keep all boss bars on 100% (not recommended)
*
* @return true if boss bar anti flickering is enabled
*/
boolean isBossbarAntiflicker();
/**
* Get the vertical offset armor stands are being moved with when the hologram patch is enabled
*
* @return the vertical offset holograms will be moved with
*/
double getHologramYOffset();
/**
* Get if players will be automatically put in the same team when collision preventing is enabled
*
* @return true if automatic teaming is enabled
*/
boolean isAutoTeam();
/**
* Get the maximum number of packets a client can send per second.
*
* @return The number of packets a client can send per second.
*/
int getMaxPPS();
/**
* Get the kick message sent if the user hits the max packets per second.
*
* @return Kick message, with colour codes using '&amp;amp;'
*/
String getMaxPPSKickMessage();
/**
* The time in seconds that should be tracked for warnings
*
* @return Time in seconds that should be tracked for warnings
*/
int getTrackingPeriod();
/**
* The number of packets per second to count as a warning
*
* @return The number of packets per second to count as a warning.
*/
int getWarningPPS();
/**
* Get the maximum number of warnings the client can have in the interval
*
* @return The number of packets a client can send per second.
*/
int getMaxWarnings();
/**
* Get the kick message sent if the user goes over the warnings in the interval
*
* @return Kick message, with colour codes using '&amp;amp;'
*/
String getMaxWarningsKickMessage();
/**
* Is anti-xray enabled?
*
* @return A boolean
*/
boolean isAntiXRay();
/**
* Send supported versions in the status response packet
*
* @return If true, enabled
*/
boolean isSendSupportedVersions();
/**
* Stimulate the player tick
*
* @return if true, enabled
*/
boolean isSimulatePlayerTick();
/**
* Use the item cache to prevent high resource usage
*
* @return if true, enabled
*/
boolean isItemCache();
/**
* Use the NMS player ticking
*
* @return if true, enabled
*/
boolean isNMSPlayerTicking();
/**
* Replace extended pistons on 1.10 chunk loading.
*
* @return true if to replace them
*/
boolean isReplacePistons();
/**
* Get the id for replacing extended pistons.
*
* @return The integer id
*/
int getPistonReplacementId();
/**
* Force json transform
*
* @return true if enabled
*/
boolean isForceJsonTransform();
/**
* Should we fix nbt array's in json chat messages for 1.12 clients
*
* @return true if enabled
*/
boolean is1_12NBTArrayFix();
/**
* Should we make team colours based on the last colour in team prefix
*
* @return true if enabled
*/
boolean is1_13TeamColourFix();
/**
* Should we fix shift quick move action for 1.12 clients
*
* @return true if enabled
*/
boolean is1_12QuickMoveActionFix();
/**
* Get the blocked protocols
*
* @return An Integer list
*/
Set<Integer> getBlockedProtocols();
/**
* Get the custom disconnect message
*
* @return Disconnect message
*/
String getBlockedDisconnectMsg();
/**
* Get the message sent to players being kicked on reload.
* Players are kicked to stop the server crashing
*
* @return Disconnect message
*/
String getReloadDisconnectMsg();
/**
* Should we hide errors that occur when trying to convert block and item data over versions?
*
* @return true if enabled
*/
boolean isSuppressConversionWarnings();
/**
* Should we disable the 1.13 auto-complete feature to stop spam kicks? (for any server lower than 1.13)
*
* @return true if enabled
*/
boolean isDisable1_13AutoComplete();
/**
* Tries to minimize cooldown animation.
*
* @return true if enabled
*/
boolean isMinimizeCooldown();
/**
* Enable the serverside blockconnections for 1.13+ clients
*
* @return true if enabled
*/
boolean isServersideBlockConnections();
/**
* Get the type of block-connection provider which should be used
*
* @return String world for world-level or packet for packet-level
*/
String getBlockConnectionMethod();
/**
* When activated, only the most important blocks are saved in the BlockStorage.
*
* @return true if enabled
*/
boolean isReduceBlockStorageMemory();
/**
* When activated with serverside-blockconnections, flower parts with blocks above will be sent as stems.
* Useful for lobbyservers where users can't build and those stems are used decoratively.
*
* @return true if enabled
*/
boolean isStemWhenBlockAbove();
/**
* Vines not connected to any blocks will be mapped to air for 1.13+ clients to prevent them from climbing up.
*
* @return true if enabled
*/
boolean isVineClimbFix();
/**
* When activated, the 1-layer snow will be sent as 2-layer snow to 1.13+ clients to have collision.
*
* @return true if enabled
*/
boolean isSnowCollisionFix();
/**
* When activated, infested blocks will be mapped to their normal stone variants for 1.13+ clients.
*
* @return true if enabled
*/
boolean isInfestedBlocksFix();
/**
* When greater than 0, enables tab complete request delaying by x ticks
*
* @return the delay in ticks
*/
int get1_13TabCompleteDelay();
/**
* When activated, edited books with more than 50 pages will be shortened to 50.
*
* @return true if enabled
*/
boolean isTruncate1_14Books();
/**
* Handles left handed info by using unused bit 7 on Client Settings packet
*
* @return true if enabled
*/
boolean isLeftHandedHandling();
/**
* Fixes velocity bugs due to different hitbox for 1.9-1.13 clients on 1.8 servers.
*
* @return true if enabled
*/
boolean is1_9HitboxFix();
/**
* Fixes velocity bugs due to different hitbox for 1.14+ clients on sub 1.14 servers.
*
* @return true if enabled
*/
boolean is1_14HitboxFix();
/**
* Fixes non full blocks having 0 light for 1.14+ clients on sub 1.14 servers.
*
* @return true if enabled
*/
boolean isNonFullBlockLightFix();
boolean is1_14HealthNaNFix();
/**
* Should 1.15 clients respawn instantly / without showing the death screen.
*
* @return true if enabled
*/
boolean is1_15InstantRespawn();
/**
* Ignores incoming plugin channel messages of 1.16+ clients with channel names longer than 32 charatcers.
*
* @return true if enabled
*/
boolean isIgnoreLong1_16ChannelNames();
}
@@ -0,0 +1,202 @@
package us.myles.ViaVersion.api.boss;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection;
import java.util.Set;
import java.util.UUID;
public abstract class BossBar<T> {
/**
* Get the current title
*
* @return the title
*/
public abstract String getTitle();
/**
* Change the title
*
* @param title Title can be in either JSON or just text
* @return The BossBar object
*/
public abstract BossBar setTitle(String title);
/**
* Get the health
*
* @return float between 0F - 1F
*/
public abstract float getHealth();
/**
* Change the health
*
* @param health this float has to be between 0F - 1F
* @return The BossBar object
*/
public abstract BossBar setHealth(float health);
/**
* Get the bossbar color
*
* @return The colour
*/
public abstract BossColor getColor();
/**
* Yay colors!
*
* @param color Whatever color you want!
* @return The BossBar object
*/
public abstract BossBar setColor(BossColor color);
/**
* Get the bosbar style
*
* @return BossStyle
*/
public abstract BossStyle getStyle();
/**
* Change the bosbar style
*
* @param style BossStyle
* @return The BossBar object
*/
public abstract BossBar setStyle(BossStyle style);
/**
* Show the bossbar to a player.
*
* @param player The player
* @return The BossBar object
* @deprecated Deprecated use UUID's instead of Player objects {@link #addPlayer(UUID)}
*/
@Deprecated
public BossBar addPlayer(T player) {
throw new UnsupportedOperationException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName());
}
/**
* Show the bossbar to a player (uuid). This only works for frontend connections. Use #addConnection(UserConnection) for other types.
*
* @param player uuid of the player
* @return The BossBar object
*/
public abstract BossBar addPlayer(UUID player);
/**
* Show the bossbar to a player connection.
*
* @param conn UserConnection of the connection
* @return The BossBar object
*/
public abstract BossBar addConnection(UserConnection conn);
/**
* add multiple players
*
* @param players list of players
* @return The BossBar object
* @deprecated Deprecated use UUID's instead of Player objects {@link #addPlayer(UUID)}
*/
@Deprecated
public BossBar addPlayers(T... players) {
throw new UnsupportedOperationException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName());
}
/**
* Remove the bossbar from a player
*
* @param player The player
* @return The BossBar object
* @deprecated Deprecated use UUID's instead of Player objects {@link #removePlayer(UUID)}
*/
@Deprecated
public BossBar removePlayer(T player) {
throw new UnsupportedOperationException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName());
}
/**
* Removes the bossbar from a player. This only works for frontend connections. For others types, use #removeConnection(UserConnection)
*
* @param uuid The players UUID
* @return The BossBar object
*/
public abstract BossBar removePlayer(UUID uuid);
/**
* Removes the bossbar from a player connection.
*
* @param conn The UserConnection
* @return The BossBar object
*/
public abstract BossBar removeConnection(UserConnection conn);
/**
* Add flags
*
* @param flag The flag to add
* @return The BossBar object
*/
public abstract BossBar addFlag(BossFlag flag);
/**
* Remove flags.
*
* @param flag The flag to remove
* @return The BossBar object
*/
public abstract BossBar removeFlag(BossFlag flag);
/**
* @param flag The flag to check against
* @return True if it has the flag
*/
public abstract boolean hasFlag(BossFlag flag);
/**
* Get players. Only returns UUIDs which are front-end. For all connections, use #getConnections()
*
* @return UUIDS from players (sorry I lied)
*/
public abstract Set<UUID> getPlayers();
/**
* Get UserConnections.
*
* @return UserConnection from players
*/
public abstract Set<UserConnection> getConnections();
/**
* Show the bossbar to everyone (In the getPlayer set)
*
* @return The BossBar object
*/
public abstract BossBar show();
/**
* Hide the bossbar from everyone (In the getPlayer set)
*
* @return The BossBar object
*/
public abstract BossBar hide();
/**
* Is it visible?
*
* @return visibility changable with show() and hide()
*/
public abstract boolean isVisible();
/**
* Get the UUID of this bossbar
*
* @return Unique Id for this bossbar
*/
public abstract UUID getId();
}
@@ -1,11 +1,7 @@
package us.myles.ViaVersion.api.boss;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Getter
public enum BossColor {
PINK(0),
BLUE(1),
RED(2),
@@ -15,4 +11,12 @@ public enum BossColor {
WHITE(6);
private final int id;
BossColor(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
@@ -1,13 +1,17 @@
package us.myles.ViaVersion.api.boss;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Getter
public enum BossFlag {
DARKEN_SKY(1),
PLAY_BOSS_MUSIC(2);
private final int id;
BossFlag(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
@@ -1,11 +1,7 @@
package us.myles.ViaVersion.api.boss;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Getter
public enum BossStyle {
SOLID(0),
SEGMENTED_6(1),
SEGMENTED_10(2),
@@ -13,4 +9,12 @@ public enum BossStyle {
SEGMENTED_20(4);
private final int id;
BossStyle(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
@@ -0,0 +1,34 @@
package us.myles.ViaVersion.api.command;
import java.util.UUID;
public interface ViaCommandSender {
/**
* Check if the sender has a permission.
*
* @param permission Permission string eg. viaversion.admin
* @return True if the sender has the permission
*/
boolean hasPermission(String permission);
/**
* Send a message to the sender
*
* @param msg The message to send
*/
void sendMessage(String msg);
/**
* Get the senders UUID.
*
* @return The senders UUID
*/
UUID getUUID();
/**
* Get the senders name.
*
* @return The senders name
*/
String getName();
}
@@ -1,6 +1,5 @@
package us.myles.ViaVersion.api.command;
import org.bukkit.command.CommandSender;
import us.myles.ViaVersion.commands.ViaCommandHandler;
import java.util.Collections;
@@ -10,14 +9,14 @@ public abstract class ViaSubCommand {
/**
* Subcommand name
*
* @return your input
* @return The commands name
*/
public abstract String name();
/**
* subcommand description, this'll show in /viaversion list
*
* @return your input
* @return The commands description
*/
public abstract String description();
@@ -25,7 +24,7 @@ public abstract class ViaSubCommand {
* Usage example:
* "playerversion [name]"
*
* @return your input
* @return The commands usage
*/
public String usage() {
return name();
@@ -34,7 +33,7 @@ public abstract class ViaSubCommand {
/**
* Permission, null for everyone
*
* @return
* @return The permission required to use the commands
*/
public String permission() {
return "viaversion.admin";
@@ -45,9 +44,9 @@ public abstract class ViaSubCommand {
*
* @param sender Command sender
* @param args Arguments
* @return command executed succesfully if false, show usage
* @return commands executed succesfully if false, show usage
*/
public abstract boolean execute(CommandSender sender, String[] args);
public abstract boolean execute(ViaCommandSender sender, String[] args);
/**
* Yay, possibility to implement tab-completion
@@ -56,7 +55,7 @@ public abstract class ViaSubCommand {
* @param args args
* @return tab complete possibilities
*/
public List<String> onTabComplete(CommandSender sender, String[] args) {
public List<String> onTabComplete(ViaCommandSender sender, String[] args) {
return Collections.emptyList();
}
@@ -67,11 +66,11 @@ public abstract class ViaSubCommand {
/**
* Send message formatted / colored
*
* @param sender command sender
* @param sender commands sender
* @param message string message
* @param args optional objects
*/
public void sendMessage(CommandSender sender, String message, Object... args) {
public void sendMessage(ViaCommandSender sender, String message, Object... args) {
ViaCommandHandler.sendMessage(sender, message, args);
}
}
@@ -1,5 +1,9 @@
package us.myles.ViaVersion.api.command;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public interface ViaVersionCommand {
/**
* Register your own subcommand inside ViaVersion
@@ -23,5 +27,24 @@ public interface ViaVersionCommand {
* @param name subcommand name
* @return ViaSubCommand instance
*/
@Nullable
ViaSubCommand getSubCommand(String name);
/**
* Executed when the Command sender executes the commands
*
* @param sender Sender object
* @param args arguments provided
* @return was successful
*/
boolean onCommand(ViaCommandSender sender, String[] args);
/**
* Executed when the Command sender tab-completes
*
* @param sender Sender object
* @param args arguments provided
* @return was successful
*/
List<String> onTabComplete(ViaCommandSender sender, String[] args);
}
@@ -0,0 +1,31 @@
package us.myles.ViaVersion.api.configuration;
import java.util.Map;
public interface ConfigurationProvider {
/**
* Sets the specified path to the given value.
*
* @param path Path of the object to set.
* @param value New value to set the path to
*/
void set(String path, Object value);
/**
* Saves the config
*/
void saveConfig();
/**
* Reloads the config
*/
void reloadConfig();
/**
* Get all the configuration values
*
* @return Map with key-values
*/
Map<String, Object> getValues();
}
@@ -0,0 +1,6 @@
package us.myles.ViaVersion.api.data;
public interface ExternalJoinGameListener {
void onExternalJoinGame(int playerEntityId);
}
@@ -0,0 +1,214 @@
package us.myles.ViaVersion.api.data;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import org.jetbrains.annotations.Nullable;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.util.GsonUtil;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class MappingDataLoader {
private static final Map<String, JsonObject> MAPPINGS_CACHE = new ConcurrentHashMap<>();
private static boolean cacheJsonMappings;
/**
* Returns true if a selected number of mappings should be cached.
* If enabled, cleanup should be done after the cache is no longer needed.
*
* @return true if mappings should be cached
*/
public static boolean isCacheJsonMappings() {
return cacheJsonMappings;
}
public static void enableMappingsCache() {
cacheJsonMappings = true;
}
/**
* Returns the cached mappings. Cleared after Via has been fully loaded.
*
* @see #isCacheJsonMappings()
*/
public static Map<String, JsonObject> getMappingsCache() {
return MAPPINGS_CACHE;
}
/**
* Loads the file from the plugin folder if present, else from the bundled resources.
*/
public static JsonObject loadFromDataDir(String name) {
File file = new File(Via.getPlatform().getDataFolder(), name);
if (!file.exists()) return loadData(name);
// Load the file from the platform's directory if present
try (FileReader reader = new FileReader(file)) {
return GsonUtil.getGson().fromJson(reader, JsonObject.class);
} catch (JsonSyntaxException e) {
// Users might mess up the format, so let's catch the syntax error
Via.getPlatform().getLogger().warning(name + " is badly formatted!");
e.printStackTrace();
} catch (IOException | JsonIOException e) {
e.printStackTrace();
}
return null;
}
/**
* Loads the file from the bundled resources. Uses the cache if enabled.
*/
public static JsonObject loadData(String name) {
return loadData(name, false);
}
/**
* Loads the file from the bundled resources. Uses the cache if enabled.
*
* @param cacheIfEnabled whether loaded files should be cached
*/
public static JsonObject loadData(String name, boolean cacheIfEnabled) {
if (cacheJsonMappings) {
JsonObject cached = MAPPINGS_CACHE.get(name);
if (cached != null) {
return cached;
}
}
InputStream stream = getResource(name);
InputStreamReader reader = new InputStreamReader(stream);
try {
JsonObject object = GsonUtil.getGson().fromJson(reader, JsonObject.class);
if (cacheIfEnabled && cacheJsonMappings) {
MAPPINGS_CACHE.put(name, object);
}
return object;
} finally {
try {
reader.close();
} catch (IOException ignored) {
// Ignored
}
}
}
public static void mapIdentifiers(Map<Integer, Integer> output, JsonObject oldIdentifiers, JsonObject newIdentifiers) {
mapIdentifiers(output, oldIdentifiers, newIdentifiers, null);
}
public static void mapIdentifiers(Map<Integer, Integer> output, JsonObject oldIdentifiers, JsonObject newIdentifiers, JsonObject diffIdentifiers) {
for (Map.Entry<String, JsonElement> entry : oldIdentifiers.entrySet()) {
Map.Entry<String, JsonElement> value = mapIdentifierEntry(entry, oldIdentifiers, newIdentifiers, diffIdentifiers);
if (value != null) {
output.put(Integer.parseInt(entry.getKey()), Integer.parseInt(value.getKey()));
}
}
}
public static void mapIdentifiers(short[] output, JsonObject oldIdentifiers, JsonObject newIdentifiers) {
MappingDataLoader.mapIdentifiers(output, oldIdentifiers, newIdentifiers, null);
}
public static void mapIdentifiers(short[] output, JsonObject oldIdentifiers, JsonObject newIdentifiers, JsonObject diffIdentifiers) {
for (Map.Entry<String, JsonElement> entry : oldIdentifiers.entrySet()) {
Map.Entry<String, JsonElement> value = mapIdentifierEntry(entry, oldIdentifiers, newIdentifiers, diffIdentifiers);
if (value != null) {
output[Integer.parseInt(entry.getKey())] = Short.parseShort(value.getKey());
}
}
}
@Nullable
private static Map.Entry<String, JsonElement> mapIdentifierEntry(Map.Entry<String, JsonElement> entry, JsonObject oldIdentifiers, JsonObject newIdentifiers, JsonObject diffIdentifiers) {
Map.Entry<String, JsonElement> value = findValue(newIdentifiers, entry.getValue().getAsString());
if (value == null) {
// Search in diff mappings
if (diffIdentifiers != null) {
JsonElement diffElement = diffIdentifiers.get(entry.getKey());
if (diffElement != null) {
value = findValue(newIdentifiers, diffElement.getAsString());
}
}
if (value == null) {
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
Via.getPlatform().getLogger().warning("No key for " + entry.getValue() + " :( ");
}
return null;
}
}
return value;
}
public static void mapIdentifiers(short[] output, JsonArray oldIdentifiers, JsonArray newIdentifiers, boolean warnOnMissing) {
mapIdentifiers(output, oldIdentifiers, newIdentifiers, null, warnOnMissing);
}
public static void mapIdentifiers(short[] output, JsonArray oldIdentifiers, JsonArray newIdentifiers, JsonObject diffIdentifiers, boolean warnOnMissing) {
for (int i = 0; i < oldIdentifiers.size(); i++) {
JsonElement value = oldIdentifiers.get(i);
Integer index = findIndex(newIdentifiers, value.getAsString());
if (index == null) {
if (diffIdentifiers != null) {
JsonElement diffElement = diffIdentifiers.get(value.getAsString());
if (diffElement != null) {
index = findIndex(newIdentifiers, diffElement.getAsString());
}
}
if (index == null) {
if (warnOnMissing && !Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
Via.getPlatform().getLogger().warning("No key for " + value + " :( ");
}
continue;
}
}
output[i] = index.shortValue();
}
}
public static void mapIdentifiers(byte[] output, JsonObject oldIdentifiers, JsonObject newIdentifiers) {
for (Map.Entry<String, JsonElement> entry : oldIdentifiers.entrySet()) {
Map.Entry<String, JsonElement> value = MappingDataLoader.findValue(newIdentifiers, entry.getValue().getAsString());
if (value == null) {
Via.getPlatform().getLogger().warning("No key for " + entry.getValue() + " :( ");
continue;
}
output[Integer.parseInt(entry.getKey())] = Byte.parseByte(value.getKey());
}
}
@Nullable
public static Map.Entry<String, JsonElement> findValue(JsonObject object, String needle) {
for (Map.Entry<String, JsonElement> entry : object.entrySet()) {
String value = entry.getValue().getAsString();
if (value.equals(needle)) {
return entry;
}
}
return null;
}
@Nullable
public static Integer findIndex(JsonArray array, String value) {
for (int i = 0; i < array.size(); i++) {
JsonElement v = array.get(i);
if (v.getAsString().equals(value)) {
return i;
}
}
return null;
}
public static InputStream getResource(String name) {
return MappingDataLoader.class.getClassLoader().getResourceAsStream("assets/viaversion/data/" + name);
}
}
@@ -0,0 +1,89 @@
package us.myles.ViaVersion.api.data;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import java.util.Arrays;
public class Mappings {
protected final short[] oldToNew;
protected Mappings(short[] oldToNew) {
this.oldToNew = oldToNew;
}
/**
* Maps old identifiers to the new ones.
* If an old value cannot be found in the new mappings, the diffmapping will be checked for the given entry.
*
* @param size set size of the underlying short array
* @param oldMapping mappings to map from
* @param newMapping mappings to map to
* @param diffMapping extra mappings that will be used/scanned when an entry cannot be found
*/
public Mappings(int size, JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping) {
oldToNew = new short[size];
Arrays.fill(oldToNew, (short) -1);
MappingDataLoader.mapIdentifiers(oldToNew, oldMapping, newMapping, diffMapping);
}
public Mappings(JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping) {
this(oldMapping.entrySet().size(), oldMapping, newMapping, diffMapping);
}
/**
* Maps old identifiers to the new ones.
*
* @param size set size of the underlying short array
* @param oldMapping mappings to map from
* @param newMapping mappings to map to
*/
public Mappings(int size, JsonObject oldMapping, JsonObject newMapping) {
oldToNew = new short[size];
Arrays.fill(oldToNew, (short) -1);
MappingDataLoader.mapIdentifiers(oldToNew, oldMapping, newMapping);
}
public Mappings(JsonObject oldMapping, JsonObject newMapping) {
this(oldMapping.entrySet().size(), oldMapping, newMapping);
}
/**
* Maps old identifiers to the new ones.
*
* @param size set size of the underlying short array
* @param oldMapping mappings to map from
* @param newMapping mappings to map to
* @param diffMapping extra mappings that will be used/scanned when an entry cannot be found
* @param warnOnMissing should "No key for x" be printed if there is no matching identifier
*/
public Mappings(int size, JsonArray oldMapping, JsonArray newMapping, JsonObject diffMapping, boolean warnOnMissing) {
oldToNew = new short[size];
Arrays.fill(oldToNew, (short) -1);
MappingDataLoader.mapIdentifiers(oldToNew, oldMapping, newMapping, diffMapping, warnOnMissing);
}
public Mappings(int size, JsonArray oldMapping, JsonArray newMapping, boolean warnOnMissing) {
this(size, oldMapping, newMapping, null, warnOnMissing);
}
public Mappings(JsonArray oldMapping, JsonArray newMapping, boolean warnOnMissing) {
this(oldMapping.size(), oldMapping, newMapping, warnOnMissing);
}
public Mappings(int size, JsonArray oldMapping, JsonArray newMapping) {
this(size, oldMapping, newMapping, true);
}
public Mappings(JsonArray oldMapping, JsonArray newMapping, JsonObject diffMapping) {
this(oldMapping.size(), oldMapping, newMapping, diffMapping, true);
}
public Mappings(JsonArray oldMapping, JsonArray newMapping) {
this(oldMapping.size(), oldMapping, newMapping, true);
}
public int getNewId(int old) {
return old >= 0 && old < oldToNew.length ? oldToNew[old] : -1;
}
}
@@ -0,0 +1,13 @@
package us.myles.ViaVersion.api.data;
public class StoredObject {
private final UserConnection user;
public StoredObject(UserConnection user) {
this.user = user;
}
public UserConnection getUser() {
return user;
}
}
@@ -0,0 +1,462 @@
package us.myles.ViaVersion.api.data;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import net.md_5.bungee.api.ChatColor;
import org.jetbrains.annotations.Nullable;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.ViaVersionConfig;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.exception.CancelException;
import us.myles.ViaVersion.exception.InformativeException;
import us.myles.ViaVersion.packets.Direction;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.util.PipelineUtil;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
public class UserConnection {
private static final AtomicLong IDS = new AtomicLong();
private final long id = IDS.incrementAndGet();
private final Channel channel;
private ProtocolInfo protocolInfo;
Map<Class, StoredObject> storedObjects = new ConcurrentHashMap<>();
private boolean active = true;
private boolean pendingDisconnect;
private Object lastPacket;
private long sentPackets;
private long receivedPackets;
// Used for tracking pps
private long startTime;
private long intervalPackets;
private long packetsPerSecond = -1L;
// Used for handling warnings (over time)
private int secondsObserved;
private int warnings;
public UserConnection(@Nullable Channel channel) {
this.channel = channel;
}
/**
* Get an object from the storage.
*
* @param objectClass The class of the object to get
* @param <T> The type of the class you want to get.
* @return The requested object
*/
@Nullable
public <T extends StoredObject> T get(Class<T> objectClass) {
return (T) storedObjects.get(objectClass);
}
/**
* Check if the storage has an object.
*
* @param objectClass The object class to check
* @return True if the object is in the storage
*/
public boolean has(Class<? extends StoredObject> objectClass) {
return storedObjects.containsKey(objectClass);
}
/**
* Put an object into the stored objects based on class.
*
* @param object The object to store.
*/
public void put(StoredObject object) {
storedObjects.put(object.getClass(), object);
}
/**
* Clear all the stored objects.
* Used for bungee when switching servers.
*/
public void clearStoredObjects() {
storedObjects.clear();
}
/**
* Send a raw packet to the player.
*
* @param packet The raw packet to send
* @param currentThread Should it run in the same thread
*/
public void sendRawPacket(ByteBuf packet, boolean currentThread) {
ChannelHandler handler = channel.pipeline().get(Via.getManager().getInjector().getEncoderName());
if (currentThread) {
channel.pipeline().context(handler).writeAndFlush(packet);
} else {
channel.eventLoop().submit(() -> channel.pipeline().context(handler).writeAndFlush(packet));
}
}
/**
* Send a raw packet to the player with returning the future.
*
* @param packet The raw packet to send
* @return ChannelFuture of the packet being sent
*/
public ChannelFuture sendRawPacketFuture(ByteBuf packet) {
ChannelHandler handler = channel.pipeline().get(Via.getManager().getInjector().getEncoderName());
return channel.pipeline().context(handler).writeAndFlush(packet);
}
/**
* Send a raw packet to the player (netty thread).
*
* @param packet The packet to send
*/
public void sendRawPacket(ByteBuf packet) {
sendRawPacket(packet, false);
}
/**
* Used for incrementing the number of packets sent to the client.
*/
public void incrementSent() {
this.sentPackets++;
}
/**
* Used for incrementing the number of packets received from the client.
*
* @return true if the interval has reset and can now be checked for the packets sent
*/
public boolean incrementReceived() {
// handle stats
long diff = System.currentTimeMillis() - startTime;
if (diff >= 1000) {
packetsPerSecond = intervalPackets;
startTime = System.currentTimeMillis();
intervalPackets = 1;
return true;
} else {
intervalPackets++;
}
// increase total
this.receivedPackets++;
return false;
}
/**
* Checks for packet flood with the packets sent in the last second.
* ALWAYS check for {@link #incrementReceived()} before using this method.
*
* @return true if the packet should be cancelled
* @see #incrementReceived()
*/
public boolean exceedsMaxPPS() {
ViaVersionConfig conf = Via.getConfig();
// Max PPS Checker
if (conf.getMaxPPS() > 0) {
if (packetsPerSecond >= conf.getMaxPPS()) {
disconnect(conf.getMaxPPSKickMessage().replace("%pps", Long.toString(packetsPerSecond)));
return true; // don't send current packet
}
}
// Tracking PPS Checker
if (conf.getMaxWarnings() > 0 && conf.getTrackingPeriod() > 0) {
if (secondsObserved > conf.getTrackingPeriod()) {
// Reset
warnings = 0;
secondsObserved = 1;
} else {
secondsObserved++;
if (packetsPerSecond >= conf.getWarningPPS()) {
warnings++;
}
if (warnings >= conf.getMaxWarnings()) {
disconnect(conf.getMaxWarningsKickMessage().replace("%pps", Long.toString(packetsPerSecond)));
return true; // don't send current packet
}
}
}
return false;
}
/**
* Disconnect a connection.
*
* @param reason The reason to use, not used if player is not active.
*/
public void disconnect(String reason) {
if (!channel.isOpen() || pendingDisconnect) return;
pendingDisconnect = true;
UUID uuid = protocolInfo.getUuid();
if (uuid == null) {
channel.close(); // Just disconnect, we don't know what the connection is
return;
}
Via.getPlatform().runSync(() -> {
if (!Via.getPlatform().kickPlayer(uuid, ChatColor.translateAlternateColorCodes('&', reason))) {
channel.close(); // =)
}
});
}
/**
* Sends a raw packet to the server.
*
* @param packet Raw packet to be sent
* @param currentThread If {@code true} executes immediately, {@code false} submits a task to EventLoop
*/
public void sendRawPacketToServer(ByteBuf packet, boolean currentThread) {
ByteBuf buf = packet.alloc().buffer();
try {
try {
Type.VAR_INT.writePrimitive(buf, PacketWrapper.PASSTHROUGH_ID);
} catch (Exception e) {
// Should not happen
Via.getPlatform().getLogger().warning("Type.VAR_INT.write thrown an exception: " + e);
}
buf.writeBytes(packet);
ChannelHandlerContext context = PipelineUtil
.getPreviousContext(Via.getManager().getInjector().getDecoderName(), channel.pipeline());
if (currentThread) {
if (context != null) {
context.fireChannelRead(buf);
} else {
channel.pipeline().fireChannelRead(buf);
}
} else {
try {
channel.eventLoop().submit(() -> {
if (context != null) {
context.fireChannelRead(buf);
} else {
channel.pipeline().fireChannelRead(buf);
}
});
} catch (Throwable t) {
// Couldn't schedule
buf.release();
throw t;
}
}
} finally {
packet.release();
}
}
/**
* Sends a raw packet to the server. It will submit a task to EventLoop.
*
* @param packet Raw packet to be sent
*/
public void sendRawPacketToServer(ByteBuf packet) {
sendRawPacketToServer(packet, false);
}
/**
* Monitors serverbound packets.
*
* @return false if this packet should be cancelled
*/
public boolean checkIncomingPacket() {
// Ignore if pending disconnect
if (pendingDisconnect) return false;
// Increment received + Check PPS
return !incrementReceived() || !exceedsMaxPPS();
}
/**
* Monitors clientbound packets.
*/
public void checkOutgoingPacket() {
incrementSent();
}
/**
* Checks if packets needs transforming.
*
* @return if packets should be passed through
*/
public boolean shouldTransformPacket() {
return active;
}
/**
* Transforms the clientbound packet contained in an outgoing ByteBuf.
*
* @param buf ByteBuf with packet id and packet contents
* @param cancelSupplier Function called with original CancelException for generating the Exception used when
* packet is cancelled
* @throws CancelException if the packet should be cancelled
* @throws InformativeException if packet transforming failed
* @throws Exception if any other processing outside of transforming fails
*/
public void transformOutgoing(ByteBuf buf, Function<Throwable, Exception> cancelSupplier) throws Exception {
if (!buf.isReadable()) return;
transform(buf, Direction.OUTGOING, cancelSupplier);
}
/**
* Transforms the serverbound packet contained in an incoming ByteBuf.
*
* @param buf ByteBuf with packet id and packet contents
* @param cancelSupplier Function called with original CancelException for generating the Exception used when
* packet is cancelled
* @throws CancelException if the packet should be cancelled
* @throws InformativeException if packet transforming failed
* @throws Exception if any other processing outside of transforming fails
*/
public void transformIncoming(ByteBuf buf, Function<Throwable, Exception> cancelSupplier) throws Exception {
if (!buf.isReadable()) return;
transform(buf, Direction.INCOMING, cancelSupplier);
}
private void transform(ByteBuf buf, Direction direction, Function<Throwable, Exception> cancelSupplier) throws Exception {
int id = Type.VAR_INT.readPrimitive(buf);
if (id == PacketWrapper.PASSTHROUGH_ID) return;
PacketWrapper wrapper = new PacketWrapper(id, buf, this);
try {
protocolInfo.getPipeline().transform(direction, protocolInfo.getState(), wrapper);
} catch (CancelException ex) {
throw cancelSupplier.apply(ex);
}
ByteBuf transformed = buf.alloc().buffer();
try {
wrapper.writeToBuffer(transformed);
buf.clear().writeBytes(transformed);
} finally {
transformed.release();
}
}
public long getId() {
return id;
}
@Nullable
public Channel getChannel() {
return channel;
}
@Nullable
public ProtocolInfo getProtocolInfo() {
return protocolInfo;
}
public void setProtocolInfo(@Nullable ProtocolInfo protocolInfo) {
this.protocolInfo = protocolInfo;
if (protocolInfo != null) {
storedObjects.put(ProtocolInfo.class, protocolInfo);
} else {
storedObjects.remove(ProtocolInfo.class);
}
}
public Map<Class, StoredObject> getStoredObjects() {
return storedObjects;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public boolean isPendingDisconnect() {
return pendingDisconnect;
}
public void setPendingDisconnect(boolean pendingDisconnect) {
this.pendingDisconnect = pendingDisconnect;
}
@Nullable
public Object getLastPacket() {
return lastPacket;
}
public void setLastPacket(@Nullable Object lastPacket) {
this.lastPacket = lastPacket;
}
public long getSentPackets() {
return sentPackets;
}
public void setSentPackets(long sentPackets) {
this.sentPackets = sentPackets;
}
public long getReceivedPackets() {
return receivedPackets;
}
public void setReceivedPackets(long receivedPackets) {
this.receivedPackets = receivedPackets;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getIntervalPackets() {
return intervalPackets;
}
public void setIntervalPackets(long intervalPackets) {
this.intervalPackets = intervalPackets;
}
public long getPacketsPerSecond() {
return packetsPerSecond;
}
public void setPacketsPerSecond(long packetsPerSecond) {
this.packetsPerSecond = packetsPerSecond;
}
public int getSecondsObserved() {
return secondsObserved;
}
public void setSecondsObserved(int secondsObserved) {
this.secondsObserved = secondsObserved;
}
public int getWarnings() {
return warnings;
}
public void setWarnings(int warnings) {
this.warnings = warnings;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserConnection that = (UserConnection) o;
return id == that.id;
}
@Override
public int hashCode() {
return Long.hashCode(id);
}
}
@@ -0,0 +1,220 @@
package us.myles.ViaVersion.api.entities;
import us.myles.ViaVersion.api.Via;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
// 1.10 Entity / Object ids
public class Entity1_10Types {
public static EntityType getTypeFromId(int typeID, boolean isObject) {
Optional<EntityType> type;
if (isObject)
type = ObjectType.getPCEntity(typeID);
else
type = EntityType.findById(typeID);
if (!type.isPresent()) {
Via.getPlatform().getLogger().severe("Could not find 1.10 type id " + typeID + " isObject=" + isObject);
return EntityType.ENTITY; // Fall back to the basic ENTITY
}
return type.get();
}
public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType {
ENTITY(-1),
DROPPED_ITEM(1, ENTITY),
EXPERIENCE_ORB(2, ENTITY),
LEASH_HITCH(8, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata
PAINTING(9, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata
ARROW(10, ENTITY),
SNOWBALL(11, ENTITY), // Actually EntityProjectile
FIREBALL(12, ENTITY),
SMALL_FIREBALL(13, ENTITY),
ENDER_PEARL(14, ENTITY), // Actually EntityProjectile
ENDER_SIGNAL(15, ENTITY),
THROWN_EXP_BOTTLE(17, ENTITY),
ITEM_FRAME(18, ENTITY), // Actually EntityHanging
WITHER_SKULL(19, ENTITY),
PRIMED_TNT(20, ENTITY),
FALLING_BLOCK(21, ENTITY),
FIREWORK(22, ENTITY),
TIPPED_ARROW(23, ARROW),
SPECTRAL_ARROW(24, ARROW),
SHULKER_BULLET(25, ENTITY),
DRAGON_FIREBALL(26, FIREBALL),
ENTITY_LIVING(-1, ENTITY),
ENTITY_INSENTIENT(-1, ENTITY_LIVING),
ENTITY_AGEABLE(-1, ENTITY_INSENTIENT),
ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE),
ENTITY_HUMAN(-1, ENTITY_LIVING),
ARMOR_STAND(30, ENTITY_LIVING),
// Vehicles
MINECART_ABSTRACT(-1, ENTITY),
MINECART_COMMAND(40, MINECART_ABSTRACT),
BOAT(41, ENTITY),
MINECART_RIDEABLE(42, MINECART_ABSTRACT),
MINECART_CHEST(43, MINECART_ABSTRACT),
MINECART_FURNACE(44, MINECART_ABSTRACT),
MINECART_TNT(45, MINECART_ABSTRACT),
MINECART_HOPPER(46, MINECART_ABSTRACT),
MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT),
CREEPER(50, ENTITY_INSENTIENT),
SKELETON(51, ENTITY_INSENTIENT),
SPIDER(52, ENTITY_INSENTIENT),
GIANT(53, ENTITY_INSENTIENT),
ZOMBIE(54, ENTITY_INSENTIENT),
SLIME(55, ENTITY_INSENTIENT),
GHAST(56, ENTITY_INSENTIENT),
PIG_ZOMBIE(57, ZOMBIE),
ENDERMAN(58, ENTITY_INSENTIENT),
CAVE_SPIDER(59, SPIDER),
SILVERFISH(60, ENTITY_INSENTIENT),
BLAZE(61, ENTITY_INSENTIENT),
MAGMA_CUBE(62, SLIME),
ENDER_DRAGON(63, ENTITY_INSENTIENT),
WITHER(64, ENTITY_INSENTIENT),
BAT(65, ENTITY_INSENTIENT),
WITCH(66, ENTITY_INSENTIENT),
ENDERMITE(67, ENTITY_INSENTIENT),
GUARDIAN(68, ENTITY_INSENTIENT),
IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references
SHULKER(69, IRON_GOLEM),
PIG(90, ENTITY_AGEABLE),
SHEEP(91, ENTITY_AGEABLE),
COW(92, ENTITY_AGEABLE),
CHICKEN(93, ENTITY_AGEABLE),
SQUID(94, ENTITY_INSENTIENT),
WOLF(95, ENTITY_TAMEABLE_ANIMAL),
MUSHROOM_COW(96, COW),
SNOWMAN(97, IRON_GOLEM),
OCELOT(98, ENTITY_TAMEABLE_ANIMAL),
HORSE(100, ENTITY_AGEABLE),
RABBIT(101, ENTITY_AGEABLE),
POLAR_BEAR(102, ENTITY_AGEABLE),
VILLAGER(120, ENTITY_AGEABLE),
ENDER_CRYSTAL(200, ENTITY),
SPLASH_POTION(-1, ENTITY),
LINGERING_POTION(-1, SPLASH_POTION),
AREA_EFFECT_CLOUD(-1, ENTITY),
EGG(-1, ENTITY),
FISHING_HOOK(-1, ENTITY),
LIGHTNING(-1, ENTITY),
WEATHER(-1, ENTITY),
PLAYER(-1, ENTITY_HUMAN),
COMPLEX_PART(-1, ENTITY);
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
private final int id;
private final EntityType parent;
EntityType(int id) {
this.id = id;
this.parent = null;
}
EntityType(int id, EntityType parent) {
this.id = id;
this.parent = parent;
}
static {
for (EntityType type : EntityType.values()) {
TYPES.put(type.id, type);
}
}
public static Optional<EntityType> findById(int id) {
if (id == -1) // Check if this is called
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getParent() {
return parent;
}
}
public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType {
BOAT(1, EntityType.BOAT),
ITEM(2, EntityType.DROPPED_ITEM),
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
MINECART(10, EntityType.MINECART_RIDEABLE),
TNT_PRIMED(50, EntityType.PRIMED_TNT),
ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL),
TIPPED_ARROW(60, EntityType.TIPPED_ARROW),
SNOWBALL(61, EntityType.SNOWBALL),
EGG(62, EntityType.EGG),
FIREBALL(63, EntityType.FIREBALL),
SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL),
ENDER_PEARL(65, EntityType.ENDER_PEARL),
WITHER_SKULL(66, EntityType.WITHER_SKULL),
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
ITEM_FRAME(71, EntityType.ITEM_FRAME),
ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL),
POTION(73, EntityType.SPLASH_POTION),
THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE),
FIREWORK(76, EntityType.FIREWORK),
LEASH(77, EntityType.LEASH_HITCH),
ARMOR_STAND(78, EntityType.ARMOR_STAND),
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL);
private static final Map<Integer, ObjectType> TYPES = new HashMap<>();
private final int id;
private final EntityType type;
static {
for (ObjectType type : ObjectType.values()) {
TYPES.put(type.id, type);
}
}
ObjectType(int id, EntityType type) {
this.id = id;
this.type = type;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getType() {
return type;
}
public static Optional<ObjectType> findById(int id) {
if (id == -1)
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
public static Optional<EntityType> getPCEntity(int id) {
Optional<ObjectType> output = findById(id);
if (!output.isPresent())
return Optional.empty();
return Optional.of(output.get().type);
}
}
}
@@ -0,0 +1,250 @@
package us.myles.ViaVersion.api.entities;
import us.myles.ViaVersion.api.Via;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
// 1.11 Entity / Object ids TODO maybe in the future instead of copying it, some api.
public class Entity1_11Types {
public static EntityType getTypeFromId(int typeID, boolean isObject) {
Optional<EntityType> type;
if (isObject)
type = ObjectType.getPCEntity(typeID);
else
type = EntityType.findById(typeID);
if (!type.isPresent()) {
Via.getPlatform().getLogger().severe("Could not find 1.11 type id " + typeID + " isObject=" + isObject);
return EntityType.ENTITY; // Fall back to the basic ENTITY
}
return type.get();
}
public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType {
ENTITY(-1),
DROPPED_ITEM(1, ENTITY),
EXPERIENCE_ORB(2, ENTITY),
LEASH_HITCH(8, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata
PAINTING(9, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata
ARROW(10, ENTITY),
SNOWBALL(11, ENTITY), // Actually EntityProjectile
FIREBALL(12, ENTITY),
SMALL_FIREBALL(13, ENTITY),
ENDER_PEARL(14, ENTITY), // Actually EntityProjectile
ENDER_SIGNAL(15, ENTITY),
THROWN_EXP_BOTTLE(17, ENTITY),
ITEM_FRAME(18, ENTITY), // Actually EntityHanging
WITHER_SKULL(19, ENTITY),
PRIMED_TNT(20, ENTITY),
FALLING_BLOCK(21, ENTITY),
FIREWORK(22, ENTITY),
SPECTRAL_ARROW(24, ARROW),
SHULKER_BULLET(25, ENTITY),
DRAGON_FIREBALL(26, FIREBALL),
EVOCATION_FANGS(33, ENTITY),
ENTITY_LIVING(-1, ENTITY),
ENTITY_INSENTIENT(-1, ENTITY_LIVING),
ENTITY_AGEABLE(-1, ENTITY_INSENTIENT),
ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE),
ENTITY_HUMAN(-1, ENTITY_LIVING),
ARMOR_STAND(30, ENTITY_LIVING),
EVOCATION_ILLAGER(34, ENTITY_INSENTIENT),
VEX(35, ENTITY_INSENTIENT),
VINDICATION_ILLAGER(36, ENTITY_INSENTIENT),
// Vehicles
MINECART_ABSTRACT(-1, ENTITY),
MINECART_COMMAND(40, MINECART_ABSTRACT),
BOAT(41, ENTITY),
MINECART_RIDEABLE(42, MINECART_ABSTRACT),
MINECART_CHEST(43, MINECART_ABSTRACT),
MINECART_FURNACE(44, MINECART_ABSTRACT),
MINECART_TNT(45, MINECART_ABSTRACT),
MINECART_HOPPER(46, MINECART_ABSTRACT),
MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT),
CREEPER(50, ENTITY_INSENTIENT),
ABSTRACT_SKELETON(-1, ENTITY_INSENTIENT),
SKELETON(51, ABSTRACT_SKELETON),
WITHER_SKELETON(5, ABSTRACT_SKELETON),
STRAY(6, ABSTRACT_SKELETON),
SPIDER(52, ENTITY_INSENTIENT),
GIANT(53, ENTITY_INSENTIENT),
ZOMBIE(54, ENTITY_INSENTIENT),
HUSK(23, ZOMBIE),
ZOMBIE_VILLAGER(27, ZOMBIE),
SLIME(55, ENTITY_INSENTIENT),
GHAST(56, ENTITY_INSENTIENT),
PIG_ZOMBIE(57, ZOMBIE),
ENDERMAN(58, ENTITY_INSENTIENT),
CAVE_SPIDER(59, SPIDER),
SILVERFISH(60, ENTITY_INSENTIENT),
BLAZE(61, ENTITY_INSENTIENT),
MAGMA_CUBE(62, SLIME),
ENDER_DRAGON(63, ENTITY_INSENTIENT),
WITHER(64, ENTITY_INSENTIENT),
BAT(65, ENTITY_INSENTIENT),
WITCH(66, ENTITY_INSENTIENT),
ENDERMITE(67, ENTITY_INSENTIENT),
GUARDIAN(68, ENTITY_INSENTIENT),
ELDER_GUARDIAN(4, GUARDIAN), // Moved down to avoid illegal forward reference
IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references
SHULKER(69, IRON_GOLEM),
PIG(90, ENTITY_AGEABLE),
SHEEP(91, ENTITY_AGEABLE),
COW(92, ENTITY_AGEABLE),
CHICKEN(93, ENTITY_AGEABLE),
SQUID(94, ENTITY_INSENTIENT),
WOLF(95, ENTITY_TAMEABLE_ANIMAL),
MUSHROOM_COW(96, COW),
SNOWMAN(97, IRON_GOLEM),
OCELOT(98, ENTITY_TAMEABLE_ANIMAL),
ABSTRACT_HORSE(-1, ENTITY_AGEABLE),
HORSE(100, ABSTRACT_HORSE),
SKELETON_HORSE(28, ABSTRACT_HORSE),
ZOMBIE_HORSE(29, ABSTRACT_HORSE),
CHESTED_HORSE(-1, ABSTRACT_HORSE),
DONKEY(31, CHESTED_HORSE),
MULE(32, CHESTED_HORSE),
LIAMA(103, CHESTED_HORSE),
RABBIT(101, ENTITY_AGEABLE),
POLAR_BEAR(102, ENTITY_AGEABLE),
VILLAGER(120, ENTITY_AGEABLE),
ENDER_CRYSTAL(200, ENTITY),
SPLASH_POTION(-1, ENTITY),
LINGERING_POTION(-1, SPLASH_POTION),
AREA_EFFECT_CLOUD(-1, ENTITY),
EGG(-1, ENTITY),
FISHING_HOOK(-1, ENTITY),
LIGHTNING(-1, ENTITY),
WEATHER(-1, ENTITY),
PLAYER(-1, ENTITY_HUMAN),
COMPLEX_PART(-1, ENTITY),
LIAMA_SPIT(-1, ENTITY);
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
private final int id;
private final EntityType parent;
EntityType(int id) {
this.id = id;
this.parent = null;
}
EntityType(int id, EntityType parent) {
this.id = id;
this.parent = parent;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getParent() {
return parent;
}
static {
for (EntityType type : EntityType.values()) {
TYPES.put(type.id, type);
}
}
public static Optional<EntityType> findById(int id) {
if (id == -1) // Check if this is called
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
}
public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType {
BOAT(1, EntityType.BOAT),
ITEM(2, EntityType.DROPPED_ITEM),
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
MINECART(10, EntityType.MINECART_RIDEABLE),
TNT_PRIMED(50, EntityType.PRIMED_TNT),
ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL),
TIPPED_ARROW(60, EntityType.ARROW),
SNOWBALL(61, EntityType.SNOWBALL),
EGG(62, EntityType.EGG),
FIREBALL(63, EntityType.FIREBALL),
SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL),
ENDER_PEARL(65, EntityType.ENDER_PEARL),
WITHER_SKULL(66, EntityType.WITHER_SKULL),
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
LIAMA_SPIT(68, EntityType.LIAMA_SPIT),
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
ITEM_FRAME(71, EntityType.ITEM_FRAME),
ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL),
POTION(73, EntityType.SPLASH_POTION),
THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE),
FIREWORK(76, EntityType.FIREWORK),
LEASH(77, EntityType.LEASH_HITCH),
ARMOR_STAND(78, EntityType.ARMOR_STAND),
EVOCATION_FANGS(79, EntityType.EVOCATION_FANGS),
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL);
private static final Map<Integer, ObjectType> TYPES = new HashMap<>();
private final int id;
private final EntityType type;
static {
for (ObjectType type : ObjectType.values()) {
TYPES.put(type.id, type);
}
}
ObjectType(int id, EntityType type) {
this.id = id;
this.type = type;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getType() {
return type;
}
public static Optional<ObjectType> findById(int id) {
if (id == -1)
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
public static Optional<EntityType> getPCEntity(int id) {
Optional<ObjectType> output = findById(id);
if (!output.isPresent())
return Optional.empty();
return Optional.of(output.get().type);
}
}
}
@@ -0,0 +1,263 @@
/*
* Copyright (c) 2016 Matsv
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package us.myles.ViaVersion.api.entities;
import us.myles.ViaVersion.api.Via;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
// 1.12 Entity / Object taken from https://github.com/Matsv/ViaBackwards/blob/master/core/src/main/java/nl/matsv/viabackwards/api/entities/types/EntityType1_12.java
public class Entity1_12Types {
public static EntityType getTypeFromId(int typeID, boolean isObject) {
Optional<EntityType> type;
if (isObject)
type = ObjectType.getPCEntity(typeID);
else
type = EntityType.findById(typeID);
if (!type.isPresent()) {
Via.getPlatform().getLogger().severe("Could not find 1.12 type id " + typeID + " isObject=" + isObject);
return EntityType.ENTITY; // Fall back to the basic ENTITY
}
return type.get();
}
public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType {
ENTITY(-1),
DROPPED_ITEM(1, ENTITY),
EXPERIENCE_ORB(2, ENTITY),
LEASH_HITCH(8, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata
PAINTING(9, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata
ARROW(10, ENTITY),
SNOWBALL(11, ENTITY), // Actually EntityProjectile
FIREBALL(12, ENTITY),
SMALL_FIREBALL(13, ENTITY),
ENDER_PEARL(14, ENTITY), // Actually EntityProjectile
ENDER_SIGNAL(15, ENTITY),
THROWN_EXP_BOTTLE(17, ENTITY),
ITEM_FRAME(18, ENTITY), // Actually EntityHanging
WITHER_SKULL(19, ENTITY),
PRIMED_TNT(20, ENTITY),
FALLING_BLOCK(21, ENTITY),
FIREWORK(22, ENTITY),
SPECTRAL_ARROW(24, ARROW),
SHULKER_BULLET(25, ENTITY),
DRAGON_FIREBALL(26, FIREBALL),
EVOCATION_FANGS(33, ENTITY),
ENTITY_LIVING(-1, ENTITY),
ENTITY_INSENTIENT(-1, ENTITY_LIVING),
ENTITY_AGEABLE(-1, ENTITY_INSENTIENT),
ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE),
ENTITY_HUMAN(-1, ENTITY_LIVING),
ARMOR_STAND(30, ENTITY_LIVING),
ENTITY_ILLAGER_ABSTRACT(-1, ENTITY_INSENTIENT),
EVOCATION_ILLAGER(34, ENTITY_ILLAGER_ABSTRACT),
VEX(35, ENTITY_INSENTIENT),
VINDICATION_ILLAGER(36, ENTITY_ILLAGER_ABSTRACT),
ILLUSION_ILLAGER(37, EVOCATION_ILLAGER),
// Vehicles
MINECART_ABSTRACT(-1, ENTITY),
MINECART_COMMAND(40, MINECART_ABSTRACT),
BOAT(41, ENTITY),
MINECART_RIDEABLE(42, MINECART_ABSTRACT),
MINECART_CHEST(43, MINECART_ABSTRACT),
MINECART_FURNACE(44, MINECART_ABSTRACT),
MINECART_TNT(45, MINECART_ABSTRACT),
MINECART_HOPPER(46, MINECART_ABSTRACT),
MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT),
CREEPER(50, ENTITY_INSENTIENT),
ABSTRACT_SKELETON(-1, ENTITY_INSENTIENT),
SKELETON(51, ABSTRACT_SKELETON),
WITHER_SKELETON(5, ABSTRACT_SKELETON),
STRAY(6, ABSTRACT_SKELETON),
SPIDER(52, ENTITY_INSENTIENT),
GIANT(53, ENTITY_INSENTIENT),
ZOMBIE(54, ENTITY_INSENTIENT),
HUSK(23, ZOMBIE),
ZOMBIE_VILLAGER(27, ZOMBIE),
SLIME(55, ENTITY_INSENTIENT),
GHAST(56, ENTITY_INSENTIENT),
PIG_ZOMBIE(57, ZOMBIE),
ENDERMAN(58, ENTITY_INSENTIENT),
CAVE_SPIDER(59, SPIDER),
SILVERFISH(60, ENTITY_INSENTIENT),
BLAZE(61, ENTITY_INSENTIENT),
MAGMA_CUBE(62, SLIME),
ENDER_DRAGON(63, ENTITY_INSENTIENT),
WITHER(64, ENTITY_INSENTIENT),
BAT(65, ENTITY_INSENTIENT),
WITCH(66, ENTITY_INSENTIENT),
ENDERMITE(67, ENTITY_INSENTIENT),
GUARDIAN(68, ENTITY_INSENTIENT),
ELDER_GUARDIAN(4, GUARDIAN), // Moved down to avoid illegal forward reference
IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references
SHULKER(69, IRON_GOLEM),
PIG(90, ENTITY_AGEABLE),
SHEEP(91, ENTITY_AGEABLE),
COW(92, ENTITY_AGEABLE),
CHICKEN(93, ENTITY_AGEABLE),
SQUID(94, ENTITY_INSENTIENT),
WOLF(95, ENTITY_TAMEABLE_ANIMAL),
MUSHROOM_COW(96, COW),
SNOWMAN(97, IRON_GOLEM),
OCELOT(98, ENTITY_TAMEABLE_ANIMAL),
PARROT(105, ENTITY_TAMEABLE_ANIMAL),
ABSTRACT_HORSE(-1, ENTITY_AGEABLE),
HORSE(100, ABSTRACT_HORSE),
SKELETON_HORSE(28, ABSTRACT_HORSE),
ZOMBIE_HORSE(29, ABSTRACT_HORSE),
CHESTED_HORSE(-1, ABSTRACT_HORSE),
DONKEY(31, CHESTED_HORSE),
MULE(32, CHESTED_HORSE),
LIAMA(103, CHESTED_HORSE),
RABBIT(101, ENTITY_AGEABLE),
POLAR_BEAR(102, ENTITY_AGEABLE),
VILLAGER(120, ENTITY_AGEABLE),
ENDER_CRYSTAL(200, ENTITY),
SPLASH_POTION(-1, ENTITY),
LINGERING_POTION(-1, SPLASH_POTION),
AREA_EFFECT_CLOUD(-1, ENTITY),
EGG(-1, ENTITY),
FISHING_HOOK(-1, ENTITY),
LIGHTNING(-1, ENTITY),
WEATHER(-1, ENTITY),
PLAYER(-1, ENTITY_HUMAN),
COMPLEX_PART(-1, ENTITY),
LIAMA_SPIT(-1, ENTITY);
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
private final int id;
private final EntityType parent;
EntityType(int id) {
this.id = id;
this.parent = null;
}
EntityType(int id, EntityType parent) {
this.id = id;
this.parent = parent;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getParent() {
return parent;
}
static {
for (EntityType type : EntityType.values()) {
TYPES.put(type.id, type);
}
}
public static Optional<EntityType> findById(int id) {
if (id == -1) // Check if this is called
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
}
public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType {
BOAT(1, EntityType.BOAT),
ITEM(2, EntityType.DROPPED_ITEM),
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
MINECART(10, EntityType.MINECART_RIDEABLE),
TNT_PRIMED(50, EntityType.PRIMED_TNT),
ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL),
TIPPED_ARROW(60, EntityType.ARROW),
SNOWBALL(61, EntityType.SNOWBALL),
EGG(62, EntityType.EGG),
FIREBALL(63, EntityType.FIREBALL),
SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL),
ENDER_PEARL(65, EntityType.ENDER_PEARL),
WITHER_SKULL(66, EntityType.WITHER_SKULL),
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
LIAMA_SPIT(68, EntityType.LIAMA_SPIT),
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
ITEM_FRAME(71, EntityType.ITEM_FRAME),
ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL),
POTION(73, EntityType.SPLASH_POTION),
THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE),
FIREWORK(76, EntityType.FIREWORK),
LEASH(77, EntityType.LEASH_HITCH),
ARMOR_STAND(78, EntityType.ARMOR_STAND),
EVOCATION_FANGS(79, EntityType.EVOCATION_FANGS),
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL);
private static final Map<Integer, ObjectType> TYPES = new HashMap<>();
private final int id;
private final EntityType type;
static {
for (ObjectType type : ObjectType.values()) {
TYPES.put(type.id, type);
}
}
ObjectType(int id, EntityType type) {
this.id = id;
this.type = type;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getType() {
return type;
}
public static Optional<ObjectType> findById(int id) {
if (id == -1)
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
public static Optional<EntityType> getPCEntity(int id) {
Optional<ObjectType> output = findById(id);
if (!output.isPresent())
return Optional.empty();
return Optional.of(output.get().type);
}
}
}
@@ -0,0 +1,311 @@
package us.myles.ViaVersion.api.entities;
import us.myles.ViaVersion.api.Via;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
// TODO auto generate 18w11a with PAaaS
public class Entity1_13Types {
public static EntityType getTypeFromId(int typeID, boolean isObject) {
Optional<EntityType> type;
if (isObject)
type = ObjectType.getPCEntity(typeID);
else
type = EntityType.findById(typeID);
if (!type.isPresent()) {
Via.getPlatform().getLogger().severe("Could not find 1.13 type id " + typeID + " isObject=" + isObject);
return EntityType.ENTITY; // Fall back to the basic ENTITY
}
return type.get();
}
public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType {
// Auto generated
ENTITY(-1), // abm
AREA_EFFECT_CLOUD(0, ENTITY), // abk
END_CRYSTAL(16, ENTITY), // aho
EVOKER_FANGS(20, ENTITY), // ala
EXPERIENCE_ORB(22, ENTITY), // abs
EYE_OF_ENDER(23, ENTITY), // alb
FALLING_BLOCK(24, ENTITY), // aix
FIREWORK_ROCKET(25, ENTITY), // alc
ITEM(32, ENTITY), // aiy
LLAMA_SPIT(37, ENTITY), // ale
TNT(55, ENTITY), // aiz
SHULKER_BULLET(60, ENTITY), // alh
FISHING_BOBBER(93, ENTITY), // ais
LIVINGENTITY(-1, ENTITY), // abv
ARMOR_STAND(1, LIVINGENTITY), // ail
PLAYER(92, LIVINGENTITY), // aks
ABSTRACT_INSENTIENT(-1, LIVINGENTITY), // abw
ENDER_DRAGON(17, ABSTRACT_INSENTIENT), // ahp
ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT), // acd
ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE), // abj
VILLAGER(79, ABSTRACT_AGEABLE), // akn
// Animals
ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE), // agd
CHICKEN(7, ABSTRACT_ANIMAL), // age
COW(9, ABSTRACT_ANIMAL), // agg
MOOSHROOM(47, COW), // agi
PIG(51, ABSTRACT_ANIMAL), // agl
POLAR_BEAR(54, ABSTRACT_ANIMAL), // agm
RABBIT(56, ABSTRACT_ANIMAL), // ago
SHEEP(58, ABSTRACT_ANIMAL), // agq
TURTLE(73, ABSTRACT_ANIMAL), // agv
ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL), // acg
OCELOT(48, ABSTRACT_TAMEABLE_ANIMAL), // agj
WOLF(86, ABSTRACT_TAMEABLE_ANIMAL), // agy
ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL), // agr
PARROT(50, ABSTRACT_PARROT), // agk
// Horses
ABSTRACT_HORSE(-1, ABSTRACT_ANIMAL), // aha
CHESTED_HORSE(-1, ABSTRACT_HORSE), // agz
DONKEY(11, CHESTED_HORSE), // ahb
MULE(46, CHESTED_HORSE), // ahf
LLAMA(36, CHESTED_HORSE), // ahe
HORSE(29, ABSTRACT_HORSE), // ahc
SKELETON_HORSE(63, ABSTRACT_HORSE), // ahg
ZOMBIE_HORSE(88, ABSTRACT_HORSE), // ahi
// Golem
ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE), // agc
SNOW_GOLEM(66, ABSTRACT_GOLEM), // ags
IRON_GOLEM(80, ABSTRACT_GOLEM), // agw
SHULKER(59, ABSTRACT_GOLEM), // ajx
// Fish
ABSTRACT_FISHES(-1, ABSTRACT_CREATURE), // agb
COD(8, ABSTRACT_FISHES), // agf
PUFFERFISH(52, ABSTRACT_FISHES), // agn
SALMON(57, ABSTRACT_FISHES), // agp
TROPICAL_FISH(72, ABSTRACT_FISHES), // agu
// Monsters
ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE), // ajs
BLAZE(4, ABSTRACT_MONSTER), // ajd
CREEPER(10, ABSTRACT_MONSTER), // ajf
ENDERMITE(19, ABSTRACT_MONSTER), // ajj
ENDERMAN(18, ABSTRACT_MONSTER), // aji
GIANT(27, ABSTRACT_MONSTER), // ajn
SILVERFISH(61, ABSTRACT_MONSTER), // ajy
VEX(78, ABSTRACT_MONSTER), // ake
WITCH(82, ABSTRACT_MONSTER), // akg
WITHER(83, ABSTRACT_MONSTER), // aij
// Illagers
ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER), // ajb
ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE), // akb
EVOKER(21, ABSTRACT_EVO_ILLU_ILLAGER), // ajl
ILLUSIONER(31, ABSTRACT_EVO_ILLU_ILLAGER), // ajq
VINDICATOR(81, ABSTRACT_ILLAGER_BASE), // akf
// Skeletons
ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER), // ajc
SKELETON(62, ABSTRACT_SKELETON), // ajz
STRAY(71, ABSTRACT_SKELETON), // akd
WITHER_SKELETON(84, ABSTRACT_SKELETON), // akh
// Guardians
GUARDIAN(28, ABSTRACT_MONSTER), // ajo
ELDER_GUARDIAN(15, GUARDIAN), // ajh
// Spiders
SPIDER(69, ABSTRACT_MONSTER), // akc
CAVE_SPIDER(6, SPIDER), // aje
// Zombies - META CHECKED
ZOMBIE(87, ABSTRACT_MONSTER), // aki
DROWNED(14, ZOMBIE), // ajg
HUSK(30, ZOMBIE), // ajp
ZOMBIE_PIGMAN(53, ZOMBIE), // aju
ZOMBIE_VILLAGER(89, ZOMBIE), // akj
// Flying entities
ABSTRACT_FLYING(-1, ABSTRACT_INSENTIENT), // abt
GHAST(26, ABSTRACT_FLYING), // ajm
PHANTOM(90, ABSTRACT_FLYING), // ajt
ABSTRACT_AMBIENT(-1, ABSTRACT_INSENTIENT), // afy
BAT(3, ABSTRACT_AMBIENT), // afz
ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT), // agx
SQUID(70, ABSTRACT_WATERMOB), // agt
DOLPHIN(12, ABSTRACT_WATERMOB),
// Slimes
SLIME(64, ABSTRACT_INSENTIENT), // aka
MAGMA_CUBE(38, SLIME), // ajr
// Hangable objects
ABSTRACT_HANGING(-1, ENTITY), // aim
LEASH_KNOT(35, ABSTRACT_HANGING), // aio
ITEM_FRAME(33, ABSTRACT_HANGING), // ain
PAINTING(49, ABSTRACT_HANGING), // aiq
ABSTRACT_LIGHTNING(-1, ENTITY), // aiu
LIGHTNING_BOLT(91, ABSTRACT_LIGHTNING), // aiv
// Arrows
ABSTRACT_ARROW(-1, ENTITY), // akw
ARROW(2, ABSTRACT_ARROW), // aky
SPECTRAL_ARROW(68, ABSTRACT_ARROW), // alk
TRIDENT(94, ABSTRACT_ARROW), // alq
// Fireballs
ABSTRACT_FIREBALL(-1, ENTITY), // akx
DRAGON_FIREBALL(13, ABSTRACT_FIREBALL), // akz
FIREBALL(34, ABSTRACT_FIREBALL), // ald
SMALL_FIREBALL(65, ABSTRACT_FIREBALL), // ali
WITHER_SKULL(85, ABSTRACT_FIREBALL), // alr
// Projectiles
PROJECTILE_ABSTRACT(-1, ENTITY), // all
SNOWBALL(67, PROJECTILE_ABSTRACT), // alj
ENDER_PEARL(75, PROJECTILE_ABSTRACT), // aln
EGG(74, PROJECTILE_ABSTRACT), // alm
POTION(77, PROJECTILE_ABSTRACT), // alp
EXPERIENCE_BOTTLE(76, PROJECTILE_ABSTRACT), // alo
// Vehicles
MINECART_ABSTRACT(-1, ENTITY), // alt
CHESTED_MINECART_ABSTRACT(-1, MINECART_ABSTRACT), // alu
CHEST_MINECART(40, CHESTED_MINECART_ABSTRACT), // alx
HOPPER_MINECART(43, CHESTED_MINECART_ABSTRACT), // ama
MINECART(39, MINECART_ABSTRACT), // alw
FURNACE_MINECART(42, MINECART_ABSTRACT), // alz
COMMAND_BLOCK_MINECART(41, MINECART_ABSTRACT), // aly
TNT_MINECART(45, MINECART_ABSTRACT), // amc
SPAWNER_MINECART(44, MINECART_ABSTRACT), // amb
BOAT(5, ENTITY); // alv
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
private final int id;
private final EntityType parent;
EntityType(int id) {
this.id = id;
this.parent = null;
}
EntityType(int id, EntityType parent) {
this.id = id;
this.parent = parent;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getParent() {
return parent;
}
static {
for (EntityType type : EntityType.values()) {
TYPES.put(type.id, type);
}
}
public static Optional<EntityType> findById(int id) {
if (id == -1) // Check if this is called
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
}
public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType {
BOAT(1, EntityType.BOAT),
ITEM(2, EntityType.ITEM),
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
MINECART(10, EntityType.MINECART),
TNT_PRIMED(50, EntityType.TNT),
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
TIPPED_ARROW(60, EntityType.ARROW),
SNOWBALL(61, EntityType.SNOWBALL),
EGG(62, EntityType.EGG),
FIREBALL(63, EntityType.FIREBALL),
SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL),
ENDER_PEARL(65, EntityType.ENDER_PEARL),
WITHER_SKULL(66, EntityType.WITHER_SKULL),
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
LLAMA_SPIT(68, EntityType.LLAMA_SPIT),
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
ITEM_FRAME(71, EntityType.ITEM_FRAME),
EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER),
POTION(73, EntityType.POTION),
EXPERIENCE_BOTTLE(75, EntityType.EXPERIENCE_BOTTLE),
FIREWORK_ROCKET(76, EntityType.FIREWORK_ROCKET),
LEASH(77, EntityType.LEASH_KNOT),
ARMOR_STAND(78, EntityType.ARMOR_STAND),
EVOKER_FANGS(79, EntityType.EVOKER_FANGS),
FISHIHNG_HOOK(90, EntityType.FISHING_BOBBER),
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL),
TRIDENT(94, EntityType.TRIDENT);
private static final Map<Integer, ObjectType> TYPES = new HashMap<>();
private final int id;
private final EntityType type;
static {
for (ObjectType type : ObjectType.values()) {
TYPES.put(type.id, type);
}
}
ObjectType(int id, EntityType type) {
this.id = id;
this.type = type;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getType() {
return type;
}
public static Optional<ObjectType> findById(int id) {
if (id == -1)
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
public static Optional<EntityType> getPCEntity(int id) {
Optional<ObjectType> output = findById(id);
if (!output.isPresent())
return Optional.empty();
return Optional.of(output.get().type);
}
public static Optional<ObjectType> fromEntityType(EntityType type) {
for (ObjectType ent : ObjectType.values())
if (ent.type == type)
return Optional.of(ent);
return Optional.empty();
}
}
}
@@ -0,0 +1,237 @@
package us.myles.ViaVersion.api.entities;
import us.myles.ViaVersion.api.Via;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class Entity1_14Types {
public static EntityType getTypeFromId(int typeID) {
Optional<EntityType> type = EntityType.findById(typeID);
if (!type.isPresent()) {
Via.getPlatform().getLogger().severe("Could not find 1.14 type id " + typeID);
return EntityType.ENTITY; // Fall back to the basic ENTITY
}
return type.get();
}
public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType {
// Auto generated
ENTITY(-1),
AREA_EFFECT_CLOUD(0, ENTITY),
END_CRYSTAL(17, ENTITY),
EVOKER_FANGS(21, ENTITY),
EXPERIENCE_ORB(23, ENTITY),
EYE_OF_ENDER(24, ENTITY),
FALLING_BLOCK(25, ENTITY),
FIREWORK_ROCKET(26, ENTITY),
ITEM(34, ENTITY),
LLAMA_SPIT(39, ENTITY),
TNT(58, ENTITY),
SHULKER_BULLET(63, ENTITY),
FISHING_BOBBER(101, ENTITY),
LIVINGENTITY(-1, ENTITY),
ARMOR_STAND(1, LIVINGENTITY),
PLAYER(100, LIVINGENTITY),
ABSTRACT_INSENTIENT(-1, LIVINGENTITY),
ENDER_DRAGON(18, ABSTRACT_INSENTIENT),
ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT),
ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE),
VILLAGER(84, ABSTRACT_AGEABLE),
WANDERING_TRADER(88, ABSTRACT_AGEABLE),
// Animals
ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE),
DOLPHIN(13, ABSTRACT_INSENTIENT),
CHICKEN(8, ABSTRACT_ANIMAL),
COW(10, ABSTRACT_ANIMAL),
MOOSHROOM(49, COW),
PANDA(52, ABSTRACT_INSENTIENT),
PIG(54, ABSTRACT_ANIMAL),
POLAR_BEAR(57, ABSTRACT_ANIMAL),
RABBIT(59, ABSTRACT_ANIMAL),
SHEEP(61, ABSTRACT_ANIMAL),
TURTLE(77, ABSTRACT_ANIMAL),
FOX(27, ABSTRACT_ANIMAL),
ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL),
CAT(6, ABSTRACT_TAMEABLE_ANIMAL),
OCELOT(50, ABSTRACT_TAMEABLE_ANIMAL),
WOLF(93, ABSTRACT_TAMEABLE_ANIMAL),
ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL),
PARROT(53, ABSTRACT_PARROT),
// Horses
ABSTRACT_HORSE(-1, ABSTRACT_ANIMAL),
CHESTED_HORSE(-1, ABSTRACT_HORSE),
DONKEY(12, CHESTED_HORSE),
MULE(48, CHESTED_HORSE),
LLAMA(38, CHESTED_HORSE),
TRADER_LLAMA(75, CHESTED_HORSE),
HORSE(31, ABSTRACT_HORSE),
SKELETON_HORSE(66, ABSTRACT_HORSE),
ZOMBIE_HORSE(95, ABSTRACT_HORSE),
// Golem
ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE),
SNOW_GOLEM(69, ABSTRACT_GOLEM),
IRON_GOLEM(85, ABSTRACT_GOLEM),
SHULKER(62, ABSTRACT_GOLEM),
// Fish
ABSTRACT_FISHES(-1, ABSTRACT_CREATURE),
COD(9, ABSTRACT_FISHES),
PUFFERFISH(55, ABSTRACT_FISHES),
SALMON(60, ABSTRACT_FISHES),
TROPICAL_FISH(76, ABSTRACT_FISHES),
// Monsters
ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE),
BLAZE(4, ABSTRACT_MONSTER),
CREEPER(11, ABSTRACT_MONSTER),
ENDERMITE(20, ABSTRACT_MONSTER),
ENDERMAN(19, ABSTRACT_MONSTER),
GIANT(29, ABSTRACT_MONSTER),
SILVERFISH(64, ABSTRACT_MONSTER),
VEX(83, ABSTRACT_MONSTER),
WITCH(89, ABSTRACT_MONSTER),
WITHER(90, ABSTRACT_MONSTER),
RAVAGER(98, ABSTRACT_MONSTER),
// Illagers
ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER),
ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE),
EVOKER(22, ABSTRACT_EVO_ILLU_ILLAGER),
ILLUSIONER(33, ABSTRACT_EVO_ILLU_ILLAGER),
VINDICATOR(86, ABSTRACT_ILLAGER_BASE),
PILLAGER(87, ABSTRACT_ILLAGER_BASE),
// Skeletons
ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER),
SKELETON(65, ABSTRACT_SKELETON),
STRAY(74, ABSTRACT_SKELETON),
WITHER_SKELETON(91, ABSTRACT_SKELETON),
// Guardians
GUARDIAN(30, ABSTRACT_MONSTER),
ELDER_GUARDIAN(16, GUARDIAN),
// Spiders
SPIDER(72, ABSTRACT_MONSTER),
CAVE_SPIDER(7, SPIDER),
// Zombies - META CHECKED
ZOMBIE(94, ABSTRACT_MONSTER),
DROWNED(15, ZOMBIE),
HUSK(32, ZOMBIE),
ZOMBIE_PIGMAN(56, ZOMBIE),
ZOMBIE_VILLAGER(96, ZOMBIE),
// Flying entities
ABSTRACT_FLYING(-1, ABSTRACT_INSENTIENT),
GHAST(28, ABSTRACT_FLYING),
PHANTOM(97, ABSTRACT_FLYING),
ABSTRACT_AMBIENT(-1, ABSTRACT_INSENTIENT),
BAT(3, ABSTRACT_AMBIENT),
ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT),
SQUID(73, ABSTRACT_WATERMOB),
// Slimes
SLIME(67, ABSTRACT_INSENTIENT),
MAGMA_CUBE(40, SLIME),
// Hangable objects
ABSTRACT_HANGING(-1, ENTITY),
LEASH_KNOT(37, ABSTRACT_HANGING),
ITEM_FRAME(35, ABSTRACT_HANGING),
PAINTING(51, ABSTRACT_HANGING),
ABSTRACT_LIGHTNING(-1, ENTITY),
LIGHTNING_BOLT(99, ABSTRACT_LIGHTNING),
// Arrows
ABSTRACT_ARROW(-1, ENTITY),
ARROW(2, ABSTRACT_ARROW),
SPECTRAL_ARROW(71, ABSTRACT_ARROW),
TRIDENT(82, ABSTRACT_ARROW),
// Fireballs
ABSTRACT_FIREBALL(-1, ENTITY),
DRAGON_FIREBALL(14, ABSTRACT_FIREBALL),
FIREBALL(36, ABSTRACT_FIREBALL),
SMALL_FIREBALL(68, ABSTRACT_FIREBALL),
WITHER_SKULL(92, ABSTRACT_FIREBALL),
// Projectiles
PROJECTILE_ABSTRACT(-1, ENTITY),
SNOWBALL(70, PROJECTILE_ABSTRACT),
ENDER_PEARL(79, PROJECTILE_ABSTRACT),
EGG(78, PROJECTILE_ABSTRACT),
POTION(81, PROJECTILE_ABSTRACT),
EXPERIENCE_BOTTLE(80, PROJECTILE_ABSTRACT),
// Vehicles
MINECART_ABSTRACT(-1, ENTITY),
CHESTED_MINECART_ABSTRACT(-1, MINECART_ABSTRACT),
CHEST_MINECART(42, CHESTED_MINECART_ABSTRACT),
HOPPER_MINECART(45, CHESTED_MINECART_ABSTRACT),
MINECART(41, MINECART_ABSTRACT),
FURNACE_MINECART(44, MINECART_ABSTRACT),
COMMAND_BLOCK_MINECART(43, MINECART_ABSTRACT),
TNT_MINECART(47, MINECART_ABSTRACT),
SPAWNER_MINECART(46, MINECART_ABSTRACT),
BOAT(5, ENTITY),
;
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
private final int id;
private final EntityType parent;
EntityType(int id) {
this.id = id;
this.parent = null;
}
EntityType(int id, EntityType parent) {
this.id = id;
this.parent = parent;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getParent() {
return parent;
}
static {
for (EntityType type : EntityType.values()) {
TYPES.put(type.id, type);
}
}
public static Optional<EntityType> findById(int id) {
if (id == -1)
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
}
}
@@ -0,0 +1,236 @@
package us.myles.ViaVersion.api.entities;
import us.myles.ViaVersion.api.Via;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class Entity1_15Types {
public static EntityType getTypeFromId(int typeID) {
Optional<EntityType> type = EntityType.findById(typeID);
if (!type.isPresent()) {
Via.getPlatform().getLogger().severe("Could not find 1.15 type id " + typeID);
return EntityType.ENTITY; // Fall back to the basic ENTITY
}
return type.get();
}
public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType {
ENTITY(-1),
AREA_EFFECT_CLOUD(0, ENTITY),
END_CRYSTAL(18, ENTITY),
EVOKER_FANGS(22, ENTITY),
EXPERIENCE_ORB(24, ENTITY),
EYE_OF_ENDER(25, ENTITY),
FALLING_BLOCK(26, ENTITY),
FIREWORK_ROCKET(27, ENTITY),
ITEM(35, ENTITY),
LLAMA_SPIT(40, ENTITY),
TNT(59, ENTITY),
SHULKER_BULLET(64, ENTITY),
FISHING_BOBBER(102, ENTITY),
LIVINGENTITY(-1, ENTITY),
ARMOR_STAND(1, LIVINGENTITY),
PLAYER(101, LIVINGENTITY),
ABSTRACT_INSENTIENT(-1, LIVINGENTITY),
ENDER_DRAGON(19, ABSTRACT_INSENTIENT),
BEE(4, ABSTRACT_INSENTIENT),
ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT),
ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE),
VILLAGER(85, ABSTRACT_AGEABLE),
WANDERING_TRADER(89, ABSTRACT_AGEABLE),
// Animals
ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE),
DOLPHIN(14, ABSTRACT_INSENTIENT),
CHICKEN(9, ABSTRACT_ANIMAL),
COW(11, ABSTRACT_ANIMAL),
MOOSHROOM(50, COW),
PANDA(53, ABSTRACT_INSENTIENT),
PIG(55, ABSTRACT_ANIMAL),
POLAR_BEAR(58, ABSTRACT_ANIMAL),
RABBIT(60, ABSTRACT_ANIMAL),
SHEEP(62, ABSTRACT_ANIMAL),
TURTLE(78, ABSTRACT_ANIMAL),
FOX(28, ABSTRACT_ANIMAL),
ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL),
CAT(7, ABSTRACT_TAMEABLE_ANIMAL),
OCELOT(51, ABSTRACT_TAMEABLE_ANIMAL),
WOLF(94, ABSTRACT_TAMEABLE_ANIMAL),
ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL),
PARROT(54, ABSTRACT_PARROT),
// Horses
ABSTRACT_HORSE(-1, ABSTRACT_ANIMAL),
CHESTED_HORSE(-1, ABSTRACT_HORSE),
DONKEY(13, CHESTED_HORSE),
MULE(49, CHESTED_HORSE),
LLAMA(39, CHESTED_HORSE),
TRADER_LLAMA(76, CHESTED_HORSE),
HORSE(32, ABSTRACT_HORSE),
SKELETON_HORSE(67, ABSTRACT_HORSE),
ZOMBIE_HORSE(96, ABSTRACT_HORSE),
// Golem
ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE),
SNOW_GOLEM(70, ABSTRACT_GOLEM),
IRON_GOLEM(86, ABSTRACT_GOLEM),
SHULKER(63, ABSTRACT_GOLEM),
// Fish
ABSTRACT_FISHES(-1, ABSTRACT_CREATURE),
COD(10, ABSTRACT_FISHES),
PUFFERFISH(56, ABSTRACT_FISHES),
SALMON(61, ABSTRACT_FISHES),
TROPICAL_FISH(77, ABSTRACT_FISHES),
// Monsters
ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE),
BLAZE(5, ABSTRACT_MONSTER),
CREEPER(12, ABSTRACT_MONSTER),
ENDERMITE(21, ABSTRACT_MONSTER),
ENDERMAN(20, ABSTRACT_MONSTER),
GIANT(30, ABSTRACT_MONSTER),
SILVERFISH(65, ABSTRACT_MONSTER),
VEX(84, ABSTRACT_MONSTER),
WITCH(90, ABSTRACT_MONSTER),
WITHER(91, ABSTRACT_MONSTER),
RAVAGER(99, ABSTRACT_MONSTER),
// Illagers
ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER),
ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE),
EVOKER(23, ABSTRACT_EVO_ILLU_ILLAGER),
ILLUSIONER(34, ABSTRACT_EVO_ILLU_ILLAGER),
VINDICATOR(87, ABSTRACT_ILLAGER_BASE),
PILLAGER(88, ABSTRACT_ILLAGER_BASE),
// Skeletons
ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER),
SKELETON(66, ABSTRACT_SKELETON),
STRAY(75, ABSTRACT_SKELETON),
WITHER_SKELETON(92, ABSTRACT_SKELETON),
// Guardians
GUARDIAN(31, ABSTRACT_MONSTER),
ELDER_GUARDIAN(17, GUARDIAN),
// Spiders
SPIDER(73, ABSTRACT_MONSTER),
CAVE_SPIDER(8, SPIDER),
// Zombies
ZOMBIE(95, ABSTRACT_MONSTER),
DROWNED(16, ZOMBIE),
HUSK(33, ZOMBIE),
ZOMBIE_PIGMAN(57, ZOMBIE),
ZOMBIE_VILLAGER(97, ZOMBIE),
// Flying entities
ABSTRACT_FLYING(-1, ABSTRACT_INSENTIENT),
GHAST(29, ABSTRACT_FLYING),
PHANTOM(98, ABSTRACT_FLYING),
ABSTRACT_AMBIENT(-1, ABSTRACT_INSENTIENT),
BAT(3, ABSTRACT_AMBIENT),
ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT),
SQUID(74, ABSTRACT_WATERMOB),
// Slimes
SLIME(68, ABSTRACT_INSENTIENT),
MAGMA_CUBE(41, SLIME),
// Hangable objects
ABSTRACT_HANGING(-1, ENTITY),
LEASH_KNOT(38, ABSTRACT_HANGING),
ITEM_FRAME(36, ABSTRACT_HANGING),
PAINTING(52, ABSTRACT_HANGING),
ABSTRACT_LIGHTNING(-1, ENTITY),
LIGHTNING_BOLT(100, ABSTRACT_LIGHTNING),
// Arrows
ABSTRACT_ARROW(-1, ENTITY),
ARROW(2, ABSTRACT_ARROW),
SPECTRAL_ARROW(72, ABSTRACT_ARROW),
TRIDENT(83, ABSTRACT_ARROW),
// Fireballs
ABSTRACT_FIREBALL(-1, ENTITY),
DRAGON_FIREBALL(15, ABSTRACT_FIREBALL),
FIREBALL(37, ABSTRACT_FIREBALL),
SMALL_FIREBALL(69, ABSTRACT_FIREBALL),
WITHER_SKULL(93, ABSTRACT_FIREBALL),
// Projectiles
PROJECTILE_ABSTRACT(-1, ENTITY),
SNOWBALL(71, PROJECTILE_ABSTRACT),
ENDER_PEARL(80, PROJECTILE_ABSTRACT),
EGG(79, PROJECTILE_ABSTRACT),
POTION(82, PROJECTILE_ABSTRACT),
EXPERIENCE_BOTTLE(81, PROJECTILE_ABSTRACT),
// Vehicles
MINECART_ABSTRACT(-1, ENTITY),
CHESTED_MINECART_ABSTRACT(-1, MINECART_ABSTRACT),
CHEST_MINECART(43, CHESTED_MINECART_ABSTRACT),
HOPPER_MINECART(46, CHESTED_MINECART_ABSTRACT),
MINECART(42, MINECART_ABSTRACT),
FURNACE_MINECART(45, MINECART_ABSTRACT),
COMMAND_BLOCK_MINECART(44, MINECART_ABSTRACT),
TNT_MINECART(48, MINECART_ABSTRACT),
SPAWNER_MINECART(47, MINECART_ABSTRACT),
BOAT(6, ENTITY);
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
private final int id;
private final EntityType parent;
EntityType(int id) {
this.id = id;
this.parent = null;
}
EntityType(int id, EntityType parent) {
this.id = id;
this.parent = parent;
}
@Override
public int getId() {
return id;
}
@Override
public EntityType getParent() {
return parent;
}
static {
for (EntityType type : EntityType.values()) {
TYPES.put(type.id, type);
}
}
public static Optional<EntityType> findById(int id) {
if (id == -1)
return Optional.empty();
return Optional.ofNullable(TYPES.get(id));
}
}
}
Loaded 100 of 617 files, more files were not shown because too many files have changed in this diff. Show more