more metas to add
This commit is contained in:
parent
fdc47c5368
commit
0d709013e2
16 changed files with 513 additions and 4 deletions
|
@ -4,6 +4,13 @@ import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
|
|||
import me.tofaa.entitylib.meta.EntityMeta;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.mobs.*;
|
||||
import me.tofaa.entitylib.meta.mobs.DonkeyMeta;
|
||||
import me.tofaa.entitylib.meta.mobs.cuboid.MagmaCubeMeta;
|
||||
import me.tofaa.entitylib.meta.mobs.cuboid.SlimeMeta;
|
||||
import me.tofaa.entitylib.meta.mobs.horse.*;
|
||||
import me.tofaa.entitylib.meta.mobs.tameable.CatMeta;
|
||||
import me.tofaa.entitylib.meta.mobs.tameable.ParrotMeta;
|
||||
import me.tofaa.entitylib.meta.mobs.tameable.WolfMeta;
|
||||
import me.tofaa.entitylib.meta.projectile.SmallFireballMeta;
|
||||
import me.tofaa.entitylib.meta.projectile.ThrownEggMeta;
|
||||
import me.tofaa.entitylib.meta.projectile.ThrownExpBottleMeta;
|
||||
|
@ -44,6 +51,17 @@ final class MetaConverterRegistry {
|
|||
put(FROG, FrogMeta::new);
|
||||
put(GOAT, GoatMeta::new);
|
||||
put(HOGLIN, HoglinMeta::new);
|
||||
put(CAT, CatMeta::new);
|
||||
put(PARROT, ParrotMeta::new);
|
||||
put(WOLF, WolfMeta::new);
|
||||
put(DONKEY, DonkeyMeta::new);
|
||||
put(HORSE, HorseMeta::new);
|
||||
put(LLAMA, LlamaMeta::new);
|
||||
put(MULE, MuleMeta::new);
|
||||
put(SKELETON_HORSE, SkeletonHorseMeta::new);
|
||||
put(ZOMBIE_HORSE, ZombieHorseMeta::new);
|
||||
put(SLIME, SlimeMeta::new);
|
||||
put(MAGMA_CUBE, MagmaCubeMeta::new);
|
||||
}
|
||||
|
||||
private void put(EntityType entityType, BiFunction<Integer, Metadata, EntityMeta> function) {
|
||||
|
|
25
src/main/java/me/tofaa/entitylib/meta/mobs/GhastMeta.java
Normal file
25
src/main/java/me/tofaa/entitylib/meta/mobs/GhastMeta.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package me.tofaa.entitylib.meta.mobs;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.MobMeta;
|
||||
|
||||
public class GhastMeta extends MobMeta {
|
||||
|
||||
public static final byte OFFSET = MobMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 1;
|
||||
|
||||
public GhastMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
|
||||
public boolean isAttacking() {
|
||||
return super.metadata.getIndex(OFFSET, false);
|
||||
}
|
||||
|
||||
public void setAttacking(boolean value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value);
|
||||
}
|
||||
|
||||
}
|
24
src/main/java/me/tofaa/entitylib/meta/mobs/PhantomMeta.java
Normal file
24
src/main/java/me/tofaa/entitylib/meta/mobs/PhantomMeta.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
package me.tofaa.entitylib.meta.mobs;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.MobMeta;
|
||||
|
||||
public class PhantomMeta extends MobMeta {
|
||||
|
||||
public static final byte OFFSET = MobMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 1;
|
||||
|
||||
public PhantomMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return super.metadata.getIndex(OFFSET, 0);
|
||||
}
|
||||
|
||||
public void setSize(int value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package me.tofaa.entitylib.meta.mobs.cuboid;
|
||||
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
|
||||
public class MagmaCubeMeta extends SlimeMeta {
|
||||
|
||||
public static final byte OFFSET = SlimeMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 0;
|
||||
|
||||
public MagmaCubeMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package me.tofaa.entitylib.meta.mobs.cuboid;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.MobMeta;
|
||||
|
||||
public class SlimeMeta extends MobMeta {
|
||||
public static final byte OFFSET = MobMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 1;
|
||||
|
||||
public SlimeMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return super.metadata.getIndex(OFFSET, 0);
|
||||
}
|
||||
|
||||
public void setSize(int value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.MobMeta;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
public abstract class BaseHorseMeta extends MobMeta {
|
||||
|
||||
public static final byte OFFSET = MobMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 2;
|
||||
|
||||
private final static byte TAMED_BIT = 0x02;
|
||||
private final static byte SADDLED_BIT = 0x04;
|
||||
private final static byte HAS_BRED_BIT = 0x08;
|
||||
private final static byte EATING_BIT = 0x10;
|
||||
private final static byte REARING_BIT = 0x20;
|
||||
private final static byte MOUTH_OPEN_BIT = 0x40;
|
||||
|
||||
protected BaseHorseMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public boolean isTamed() {
|
||||
return getMaskBit(OFFSET, TAMED_BIT);
|
||||
}
|
||||
|
||||
public void setTamed(boolean value) {
|
||||
setMaskBit(OFFSET, TAMED_BIT, value);
|
||||
}
|
||||
|
||||
public boolean isSaddled() {
|
||||
return getMaskBit(OFFSET, SADDLED_BIT);
|
||||
}
|
||||
|
||||
public void setSaddled(boolean value) {
|
||||
setMaskBit(OFFSET, SADDLED_BIT, value);
|
||||
}
|
||||
|
||||
public boolean isHasBred() {
|
||||
return getMaskBit(OFFSET, HAS_BRED_BIT);
|
||||
}
|
||||
|
||||
public void setHasBred(boolean value) {
|
||||
setMaskBit(OFFSET, HAS_BRED_BIT, value);
|
||||
}
|
||||
|
||||
public boolean isEating() {
|
||||
return getMaskBit(OFFSET, EATING_BIT);
|
||||
}
|
||||
|
||||
public void setEating(boolean value) {
|
||||
setMaskBit(OFFSET, EATING_BIT, value);
|
||||
}
|
||||
|
||||
public boolean isRearing() {
|
||||
return getMaskBit(OFFSET, REARING_BIT);
|
||||
}
|
||||
|
||||
public void setRearing(boolean value) {
|
||||
setMaskBit(OFFSET, REARING_BIT, value);
|
||||
}
|
||||
|
||||
public boolean isMouthOpen() {
|
||||
return getMaskBit(OFFSET, MOUTH_OPEN_BIT);
|
||||
}
|
||||
|
||||
public void setMouthOpen(boolean value) {
|
||||
setMaskBit(OFFSET, MOUTH_OPEN_BIT, value);
|
||||
}
|
||||
|
||||
public Optional<UUID> getOwner() {
|
||||
return super.metadata.getIndex(offset(OFFSET, 1), Optional.empty());
|
||||
}
|
||||
|
||||
public void setOwner(UUID value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.OPTIONAL_UUID, Optional.of(value));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
|
||||
public class ChestedHorseMeta extends BaseHorseMeta {
|
||||
|
||||
public static final byte OFFSET = BaseHorseMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 1;
|
||||
|
||||
public ChestedHorseMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public boolean isHasChest() {
|
||||
return super.metadata.getIndex(OFFSET, false);
|
||||
}
|
||||
|
||||
public void setHasChest(boolean value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.MobMeta;
|
||||
|
||||
public class DonkeyMeta extends ChestedHorseMeta{
|
||||
|
||||
public static final byte OFFSET = MobMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 0;
|
||||
|
||||
public DonkeyMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class HorseMeta extends BaseHorseMeta {
|
||||
|
||||
public static final byte OFFSET = BaseHorseMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 1;
|
||||
|
||||
public HorseMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public Variant getVariant() {
|
||||
return getVariantFromID(super.metadata.getIndex(OFFSET, 0));
|
||||
}
|
||||
|
||||
public void setVariant(Variant variant) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.INT, getVariantID(variant.marking, variant.color));
|
||||
}
|
||||
|
||||
public static int getVariantID(@NotNull Marking marking, @NotNull Color color) {
|
||||
return (marking.ordinal() << 8) + color.ordinal();
|
||||
}
|
||||
|
||||
public static Variant getVariantFromID(int variantID) {
|
||||
return new Variant(
|
||||
Marking.VALUES[variantID >> 8],
|
||||
Color.VALUES[variantID & 0xFF]
|
||||
);
|
||||
}
|
||||
|
||||
public static class Variant {
|
||||
|
||||
private Marking marking;
|
||||
private Color color;
|
||||
|
||||
public Variant(@NotNull Marking marking, @NotNull Color color) {
|
||||
this.marking = marking;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Marking getMarking() {
|
||||
return this.marking;
|
||||
}
|
||||
|
||||
public void setMarking(@NotNull Marking marking) {
|
||||
this.marking = marking;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Color getColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setColor(@NotNull Color color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public enum Marking {
|
||||
NONE,
|
||||
WHITE,
|
||||
WHITE_FIELD,
|
||||
WHITE_DOTS,
|
||||
BLACK_DOTS;
|
||||
|
||||
private final static Marking[] VALUES = values();
|
||||
}
|
||||
|
||||
public enum Color {
|
||||
WHITE,
|
||||
CREAMY,
|
||||
CHESTNUT,
|
||||
BROWN,
|
||||
BLACK,
|
||||
GRAY,
|
||||
DARK_BROWN;
|
||||
|
||||
private final static Color[] VALUES = values();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
|
||||
public class LlamaMeta extends ChestedHorseMeta{
|
||||
|
||||
public static final byte OFFSET = ChestedHorseMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 3;
|
||||
|
||||
public LlamaMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public int getStrength() {
|
||||
return super.metadata.getIndex(OFFSET, 0);
|
||||
}
|
||||
|
||||
public void setStrength(int value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value);
|
||||
}
|
||||
|
||||
public int getCarpetColor() {
|
||||
return super.metadata.getIndex(offset(OFFSET, 1), -1);
|
||||
}
|
||||
|
||||
public void setCarpetColor(int value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value);
|
||||
}
|
||||
|
||||
public Variant getVariant() {
|
||||
return Variant.VALUES[super.metadata.getIndex(offset(OFFSET, 2), 0)];
|
||||
}
|
||||
|
||||
public void setVariant(Variant value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.INT, value.ordinal());
|
||||
}
|
||||
|
||||
public enum Variant {
|
||||
CREAMY,
|
||||
WHITE,
|
||||
BROWN,
|
||||
GRAY;
|
||||
|
||||
private final static Variant[] VALUES = values();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
|
||||
public class MuleMeta extends ChestedHorseMeta{
|
||||
|
||||
public static final byte OFFSET = ChestedHorseMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 0;
|
||||
|
||||
public MuleMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
|
||||
public class SkeletonHorseMeta extends BaseHorseMeta {
|
||||
|
||||
public static final byte OFFSET = BaseHorseMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 0;
|
||||
|
||||
public SkeletonHorseMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package me.tofaa.entitylib.meta.mobs.horse;
|
||||
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
|
||||
public class ZombieHorseMeta extends BaseHorseMeta {
|
||||
|
||||
public static final byte OFFSET = BaseHorseMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 0;
|
||||
|
||||
public ZombieHorseMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
}
|
|
@ -1,23 +1,57 @@
|
|||
package me.tofaa.entitylib.meta.mobs.tameable;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
|
||||
import me.tofaa.entitylib.extras.DyeColor;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.TameableMeta;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class CatMeta extends TameableMeta {
|
||||
|
||||
public static final byte OFFSET = TameableMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 4;
|
||||
|
||||
private static final NamedTextColor[] COLORS = new NamedTextColor[] {
|
||||
NamedTextColor.BLACK, NamedTextColor.RED, NamedTextColor.WHITE, NamedTextColor.YELLOW, NamedTextColor.GRAY,
|
||||
NamedTextColor.WHITE,
|
||||
};
|
||||
private static final DyeColor[] COLORS = DyeColor.values();
|
||||
|
||||
public CatMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public CatMeta.Variant getVariant() {
|
||||
return super.metadata.getIndex(OFFSET, Variant.BLACK);
|
||||
}
|
||||
|
||||
public void setVariant(@NotNull CatMeta.Variant value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.CAT_VARIANT, value.ordinal());
|
||||
}
|
||||
|
||||
public boolean isLying() {
|
||||
return super.metadata.getIndex(offset(OFFSET, 1), false);
|
||||
}
|
||||
|
||||
public void setLying(boolean value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value);
|
||||
}
|
||||
|
||||
public boolean isRelaxed() {
|
||||
return super.metadata.getIndex(offset(OFFSET, 2), false);
|
||||
}
|
||||
|
||||
public void setRelaxed(boolean value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value);
|
||||
}
|
||||
|
||||
public @NotNull DyeColor getCollarColor() {
|
||||
return COLORS[super.metadata.getIndex(offset(OFFSET, 3), DyeColor.RED.ordinal())];
|
||||
}
|
||||
|
||||
public void setCollarColor(@NotNull DyeColor value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.INT, value.ordinal());
|
||||
}
|
||||
|
||||
|
||||
public enum Variant {
|
||||
TABBY,
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
package me.tofaa.entitylib.meta.mobs.tameable;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.TameableMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ParrotMeta extends TameableMeta {
|
||||
|
||||
public static final byte OFFSET = TameableMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 1;
|
||||
|
||||
public ParrotMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
isVersionNewer(ServerVersion.V_1_14);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Color getColor() {
|
||||
return Color.VALUES[super.metadata.getIndex(OFFSET, 0)];
|
||||
}
|
||||
|
||||
public void setColor(@NotNull Color value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value.ordinal());
|
||||
}
|
||||
|
||||
public enum Color {
|
||||
RED_BLUE,
|
||||
BLUE,
|
||||
GREEN,
|
||||
YELLOW_BLUE,
|
||||
GREY;
|
||||
|
||||
private final static Color[] VALUES = values();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package me.tofaa.entitylib.meta.mobs.tameable;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
|
||||
import me.tofaa.entitylib.meta.Metadata;
|
||||
import me.tofaa.entitylib.meta.types.TameableMeta;
|
||||
|
||||
public class WolfMeta extends TameableMeta {
|
||||
|
||||
public static final byte OFFSET = TameableMeta.MAX_OFFSET;
|
||||
public static final byte MAX_OFFSET = OFFSET + 3;
|
||||
|
||||
public WolfMeta(int entityId, Metadata metadata) {
|
||||
super(entityId, metadata);
|
||||
}
|
||||
|
||||
public boolean isBegging() {
|
||||
return super.metadata.getIndex(OFFSET, false);
|
||||
}
|
||||
|
||||
public void setBegging(boolean value) {
|
||||
super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value);
|
||||
}
|
||||
|
||||
public int getCollarColor() {
|
||||
return super.metadata.getIndex(offset(OFFSET, 1), 14);
|
||||
}
|
||||
|
||||
public void setCollarColor(int value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value);
|
||||
}
|
||||
|
||||
public int getAngerTime() {
|
||||
return super.metadata.getIndex(offset(OFFSET, 2), 0);
|
||||
}
|
||||
|
||||
public void setAngerTime(int value) {
|
||||
super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.INT, value);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue