tiny	2	0	spigot	mojang+yarn

# Originally DistanceManager, which also implements DistanceManager, so clashes since the implemented class
# is imported and not fully qualified. Easiest fix is to just change the name
c	net/minecraft/server/level/PlayerChunkMap$a	net/minecraft/server/level/ChunkMap$ChunkDistanceManager

# CraftBukkit adds the getServer() method, clashes with a Mojang method
c	net/minecraft/world/level/World	net/minecraft/world/level/Level
	m	()Lorg/bukkit/craftbukkit/CraftServer;	getServer	getCraftServer

# CraftBukkit adds the server field, clashes with a Mojang field
c	net/minecraft/server/network/PlayerConnection	net/minecraft/server/network/ServerGamePacketListenerImpl
	m	()Lorg/bukkit/craftbukkit/entity/CraftPlayer;	getPlayer	getCraftPlayer

# CraftBukkit adds the player field, clashes with a Mojang field
#c	net/minecraft/world/inventory/ContainerWorkbench	net/minecraft/world/inventory/CraftingMenu
#	f	Lnet/minecraft/world/entity/player/PlayerInventory;	player	playerInventory

# CraftBukkit adds the getType() method, clashes with a Mojang method
c	net/minecraft/world/entity/EntityAreaEffectCloud	net/minecraft/world/entity/AreaEffectCloud
	m	()Ljava/lang/String;	getType	getPotionType

# CraftBukkit adds the getType() method, clashes with a Mojang method
c	net/minecraft/world/entity/projectile/EntityTippedArrow	net/minecraft/world/entity/projectile/Arrow
	m	()Ljava/lang/String;	getType	getPotionType

# CraftBukkit adds the getLevel() method, clashes with original method
#c	net/minecraft/world/level/block/entity/TileEntityBeacon	net/minecraft/world/level/block/entity/BeaconBlockEntity
#	m	()I	getLevel	getLevelCb

# CraftBukkit adds the getLootTable() method, clashes with original method
#c	net/minecraft/world/entity/EntityInsentient	net/minecraft/world/entity/Mob
#	m	()Lnet/minecraft/resources/MinecraftKey;	getLootTable	getLootTableCb

# CraftBukkit adds the canCollideWith() method, clashes with original method
#c	net/minecraft/world/entity/Entity	net/minecraft/world/entity/Entity
#	m	(Lnet/minecraft/world/entity/Entity;)Z	canCollideWith	canCollideWithCb

# CraftBukkit adds a new `a` method which allows passing the Entity parameter
# It uses `a` to match the original method (with just 1 param), so this patch makes them match
#c	net/minecraft/server/level/WorldServer	net/minecraft/server/level/ServerLevel
#	m	(Lnet/minecraft/server/level/WorldServer;Lnet/minecraft/world/entity/Entity;)V	a	makeObsidianPlatform

# CraftBukkit adds `getMinecraftWorld()` to `GeneratorAccess`, which matches `WorldAccess.getMinecraftWorld()`
# But that method in `WorldAccess` is called `getLevel()` in Mojang mappings
#c	net/minecraft/world/level/GeneratorAccess	net/minecraft/world/level/LevelAccessor
#	m	()Lnet/minecraft/server/level/WorldServer;	getMinecraftWorld	getLevel

# SpecialSource2 automatically maps methods to the name of synthetic methods that point to it in an attempt to
# normalize method names with what is expected by the super class. This is _extremely_ stupid and flawed however
# because synthetic methods by definition have different descriptors than the base method, which means method
# signature clashes become possible, which is what happens here.
#
# LootEntryAbstract$Serializer has a synthetic method pointing to the base serialize() method with the following descriptor:
#
#    (JsonObject,Object,JsonSerializationContext)V  <-- ProGuard names this method `a`
#
# and this synthetic method points to another method with the specialized descriptor:
#
#    (JsonObject,LootEntryAbstract,JsonSerializationContext)V  <-- ProGuard names this method `b`
#
# SpecialSource2 automatically maps the second method name to the name of the first method, in this case `a`.
#
# LootEntryAbstract$Serializer also has another method with the same descriptor as serialize(), which Spigot calls
# serializeCustom(). Of course ProGuard strips the names and since this method is the first time it's seen this
# descriptor, it renamed that method also to `a`.
#
# This is allowed because the synthetic method for serialize() has a different descriptor, using Object as the second
# parameter. This breaks when SpecialSource2 does it's "magic" of course. This patch manually fixes this case by adding
# both correct mappings
#c	net/minecraft/world/level/storage/loot/entries/LootEntryAbstract$Serializer	net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer$Serializer
#	m	(Lcom/google/gson/JsonObject;Lnet/minecraft/world/level/storage/loot/entries/LootEntryAbstract;Lcom/google/gson/JsonSerializationContext;)V	a	serialize
#		p	0		json
#		p	1		entry
#		p	2		context
#	m	(Lcom/google/gson/JsonObject;Lnet/minecraft/world/level/storage/loot/entries/LootEntryAbstract;Lcom/google/gson/JsonSerializationContext;)V	serializeType	serializeCustom

# missed mapping?
c	net/minecraft/world/level/block/MultifaceBlock	net/minecraft/world/level/block/MultifaceBlock
	m	(Lnet/minecraft/world/level/block/state/IBlockData;Lnet/minecraft/world/level/IBlockAccess;Lnet/minecraft/core/BlockPosition;Lnet/minecraft/core/EnumDirection;)Lnet/minecraft/world/level/block/state/IBlockData;	c	getStateForPlacement

# another missed one
c	net/minecraft/server/players/UserCache	net/minecraft/server/players/GameProfileCache
	m	(Ljava/lang/String;)Lcom/mojang/authlib/GameProfile;	getProfile	get
		p	0		name