close #302
This commit is contained in:
parent
d8715c3604
commit
2736b3616d
4 changed files with 48 additions and 105 deletions
|
@ -1,15 +1,12 @@
|
|||
package at.petrak.hexcasting.api.spell.iota;
|
||||
|
||||
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes;
|
||||
import net.minecraft.client.gui.Font;
|
||||
import net.minecraft.nbt.Tag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TextColor;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.FormattedCharSequence;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
// Take notes from ForgeRegistryEntry
|
||||
public abstract class IotaType<T extends Iota> {
|
||||
|
@ -31,15 +28,6 @@ public abstract class IotaType<T extends Iota> {
|
|||
*/
|
||||
public abstract Component display(Tag tag);
|
||||
|
||||
/**
|
||||
* Get a display of this datum from the {@code data} tag, with a maximum width.
|
||||
* This is for use on the client.
|
||||
*/
|
||||
public List<FormattedCharSequence> displayWithWidth(Tag tag, int maxWidth, Font font) {
|
||||
var display = this.display(tag);
|
||||
return font.split(display, maxWidth);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the color associated with this datum type.
|
||||
*/
|
||||
|
|
|
@ -4,14 +4,11 @@ import at.petrak.hexcasting.api.spell.SpellList;
|
|||
import at.petrak.hexcasting.api.utils.HexUtils;
|
||||
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.client.gui.Font;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.ListTag;
|
||||
import net.minecraft.nbt.Tag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.Style;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.FormattedCharSequence;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
@ -112,55 +109,6 @@ public class ListIota extends Iota {
|
|||
return Component.translatable("hexcasting.tooltip.list_contents", out).withStyle(ChatFormatting.DARK_PURPLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<FormattedCharSequence> displayWithWidth(Tag tag, int maxWidth, Font font) {
|
||||
// We aim to not break one iota between lines
|
||||
var listTag = HexUtils.downcast(tag, ListTag.TYPE);
|
||||
|
||||
var start = FormattedCharSequence.forward(listTag.isEmpty() ? "[]" : "[",
|
||||
Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE));
|
||||
var cursor = font.width(start);
|
||||
var currentLine = new ArrayList<>(List.of(start));
|
||||
var out = new ArrayList<FormattedCharSequence>();
|
||||
|
||||
for (int i = 0; i < listTag.size(); i++) {
|
||||
Tag subtag = listTag.get(i);
|
||||
var cSubtag = HexUtils.downcast(subtag, CompoundTag.TYPE);
|
||||
var translation = HexIotaTypes.getDisplay(cSubtag);
|
||||
var currentElement = translation.getVisualOrderText();
|
||||
String addl;
|
||||
if (i < listTag.size() - 1) {
|
||||
addl = ", ";
|
||||
} else {
|
||||
// Last go-around, so add the closing bracket
|
||||
addl = "]";
|
||||
}
|
||||
currentElement = FormattedCharSequence.composite(currentElement,
|
||||
FormattedCharSequence.forward(addl, Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE)));
|
||||
|
||||
var width = font.width(currentElement);
|
||||
|
||||
if (cursor + width > maxWidth) {
|
||||
out.add(FormattedCharSequence.composite(currentLine));
|
||||
currentLine = new ArrayList<>();
|
||||
// Indent further lines by two spaces
|
||||
var indentation = FormattedCharSequence.forward(" ", Style.EMPTY);
|
||||
var lineStart = FormattedCharSequence.composite(indentation, currentElement);
|
||||
currentLine.add(lineStart);
|
||||
cursor = font.width(lineStart);
|
||||
} else {
|
||||
currentLine.add(currentElement);
|
||||
cursor += width;
|
||||
}
|
||||
}
|
||||
|
||||
if (!currentLine.isEmpty()) {
|
||||
out.add(FormattedCharSequence.composite(currentLine));
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int color() {
|
||||
return 0xff_aa00aa;
|
||||
|
|
|
@ -11,12 +11,11 @@ import at.petrak.hexcasting.api.spell.math.HexCoord
|
|||
import at.petrak.hexcasting.api.spell.math.HexDir
|
||||
import at.petrak.hexcasting.api.spell.math.HexPattern
|
||||
import at.petrak.hexcasting.api.utils.asTranslatedComponent
|
||||
import at.petrak.hexcasting.api.utils.gold
|
||||
import at.petrak.hexcasting.client.*
|
||||
import at.petrak.hexcasting.client.ktxt.accumulatedScroll
|
||||
import at.petrak.hexcasting.client.sound.GridSoundInstance
|
||||
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes
|
||||
import at.petrak.hexcasting.common.lib.HexSounds
|
||||
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes
|
||||
import at.petrak.hexcasting.common.network.MsgNewSpellPatternSyn
|
||||
import at.petrak.hexcasting.xplat.IClientXplatAbstractions
|
||||
import com.mojang.blaze3d.systems.RenderSystem
|
||||
|
@ -44,7 +43,7 @@ class GuiSpellcasting constructor(
|
|||
) : Screen("gui.hexcasting.spellcasting".asTranslatedComponent) {
|
||||
private var stackDescs: List<FormattedCharSequence> = listOf()
|
||||
private var parenDescs: List<FormattedCharSequence> = listOf()
|
||||
private var ravenmind: List<FormattedCharSequence>? = null
|
||||
private var ravenmind: FormattedCharSequence? = null
|
||||
|
||||
private var drawState: PatternDrawState = PatternDrawState.BetweenPatterns
|
||||
private val usedSpots: MutableSet<HexCoord> = HashSet()
|
||||
|
@ -76,14 +75,15 @@ class GuiSpellcasting constructor(
|
|||
val mc = Minecraft.getInstance()
|
||||
val width = (this.width * LHS_IOTAS_ALLOCATION).toInt()
|
||||
this.stackDescs =
|
||||
this.cachedStack.flatMap { HexIotaTypes.getDisplayWithMaxWidth(it, width, mc.font).asReversed() }
|
||||
this.cachedStack.map { HexIotaTypes.getDisplayWithMaxWidth(it, width, mc.font) }
|
||||
.asReversed()
|
||||
this.parenDescs = if (this.cachedParens.isNotEmpty())
|
||||
this.cachedParens.flatMap { HexIotaTypes.getDisplayWithMaxWidth(it, width, mc.font) }
|
||||
else if (this.parenCount > 0)
|
||||
listOf("...".gold.visualOrderText)
|
||||
else
|
||||
emptyList()
|
||||
// this.parenDescs = if (this.cachedParens.isNotEmpty())
|
||||
// this.cachedParens.flatMap { HexIotaTypes.getDisplayWithMaxWidth(it, width, mc.font) }
|
||||
// else if (this.parenCount > 0)
|
||||
// listOf("...".gold.visualOrderText)
|
||||
// else
|
||||
// emptyList()
|
||||
this.parenDescs = emptyList()
|
||||
this.ravenmind =
|
||||
this.cachedRavenmind?.let {
|
||||
HexIotaTypes.getDisplayWithMaxWidth(
|
||||
|
@ -383,23 +383,23 @@ class GuiSpellcasting constructor(
|
|||
ps.pushPose()
|
||||
ps.translate(10.0, 10.0, 0.0)
|
||||
|
||||
if (this.parenCount > 0) {
|
||||
val boxHeight = (this.parenDescs.size + 1f) * 10f
|
||||
RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
||||
RenderSystem.defaultBlendFunc()
|
||||
drawBox(ps, 0f, 0f, (this.width * LHS_IOTAS_ALLOCATION + 5).toFloat(), boxHeight, 7.5f)
|
||||
ps.translate(0.0, 0.0, 1.0)
|
||||
|
||||
val time = ClientTickCounter.getTotal() * 0.16f
|
||||
val opacity = (Mth.map(cos(time), -1f, 1f, 200f, 255f)).toInt()
|
||||
val color = 0x00_ffffff or (opacity shl 24)
|
||||
RenderSystem.setShader { prevShader }
|
||||
for (desc in this.parenDescs) {
|
||||
font.draw(ps, desc, 10f, 7f, color)
|
||||
ps.translate(0.0, 10.0, 0.0)
|
||||
}
|
||||
ps.translate(0.0, 15.0, 0.0)
|
||||
}
|
||||
// if (this.parenCount > 0) {
|
||||
// val boxHeight = (this.parenDescs.size + 1f) * 10f
|
||||
// RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
||||
// RenderSystem.defaultBlendFunc()
|
||||
// drawBox(ps, 0f, 0f, (this.width * LHS_IOTAS_ALLOCATION + 5).toFloat(), boxHeight, 7.5f)
|
||||
// ps.translate(0.0, 0.0, 1.0)
|
||||
//
|
||||
// val time = ClientTickCounter.getTotal() * 0.16f
|
||||
// val opacity = (Mth.map(cos(time), -1f, 1f, 200f, 255f)).toInt()
|
||||
// val color = 0x00_ffffff or (opacity shl 24)
|
||||
// RenderSystem.setShader { prevShader }
|
||||
// for (desc in this.parenDescs) {
|
||||
// font.draw(ps, desc, 10f, 7f, color)
|
||||
// ps.translate(0.0, 10.0, 0.0)
|
||||
// }
|
||||
// ps.translate(0.0, 15.0, 0.0)
|
||||
// }
|
||||
|
||||
if (this.stackDescs.isNotEmpty()) {
|
||||
val boxHeight = (this.stackDescs.size + 1f) * 10f
|
||||
|
@ -415,30 +415,27 @@ class GuiSpellcasting constructor(
|
|||
}
|
||||
|
||||
ps.popPose()
|
||||
if (!this.ravenmind.isNullOrEmpty()) {
|
||||
if (this.ravenmind != null) {
|
||||
val kotlinBad = this.ravenmind!!
|
||||
ps.pushPose()
|
||||
ps.translate(this.width * 0.8, 10.0, 0.0)
|
||||
val boxHeight = (kotlinBad.size + 0.5f) * 10f
|
||||
val boxHeight = 15f
|
||||
val addlScale = 1.5f
|
||||
ps.translate(this.width * (1.0 - RHS_IOTAS_ALLOCATION * addlScale) - 10, 10.0, 0.0)
|
||||
RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
||||
RenderSystem.enableBlend()
|
||||
drawBox(
|
||||
ps, 0f, 0f,
|
||||
((this.width * RHS_IOTAS_ALLOCATION + 5) * addlScale).toFloat(), boxHeight * addlScale,
|
||||
(this.width * RHS_IOTAS_ALLOCATION * addlScale).toFloat(), boxHeight * addlScale,
|
||||
)
|
||||
ps.translate(5.0, 5.0, 1.0)
|
||||
ps.scale(addlScale, addlScale, 1f)
|
||||
|
||||
val time = ClientTickCounter.getTotal() * 0.42f
|
||||
val time = ClientTickCounter.getTotal() * 0.2f
|
||||
val opacity = (Mth.map(sin(time), -1f, 1f, 150f, 255f)).toInt()
|
||||
val color = 0x00_ffffff or (opacity shl 24)
|
||||
|
||||
RenderSystem.setShader { prevShader }
|
||||
for (desc in kotlinBad) {
|
||||
font.draw(ps, desc, 0f, 0f, color)
|
||||
ps.translate(0.0, 10.0, 0.0)
|
||||
}
|
||||
font.draw(ps, kotlinBad, 0f, 0f, color)
|
||||
ps.popPose()
|
||||
}
|
||||
|
||||
|
@ -479,7 +476,7 @@ class GuiSpellcasting constructor(
|
|||
|
||||
companion object {
|
||||
const val LHS_IOTAS_ALLOCATION = 0.7
|
||||
const val RHS_IOTAS_ALLOCATION = 0.1
|
||||
const val RHS_IOTAS_ALLOCATION = 0.15
|
||||
|
||||
fun drawBox(ps: PoseStack, x: Float, y: Float, w: Float, h: Float, leftMargin: Float = 2.5f) {
|
||||
RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
||||
|
|
|
@ -150,16 +150,26 @@ public class HexIotaTypes {
|
|||
return type.display(data);
|
||||
}
|
||||
|
||||
public static List<FormattedCharSequence> getDisplayWithMaxWidth(CompoundTag tag, int maxWidth, Font font) {
|
||||
public static FormattedCharSequence getDisplayWithMaxWidth(CompoundTag tag, int maxWidth, Font font) {
|
||||
var type = getTypeFromTag(tag);
|
||||
if (type == null) {
|
||||
return font.split(brokenIota(), maxWidth);
|
||||
return brokenIota().getVisualOrderText();
|
||||
}
|
||||
var data = tag.get(KEY_DATA);
|
||||
if (data == null) {
|
||||
return font.split(brokenIota(), maxWidth);
|
||||
return brokenIota().getVisualOrderText();
|
||||
}
|
||||
var display = type.display(data);
|
||||
var splitted = font.split(display, maxWidth - font.width("..."));
|
||||
if (splitted.isEmpty())
|
||||
return FormattedCharSequence.EMPTY;
|
||||
else if (splitted.size() == 1)
|
||||
return splitted.get(0);
|
||||
else {
|
||||
var first = splitted.get(0);
|
||||
return FormattedCharSequence.fromPair(first,
|
||||
Component.literal("...").withStyle(ChatFormatting.GRAY).getVisualOrderText());
|
||||
}
|
||||
return type.displayWithWidth(data, maxWidth, font);
|
||||
}
|
||||
|
||||
public static int getColor(CompoundTag tag) {
|
||||
|
|
Loading…
Reference in a new issue