Silk touch spawners

This commit is contained in:
William Blake Galbreath
2025-01-05 12:32:49 -08:00
committed by granny
parent 39c5222ecb
commit 320d145f74
6 changed files with 167 additions and 190 deletions

View File

@@ -1,8 +1,14 @@
package org.purpurmc.purpur;
import java.util.ArrayList;
import java.util.HashMap;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.monster.Shulker;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
import java.util.List;
@@ -89,6 +95,38 @@ public class PurpurWorldConfig {
idleTimeoutTargetPlayer = getBoolean("gameplay-mechanics.player.idle-timeout.mobs-target", idleTimeoutTargetPlayer);
}
public boolean silkTouchEnabled = false;
public String silkTouchSpawnerName = "<reset><white>Monster Spawner";
public List<String> silkTouchSpawnerLore = new ArrayList<>();
public List<Item> silkTouchTools = new ArrayList<>();
public int minimumSilkTouchSpawnerRequire = 1;
private void silkTouchSettings() {
if (PurpurConfig.version < 21) {
String oldName = getString("gameplay-mechanics.silk-touch.spawner-name", silkTouchSpawnerName);
set("gameplay-mechanics.silk-touch.spawner-name", "<reset>" + ChatColor.toMM(oldName.replace("{mob}", "<mob>")));
List<String> list = new ArrayList<>();
getList("gameplay-mechanics.silk-touch.spawner-lore", List.of("Spawns a <mob>"))
.forEach(line -> list.add("<reset>" + ChatColor.toMM(line.toString().replace("{mob}", "<mob>"))));
set("gameplay-mechanics.silk-touch.spawner-lore", list);
}
silkTouchEnabled = getBoolean("gameplay-mechanics.silk-touch.enabled", silkTouchEnabled);
silkTouchSpawnerName = getString("gameplay-mechanics.silk-touch.spawner-name", silkTouchSpawnerName);
minimumSilkTouchSpawnerRequire = getInt("gameplay-mechanics.silk-touch.minimal-level", minimumSilkTouchSpawnerRequire);
silkTouchSpawnerLore.clear();
getList("gameplay-mechanics.silk-touch.spawner-lore", List.of("Spawns a <mob>"))
.forEach(line -> silkTouchSpawnerLore.add(line.toString()));
silkTouchTools.clear();
getList("gameplay-mechanics.silk-touch.tools", List.of(
"minecraft:iron_pickaxe",
"minecraft:golden_pickaxe",
"minecraft:diamond_pickaxe",
"minecraft:netherite_pickaxe"
)).forEach(key -> {
Item item = BuiltInRegistries.ITEM.getValue(ResourceLocation.parse(key.toString()));
if (item != Items.AIR) silkTouchTools.add(item);
});
}
public boolean babiesAreRidable = true;
public boolean untamedTamablesAreRidable = true;
public boolean useNightVisionWhenRiding = false;

View File

@@ -0,0 +1,40 @@
package org.purpurmc.purpur.item;
import net.minecraft.core.BlockPos;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.CustomData;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.SpawnerBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
public class SpawnerItem extends BlockItem {
public SpawnerItem(Block block, Properties settings) {
super(block, settings);
}
@Override
protected boolean updateCustomBlockEntityTag(BlockPos pos, Level level, Player player, ItemStack stack, BlockState state) {
boolean handled = super.updateCustomBlockEntityTag(pos, level, player, stack, state);
if (level.purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.place.spawners")) {
BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity instanceof SpawnerBlockEntity spawner) {
CompoundTag customData = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag();
if (customData.contains("Purpur.mob_type")) {
EntityType.byString(customData.getString("Purpur.mob_type")).ifPresent(type -> spawner.getSpawner().setEntityId(type, level, level.random, pos));
} else if (customData.contains("Purpur.SpawnData")) {
net.minecraft.world.level.SpawnData.CODEC.parse(net.minecraft.nbt.NbtOps.INSTANCE, customData.getCompound("Purpur.SpawnData")).result()
.ifPresent(spawnData -> spawner.getSpawner().nextSpawnData = spawnData);
}
}
}
return handled;
}
}