Skip to content

Commit

Permalink
Add PlayerTag.send_climbable_materials mechanism (#2342)
Browse files Browse the repository at this point in the history
  • Loading branch information
tal5 committed Jun 22, 2022
1 parent ef0c37b commit 8db188f
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 0 deletions.
Expand Up @@ -113,4 +113,8 @@ public void sendPlayerInfoAddPacket(Player player, ProfileEditMode mode, String
public void sendPlayerRemovePacket(Player player, UUID id) {
throw new UnsupportedOperationException();
}

public void sendClimbableMaterials(Player player, List<Material> materials) {
throw new UnsupportedOperationException();
}
}
Expand Up @@ -2502,6 +2502,37 @@ public void adjust(Mechanism mechanism) {

AbstractFlagTracker.tryFlagAdjusts(this, mechanism);

// <--[mechanism]
// @object PlayerTag
// @name send_climbable_materials
// @input ListTag(MaterialTag)
// @description
// Sends the player a list of climbable materials.
// To climb a block, the player has to stand in it, which means only non-full blocks can be climbed.
// Note that this gets reset once the player rejoins or once server resources are reloaded (which happens when the vanilla /reload command is used, or when a data pack gets enabled).
// @tags
// <server.vanilla_tagged_materials[<tag>]>
// @example
// # Lets the linked player climb iron_bars, while keeping other climbable materials climbable
// - adjust <player> send_climbable_materials:<server.vanilla_tagged_materials[climbable].include[iron_bars]>
// @example
// # Lets the linked player climb only acacia_buttons, making all other materials non-climbable.
// - adjust <player> send_climbable_materials:acacia_button
// -->
if (mechanism.matches("send_climbable_materials") && mechanism.requireObject(ListTag.class)) {
List<MaterialTag> materialTags = mechanism.valueAsType(ListTag.class).filter(MaterialTag.class, mechanism.context);
List<Material> materials = new ArrayList<>();
for (MaterialTag materialTag : materialTags) {
Material material = materialTag.getMaterial();
if (!material.isBlock()) {
mechanism.echoError("Invalid material specified '" + material.name() + "': must be a block material.");
continue;
}
materials.add(material);
}
NMSHandler.playerHelper.sendClimbableMaterials(getPlayerEntity(), materials);
}

// <--[mechanism]
// @object PlayerTag
// @name noclip
Expand Down
Expand Up @@ -119,4 +119,7 @@ public class ReflectionMappingsInfo {
public static String FluidState_isEmpty = "c";
public static String FluidState_createLegacyBlock = "g";
public static String FluidState_animateTick = "a";

// net.minecraft.tags.TagNetworkSerialization$NetworkPayload
public static String TagNetworkSerialization_NetworkPayload_tags = "a";
}
Expand Up @@ -25,9 +25,12 @@
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.mojang.authlib.properties.Property;
import it.unimi.dsi.fastutil.ints.IntList;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.core.Registry;
import net.minecraft.network.protocol.game.*;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerEntity;
Expand All @@ -38,6 +41,8 @@
import net.minecraft.server.players.ServerOpList;
import net.minecraft.server.players.ServerOpListEntry;
import net.minecraft.stats.ServerRecipeBook;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.TagNetworkSerialization;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.ChunkPos;
Expand All @@ -46,6 +51,7 @@
import org.bukkit.boss.BossBar;
import org.bukkit.craftbukkit.v1_18_R2.CraftServer;
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_18_R2.boss.CraftBossBar;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
Expand Down Expand Up @@ -423,4 +429,17 @@ public void sendPlayerRemovePacket(Player player, UUID id) {
packet.getEntries().add(new ClientboundPlayerInfoPacket.PlayerUpdate(profile, 0, null, null));
PacketHelperImpl.send(player, packet);
}

@Override
public void sendClimbableMaterials(Player player, List<Material> materials) {
Map<ResourceKey<? extends Registry<?>>, TagNetworkSerialization.NetworkPayload> packetInput = TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registryAccess());
TagNetworkSerialization.NetworkPayload payload = packetInput.get(Registry.BLOCK_REGISTRY);
Map<ResourceLocation, IntList> tags = ReflectionHelper.getFieldValue(TagNetworkSerialization.NetworkPayload.class, ReflectionMappingsInfo.TagNetworkSerialization_NetworkPayload_tags, payload);
IntList intList = tags.get(BlockTags.CLIMBABLE.location());
intList.clear();
for (Material material : materials) {
intList.add(Registry.BLOCK.getId(((CraftBlockData) material.createBlockData()).getState().getBlock()));
}
PacketHelperImpl.send(player, new ClientboundUpdateTagsPacket(packetInput));
}
}
Expand Up @@ -119,4 +119,7 @@ public class ReflectionMappingsInfo {
public static String FluidState_isEmpty = "c";
public static String FluidState_createLegacyBlock = "g";
public static String FluidState_animateTick = "a";

// net.minecraft.tags.TagNetworkSerialization$NetworkPayload
public static String TagNetworkSerialization_NetworkPayload_tags = "a";
}
Expand Up @@ -25,9 +25,12 @@
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.mojang.authlib.properties.Property;
import it.unimi.dsi.fastutil.ints.IntList;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.core.Registry;
import net.minecraft.network.protocol.game.*;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerEntity;
Expand All @@ -38,6 +41,8 @@
import net.minecraft.server.players.ServerOpList;
import net.minecraft.server.players.ServerOpListEntry;
import net.minecraft.stats.ServerRecipeBook;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.TagNetworkSerialization;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.ChunkPos;
Expand All @@ -46,6 +51,7 @@
import org.bukkit.boss.BossBar;
import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_19_R1.boss.CraftBossBar;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
Expand Down Expand Up @@ -423,4 +429,17 @@ public void sendPlayerRemovePacket(Player player, UUID id) {
packet.getEntries().add(new ClientboundPlayerInfoPacket.PlayerUpdate(profile, 0, null, null, null));
PacketHelperImpl.send(player, packet);
}

@Override
public void sendClimbableMaterials(Player player, List<Material> materials) {
Map<ResourceKey<? extends Registry<?>>, TagNetworkSerialization.NetworkPayload> packetInput = TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registryAccess());
TagNetworkSerialization.NetworkPayload payload = packetInput.get(Registry.BLOCK_REGISTRY);
Map<ResourceLocation, IntList> tags = ReflectionHelper.getFieldValue(TagNetworkSerialization.NetworkPayload.class, ReflectionMappingsInfo.TagNetworkSerialization_NetworkPayload_tags, payload);
IntList intList = tags.get(BlockTags.CLIMBABLE.location());
intList.clear();
for (Material material : materials) {
intList.add(Registry.BLOCK.getId(((CraftBlockData) material.createBlockData()).getState().getBlock()));
}
PacketHelperImpl.send(player, new ClientboundUpdateTagsPacket(packetInput));
}
}

0 comments on commit 8db188f

Please sign in to comment.