delete stuff
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
package dev.xkmc.l2core.base.effects;
|
||||
|
||||
import dev.xkmc.l2core.capability.attachment.GeneralCapabilityTemplate;
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialClass;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
|
||||
@@ -12,6 +13,6 @@ import java.util.TreeMap;
|
||||
@SerialClass
|
||||
public class ClientEffectCap extends GeneralCapabilityTemplate<LivingEntity, ClientEffectCap> {
|
||||
|
||||
public final Map<MobEffect, Integer> map = new TreeMap<>(Comparator.comparing(MobEffect::getDescriptionId));
|
||||
public final Map<Holder<MobEffect>, Integer> map = new TreeMap<>(Comparator.comparing(Holder::getRegisteredName));
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.xkmc.l2core.base.effects;
|
||||
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
|
||||
@@ -11,7 +12,7 @@ public class EffectBuilder {
|
||||
this.ins = ins;
|
||||
}
|
||||
|
||||
public EffectBuilder(MobEffect effect) {
|
||||
public EffectBuilder(Holder<MobEffect> effect) {
|
||||
this.ins = new MobEffectInstance(effect, 1, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package dev.xkmc.l2core.base.effects;
|
||||
|
||||
import dev.xkmc.l2core.init.events.ClientEffectRenderEvents;
|
||||
import dev.xkmc.l2core.events.ClientEffectRenderEvents;
|
||||
import dev.xkmc.l2serial.network.SerialPacketBase;
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public record EffectToClient(int entity, MobEffect effect, boolean exist, int level)
|
||||
public record EffectToClient(int entity, Holder<MobEffect> effect, boolean exist, int level)
|
||||
implements SerialPacketBase<EffectToClient> {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,7 +4,6 @@ import dev.xkmc.l2core.base.effects.api.ForceEffect;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.neoforged.bus.api.Event;
|
||||
import net.neoforged.neoforge.common.NeoForge;
|
||||
import net.neoforged.neoforge.event.EventHooks;
|
||||
import net.neoforged.neoforge.event.entity.living.MobEffectEvent;
|
||||
@@ -15,53 +14,46 @@ import java.util.function.Predicate;
|
||||
|
||||
public class EffectUtil {
|
||||
|
||||
public enum AddReason {
|
||||
NONE, PROF, FORCE, SKILL, SELF
|
||||
}
|
||||
|
||||
private static final ThreadLocal<AddReason> REASON = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* force add effect, make hard not override
|
||||
* for icon use only, such as Arcane Mark on Wither and Ender Dragon
|
||||
*/
|
||||
private static void forceAddEffect(LivingEntity e, MobEffectInstance ins, @Nullable Entity source) {
|
||||
MobEffectInstance effectinstance = e.getActiveEffectsMap().get(ins.getEffect());
|
||||
MobEffectInstance old = e.activeEffects.get(ins.getEffect());
|
||||
var event = new ForceAddEffectEvent(e, ins);
|
||||
NeoForge.EVENT_BUS.post(event);
|
||||
if (event.getResult() == Event.Result.DENY) {
|
||||
if (event.isCanceled()) {
|
||||
return;
|
||||
}
|
||||
NeoForge.EVENT_BUS.post(new MobEffectEvent.Added(e, effectinstance, ins, source));
|
||||
if (effectinstance == null) {
|
||||
e.getActiveEffectsMap().put(ins.getEffect(), ins);
|
||||
NeoForge.EVENT_BUS.post(new MobEffectEvent.Added(e, old, ins, source));
|
||||
if (old == null) {
|
||||
e.activeEffects.put(ins.getEffect(), ins);
|
||||
e.onEffectAdded(ins, source);
|
||||
} else if (effectinstance.update(ins)) {
|
||||
e.onEffectUpdated(effectinstance, true, source);
|
||||
ins.onEffectAdded(e);
|
||||
} else if (old.update(ins)) {
|
||||
e.onEffectUpdated(old, true, source);
|
||||
}
|
||||
ins.onEffectStarted(e);
|
||||
}
|
||||
|
||||
public static void addEffect(LivingEntity entity, MobEffectInstance ins, AddReason reason, @Nullable Entity source) {
|
||||
if (entity == source)
|
||||
reason = AddReason.SELF;
|
||||
if (ins.getEffect() instanceof ForceEffect)
|
||||
reason = AddReason.FORCE;
|
||||
public static void addEffect(LivingEntity entity, MobEffectInstance ins, @Nullable Entity source) {
|
||||
ins = new MobEffectInstance(ins.getEffect(), ins.getDuration(), ins.getAmplifier(),
|
||||
ins.isAmbient(), reason != AddReason.FORCE && ins.isVisible(), ins.showIcon());
|
||||
REASON.set(reason);
|
||||
ins.isAmbient(), ins.isVisible(), ins.showIcon());
|
||||
if (ins.getEffect() instanceof ForceEffect)
|
||||
forceAddEffect(entity, ins, source);
|
||||
else if (ins.getEffect().isInstantenous())
|
||||
ins.getEffect().applyInstantenousEffect(null, null, entity, ins.getAmplifier(), 1);
|
||||
else if (ins.getEffect().value().isInstantenous())
|
||||
ins.getEffect().value().applyInstantenousEffect(null, null, entity, ins.getAmplifier(), 1);
|
||||
else entity.addEffect(ins, source);
|
||||
REASON.set(AddReason.NONE);
|
||||
}
|
||||
|
||||
public static void refreshEffect(LivingEntity entity, MobEffectInstance ins, AddReason reason, Entity source) {
|
||||
public static void refreshEffect(LivingEntity entity, MobEffectInstance ins, Entity source) {
|
||||
if (ins.duration < 40) ins.duration = 40;
|
||||
MobEffectInstance cur = entity.getEffect(ins.getEffect());
|
||||
if (cur == null || cur.getAmplifier() < ins.getAmplifier() || cur.getAmplifier() == ins.getAmplifier() && cur.getDuration() < ins.getDuration() / 2)
|
||||
addEffect(entity, ins, reason, source);
|
||||
if (cur == null ||
|
||||
cur.getAmplifier() < ins.getAmplifier() ||
|
||||
cur.getAmplifier() == ins.getAmplifier() &&
|
||||
cur.getDuration() < ins.getDuration() / 2
|
||||
) addEffect(entity, ins, source);
|
||||
}
|
||||
|
||||
public static void removeEffect(LivingEntity entity, Predicate<MobEffectInstance> pred) {
|
||||
@@ -76,9 +68,4 @@ public class EffectUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static AddReason getReason() {
|
||||
AddReason ans = REASON.get();
|
||||
return ans == null ? AddReason.NONE : ans;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,11 +3,11 @@ package dev.xkmc.l2core.base.effects;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.neoforged.bus.api.Event;
|
||||
import net.neoforged.bus.api.ICancellableEvent;
|
||||
import net.neoforged.neoforge.event.entity.living.MobEffectEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@Event.HasResult
|
||||
public class ForceAddEffectEvent extends MobEffectEvent {
|
||||
public class ForceAddEffectEvent extends MobEffectEvent implements ICancellableEvent {
|
||||
|
||||
public ForceAddEffectEvent(LivingEntity living, @NotNull MobEffectInstance effectInstance) {
|
||||
super(living, effectInstance);
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
package dev.xkmc.l2core.base.entity;
|
||||
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.codec.PacketCodec;
|
||||
import dev.xkmc.l2serial.serialization.codec.TagCodec;
|
||||
import dev.xkmc.l2serial.util.Wrappers;
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.neoforged.neoforge.entity.IEntityWithComplexSpawn;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
@SerialClass
|
||||
@ParametersAreNonnullByDefault
|
||||
@MethodsReturnNonnullByDefault
|
||||
public abstract class BaseEntity extends Entity implements IEntityWithComplexSpawn {
|
||||
|
||||
public BaseEntity(EntityType<?> type, Level world) {
|
||||
super(type, world);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addAdditionalSaveData(CompoundTag tag) {
|
||||
tag.put("auto-serial", TagCodec.toTag(new CompoundTag(), this));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readAdditionalSaveData(CompoundTag tag) {
|
||||
if (!tag.contains("auto-serial"))
|
||||
return;
|
||||
Wrappers.run(() -> TagCodec.fromTag(tag.getCompound("auto-serial"), this.getClass(), this, f -> true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSpawnData(FriendlyByteBuf buffer) {
|
||||
PacketCodec.to(buffer, this);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public void readSpawnData(FriendlyByteBuf data) {
|
||||
PacketCodec.from(data, (Class) this.getClass(), this);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.base.entity;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -1,29 +0,0 @@
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.level.Explosion;
|
||||
|
||||
public class BaseExplosion extends Explosion {
|
||||
|
||||
public final BaseExplosionContext base;
|
||||
public final ModExplosionContext mod;
|
||||
public final VanillaExplosionContext mc;
|
||||
public final ParticleExplosionContext particle;
|
||||
|
||||
public BaseExplosion(BaseExplosionContext base, VanillaExplosionContext mc, ModExplosionContext mod, ParticleExplosionContext particle) {
|
||||
super(base.level(), mc.entity(), mc.source(), mc.calculator(), base.x(), base.y(), base.z(), base.r(), mc.fire(), mc.type(),
|
||||
particle.small(), particle.large(), particle.sound());
|
||||
this.base = base;
|
||||
this.mod = mod;
|
||||
this.mc = mc;
|
||||
this.particle = particle;
|
||||
}
|
||||
|
||||
/**
|
||||
* return false to cancel hurt
|
||||
*/
|
||||
public boolean hurtEntity(Entity entity) {
|
||||
return mod.hurtEntity(entity);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.world.level.Level;
|
||||
|
||||
public record BaseExplosionContext(Level level, double x, double y, double z, float r) {
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.network.protocol.game.ClientboundExplodePacket;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.Explosion;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.neoforged.neoforge.event.EventHooks;
|
||||
|
||||
public class ExplosionHandler {
|
||||
|
||||
public static void explode(BaseExplosion exp) {
|
||||
if (exp.base.level().isClientSide()) return;
|
||||
if (EventHooks.onExplosionStart(exp.base.level(), exp)) return;
|
||||
exp.explode();
|
||||
Level level = exp.base.level();
|
||||
exp.finalizeExplosion(level.isClientSide());
|
||||
double x = exp.base.x();
|
||||
double y = exp.base.y();
|
||||
double z = exp.base.z();
|
||||
float r = exp.base.r();
|
||||
boolean flag = exp.mc.type() == Explosion.BlockInteraction.KEEP;
|
||||
if (flag) {
|
||||
exp.clearToBlow();
|
||||
}
|
||||
for (Player player : level.players()) {
|
||||
if (player instanceof ServerPlayer serverplayer) {
|
||||
if (serverplayer.distanceToSqr(x, y, z) < 4096.0D) {
|
||||
serverplayer.connection.send(new ClientboundExplodePacket(x, y, z, r,
|
||||
exp.getToBlow(), exp.getHitPlayers().get(serverplayer), exp.mc.type(),
|
||||
exp.particle.small(), exp.particle.large(), exp.particle.sound()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.world.entity.Entity;
|
||||
|
||||
public interface ModExplosionContext {
|
||||
|
||||
/**
|
||||
* return false to cancel damage
|
||||
*/
|
||||
boolean hurtEntity(Entity entity);
|
||||
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.core.particles.ParticleOptions;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
|
||||
public record ParticleExplosionContext(ParticleOptions small,
|
||||
ParticleOptions large,
|
||||
SoundEvent sound) {
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.level.Explosion;
|
||||
import net.minecraft.world.level.ExplosionDamageCalculator;
|
||||
import net.minecraft.world.level.GameRules;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.neoforged.neoforge.event.EventHooks;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public record VanillaExplosionContext(@Nullable Entity entity, @Nullable DamageSource source,
|
||||
@Nullable ExplosionDamageCalculator calculator,
|
||||
boolean fire, Explosion.BlockInteraction type) {
|
||||
|
||||
public VanillaExplosionContext(Level level, @Nullable Entity entity, @Nullable DamageSource source,
|
||||
@Nullable ExplosionDamageCalculator calculator,
|
||||
boolean fire, Level.ExplosionInteraction type) {
|
||||
this(entity, source, calculator, fire, getType(level, entity, type));
|
||||
}
|
||||
|
||||
private static Explosion.BlockInteraction getType(Level level, @Nullable Entity entity, Level.ExplosionInteraction type) {
|
||||
return switch (type) {
|
||||
case NONE -> Explosion.BlockInteraction.KEEP;
|
||||
case BLOCK -> level.getDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY);
|
||||
case MOB -> EventHooks.getMobGriefingEvent(level, entity instanceof LivingEntity le ? le : null) ?
|
||||
level.getDestroyType(GameRules.RULE_MOB_EXPLOSION_DROP_DECAY) :
|
||||
Explosion.BlockInteraction.KEEP;
|
||||
case TNT -> level.getDestroyType(GameRules.RULE_TNT_EXPLOSION_DROP_DECAY);
|
||||
case BLOW -> Explosion.BlockInteraction.TRIGGER_BLOCK;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.base.explosion;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -1,6 +1,7 @@
|
||||
package dev.xkmc.l2core.base.menu.base;
|
||||
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialField;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
@@ -17,7 +18,7 @@ import java.util.HashMap;
|
||||
public record MenuLayoutConfig(int height, HashMap<String, Rect> side, HashMap<String, Rect> comp) {
|
||||
|
||||
public static ResourceLocation getTexture(ResourceLocation id) {
|
||||
return new ResourceLocation(id.getNamespace(), "textures/gui/container/" + id.getPath() + ".png");
|
||||
return ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "textures/gui/container/" + id.getPath() + ".png");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,7 +110,7 @@ public record MenuLayoutConfig(int height, HashMap<String, Rect> side, HashMap<S
|
||||
|
||||
public static final Rect ZERO = new Rect();
|
||||
|
||||
@SerialClass.SerialField
|
||||
@SerialField
|
||||
public int x, y, w, h, rx = 1, ry = 1;
|
||||
|
||||
public Rect() {
|
||||
@@ -125,7 +126,7 @@ public record MenuLayoutConfig(int height, HashMap<String, Rect> side, HashMap<S
|
||||
|
||||
public final ResourceLocation id;
|
||||
|
||||
public MenuLayoutConfig parent(){
|
||||
public MenuLayoutConfig parent() {
|
||||
return MenuLayoutConfig.this;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import net.minecraft.resources.ResourceLocation;
|
||||
public record SpriteManager(ResourceLocation id) {
|
||||
|
||||
public SpriteManager(String modid, String path) {
|
||||
this(new ResourceLocation(modid, path));
|
||||
this(ResourceLocation.fromNamespaceAndPath(modid, path));
|
||||
}
|
||||
|
||||
public MenuLayoutConfig get() {
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import dev.xkmc.l2core.init.L2LibraryConfig;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.neoforged.neoforge.client.gui.overlay.ExtendedGui;
|
||||
import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class InfoSideBar<S extends SideBar.Signature<S>> extends SideBar<S> implements IGuiOverlay {
|
||||
|
||||
public InfoSideBar(float duration, float ease) {
|
||||
super(duration, ease);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(ExtendedGui gui, GuiGraphics g, float partialTick, int width, int height) {
|
||||
if (!ease(gui.getGuiTicks() + partialTick))
|
||||
return;
|
||||
var text = getText();
|
||||
if (text.isEmpty()) return;
|
||||
int anchor = L2LibraryConfig.CLIENT.infoAnchor.get();
|
||||
int y = height * anchor / 2;
|
||||
int w = (int) (width * L2LibraryConfig.CLIENT.infoMaxWidth.get());
|
||||
new TextBox(g, 0, anchor, getXOffset(width), y, w)
|
||||
.renderLongText(Minecraft.getInstance().font, text);
|
||||
}
|
||||
|
||||
protected abstract List<Component> getText();
|
||||
|
||||
@Override
|
||||
protected int getXOffset(int width) {
|
||||
float progress = (max_ease - ease_time) / max_ease;
|
||||
return Math.round(-progress * width / 2 + 8);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ItemSelSideBar<S extends SideBar.Signature<S>> extends SelectionSideBar<ItemStack, S> {
|
||||
|
||||
public ItemSelSideBar(float duration, float ease) {
|
||||
super(duration, ease);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderEntry(Context ctx, ItemStack stack, int i, int selected) {
|
||||
boolean shift = Minecraft.getInstance().options.keyShift.isDown();
|
||||
int y = 18 * i + ctx.y0();
|
||||
renderSelection(ctx.g(), ctx.x0(), y, shift ? 127 : 64, isAvailable(stack), selected == i);
|
||||
if (selected == i) {
|
||||
if (!stack.isEmpty() && ease_time == max_ease) {
|
||||
boolean onCenter = onCenter();
|
||||
ctx.g().renderTooltip(ctx.font(), stack.getHoverName(), 0, 0);
|
||||
TextBox box = new TextBox(ctx.g(), onCenter ? 0 : 2, 1, ctx.x0() + (onCenter ? 22 : -6), y + 8, -1);
|
||||
box.renderLongText(ctx.font(), List.of(stack.getHoverName()));
|
||||
}
|
||||
}
|
||||
ctx.renderItem(stack, ctx.x0(), y);
|
||||
}
|
||||
|
||||
public void renderSelection(GuiGraphics g, int x, int y, int a, boolean available, boolean selected) {
|
||||
if (available) {
|
||||
OverlayUtil.fillRect(g, x, y, 16, 16, color(255, 255, 255, a));
|
||||
} else {
|
||||
OverlayUtil.fillRect(g, x, y, 16, 16, color(255, 0, 0, a));
|
||||
}
|
||||
if (selected) {
|
||||
OverlayUtil.drawRect(g, x, y, 16, 16, color(255, 170, 0, 255));
|
||||
}
|
||||
}
|
||||
|
||||
public static int color(int r, int g, int b, int a) {
|
||||
return a << 24 | r << 16 | g << 8 | b;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
|
||||
public record L2TooltipRenderUtil(GuiGraphics fill, int bg, int bs, int be) {
|
||||
|
||||
public void renderTooltipBackground(int x, int y, int w, int h, int z) {
|
||||
int x1 = x - 3;
|
||||
int y1 = y - 3;
|
||||
int w1 = w + 3 + 3;
|
||||
int h1 = h + 3 + 3;
|
||||
renderHorizontalLine(x1, y1 - 1, w1, z, bg);
|
||||
renderHorizontalLine(x1, y1 + h1, w1, z, bg);
|
||||
renderRectangle(x1, y1, w1, h1, z, bg);
|
||||
renderVerticalLine(x1 - 1, y1, h1, z, bg);
|
||||
renderVerticalLine(x1 + w1, y1, h1, z, bg);
|
||||
renderFrameGradient(x1, y1 + 1, w1, h1, z, bs, be);
|
||||
}
|
||||
|
||||
private void renderFrameGradient(int x, int y, int w, int h, int z, int c0, int c1) {
|
||||
renderVerticalLineGradient(x, y, h - 2, z, c0, c1);
|
||||
renderVerticalLineGradient(x + w - 1, y, h - 2, z, c0, c1);
|
||||
renderHorizontalLine(x, y - 1, w, z, c0);
|
||||
renderHorizontalLine(x, y - 1 + h - 1, w, z, c1);
|
||||
}
|
||||
|
||||
private void renderVerticalLine(int x, int y, int h, int z, int c) {
|
||||
fill.fillGradient(x, y, x + 1, y + h, z, c, c);
|
||||
}
|
||||
|
||||
private void renderVerticalLineGradient(int x, int y, int h, int z, int c0, int c1) {
|
||||
fill.fillGradient(x, y, x + 1, y + h, z, c0, c1);
|
||||
}
|
||||
|
||||
private void renderHorizontalLine(int x, int y, int w, int z, int c) {
|
||||
fill.fillGradient(x, y, x + w, y + 1, z, c, c);
|
||||
}
|
||||
|
||||
private void renderRectangle(int x, int y, int w, int h, int z, int c) {
|
||||
fill.fillGradient(x, y, x + w, y + h, z, c, c);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import dev.xkmc.l2core.init.L2LibraryConfig;
|
||||
import net.minecraft.client.gui.Font;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
|
||||
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner;
|
||||
import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import org.joml.Vector2i;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class OverlayUtil implements ClientTooltipPositioner {
|
||||
|
||||
private static int getBGColor() {
|
||||
return (int) (Math.round(L2LibraryConfig.CLIENT.infoAlpha.get() * 255)) << 24 | 0x100010;
|
||||
}
|
||||
|
||||
public int bg = getBGColor();
|
||||
public int bs = 0x505000FF;
|
||||
public int be = 0x5028007f;
|
||||
public int tc = 0xFFFFFFFF;
|
||||
|
||||
protected final GuiGraphics g;
|
||||
protected final int x0, y0, maxW;
|
||||
|
||||
public OverlayUtil(GuiGraphics g, int x0, int y0, int maxW) {
|
||||
this.g = g;
|
||||
this.x0 = x0;
|
||||
this.y0 = y0;
|
||||
this.maxW = maxW < 0 ? getMaxWidth() : maxW;
|
||||
}
|
||||
|
||||
public int getMaxWidth() {
|
||||
return g.guiWidth() / 4;
|
||||
}
|
||||
|
||||
public void renderLongText(Font font, List<Component> list) {
|
||||
List<ClientTooltipComponent> ans = list.stream().flatMap(text -> font.split(text, maxW).stream())
|
||||
.map(ClientTooltipComponent::create).toList();
|
||||
renderTooltipInternal(font, ans);
|
||||
}
|
||||
|
||||
public void renderTooltipInternal(Font font, List<ClientTooltipComponent> list) {
|
||||
if (list.isEmpty()) return;
|
||||
int w = 0;
|
||||
int h = list.size() == 1 ? -2 : 0;
|
||||
for (ClientTooltipComponent c : list) {
|
||||
int wi = c.getWidth(font);
|
||||
if (wi > w) {
|
||||
w = wi;
|
||||
}
|
||||
h += c.getHeight();
|
||||
}
|
||||
int wf = w;
|
||||
int hf = h;
|
||||
Vector2ic pos = positionTooltip(g.guiWidth(), g.guiHeight(), x0, y0, wf, hf);
|
||||
int xf = pos.x();
|
||||
int yf = pos.y();
|
||||
g.pose().pushPose();
|
||||
int z = 400;
|
||||
g.drawManaged(() -> TooltipRenderUtil.renderTooltipBackground(g, xf, yf, wf, hf, z, bg, bg, bs, be));
|
||||
g.pose().translate(0.0F, 0.0F, z);
|
||||
int yi = yf;
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
ClientTooltipComponent c = list.get(i);
|
||||
c.renderText(font, xf, yi, g.pose().last().pose(), g.bufferSource());
|
||||
yi += c.getHeight() + (i == 0 ? 2 : 0);
|
||||
}
|
||||
yi = yf;
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
ClientTooltipComponent c = list.get(i);
|
||||
c.renderImage(font, xf, yi, g);
|
||||
yi += c.getHeight() + (i == 0 ? 2 : 0);
|
||||
}
|
||||
g.pose().popPose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2ic positionTooltip(int gw, int gh, int x, int y, int tw, int th) {
|
||||
if (x < 0) x = Math.round(gw / 8f);
|
||||
if (y < 0) y = Math.round((gh - th) / 2f);
|
||||
return new Vector2i(x, y);
|
||||
}
|
||||
|
||||
/**
|
||||
* specifies outer size
|
||||
*/
|
||||
public static void fillRect(GuiGraphics g, int x, int y, int w, int h, int col) {
|
||||
g.fill(x, y, x + w, y + h, col);
|
||||
}
|
||||
|
||||
/**
|
||||
* specifies inner size
|
||||
*/
|
||||
public static void drawRect(GuiGraphics g, int x, int y, int w, int h, int col) {
|
||||
fillRect(g, x - 1, y - 1, w + 2, 1, col);
|
||||
fillRect(g, x - 1, y - 1, 1, h + 2, col);
|
||||
fillRect(g, x - 1, y + h, w + 2, 1, col);
|
||||
fillRect(g, x + w, y - 1, 1, h + 2, col);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.Font;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.neoforged.neoforge.client.gui.overlay.ExtendedGui;
|
||||
import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class SelectionSideBar<T, S extends SideBar.Signature<S>> extends SideBar<S> implements IGuiOverlay {
|
||||
|
||||
public SelectionSideBar(float duration, float ease) {
|
||||
super(duration, ease);
|
||||
}
|
||||
|
||||
public abstract Pair<List<T>, Integer> getItems();
|
||||
|
||||
public abstract boolean isAvailable(T t);
|
||||
|
||||
public abstract boolean onCenter();
|
||||
|
||||
public void initRender() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(ExtendedGui gui, GuiGraphics g, float partialTick, int width, int height) {
|
||||
if (!ease(gui.getGuiTicks() + partialTick))
|
||||
return;
|
||||
initRender();
|
||||
gui.setupOverlayRenderState(true, false);
|
||||
int x0 = this.getXOffset(width);
|
||||
int y0 = this.getYOffset(height);
|
||||
Context ctx = new Context(gui, g, partialTick, Minecraft.getInstance().font, x0, y0);
|
||||
renderContent(ctx);
|
||||
}
|
||||
|
||||
public void renderContent(Context ctx) {
|
||||
Pair<List<T>, Integer> content = getItems();
|
||||
var list = content.getFirst();
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
renderEntry(ctx, list.get(i), i, content.getSecond());
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void renderEntry(Context ctx, T t, int index, int select);
|
||||
|
||||
public record Context(ExtendedGui gui, GuiGraphics g, float pTick, Font font, int x0, int y0) {
|
||||
|
||||
public void renderItem(ItemStack stack, int x, int y) {
|
||||
if (!stack.isEmpty()) {
|
||||
g.renderItem(stack, x, y);
|
||||
g.renderItemDecorations(font, stack, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public abstract class SideBar<S extends SideBar.Signature<S>> {
|
||||
|
||||
public interface Signature<S extends Signature<S>> {
|
||||
|
||||
boolean shouldRefreshIdle(SideBar<?> sideBar, @Nullable S old);
|
||||
|
||||
}
|
||||
|
||||
public record IntSignature(int val) implements Signature<IntSignature> {
|
||||
|
||||
@Override
|
||||
public boolean shouldRefreshIdle(SideBar<?> sideBar, @Nullable SideBar.IntSignature old) {
|
||||
return old == null || val != old.val;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected final float max_time;
|
||||
protected final float max_ease;
|
||||
|
||||
@Nullable
|
||||
protected S prev;
|
||||
|
||||
protected float idle = 0;
|
||||
protected float ease_time = 0;
|
||||
protected float prev_time = -1;
|
||||
|
||||
public SideBar(float duration, float ease) {
|
||||
this.max_time = duration;
|
||||
this.max_ease = ease;
|
||||
}
|
||||
|
||||
public abstract S getSignature();
|
||||
|
||||
public abstract boolean isScreenOn();
|
||||
|
||||
protected boolean isOnHold() {
|
||||
return Minecraft.getInstance().options.keyShift.isDown();
|
||||
}
|
||||
|
||||
protected boolean ease(float current_time) {
|
||||
if (!isScreenOn()) {
|
||||
prev = null;
|
||||
idle = max_time;
|
||||
ease_time = 0;
|
||||
prev_time = -1;
|
||||
return false;
|
||||
}
|
||||
float time_diff = prev_time < 0 ? 0 : (current_time - prev_time);
|
||||
prev_time = current_time;
|
||||
|
||||
S signature = getSignature();
|
||||
if (signature.shouldRefreshIdle(this, prev) || isOnHold()) {
|
||||
idle = 0;
|
||||
} else {
|
||||
idle += time_diff;
|
||||
}
|
||||
prev = signature;
|
||||
if (idle < max_time) {
|
||||
if (ease_time < max_ease) {
|
||||
ease_time += time_diff;
|
||||
if (ease_time > max_ease) {
|
||||
ease_time = max_ease;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ease_time > 0) {
|
||||
ease_time -= time_diff;
|
||||
if (ease_time < 0) {
|
||||
ease_time = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ease_time > 0;
|
||||
}
|
||||
|
||||
public boolean isRendering() {
|
||||
return isScreenOn() && ease_time > 0;
|
||||
}
|
||||
|
||||
protected int getXOffset(int width) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected int getYOffset(int height) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import org.joml.Vector2i;
|
||||
import org.joml.Vector2ic;
|
||||
|
||||
public class TextBox extends OverlayUtil {
|
||||
|
||||
private final int anchorX, anchorY;
|
||||
|
||||
public TextBox(GuiGraphics g, int anchorX, int anchorY, int x, int y, int width) {
|
||||
super(g, x, y, width);
|
||||
this.anchorX = anchorX;
|
||||
this.anchorY = anchorY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2ic positionTooltip(int gw, int gh, int x, int y, int tw, int th) {
|
||||
return new Vector2i(x - tw * anchorX / 2, y - th * anchorY / 2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxWidth() {
|
||||
if (anchorX == 0) return g.guiWidth() - x0 - 8;
|
||||
if (anchorX == 1) return Math.max(x0 / 2 - 4, g.guiWidth() - x0 / 2 - 4);
|
||||
if (anchorX == 2) return x0 - 8;
|
||||
return g.guiWidth();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.base.overlay;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -1,11 +1,12 @@
|
||||
package dev.xkmc.l2core.base.tile;
|
||||
|
||||
import dev.xkmc.l2core.util.ServerOnly;
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.codec.TagCodec;
|
||||
import dev.xkmc.l2serial.util.Wrappers;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialField;
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.HolderLookup;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
@@ -24,16 +25,16 @@ public class BaseBlockEntity extends BlockEntity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(CompoundTag tag) {
|
||||
super.load(tag);
|
||||
public void loadAdditional(CompoundTag tag, HolderLookup.Provider pvd) {
|
||||
super.loadAdditional(tag, pvd);
|
||||
if (tag.contains("auto-serial"))
|
||||
Wrappers.run(() -> TagCodec.fromTag(tag.getCompound("auto-serial"), getClass(), this, f -> true));
|
||||
new TagCodec(pvd).fromTag(tag.getCompound("auto-serial"), getClass(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveAdditional(CompoundTag tag) {
|
||||
super.saveAdditional(tag);
|
||||
CompoundTag ser = Wrappers.get(() -> TagCodec.toTag(new CompoundTag(), getClass(), this, f -> true));
|
||||
public void saveAdditional(CompoundTag tag, HolderLookup.Provider pvd) {
|
||||
super.saveAdditional(tag, pvd);
|
||||
CompoundTag ser = new TagCodec(pvd).toTag(new CompoundTag(), getClass(), this);
|
||||
if (ser != null) tag.put("auto-serial", ser);
|
||||
}
|
||||
|
||||
@@ -53,9 +54,10 @@ public class BaseBlockEntity extends BlockEntity {
|
||||
* Generate data packet from server to client, called from getUpdatePacket()
|
||||
*/
|
||||
@Override
|
||||
public CompoundTag getUpdateTag() {
|
||||
CompoundTag ans = super.getUpdateTag();
|
||||
CompoundTag ser = Wrappers.get(() -> TagCodec.toTag(new CompoundTag(), getClass(), this, SerialClass.SerialField::toClient));
|
||||
public CompoundTag getUpdateTag(HolderLookup.Provider pvd) {
|
||||
CompoundTag ans = super.getUpdateTag(pvd);
|
||||
CompoundTag ser = new TagCodec(pvd).pred(SerialField::toClient)
|
||||
.toTag(new CompoundTag(), getClass(), this);
|
||||
if (ser != null) ans.put("auto-serial", ser);
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public class BaseContainer<T extends BaseContainer<T>> extends SimpleContainer i
|
||||
for (ItemStack stack : items) {
|
||||
if (stack.isEmpty())
|
||||
ans++;
|
||||
else if (ItemStack.isSameItemSameTags(stack, add) &&
|
||||
else if (ItemStack.isSameItemSameComponents(stack, add) &&
|
||||
stack.getCount() + add.getCount() <=
|
||||
Math.min(stack.getMaxStackSize(), getMaxStackSize())) {
|
||||
return true;
|
||||
@@ -61,7 +61,7 @@ public class BaseContainer<T extends BaseContainer<T>> extends SimpleContainer i
|
||||
public boolean canRecipeAddItem(ItemStack stack) {
|
||||
stack = stack.copy();
|
||||
for (ItemStack slot : this.items) {
|
||||
if (slot.isEmpty() || ItemStack.isSameItemSameTags(slot, stack)) {
|
||||
if (slot.isEmpty() || ItemStack.isSameItemSameComponents(slot, stack)) {
|
||||
int cap = Math.min(getMaxStackSize(), slot.getMaxStackSize());
|
||||
int amount = Math.min(stack.getCount(), cap - slot.getCount());
|
||||
if (amount > 0) {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package dev.xkmc.l2core.base.tile;
|
||||
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.codec.AliasCollection;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialField;
|
||||
import net.minecraft.core.NonNullList;
|
||||
import net.neoforged.neoforge.fluids.FluidStack;
|
||||
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
|
||||
@@ -21,7 +22,7 @@ public class BaseTank implements IFluidHandler, AliasCollection<FluidStack> {
|
||||
private Predicate<FluidStack> predicate = e -> true;
|
||||
private BooleanSupplier allowExtract = () -> true;
|
||||
|
||||
@SerialClass.SerialField
|
||||
@SerialField
|
||||
public NonNullList<FluidStack> list;
|
||||
|
||||
private int click_max;
|
||||
@@ -82,7 +83,7 @@ public class BaseTank implements IFluidHandler, AliasCollection<FluidStack> {
|
||||
int filled = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
FluidStack stack = list.get(i);
|
||||
if (stack.isFluidEqual(resource)) {
|
||||
if (FluidStack.isSameFluidSameComponents(stack, resource)) {
|
||||
int remain = capacity - stack.getAmount();
|
||||
int fill = Math.min(to_fill, remain);
|
||||
filled += fill;
|
||||
@@ -123,7 +124,7 @@ public class BaseTank implements IFluidHandler, AliasCollection<FluidStack> {
|
||||
int drained = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
FluidStack stack = list.get(i);
|
||||
if (stack.isFluidEqual(resource)) {
|
||||
if (FluidStack.isSameFluidSameComponents(stack, resource)) {
|
||||
int remain = stack.getAmount();
|
||||
int drain = Math.min(to_drain, remain);
|
||||
drained += drain;
|
||||
@@ -155,7 +156,7 @@ public class BaseTank implements IFluidHandler, AliasCollection<FluidStack> {
|
||||
int drained = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
FluidStack stack = list.get(i);
|
||||
if (!stack.isEmpty() && (ans == null || stack.isFluidEqual(ans))) {
|
||||
if (!stack.isEmpty() && (ans == null || FluidStack.isSameFluidSameComponents(stack, ans))) {
|
||||
int remain = stack.getAmount();
|
||||
int drain = Math.min(to_drain, remain);
|
||||
drained += drain;
|
||||
|
||||
@@ -3,7 +3,7 @@ package dev.xkmc.l2core.base.tile;
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
import net.neoforged.neoforge.fluids.FluidStack;
|
||||
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
|
||||
import net.neoforged.neoforge.items.wrapper.EmptyHandler;
|
||||
import net.neoforged.neoforge.fluids.capability.templates.EmptyFluidHandler;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -85,36 +85,31 @@ public class CombinedTankWrapper implements IFluidHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(FluidStack resource, FluidAction action) {
|
||||
if (resource.isEmpty())
|
||||
public int fill(FluidStack input, FluidAction action) {
|
||||
if (input.isEmpty())
|
||||
return 0;
|
||||
|
||||
int filled = 0;
|
||||
resource = resource.copy();
|
||||
int ans = 0;
|
||||
input = input.copy();
|
||||
|
||||
boolean found = false;
|
||||
|
||||
boolean fittingHandlerFound = false;
|
||||
Outer:
|
||||
for (boolean searchPass : new boolean[]{true, false}) {
|
||||
for (IFluidHandler iFluidHandler : fillable()) {
|
||||
|
||||
for (int i = 0; i < iFluidHandler.getTanks(); i++)
|
||||
if (searchPass && iFluidHandler.getFluidInTank(i)
|
||||
.isFluidEqual(resource))
|
||||
fittingHandlerFound = true;
|
||||
|
||||
if (searchPass && !fittingHandlerFound)
|
||||
for (IFluidHandler handler : fillable()) {
|
||||
for (int i = 0; i < handler.getTanks(); i++)
|
||||
if (searchPass && FluidStack.isSameFluidSameComponents(handler.getFluidInTank(i), input))
|
||||
found = true;
|
||||
if (searchPass && !found)
|
||||
continue;
|
||||
|
||||
int filledIntoCurrent = iFluidHandler.fill(resource, action);
|
||||
resource.shrink(filledIntoCurrent);
|
||||
filled += filledIntoCurrent;
|
||||
|
||||
if (resource.isEmpty() || fittingHandlerFound || enforceVariety && filledIntoCurrent != 0)
|
||||
break Outer;
|
||||
int filler = handler.fill(input, action);
|
||||
input.shrink(filler);
|
||||
ans += filler;
|
||||
if (input.isEmpty() || found || enforceVariety && filler != 0)
|
||||
return ans;
|
||||
}
|
||||
}
|
||||
|
||||
return filled;
|
||||
return ans;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -122,41 +117,41 @@ public class CombinedTankWrapper implements IFluidHandler {
|
||||
if (resource.isEmpty())
|
||||
return resource;
|
||||
|
||||
FluidStack drained = FluidStack.EMPTY;
|
||||
FluidStack ans = FluidStack.EMPTY;
|
||||
resource = resource.copy();
|
||||
|
||||
for (IFluidHandler iFluidHandler : drainable()) {
|
||||
FluidStack drainedFromCurrent = iFluidHandler.drain(resource, action);
|
||||
int amount = drainedFromCurrent.getAmount();
|
||||
for (IFluidHandler handler : drainable()) {
|
||||
FluidStack drained = handler.drain(resource, action);
|
||||
int amount = drained.getAmount();
|
||||
resource.shrink(amount);
|
||||
|
||||
if (!drainedFromCurrent.isEmpty() && (drained.isEmpty() || drainedFromCurrent.isFluidEqual(drained)))
|
||||
drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount(),
|
||||
drainedFromCurrent.getTag());
|
||||
if (!drained.isEmpty() && (ans.isEmpty() || FluidStack.isSameFluidSameComponents(drained, ans)))
|
||||
ans = new FluidStack(drained.getFluidHolder(), amount + ans.getAmount(),
|
||||
drained.getComponentsPatch());
|
||||
if (resource.isEmpty())
|
||||
break;
|
||||
}
|
||||
|
||||
return drained;
|
||||
return ans;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(int maxDrain, FluidAction action) {
|
||||
FluidStack drained = FluidStack.EMPTY;
|
||||
FluidStack ans = FluidStack.EMPTY;
|
||||
|
||||
for (IFluidHandler iFluidHandler : drainable()) {
|
||||
FluidStack drainedFromCurrent = iFluidHandler.drain(maxDrain, action);
|
||||
int amount = drainedFromCurrent.getAmount();
|
||||
FluidStack drained = iFluidHandler.drain(maxDrain, action);
|
||||
int amount = drained.getAmount();
|
||||
maxDrain -= amount;
|
||||
|
||||
if (!drainedFromCurrent.isEmpty() && (drained.isEmpty() || drainedFromCurrent.isFluidEqual(drained)))
|
||||
drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount(),
|
||||
drainedFromCurrent.getTag());
|
||||
if (!drained.isEmpty() && (ans.isEmpty() || FluidStack.isSameFluidSameComponents(drained, ans)))
|
||||
ans = new FluidStack(drained.getFluidHolder(), amount + ans.getAmount(),
|
||||
drained.getComponentsPatch());
|
||||
if (maxDrain == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return drained;
|
||||
return ans;
|
||||
}
|
||||
|
||||
protected int getIndexForSlot(int slot) {
|
||||
@@ -170,7 +165,7 @@ public class CombinedTankWrapper implements IFluidHandler {
|
||||
|
||||
protected IFluidHandler getHandlerFromIndex(int index) {
|
||||
if (index < 0 || index >= list.size())
|
||||
return (IFluidHandler) EmptyHandler.INSTANCE;
|
||||
return EmptyFluidHandler.INSTANCE;
|
||||
return list.get(index).getFirst();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package dev.xkmc.l2core.capability.conditionals;
|
||||
|
||||
import dev.xkmc.l2core.capability.player.PlayerCapabilityTemplate;
|
||||
import dev.xkmc.l2core.init.L2LibReg;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialField;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
|
||||
import java.util.TreeSet;
|
||||
|
||||
@SerialClass
|
||||
public class PlayerFlagData extends PlayerCapabilityTemplate<PlayerFlagData> {
|
||||
|
||||
public static void addFlag(LivingEntity entity, String str) {
|
||||
if (entity instanceof Player player) {
|
||||
L2LibReg.FLAGS.type().get(player).addFlag(str);
|
||||
if (player instanceof ServerPlayer sp)
|
||||
L2LibReg.FLAGS.type().network.toClient(sp);
|
||||
} else {
|
||||
entity.addTag(str);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasFlag(LivingEntity entity, String str) {
|
||||
if (entity instanceof Player player) {
|
||||
return L2LibReg.FLAGS.type().get(player).hasFlag(str);
|
||||
} else {
|
||||
return entity.getTags().contains(str);
|
||||
}
|
||||
}
|
||||
|
||||
@SerialField
|
||||
private final TreeSet<String> flags = new TreeSet<>();
|
||||
|
||||
public void addFlag(String str) {
|
||||
flags.add(str);
|
||||
}
|
||||
|
||||
public boolean hasFlag(String flag) {
|
||||
return flags.contains(flag);
|
||||
}
|
||||
|
||||
public static void register() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,7 +9,7 @@ public record TokenKey<T extends ConditionalToken>(String type, String id) {
|
||||
}
|
||||
|
||||
public ResourceLocation asLocation() {
|
||||
return new ResourceLocation(type, id);
|
||||
return ResourceLocation.fromNamespaceAndPath(type, id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package dev.xkmc.l2core.capability.level;
|
||||
|
||||
import dev.xkmc.l2serial.serialization.SerialClass;
|
||||
import dev.xkmc.l2serial.serialization.codec.TagCodec;
|
||||
import dev.xkmc.l2serial.serialization.marker.SerialClass;
|
||||
import net.minecraft.core.HolderLookup;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.saveddata.SavedData;
|
||||
|
||||
@@ -9,8 +10,8 @@ import net.minecraft.world.level.saveddata.SavedData;
|
||||
public class BaseSavedData extends SavedData {
|
||||
|
||||
@Override
|
||||
public CompoundTag save(CompoundTag tag) {
|
||||
TagCodec.toTag(tag, this);
|
||||
public CompoundTag save(CompoundTag tag, HolderLookup.Provider provider) {
|
||||
new TagCodec(provider).toTag(tag, this);
|
||||
return tag;
|
||||
}
|
||||
|
||||
@@ -20,5 +21,4 @@ public class BaseSavedData extends SavedData {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package dev.xkmc.l2core.compat.curios;
|
||||
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public record CurioEntityBuilder(
|
||||
ArrayList<ResourceLocation> entities,
|
||||
ArrayList<String> slots,
|
||||
ArrayList<SlotCondition> conditions) {
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
package dev.xkmc.l2core.compat.curios;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import static dev.xkmc.l2core.compat.curios.CurioSlotBuilder.Operation.SET;
|
||||
|
||||
public record CurioSlotBuilder(int order, String icon, int size,
|
||||
Operation operation,
|
||||
boolean add_cosmetic,
|
||||
boolean use_native_gui,
|
||||
boolean render_toggle,
|
||||
boolean replace, ArrayList<SlotCondition> conditions) {
|
||||
|
||||
public CurioSlotBuilder(int order, String icon) {
|
||||
this(order, icon, 1, SET);
|
||||
}
|
||||
|
||||
public CurioSlotBuilder(int order, String icon, int size,
|
||||
Operation operation) {
|
||||
this(order, icon, size, operation,
|
||||
false, true, true, false, SlotCondition.of());
|
||||
}
|
||||
|
||||
public enum Operation {
|
||||
SET, ADD, REMOVE
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package dev.xkmc.l2core.compat.curios;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public record SlotCondition(String type, String modid) {
|
||||
|
||||
public static ArrayList<SlotCondition> of(String... ids) {
|
||||
ArrayList<SlotCondition> ans = new ArrayList<>();
|
||||
for (String id : ids) {
|
||||
ans.add(new SlotCondition(id));
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
public SlotCondition(String modid) {
|
||||
this("forge:mod_loaded", modid);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.compat.curios;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -1,4 +1,4 @@
|
||||
package dev.xkmc.l2core.init.events;
|
||||
package dev.xkmc.l2core.events;
|
||||
|
||||
import dev.xkmc.l2core.capability.attachment.GeneralCapabilityHolder;
|
||||
import dev.xkmc.l2core.capability.player.PlayerCapabilityHolder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package dev.xkmc.l2core.init.events;
|
||||
package dev.xkmc.l2core.events;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
@@ -1,6 +1,5 @@
|
||||
package dev.xkmc.l2core.init.events;
|
||||
package dev.xkmc.l2core.events;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
@@ -26,18 +25,15 @@ import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.neoforged.api.distmarker.Dist;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.EventBusSubscriber;
|
||||
import net.neoforged.fml.common.Mod;
|
||||
import net.neoforged.neoforge.client.event.ClientTickEvent;
|
||||
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
|
||||
import net.neoforged.neoforge.client.event.RenderLivingEvent;
|
||||
import net.neoforged.neoforge.event.TickEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -81,11 +77,11 @@ public class ClientEffectRenderEvents {
|
||||
public static void onLivingEntityRender(RenderLivingEvent.Post<?, ?> event) {
|
||||
LivingEntity entity = event.getEntity();
|
||||
if (!L2LibReg.EFFECT.type().isProper(entity)) return;
|
||||
if (entity.getTags().contains("ClientOnly")) return;
|
||||
if (entity.getTags().contains("ClientOnly")) return;//TODO
|
||||
ClientEffectCap cap = L2LibReg.EFFECT.type().get(entity);
|
||||
List<Pair<ClientRenderEffect, Integer>> l0 = new ArrayList<>();
|
||||
for (Map.Entry<MobEffect, Integer> entry : cap.map.entrySet()) {
|
||||
if (entry.getKey() instanceof ClientRenderEffect effect) {
|
||||
for (var entry : cap.map.entrySet()) {
|
||||
if (entry.getKey().value() instanceof ClientRenderEffect effect) {
|
||||
l0.add(Pair.of(effect, entry.getValue()));
|
||||
}
|
||||
}
|
||||
@@ -103,7 +99,6 @@ public class ClientEffectRenderEvents {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int n = index;
|
||||
int w = (int) Math.ceil(Math.sqrt(n));
|
||||
int h = (int) Math.ceil(n * 1d / w);
|
||||
@@ -155,10 +150,9 @@ public class ClientEffectRenderEvents {
|
||||
}
|
||||
|
||||
private static void iconVertex(PoseStack.Pose entry, VertexConsumer builder, float x, float y, float u, float v) {
|
||||
builder.vertex(entry.pose(), x, y, 0)
|
||||
.uv(u, v)
|
||||
.normal(entry.normal(), 0.0F, 1.0F, 0.0F)
|
||||
.endVertex();
|
||||
builder.addVertex(entry.pose(), x, y, 0)
|
||||
.setUv(u, v)
|
||||
.setNormal(entry, 0.0F, 1.0F, 0.0F);
|
||||
}
|
||||
|
||||
public static RenderType get2DIcon(ResourceLocation rl) {
|
||||
@@ -188,5 +182,4 @@ public class ClientEffectRenderEvents {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,26 +1,30 @@
|
||||
package dev.xkmc.l2core.init.events;
|
||||
package dev.xkmc.l2core.events;
|
||||
|
||||
import dev.xkmc.l2core.base.effects.EffectToClient;
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.tags.TagKey;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.Mod;
|
||||
import net.neoforged.fml.common.EventBusSubscriber;
|
||||
import net.neoforged.neoforge.event.entity.living.MobEffectEvent;
|
||||
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = L2Core.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||
@EventBusSubscriber(modid = L2Core.MODID, bus = EventBusSubscriber.Bus.GAME)
|
||||
public class EffectSyncEvents {
|
||||
|
||||
public static final Set<MobEffect> TRACKED = new HashSet<>();
|
||||
public static final TagKey<MobEffect> SYNCED = TagKey.create(Registries.MOB_EFFECT, L2Core.loc("synced"));
|
||||
|
||||
private static boolean isTracked(Holder<MobEffect> eff) {
|
||||
return eff.is(SYNCED);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPotionAddedEvent(MobEffectEvent.Added event) {
|
||||
if (TRACKED.contains(event.getEffectInstance().getEffect())) {
|
||||
if (isTracked(event.getEffectInstance().getEffect())) {
|
||||
onEffectAppear(event.getEffectInstance().getEffect(), event.getEntity(), event.getEffectInstance().getAmplifier());
|
||||
}
|
||||
}
|
||||
@@ -28,7 +32,7 @@ public class EffectSyncEvents {
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPotionRemoveEvent(MobEffectEvent.Remove event) {
|
||||
if (event.getEffectInstance() != null && TRACKED.contains(event.getEffectInstance().getEffect())) {
|
||||
if (event.getEffectInstance() != null && isTracked(event.getEffectInstance().getEffect())) {
|
||||
onEffectDisappear(event.getEffectInstance().getEffect(), event.getEntity());
|
||||
}
|
||||
}
|
||||
@@ -36,17 +40,16 @@ public class EffectSyncEvents {
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPotionExpiryEvent(MobEffectEvent.Expired event) {
|
||||
if (event.getEffectInstance() != null && TRACKED.contains(event.getEffectInstance().getEffect())) {
|
||||
if (event.getEffectInstance() != null && isTracked(event.getEffectInstance().getEffect())) {
|
||||
onEffectDisappear(event.getEffectInstance().getEffect(), event.getEntity());
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPlayerStartTracking(PlayerEvent.StartTracking event) {
|
||||
if (!(event.getTarget() instanceof LivingEntity le))
|
||||
return;
|
||||
for (MobEffect eff : le.getActiveEffectsMap().keySet()) {
|
||||
if (TRACKED.contains(eff)) {
|
||||
if (!(event.getTarget() instanceof LivingEntity le)) return;
|
||||
for (var eff : le.getActiveEffectsMap().keySet()) {
|
||||
if (isTracked(eff)) {
|
||||
onEffectAppear(eff, le, le.getActiveEffectsMap().get(eff).getAmplifier());
|
||||
}
|
||||
}
|
||||
@@ -54,10 +57,9 @@ public class EffectSyncEvents {
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPlayerStopTracking(PlayerEvent.StopTracking event) {
|
||||
if (!(event.getTarget() instanceof LivingEntity le))
|
||||
return;
|
||||
for (MobEffect eff : le.getActiveEffectsMap().keySet()) {
|
||||
if (TRACKED.contains(eff)) {
|
||||
if (!(event.getTarget() instanceof LivingEntity le)) return;
|
||||
for (var eff : le.getActiveEffectsMap().keySet()) {
|
||||
if (isTracked(eff)) {
|
||||
onEffectDisappear(eff, le);
|
||||
}
|
||||
}
|
||||
@@ -66,11 +68,10 @@ public class EffectSyncEvents {
|
||||
@SubscribeEvent
|
||||
public static void onServerPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) {
|
||||
ServerPlayer e = (ServerPlayer) event.getEntity();
|
||||
if (e != null) {
|
||||
for (MobEffect eff : e.getActiveEffectsMap().keySet()) {
|
||||
if (TRACKED.contains(eff)) {
|
||||
onEffectAppear(eff, e, e.getActiveEffectsMap().get(eff).getAmplifier());
|
||||
}
|
||||
if (e == null) return;
|
||||
for (var eff : e.getActiveEffectsMap().keySet()) {
|
||||
if (isTracked(eff)) {
|
||||
onEffectAppear(eff, e, e.getActiveEffectsMap().get(eff).getAmplifier());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,21 +79,20 @@ public class EffectSyncEvents {
|
||||
@SubscribeEvent
|
||||
public static void onServerPlayerLeave(PlayerEvent.PlayerLoggedOutEvent event) {
|
||||
ServerPlayer e = (ServerPlayer) event.getEntity();
|
||||
if (e != null) {
|
||||
for (MobEffect eff : e.getActiveEffectsMap().keySet()) {
|
||||
if (TRACKED.contains(eff)) {
|
||||
onEffectDisappear(eff, e);
|
||||
}
|
||||
if (e == null) return;
|
||||
for (var eff : e.getActiveEffectsMap().keySet()) {
|
||||
if (isTracked(eff)) {
|
||||
onEffectDisappear(eff, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void onEffectAppear(MobEffect eff, LivingEntity e, int lv) {
|
||||
private static void onEffectAppear(Holder<MobEffect> eff, LivingEntity e, int lv) {
|
||||
if (e.level().isClientSide()) return;
|
||||
L2Core.PACKET_HANDLER.toTrackingPlayers(new EffectToClient(e.getId(), eff, true, lv), e);
|
||||
}
|
||||
|
||||
private static void onEffectDisappear(MobEffect eff, LivingEntity e) {
|
||||
private static void onEffectDisappear(Holder<MobEffect> eff, LivingEntity e) {
|
||||
if (e.level().isClientSide()) return;
|
||||
L2Core.PACKET_HANDLER.toTrackingPlayers(new EffectToClient(e.getId(), eff, false, 0), e);
|
||||
}
|
||||
43
src/main/java/dev/xkmc/l2core/events/SchedulerHandler.java
Normal file
43
src/main/java/dev/xkmc/l2core/events/SchedulerHandler.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package dev.xkmc.l2core.events;
|
||||
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.EventBusSubscriber;
|
||||
import net.neoforged.neoforge.event.tick.ServerTickEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.BooleanSupplier;
|
||||
|
||||
@EventBusSubscriber(modid = L2Core.MODID, bus = EventBusSubscriber.Bus.GAME)
|
||||
public class SchedulerHandler {
|
||||
|
||||
|
||||
@SubscribeEvent
|
||||
public static void serverTick(ServerTickEvent.Post event) {
|
||||
execute();
|
||||
}
|
||||
|
||||
private static List<BooleanSupplier> TASKS = new ArrayList<>();
|
||||
|
||||
public static synchronized void schedule(Runnable runnable) {
|
||||
TASKS.add(() -> {
|
||||
runnable.run();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
public static synchronized void schedulePersistent(BooleanSupplier runnable) {
|
||||
TASKS.add(runnable);
|
||||
}
|
||||
|
||||
private static synchronized void execute() {
|
||||
if (TASKS.isEmpty()) return;
|
||||
var temp = TASKS;
|
||||
TASKS = new ArrayList<>();
|
||||
temp.removeIf(BooleanSupplier::getAsBoolean);
|
||||
temp.addAll(TASKS);
|
||||
TASKS = temp;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.util;
|
||||
package dev.xkmc.l2core.events;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
@@ -3,9 +3,9 @@ package dev.xkmc.l2core.init;
|
||||
import dev.xkmc.l2core.base.effects.EffectToClient;
|
||||
import dev.xkmc.l2core.capability.conditionals.TokenToClient;
|
||||
import dev.xkmc.l2core.capability.player.PlayerCapToClient;
|
||||
import dev.xkmc.l2core.serial.config.SyncPacket;
|
||||
import dev.xkmc.l2serial.network.PacketHandler;
|
||||
import dev.xkmc.l2serial.serialization.custom_handler.Handlers;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.neoforged.bus.api.IEventBus;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.EventBusSubscriber;
|
||||
@@ -35,6 +35,7 @@ public class L2Core {
|
||||
public L2Core(IEventBus bus) {
|
||||
Handlers.register();
|
||||
L2LibReg.register(bus);
|
||||
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@@ -42,4 +43,8 @@ public class L2Core {
|
||||
PACKET_HANDLER.register(event);
|
||||
}
|
||||
|
||||
public static ResourceLocation loc(String id) {
|
||||
return ResourceLocation.fromNamespaceAndPath(MODID, id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,12 +3,12 @@ package dev.xkmc.l2core.init;
|
||||
import dev.xkmc.l2core.base.effects.ClientEffectCap;
|
||||
import dev.xkmc.l2core.base.menu.base.MenuLayoutConfig;
|
||||
import dev.xkmc.l2core.capability.conditionals.ConditionalData;
|
||||
import dev.xkmc.l2core.capability.conditionals.PlayerFlagData;
|
||||
import dev.xkmc.l2core.capability.player.PlayerCapabilityNetworkHandler;
|
||||
import dev.xkmc.l2core.init.reg.datapack.DatapackReg;
|
||||
import dev.xkmc.l2core.init.reg.simple.*;
|
||||
import dev.xkmc.l2core.serial.conditions.*;
|
||||
import dev.xkmc.l2core.serial.ingredients.EnchantmentIngredient;
|
||||
import dev.xkmc.l2core.serial.ingredients.MobEffectIngredient;
|
||||
import dev.xkmc.l2core.serial.ingredients.PotionIngredient;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.neoforged.bus.api.IEventBus;
|
||||
@@ -23,7 +23,6 @@ public class L2LibReg {
|
||||
public static final IngReg INGREDIENT = IngReg.of(REG);
|
||||
public static final IngVal<EnchantmentIngredient> ING_ENCH = INGREDIENT.reg("enchantment", EnchantmentIngredient.class);
|
||||
public static final IngVal<PotionIngredient> ING_POTION = INGREDIENT.reg("potion", PotionIngredient.class);
|
||||
public static final IngVal<MobEffectIngredient> ING_EFF = INGREDIENT.reg("mob_effect", MobEffectIngredient.class);
|
||||
|
||||
// conditions
|
||||
public static final CdcReg<ICondition> CONDITION = CdcReg.of(REG, NeoForgeRegistries.CONDITION_SERIALIZERS);
|
||||
@@ -35,10 +34,13 @@ public class L2LibReg {
|
||||
|
||||
// attachments
|
||||
public static final AttReg ATTACHMENT = AttReg.of(REG);
|
||||
|
||||
public static final AttVal.CapVal<LivingEntity, ClientEffectCap> EFFECT = ATTACHMENT.entity("effect",
|
||||
ClientEffectCap.class, ClientEffectCap::new, LivingEntity.class, e -> e.level().isClientSide());
|
||||
public static final AttVal.PlayerVal<ConditionalData> CONDITIONAL = ATTACHMENT.player("conditionals",
|
||||
ConditionalData.class, ConditionalData::new, PlayerCapabilityNetworkHandler::new);
|
||||
public static final AttVal.PlayerVal<PlayerFlagData> FLAGS = ATTACHMENT.player("flags",
|
||||
PlayerFlagData.class, PlayerFlagData::new, PlayerCapabilityNetworkHandler::new);
|
||||
|
||||
public static final DatapackReg<MenuLayoutConfig> MENU_LAYOUT = REG.dataReg("menu_layout", MenuLayoutConfig.class);
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package dev.xkmc.l2core.init.events;
|
||||
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import dev.xkmc.l2core.util.raytrace.EntityTarget;
|
||||
import net.neoforged.api.distmarker.Dist;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.Mod;
|
||||
import net.neoforged.neoforge.event.TickEvent;
|
||||
|
||||
@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = L2Core.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||
public class ClientGeneralEventHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public static void clientTick(TickEvent.ClientTickEvent event) {
|
||||
if (event.phase != TickEvent.Phase.END) return;
|
||||
for (EntityTarget target : EntityTarget.LIST) {
|
||||
target.tickRender();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
package dev.xkmc.l2core.init.events;
|
||||
|
||||
import dev.xkmc.l2core.base.explosion.BaseExplosion;
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import dev.xkmc.l2core.serial.config.PacketHandlerWithConfig;
|
||||
import dev.xkmc.l2core.util.raytrace.RayTraceUtil;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.Mod;
|
||||
import net.neoforged.neoforge.event.AddReloadListenerEvent;
|
||||
import net.neoforged.neoforge.event.OnDatapackSyncEvent;
|
||||
import net.neoforged.neoforge.event.TickEvent;
|
||||
import net.neoforged.neoforge.event.level.ExplosionEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.BooleanSupplier;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = L2Core.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||
public class GeneralEventHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public static void addReloadListeners(AddReloadListenerEvent event) {
|
||||
PacketHandlerWithConfig.addReloadListeners(event);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onDatapackSync(OnDatapackSyncEvent event) {
|
||||
PacketHandlerWithConfig.onDatapackSync(event);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void serverTick(TickEvent.ServerTickEvent event) {
|
||||
if (event.phase != TickEvent.Phase.END) return;
|
||||
RayTraceUtil.serverTick();
|
||||
execute();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onDetonate(ExplosionEvent.Detonate event) {
|
||||
if (event.getExplosion() instanceof BaseExplosion exp) {
|
||||
event.getAffectedEntities().removeIf(e -> !exp.hurtEntity(e));
|
||||
}
|
||||
}
|
||||
|
||||
private static List<BooleanSupplier> TASKS = new ArrayList<>();
|
||||
|
||||
public static synchronized void schedule(Runnable runnable) {
|
||||
TASKS.add(() -> {
|
||||
runnable.run();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
public static synchronized void schedulePersistent(BooleanSupplier runnable) {
|
||||
TASKS.add(runnable);
|
||||
}
|
||||
|
||||
private static synchronized void execute() {
|
||||
if (TASKS.isEmpty()) return;
|
||||
var temp = TASKS;
|
||||
TASKS = new ArrayList<>();
|
||||
temp.removeIf(BooleanSupplier::getAsBoolean);
|
||||
temp.addAll(TASKS);
|
||||
TASKS = temp;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.init.events;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -1,166 +0,0 @@
|
||||
package dev.xkmc.l2core.init.reg.registrate;
|
||||
|
||||
/*TODO
|
||||
public class L2Registrate extends AbstractRegistrate<L2Registrate> {
|
||||
|
||||
public L2Registrate(String modid) {
|
||||
super(modid);
|
||||
registerEventListeners(FMLJavaModLoadingContext.get().getModEventBus());
|
||||
}
|
||||
|
||||
public <T extends NamedEntry<T>, P extends T> GenericBuilder<T, P> generic(RegistryInstance<T> cls, String id, NonNullSupplier<P> sup) {
|
||||
return entry(id, cb -> new GenericBuilder<>(this, id, cb, cls.key(), sup));
|
||||
}
|
||||
|
||||
public <T extends Recipe<?>> RegistryEntry<RecipeType<T>> recipe(String id) {
|
||||
return simple(id, ForgeRegistries.Keys.RECIPE_TYPES, () -> new RecipeType<>() {
|
||||
});
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public <T extends Enchantment> EnchantmentBuilder<T, L2Registrate> enchantment(String name, EnchantmentCategory type, EnchantmentBuilder.EnchantmentFactory<T> factory) {
|
||||
return super.enchantment(name, type, factory);
|
||||
}
|
||||
|
||||
public <T extends Enchantment> EnchantmentBuilder<T, L2Registrate> enchantment(String name, EnchantmentCategory type, EnchantmentBuilder.EnchantmentFactory<T> factory, String desc) {
|
||||
addRawLang("enchantment." + getModid() + "." + name + ".desc", desc);
|
||||
return super.enchantment(name, type, factory);
|
||||
}
|
||||
|
||||
public <T extends MobEffect> NoConfigBuilder<MobEffect, T, L2Registrate> effect(String name, NonNullSupplier<T> sup, String desc) {
|
||||
addRawLang("effect." + getModid() + "." + name + ".description", desc);
|
||||
return entry(name, cb -> new NoConfigBuilder<>(this, this, name, cb, ForgeRegistries.Keys.MOB_EFFECTS, sup));
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "unsafe"})
|
||||
public <E extends NamedEntry<E>> RegistryInstance<E> newRegistry(String id, Class<?> cls, Consumer<RegistryBuilder<E>> cons) {
|
||||
ResourceKey<Registry<E>> key = makeRegistry(id, () -> {
|
||||
var ans = new RegistryBuilder<E>();
|
||||
ans.onCreate((r, s) -> new RLClassHandler<>((Class<E>) cls, () -> r));
|
||||
cons.accept(ans);
|
||||
return ans;
|
||||
});
|
||||
return new RegistryInstance<>(Suppliers.memoize(() -> RegistryManager.ACTIVE.getRegistry(key)), key);
|
||||
}
|
||||
|
||||
public <E extends NamedEntry<E>> RegistryInstance<E> newRegistry(String id, Class<?> cls) {
|
||||
return newRegistry(id, cls, e -> {
|
||||
});
|
||||
}
|
||||
|
||||
public synchronized RegistryEntry<CreativeModeTab> buildModCreativeTab(String name, String def, Consumer<CreativeModeTab.Builder> config) {
|
||||
ResourceLocation id = new ResourceLocation(getModid(), name);
|
||||
defaultCreativeTab(ResourceKey.create(Registries.CREATIVE_MODE_TAB, id));
|
||||
return buildCreativeTabImpl(name, this.addLang("itemGroup", id, def), config);
|
||||
}
|
||||
|
||||
public synchronized RegistryEntry<CreativeModeTab> buildL2CreativeTab(String name, String def, Consumer<CreativeModeTab.Builder> config) {
|
||||
ResourceLocation id = new ResourceLocation(L2Library.MODID, name);
|
||||
defaultCreativeTab(ResourceKey.create(Registries.CREATIVE_MODE_TAB, id));
|
||||
TabSorter sorter = new TabSorter(getModid() + ":" + name, id);
|
||||
return L2Library.REGISTRATE.buildCreativeTabImpl(name, this.addLang("itemGroup", id, def), b -> {
|
||||
config.accept(b);
|
||||
sorter.sort(b);
|
||||
});
|
||||
}
|
||||
|
||||
private synchronized RegistryEntry<CreativeModeTab> buildCreativeTabImpl(String name, Component comp, Consumer<CreativeModeTab.Builder> config) {
|
||||
return this.generic(self(), name, Registries.CREATIVE_MODE_TAB, () -> {
|
||||
var builder = CreativeModeTab.builder().title(comp)
|
||||
.withTabsBefore(CreativeModeTabs.SPAWN_EGGS);
|
||||
config.accept(builder);
|
||||
return builder.build();
|
||||
}).register();
|
||||
}
|
||||
|
||||
public record RegistryInstance<E extends NamedEntry<E>>(Supplier<IForgeRegistry<E>> supplier,
|
||||
ResourceKey<Registry<E>> key) implements Supplier<IForgeRegistry<E>> {
|
||||
|
||||
@Override
|
||||
public IForgeRegistry<E> get() {
|
||||
return supplier().get();
|
||||
}
|
||||
}
|
||||
|
||||
public static class GenericBuilder<T extends NamedEntry<T>, P extends T> extends AbstractBuilder<T, P, L2Registrate, GenericBuilder<T, P>> {
|
||||
|
||||
private final NonNullSupplier<P> sup;
|
||||
|
||||
GenericBuilder(L2Registrate parent, String name, BuilderCallback callback, ResourceKey<Registry<T>> registryType, NonNullSupplier<P> sup) {
|
||||
super(parent, parent, name, callback, registryType);
|
||||
this.sup = sup;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @NonnullType @NotNull P createEntry() {
|
||||
return sup.get();
|
||||
}
|
||||
|
||||
public GenericBuilder<T, P> defaultLang() {
|
||||
return lang(NamedEntry::getDescriptionId, RegistrateLangProvider.toEnglishName(this.getName()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class TabSorter {
|
||||
|
||||
private static final TreeMap<String, TabSorter> MAP = new TreeMap<>();
|
||||
private static final HashSet<ResourceLocation> SET = new HashSet<>();
|
||||
|
||||
private final ResourceLocation id;
|
||||
|
||||
private TabSorter(String str, ResourceLocation id) {
|
||||
MAP.put(str, this);
|
||||
SET.add(id);
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void sort(CreativeModeTab.Builder b) {
|
||||
var list = new ArrayList<>(MAP.values());
|
||||
boolean after = false;
|
||||
ResourceLocation before = null;
|
||||
for (var e : list) {
|
||||
if (e == this) {
|
||||
after = true;
|
||||
if (before != null) {
|
||||
b.withTabsBefore(before);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (after) {
|
||||
b.withTabsAfter(e.id);
|
||||
return;
|
||||
} else {
|
||||
before = e.id;
|
||||
}
|
||||
}
|
||||
for (var e : BuiltInRegistries.CREATIVE_MODE_TAB.entrySet()) {
|
||||
var id = e.getKey().location();
|
||||
if (known(id) || known(e.getValue())) {
|
||||
continue;
|
||||
}
|
||||
b.withTabsAfter(id);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean known(ResourceLocation id) {
|
||||
if (id.getNamespace().equals("minecraft")) {
|
||||
return true;
|
||||
}
|
||||
return SET.contains(id);
|
||||
}
|
||||
|
||||
private static boolean known(CreativeModeTab tab) {
|
||||
for (var other : tab.tabsAfter) {
|
||||
if (known(other)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
@@ -1,40 +0,0 @@
|
||||
package dev.xkmc.l2core.init.reg.registrate;
|
||||
|
||||
/*TODO
|
||||
public class NamedEntry<T extends NamedEntry<T>> {
|
||||
|
||||
private final L2Registrate.RegistryInstance<T> registry;
|
||||
|
||||
private String desc = null;
|
||||
|
||||
public NamedEntry(L2Registrate.RegistryInstance<T> registry) {
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
public @NotNull String getDescriptionId() {
|
||||
if (desc != null)
|
||||
return desc;
|
||||
ResourceLocation rl = getRegistryName();
|
||||
ResourceLocation reg = registry.get().getRegistryName();
|
||||
desc = reg.getPath() + "." + rl.getNamespace() + "." + rl.getPath();
|
||||
return desc;
|
||||
}
|
||||
|
||||
public MutableComponent getDesc() {
|
||||
return Component.translatable(getDescriptionId());
|
||||
}
|
||||
|
||||
public ResourceLocation getRegistryName() {
|
||||
return Objects.requireNonNull(registry.get().getKey(getThis()));
|
||||
}
|
||||
|
||||
public String getID() {
|
||||
return getRegistryName().toString();
|
||||
}
|
||||
|
||||
public T getThis() {
|
||||
return Wrappers.cast(this);
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
@@ -1,8 +0,0 @@
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
|
||||
package dev.xkmc.l2core.init.reg.registrate;
|
||||
|
||||
import net.minecraft.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
@@ -24,7 +24,7 @@ public record BooleanValueCondition(String path, ArrayList<String> line, boolean
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapCodec<? extends ICondition> codec() {
|
||||
public MapCodec<BooleanValueCondition> codec() {
|
||||
return L2LibReg.CONDITION_BOOL.get();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.xkmc.l2core.serial.conditions;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import dev.xkmc.l2core.init.L2LibReg;
|
||||
import net.neoforged.fml.config.ConfigTracker;
|
||||
import net.neoforged.neoforge.common.ModConfigSpec;
|
||||
@@ -24,7 +24,7 @@ public record DoubleValueCondition(String path, ArrayList<String> line, double l
|
||||
}
|
||||
|
||||
@Override
|
||||
public Codec<DoubleValueCondition> codec() {
|
||||
public MapCodec<DoubleValueCondition> codec() {
|
||||
return L2LibReg.CONDITION_DOUBLE.get();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.xkmc.l2core.serial.conditions;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import dev.xkmc.l2core.init.L2LibReg;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
@@ -12,8 +12,6 @@ import java.util.ArrayList;
|
||||
|
||||
public record IntValueCondition(String path, ArrayList<String> line, int low, int high) implements ICondition {
|
||||
|
||||
public static final ResourceLocation ID = new ResourceLocation(L2Core.MODID, "int_config");
|
||||
|
||||
public static IntValueCondition of(String file, ModConfigSpec.ConfigValue<Integer> config, int low, int high) {
|
||||
return new IntValueCondition(file, new ArrayList<>(config.getPath()), low, high);
|
||||
}
|
||||
@@ -29,7 +27,7 @@ public record IntValueCondition(String path, ArrayList<String> line, int low, in
|
||||
|
||||
|
||||
@Override
|
||||
public Codec<IntValueCondition> codec() {
|
||||
public MapCodec<IntValueCondition> codec() {
|
||||
return L2LibReg.CONDITION_INT.get();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package dev.xkmc.l2core.serial.conditions;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import dev.xkmc.l2core.init.L2LibReg;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.neoforged.fml.config.ConfigTracker;
|
||||
import net.neoforged.neoforge.common.ModConfigSpec;
|
||||
import net.neoforged.neoforge.common.conditions.ICondition;
|
||||
@@ -13,8 +11,6 @@ import java.util.List;
|
||||
|
||||
public record ListStringValueCondition(String path, ArrayList<String> line, String key) implements ICondition {
|
||||
|
||||
public static final ResourceLocation ID = new ResourceLocation(L2Core.MODID, "string_list_config");
|
||||
|
||||
public static ListStringValueCondition of(String file, ModConfigSpec.ConfigValue<List<String>> config, String key) {
|
||||
return new ListStringValueCondition(file, new ArrayList<>(config.getPath()), key);
|
||||
}
|
||||
@@ -29,7 +25,7 @@ public record ListStringValueCondition(String path, ArrayList<String> line, Stri
|
||||
}
|
||||
|
||||
@Override
|
||||
public Codec<ListStringValueCondition> codec() {
|
||||
public MapCodec<ListStringValueCondition> codec() {
|
||||
return L2LibReg.CONDITION_LIST_STR.get();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package dev.xkmc.l2core.serial.conditions;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import dev.xkmc.l2core.init.L2Core;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import dev.xkmc.l2core.init.L2LibReg;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.neoforged.fml.config.ConfigTracker;
|
||||
import net.neoforged.neoforge.common.ModConfigSpec;
|
||||
import net.neoforged.neoforge.common.conditions.ICondition;
|
||||
@@ -12,8 +10,6 @@ import java.util.ArrayList;
|
||||
|
||||
public record StringValueCondition(String path, ArrayList<String> line, String key) implements ICondition {
|
||||
|
||||
public static final ResourceLocation ID = new ResourceLocation(L2Core.MODID, "string_config");
|
||||
|
||||
public static StringValueCondition of(String file, ModConfigSpec.ConfigValue<String> config, String key) {
|
||||
return new StringValueCondition(file, new ArrayList<>(config.getPath()), key);
|
||||
}
|
||||
@@ -28,7 +24,7 @@ public record StringValueCondition(String path, ArrayList<String> line, String k
|
||||
}
|
||||
|
||||
@Override
|
||||
public Codec<StringValueCondition> codec() {
|
||||
public MapCodec<StringValueCondition> codec() {
|
||||
return L2LibReg.CONDITION_STR.get();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.xkmc.l2core.serial.recipe;
|
||||
|
||||
import net.minecraft.core.HolderLookup;
|
||||
import net.minecraft.core.RegistryAccess;
|
||||
import net.minecraft.world.Container;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
@@ -23,13 +24,14 @@ public abstract class BaseRecipe<Rec extends SRec, SRec extends BaseRecipe<?, SR
|
||||
public abstract boolean matches(Inv inv, Level world);
|
||||
|
||||
@Override
|
||||
public abstract ItemStack assemble(Inv inv, RegistryAccess access);
|
||||
public abstract ItemStack assemble(Inv inv, HolderLookup.Provider provider);
|
||||
|
||||
@Override
|
||||
public abstract ItemStack getResultItem(HolderLookup.Provider provider);
|
||||
|
||||
@Override
|
||||
public abstract boolean canCraftInDimensions(int r, int c);
|
||||
|
||||
public abstract ItemStack getResultItem(RegistryAccess access);
|
||||
|
||||
@Override
|
||||
public final RecipeSerializer<?> getSerializer() {
|
||||
return factory;
|
||||
|
||||
@@ -1,25 +1,23 @@
|
||||
package dev.xkmc.l2core.util;
|
||||
|
||||
import net.minecraft.advancements.critereon.EnchantmentPredicate;
|
||||
import net.minecraft.advancements.critereon.ItemPredicate;
|
||||
import net.minecraft.advancements.critereon.MinMaxBounds;
|
||||
import net.minecraft.advancements.critereon.StatePropertiesPredicate;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.enchantment.Enchantment;
|
||||
import net.minecraft.world.item.enchantment.Enchantments;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.properties.Property;
|
||||
import net.minecraft.world.level.storage.loot.LootPool;
|
||||
import net.minecraft.world.level.storage.loot.LootTable;
|
||||
import net.minecraft.world.level.storage.loot.entries.LootItem;
|
||||
import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer;
|
||||
import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount;
|
||||
import net.minecraft.world.level.storage.loot.functions.LootingEnchantFunction;
|
||||
import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction;
|
||||
import net.minecraft.world.level.storage.loot.predicates.*;
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition;
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemKilledByPlayerCondition;
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition;
|
||||
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
|
||||
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
|
||||
import net.neoforged.neoforge.common.Tags;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -40,12 +38,6 @@ public class LootTableTemplate {
|
||||
.apply(SetItemCountFunction.setCount(UniformGenerator.between(min, max)));
|
||||
}
|
||||
|
||||
public static LootPoolSingletonContainer.Builder<?> getItem(Item item, int min, int max, int add) {
|
||||
return LootItem.lootTableItem(item)
|
||||
.apply(SetItemCountFunction.setCount(UniformGenerator.between(min, max)))
|
||||
.apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, add)));
|
||||
}
|
||||
|
||||
public static LootItemCondition.Builder byPlayer() {
|
||||
return LootItemKilledByPlayerCondition.killedByPlayer();
|
||||
}
|
||||
@@ -54,10 +46,6 @@ public class LootTableTemplate {
|
||||
return LootItemRandomChanceCondition.randomChance(chance);
|
||||
}
|
||||
|
||||
public static LootItemCondition.Builder chance(float chance, float add) {
|
||||
return LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(chance, add);
|
||||
}
|
||||
|
||||
public static LootItemBlockStatePropertyCondition.Builder withBlockState(Block block, Property<Integer> prop, int low, int high) {
|
||||
StatePropertiesPredicate.Builder builder = StatePropertiesPredicate.Builder.properties();
|
||||
builder.matchers.add(new StatePropertiesPredicate.PropertyMatcher(prop.getName(),
|
||||
@@ -85,42 +73,9 @@ public class LootTableTemplate {
|
||||
);
|
||||
}
|
||||
|
||||
public static LootPoolSingletonContainer.Builder<?> cropDrop(Item item) {
|
||||
return LootItem.lootTableItem(item).apply(ApplyBonusCount
|
||||
.addBonusBinomialDistributionCount(Enchantments.BLOCK_FORTUNE, 0.57f, 3));
|
||||
}
|
||||
|
||||
public static EnchantmentPredicate hasEnchantment(Enchantment enchant, int min) {
|
||||
public static EnchantmentPredicate hasEnchantment(Holder<Enchantment> enchant, int min) {
|
||||
return new EnchantmentPredicate(enchant, MinMaxBounds.Ints.atLeast(min));
|
||||
}
|
||||
|
||||
public static LootItemCondition.Builder shearOrSilk(boolean inverted) {
|
||||
var ans = AnyOfCondition.anyOf(
|
||||
MatchTool.toolMatches(ItemPredicate.Builder.item().of(Tags.Items.SHEARS)),
|
||||
MatchTool.toolMatches(ItemPredicate.Builder.item().hasEnchantment(hasEnchantment(Enchantments.SILK_TOUCH, 1)))
|
||||
);
|
||||
return inverted ? ans.invert() : ans;
|
||||
}
|
||||
|
||||
public static LootItemCondition.Builder silk(boolean inverted) {
|
||||
LootItemCondition.Builder ans = MatchTool.toolMatches(ItemPredicate.Builder.item().hasEnchantment(hasEnchantment(Enchantments.SILK_TOUCH, 1)));
|
||||
return inverted ? InvertedLootItemCondition.invert(ans) : ans;
|
||||
}
|
||||
|
||||
public static LootTable.Builder selfOrOther(Block block, Block base, Item other, int count) {
|
||||
return LootTable.lootTable()
|
||||
.withPool(LootTableTemplate.getPool(1, 0)
|
||||
.add(LootTableTemplate.getItem(base.asItem(), 1))
|
||||
.when(ExplosionCondition.survivesExplosion())
|
||||
.when(LootTableTemplate.silk(true)))
|
||||
.withPool(LootTableTemplate.getPool(1, 0)
|
||||
.add(LootTableTemplate.getItem(other, count))
|
||||
.when(ExplosionCondition.survivesExplosion())
|
||||
.when(LootTableTemplate.silk(true)))
|
||||
.withPool(LootTableTemplate.getPool(1, 0)
|
||||
.add(LootTableTemplate.getItem(block.asItem(), 1))
|
||||
.when(LootTableTemplate.silk(false))
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user