159 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.network.chat;
 | |
| 
 | |
| import com.mojang.serialization.Codec;
 | |
| import com.mojang.serialization.DataResult;
 | |
| import com.mojang.serialization.Lifecycle;
 | |
| import com.mojang.serialization.MapCodec;
 | |
| import com.mojang.serialization.codecs.RecordCodecBuilder;
 | |
| import java.util.ArrayList;
 | |
| import java.util.List;
 | |
| import java.util.Optional;
 | |
| import java.util.UUID;
 | |
| import net.minecraft.core.UUIDUtil;
 | |
| import net.minecraft.core.registries.BuiltInRegistries;
 | |
| import net.minecraft.util.StringRepresentable;
 | |
| import net.minecraft.world.entity.EntityType;
 | |
| import net.minecraft.world.item.ItemStack;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| public interface HoverEvent {
 | |
| 	Codec<HoverEvent> CODEC = HoverEvent.Action.CODEC.dispatch("action", HoverEvent::action, action -> action.codec);
 | |
| 
 | |
| 	HoverEvent.Action action();
 | |
| 
 | |
| 	public static enum Action implements StringRepresentable {
 | |
| 		SHOW_TEXT("show_text", true, HoverEvent.ShowText.CODEC),
 | |
| 		SHOW_ITEM("show_item", true, HoverEvent.ShowItem.CODEC),
 | |
| 		SHOW_ENTITY("show_entity", true, HoverEvent.ShowEntity.CODEC);
 | |
| 
 | |
| 		public static final Codec<HoverEvent.Action> UNSAFE_CODEC = StringRepresentable.fromValues(HoverEvent.Action::values);
 | |
| 		public static final Codec<HoverEvent.Action> CODEC = UNSAFE_CODEC.validate(HoverEvent.Action::filterForSerialization);
 | |
| 		private final String name;
 | |
| 		private final boolean allowFromServer;
 | |
| 		final MapCodec<? extends HoverEvent> codec;
 | |
| 
 | |
| 		private Action(final String name, final boolean allowFromServer, final MapCodec<? extends HoverEvent> codec) {
 | |
| 			this.name = name;
 | |
| 			this.allowFromServer = allowFromServer;
 | |
| 			this.codec = codec;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * Indicates whether this event can be run from chat text.
 | |
| 		 */
 | |
| 		public boolean isAllowedFromServer() {
 | |
| 			return this.allowFromServer;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public String getSerializedName() {
 | |
| 			return this.name;
 | |
| 		}
 | |
| 
 | |
| 		public String toString() {
 | |
| 			return "<action " + this.name + ">";
 | |
| 		}
 | |
| 
 | |
| 		private static DataResult<HoverEvent.Action> filterForSerialization(HoverEvent.Action action) {
 | |
| 			return !action.isAllowedFromServer() ? DataResult.error(() -> "Action not allowed: " + action) : DataResult.success(action, Lifecycle.stable());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static class EntityTooltipInfo {
 | |
| 		public static final MapCodec<HoverEvent.EntityTooltipInfo> CODEC = RecordCodecBuilder.mapCodec(
 | |
| 			instance -> instance.group(
 | |
| 					BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("id").forGetter(entityTooltipInfo -> entityTooltipInfo.type),
 | |
| 					UUIDUtil.LENIENT_CODEC.fieldOf("uuid").forGetter(entityTooltipInfo -> entityTooltipInfo.uuid),
 | |
| 					ComponentSerialization.CODEC.optionalFieldOf("name").forGetter(entityTooltipInfo -> entityTooltipInfo.name)
 | |
| 				)
 | |
| 				.apply(instance, HoverEvent.EntityTooltipInfo::new)
 | |
| 		);
 | |
| 		public final EntityType<?> type;
 | |
| 		public final UUID uuid;
 | |
| 		public final Optional<Component> name;
 | |
| 		@Nullable
 | |
| 		private List<Component> linesCache;
 | |
| 
 | |
| 		public EntityTooltipInfo(EntityType<?> type, UUID id, @Nullable Component name) {
 | |
| 			this(type, id, Optional.ofNullable(name));
 | |
| 		}
 | |
| 
 | |
| 		public EntityTooltipInfo(EntityType<?> type, UUID id, Optional<Component> name) {
 | |
| 			this.type = type;
 | |
| 			this.uuid = id;
 | |
| 			this.name = name;
 | |
| 		}
 | |
| 
 | |
| 		public List<Component> getTooltipLines() {
 | |
| 			if (this.linesCache == null) {
 | |
| 				this.linesCache = new ArrayList();
 | |
| 				this.name.ifPresent(this.linesCache::add);
 | |
| 				this.linesCache.add(Component.translatable("gui.entity_tooltip.type", this.type.getDescription()));
 | |
| 				this.linesCache.add(Component.literal(this.uuid.toString()));
 | |
| 			}
 | |
| 
 | |
| 			return this.linesCache;
 | |
| 		}
 | |
| 
 | |
| 		public boolean equals(Object object) {
 | |
| 			if (this == object) {
 | |
| 				return true;
 | |
| 			} else if (object != null && this.getClass() == object.getClass()) {
 | |
| 				HoverEvent.EntityTooltipInfo entityTooltipInfo = (HoverEvent.EntityTooltipInfo)object;
 | |
| 				return this.type.equals(entityTooltipInfo.type) && this.uuid.equals(entityTooltipInfo.uuid) && this.name.equals(entityTooltipInfo.name);
 | |
| 			} else {
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public int hashCode() {
 | |
| 			int i = this.type.hashCode();
 | |
| 			i = 31 * i + this.uuid.hashCode();
 | |
| 			return 31 * i + this.name.hashCode();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public record ShowEntity(HoverEvent.EntityTooltipInfo entity) implements HoverEvent {
 | |
| 		public static final MapCodec<HoverEvent.ShowEntity> CODEC = RecordCodecBuilder.mapCodec(
 | |
| 			instance -> instance.group(HoverEvent.EntityTooltipInfo.CODEC.forGetter(HoverEvent.ShowEntity::entity)).apply(instance, HoverEvent.ShowEntity::new)
 | |
| 		);
 | |
| 
 | |
| 		@Override
 | |
| 		public HoverEvent.Action action() {
 | |
| 			return HoverEvent.Action.SHOW_ENTITY;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public record ShowItem(ItemStack item) implements HoverEvent {
 | |
| 		public static final MapCodec<HoverEvent.ShowItem> CODEC = ItemStack.MAP_CODEC.xmap(HoverEvent.ShowItem::new, HoverEvent.ShowItem::item);
 | |
| 
 | |
| 		public ShowItem(ItemStack item) {
 | |
| 			item = item.copy();
 | |
| 			this.item = item;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public HoverEvent.Action action() {
 | |
| 			return HoverEvent.Action.SHOW_ITEM;
 | |
| 		}
 | |
| 
 | |
| 		public boolean equals(Object object) {
 | |
| 			return object instanceof HoverEvent.ShowItem showItem && ItemStack.matches(this.item, showItem.item);
 | |
| 		}
 | |
| 
 | |
| 		public int hashCode() {
 | |
| 			return ItemStack.hashItemAndComponents(this.item);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public record ShowText(Component value) implements HoverEvent {
 | |
| 		public static final MapCodec<HoverEvent.ShowText> CODEC = RecordCodecBuilder.mapCodec(
 | |
| 			instance -> instance.group(ComponentSerialization.CODEC.fieldOf("value").forGetter(HoverEvent.ShowText::value)).apply(instance, HoverEvent.ShowText::new)
 | |
| 		);
 | |
| 
 | |
| 		@Override
 | |
| 		public HoverEvent.Action action() {
 | |
| 			return HoverEvent.Action.SHOW_TEXT;
 | |
| 		}
 | |
| 	}
 | |
| }
 |