...
This commit is contained in:
parent
053a0e038c
commit
8b9e20be2c
|
@ -153,6 +153,8 @@ repositories {
|
|||
maven {
|
||||
url = uri("https://maven.tterrag.com/releases")
|
||||
}
|
||||
|
||||
maven { url 'https://squiddev.cc/maven/' }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
@ -206,6 +208,8 @@ dependencies {
|
|||
compileOnly 'org.projectlombok:lombok:1.18.20'
|
||||
annotationProcessor 'org.projectlombok:lombok:1.18.20'
|
||||
|
||||
implementation fg.deobf("org.squiddev:cc-tweaked-1.19.2:1.101.3")
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
package space.eptaproject.vmodextras;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.mojang.logging.LogUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.*;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
|
@ -22,16 +18,10 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
|||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||
import net.minecraftforge.registries.*;
|
||||
import org.slf4j.Logger;
|
||||
import space.eptaproject.vmodextras.block.CompactBackupBlock;
|
||||
import space.eptaproject.vmodextras.block.CompactBackupBlockEntity;
|
||||
import space.eptaproject.vmodextras.block.TrackBackupBlock;
|
||||
import space.eptaproject.vmodextras.block.TrackBackupBlockEntity;
|
||||
import space.eptaproject.vmodextras.block.*;
|
||||
import space.eptaproject.vmodextras.compact.Compact;
|
||||
import space.eptaproject.vmodextras.util.ModRegistry;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Map;
|
||||
|
||||
@Mod(VmodExtras.MODID)
|
||||
public class VmodExtras {
|
||||
public static final String MODID = "vmodextras";
|
||||
|
@ -42,13 +32,16 @@ public class VmodExtras {
|
|||
public static final RegistryObject<Block> SHIP_VOID_BLOCK;
|
||||
public static final RegistryObject<Block> TRAK_BUK;
|
||||
public static final RegistryObject<Block> COMPACT_BACKUP;
|
||||
public static final RegistryObject<Block> ENTITY_BACKUP;
|
||||
|
||||
public static final RegistryObject<BlockEntityType<TrackBackupBlockEntity>> MY_BLOCK_ENTITY;
|
||||
public static final RegistryObject<BlockEntityType<CompactBackupBlockEntity>> COMPACT_BACKUP_BLOCK_ENTITY;
|
||||
public static final RegistryObject<BlockEntityType<EntityBackupBlockEntity>> ENTITY_BACKUP_BLOCK_ENTITY;
|
||||
|
||||
public static RegistryObject<Item> MY_BLOCK_ITEM;
|
||||
public static RegistryObject<Item> SHIP_VOID_ITEM;
|
||||
public static RegistryObject<Item> COMPACT_BACKUP_ITEM;
|
||||
public static RegistryObject<Item> ENTITY_BACKUP_ITEM;
|
||||
|
||||
|
||||
public static final ModRegistry REGISTRY;
|
||||
|
@ -61,24 +54,28 @@ public class VmodExtras {
|
|||
TRAK_BUK = REGISTRY.BLOCKS.register("track_backup", () -> new TrackBackupBlock(BlockBehaviour.Properties.of().mapColor(MapColor.STONE)));
|
||||
SHIP_VOID_BLOCK = REGISTRY.BLOCKS.register("ship_void", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.STONE)));
|
||||
COMPACT_BACKUP = REGISTRY.BLOCKS.register("compact_backup", () -> new CompactBackupBlock(BlockBehaviour.Properties.of().mapColor(MapColor.STONE)));
|
||||
ENTITY_BACKUP = REGISTRY.BLOCKS.register("entity_backup", () -> new EntityBackupBlock(BlockBehaviour.Properties.of().mapColor(MapColor.STONE)));
|
||||
|
||||
MY_BLOCK_ENTITY = REGISTRY.BLOCK_ENTITIES.register("track_backup", () -> BlockEntityType.Builder.of(TrackBackupBlockEntity::new, TRAK_BUK.get()).build(null));
|
||||
COMPACT_BACKUP_BLOCK_ENTITY = REGISTRY.BLOCK_ENTITIES.register("compact_backup", () -> BlockEntityType.Builder.of(CompactBackupBlockEntity::new, COMPACT_BACKUP.get()).build(null));
|
||||
ENTITY_BACKUP_BLOCK_ENTITY = REGISTRY.BLOCK_ENTITIES.register("entity_backup", () -> BlockEntityType.Builder.of(EntityBackupBlockEntity::new, ENTITY_BACKUP.get()).build(null));
|
||||
|
||||
EXAMPLE_TAB = REGISTRY.TabBuilder()
|
||||
.push((registry) -> {
|
||||
MY_BLOCK_ITEM = registry.register("track_backup", () -> new BlockItem(TRAK_BUK.get(), new Item.Properties()));
|
||||
MY_BLOCK_ITEM = registry.register("track_backup", () -> new BlockItem(TRAK_BUK.get(), new Item.Properties().rarity(Rarity.EPIC)));
|
||||
SHIP_VOID_ITEM = registry.register("ship_void", () -> new BlockItem(SHIP_VOID_BLOCK.get(), new Item.Properties()));
|
||||
COMPACT_BACKUP_ITEM = registry.register("compact_backup", () -> new BlockItem(COMPACT_BACKUP.get(), new Item.Properties()));
|
||||
COMPACT_BACKUP_ITEM = registry.register("compact_backup", () -> new BlockItem(COMPACT_BACKUP.get(), new Item.Properties().rarity(Rarity.EPIC)));
|
||||
ENTITY_BACKUP_ITEM = registry.register("entity_backup", () -> new BlockItem(ENTITY_BACKUP.get(), new Item.Properties().rarity(Rarity.EPIC)));
|
||||
})
|
||||
.build("vmodetras", Items.BEDROCK.getDefaultInstance());
|
||||
|
||||
new Compact();
|
||||
}
|
||||
|
||||
public VmodExtras() {
|
||||
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
|
||||
|
||||
modEventBus.addListener(this::commonSetup);
|
||||
|
||||
REGISTRY.register(modEventBus);
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
|
|
|
@ -5,12 +5,11 @@ import edn.stratodonut.trackwork.tracks.forces.PhysicsTrackController;
|
|||
import edn.stratodonut.trackwork.tracks.forces.SimpleWheelController;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.Tag;
|
||||
import net.minecraft.world.level.block.Rotation;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
import org.joml.Vector3d;
|
||||
import org.joml.Vector3dc;
|
||||
import org.valkyrienskies.core.api.ships.ServerShip;
|
||||
import org.valkyrienskies.mod.common.VSGameUtilsKt;
|
||||
import space.eptaproject.vmodextras.trackwork.IPhysicsTrackController;
|
||||
|
@ -32,46 +31,25 @@ public class CompactBackupBlockEntity extends BlockEntity {
|
|||
if (ship != null) {
|
||||
{
|
||||
PhysicsTrackController physicsTrackController = ship.getAttachment(PhysicsTrackController.class);
|
||||
IPhysicsTrackController controller = (IPhysicsTrackController) physicsTrackController;
|
||||
if (physicsTrackController != null) {
|
||||
CompoundTag PhysicsTrackControllerTag = new CompoundTag();
|
||||
IPhysicsTrackController controller = (IPhysicsTrackController) physicsTrackController;
|
||||
CompoundTag local = new CompoundTag();
|
||||
|
||||
PhysicsTrackControllerTag.putFloat("SuspensionStiffness", controller.getSuspensionStiffness());
|
||||
{
|
||||
CompoundTag suspensionAdjust = new CompoundTag();
|
||||
controller.encode(local);
|
||||
|
||||
Vector3dc vec = controller.getSuspensionAdjust();
|
||||
|
||||
suspensionAdjust.putDouble("x", vec.x());
|
||||
suspensionAdjust.putDouble("y", vec.y());
|
||||
suspensionAdjust.putDouble("z", vec.z());
|
||||
|
||||
PhysicsTrackControllerTag.put("suspensionAdjust", suspensionAdjust);
|
||||
}
|
||||
|
||||
tag.put("PhysicsTrackController", PhysicsTrackControllerTag);
|
||||
tag.put("PhysicsTrackController", local);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
SimpleWheelController simpleWheelController = ship.getAttachment(SimpleWheelController.class);
|
||||
ISimpleWheelController controller = (ISimpleWheelController) simpleWheelController;
|
||||
if (simpleWheelController != null) {
|
||||
CompoundTag SimpleWheelControllerTag = new CompoundTag();
|
||||
ISimpleWheelController controller = (ISimpleWheelController) simpleWheelController;
|
||||
CompoundTag local = new CompoundTag();
|
||||
|
||||
SimpleWheelControllerTag.putFloat("SuspensionStiffness", controller.getSuspensionStiffness());
|
||||
{
|
||||
CompoundTag suspensionAdjust = new CompoundTag();
|
||||
controller.encode(local);
|
||||
|
||||
Vector3dc vec = controller.getSuspensionAdjust();
|
||||
|
||||
suspensionAdjust.putDouble("x", vec.x());
|
||||
suspensionAdjust.putDouble("y", vec.y());
|
||||
suspensionAdjust.putDouble("z", vec.z());
|
||||
|
||||
SimpleWheelControllerTag.put("suspensionAdjust", suspensionAdjust);
|
||||
}
|
||||
|
||||
tag.put("SimpleWheelController", SimpleWheelControllerTag);
|
||||
tag.put("SimpleWheelController", local);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -98,31 +76,12 @@ public class CompactBackupBlockEntity extends BlockEntity {
|
|||
|
||||
ServerShip ship = (ServerShip) VSGameUtilsKt.getShipObjectManagingPos(this.level, getBlockPos());
|
||||
if (ship != null) {
|
||||
if (tag.contains("SimpleWheelController")) {
|
||||
CompoundTag L = tag.getCompound("SimpleWheelController");
|
||||
SimpleWheelController controller2 = SimpleWheelController.getOrCreate(ship);
|
||||
if (L.contains("SuspensionStiffness")) {
|
||||
((ISimpleWheelController) controller2).setSuspensionStiffness(L.getFloat("SuspensionStiffness"));
|
||||
}
|
||||
if (L.contains("suspensionAdjust")) {
|
||||
CompoundTag suspensionAdjust = L.getCompound("suspensionAdjust");
|
||||
|
||||
((ISimpleWheelController) controller2).setSuspensionAdjust(new Vector3d(new Vector3d(suspensionAdjust.getDouble("x"), suspensionAdjust.getDouble("y"), suspensionAdjust.getDouble("z"))));
|
||||
}
|
||||
if (tag.contains("SimpleWheelController", Tag.TAG_COMPOUND)) {
|
||||
((ISimpleWheelController) SimpleWheelController.getOrCreate(ship)).decode(tag.getCompound("SimpleWheelController"));
|
||||
}
|
||||
|
||||
if (tag.contains("PhysicsTrackController")) {
|
||||
CompoundTag L = tag.getCompound("PhysicsTrackController");
|
||||
PhysicsTrackController controller = PhysicsTrackController.getOrCreate(ship);
|
||||
if (L.contains("SuspensionStiffness")) {
|
||||
((IPhysicsTrackController) controller).setSuspensionStiffness(L.getFloat("SuspensionStiffness"));
|
||||
}
|
||||
if (L.contains("suspensionAdjust")) {
|
||||
CompoundTag suspensionAdjust = L.getCompound("suspensionAdjust");
|
||||
|
||||
|
||||
((IPhysicsTrackController) controller).setSuspensionAdjust(new Vector3d(suspensionAdjust.getDouble("x"), suspensionAdjust.getDouble("y"), suspensionAdjust.getDouble("z")));
|
||||
}
|
||||
if (tag.contains("PhysicsTrackController", Tag.TAG_COMPOUND)) {
|
||||
((IPhysicsTrackController) PhysicsTrackController.getOrCreate(ship)).decode(tag.getCompound("PhysicsTrackController"));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
package space.eptaproject.vmodextras.block;
|
||||
|
||||
import com.simibubi.create.foundation.block.IBE;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import space.eptaproject.vmodextras.VmodExtras;
|
||||
|
||||
public class EntityBackupBlock extends Block implements IBE<EntityBackupBlockEntity> {
|
||||
public EntityBackupBlock(BlockBehaviour.Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockEntityType<? extends EntityBackupBlockEntity> getBlockEntityType() {
|
||||
return VmodExtras.ENTITY_BACKUP_BLOCK_ENTITY.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<EntityBackupBlockEntity> getBlockEntityClass() {
|
||||
return EntityBackupBlockEntity.class;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package space.eptaproject.vmodextras.block;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.valkyrienskies.core.api.ships.ServerShip;
|
||||
import org.valkyrienskies.mod.common.VSGameUtilsKt;
|
||||
import space.eptaproject.vmodextras.VmodExtras;
|
||||
|
||||
|
||||
public class EntityBackupBlockEntity extends BlockEntity {
|
||||
public EntityBackupBlockEntity(BlockPos p_155229_, BlockState p_155230_) {
|
||||
super(VmodExtras.ENTITY_BACKUP_BLOCK_ENTITY.get(), p_155229_, p_155230_);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(CompoundTag tag) {
|
||||
super.load(tag);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveAdditional(CompoundTag tag) {
|
||||
super.saveAdditional(tag);
|
||||
ServerShip ship = (ServerShip) VSGameUtilsKt.getShipManagingPos(this.level, this.getBlockPos());
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package space.eptaproject.vmodextras.compact;
|
||||
|
||||
import net.minecraft.world.item.CreativeModeTab;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraftforge.registries.RegistryObject;
|
||||
import space.eptaproject.vmodextras.VmodExtras;
|
||||
import space.eptaproject.vmodextras.compact.computercraft.ComputerCraftCompact;
|
||||
import space.eptaproject.vmodextras.util.ModRegistry;
|
||||
|
||||
public class Compact {
|
||||
public static RegistryObject<CreativeModeTab> COMPACT_TAB;
|
||||
|
||||
public Compact() {
|
||||
ModRegistry REGISTRY = VmodExtras.REGISTRY;
|
||||
ModRegistry.TabBuilder builder = REGISTRY.TabBuilder();
|
||||
new ComputerCraftCompact(REGISTRY, builder);
|
||||
COMPACT_TAB = builder.build("compact", Items.PAPER.getDefaultInstance());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package space.eptaproject.vmodextras.compact.computercraft;
|
||||
|
||||
import net.minecraft.world.item.BlockItem;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.Rarity;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.material.MapColor;
|
||||
import net.minecraftforge.registries.RegistryObject;
|
||||
import space.eptaproject.vmodextras.util.ModRegistry;
|
||||
|
||||
public class ComputerCraftCompact {
|
||||
public static RegistryObject<BlockEntityType<TrackWorkControllerEntity>> TRACK_WORK_CONTROLLER_BLOCK_ENTITY;
|
||||
|
||||
|
||||
public static RegistryObject<Block> TRACK_WORK_CONTROLLER_BLOCK;
|
||||
|
||||
public static RegistryObject<Item> TRACK_WORK_CONTROLLER_ITEM;
|
||||
|
||||
|
||||
public ComputerCraftCompact(ModRegistry REGISTRY, ModRegistry.TabBuilder builder) {
|
||||
TRACK_WORK_CONTROLLER_BLOCK = REGISTRY.BLOCKS.register("track_work_controller", () -> new TrackWorkController(BlockBehaviour.Properties.of().mapColor(MapColor.STONE)));
|
||||
TRACK_WORK_CONTROLLER_BLOCK_ENTITY = REGISTRY.BLOCK_ENTITIES.register("track_work_controller", () -> BlockEntityType.Builder.of(TrackWorkControllerEntity::new, TRACK_WORK_CONTROLLER_BLOCK.get()).build(null));
|
||||
|
||||
builder.push((registry) -> {
|
||||
TRACK_WORK_CONTROLLER_ITEM = registry.register("track_work_controller", () -> new BlockItem(TRACK_WORK_CONTROLLER_BLOCK.get(), new Item.Properties().rarity(Rarity.EPIC)));
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package space.eptaproject.vmodextras.compact.computercraft;
|
||||
|
||||
import com.simibubi.create.foundation.block.IBE;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
|
||||
public class TrackWorkController extends Block implements IBE<TrackWorkControllerEntity> {
|
||||
public TrackWorkController(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public BlockEntityType<? extends TrackWorkControllerEntity> getBlockEntityType() {
|
||||
return ComputerCraftCompact.TRACK_WORK_CONTROLLER_BLOCK_ENTITY.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<TrackWorkControllerEntity> getBlockEntityClass() {
|
||||
return TrackWorkControllerEntity.class;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package space.eptaproject.vmodextras.compact.computercraft;
|
||||
|
||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL;
|
||||
|
||||
public class TrackWorkControllerEntity extends BlockEntity {
|
||||
public TrackWorkControllerEntity(BlockPos p_155229_, BlockState p_155230_) {
|
||||
super(ComputerCraftCompact.TRACK_WORK_CONTROLLER_BLOCK_ENTITY.get(), p_155229_, p_155230_);
|
||||
}
|
||||
|
||||
protected TrackWorkControllerPeripheral peripheral = new TrackWorkControllerPeripheral(this);
|
||||
private LazyOptional<IPeripheral> peripheralCap;
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, Direction direction) {
|
||||
if (cap == CAPABILITY_PERIPHERAL) {
|
||||
if (peripheralCap == null) {
|
||||
peripheralCap = LazyOptional.of(() -> peripheral);
|
||||
}
|
||||
return peripheralCap.cast();
|
||||
}
|
||||
return super.getCapability(cap, direction);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
package space.eptaproject.vmodextras.compact.computercraft;
|
||||
|
||||
import dan200.computercraft.api.lua.IArguments;
|
||||
import dan200.computercraft.api.lua.LuaException;
|
||||
import dan200.computercraft.api.lua.LuaFunction;
|
||||
import dan200.computercraft.api.peripheral.IComputerAccess;
|
||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||
import edn.stratodonut.trackwork.tracks.forces.SimpleWheelController;
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.joml.Vector3d;
|
||||
import org.joml.Vector3dc;
|
||||
import org.valkyrienskies.core.api.ships.ServerShip;
|
||||
import org.valkyrienskies.mod.common.VSGameUtilsKt;
|
||||
import space.eptaproject.vmodextras.trackwork.ISimpleWheelController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
@AllArgsConstructor
|
||||
public class TrackWorkControllerPeripheral implements IPeripheral {
|
||||
private final List<IComputerAccess> connectedComputers = new ObjectArrayList<>();
|
||||
|
||||
private TrackWorkControllerEntity entity;
|
||||
|
||||
@Override
|
||||
public @Nonnull String getType() {
|
||||
return "track_work_controller";
|
||||
}
|
||||
|
||||
public boolean equals(IPeripheral iPeripheral) {
|
||||
return this == iPeripheral;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detach(@Nullable IComputerAccess computer) {
|
||||
connectedComputers.remove(computer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void attach(@Nonnull IComputerAccess computer) {
|
||||
connectedComputers.add(computer);
|
||||
}
|
||||
|
||||
@LuaFunction
|
||||
public final void SetSuspensionAdjust(IArguments arguments) throws LuaException {
|
||||
Vector3dc vec = new Vector3d(arguments.getDouble(0),arguments.getDouble(1),arguments.getDouble(2));
|
||||
|
||||
ServerShip ship = (ServerShip) VSGameUtilsKt.getShipObjectManagingPos(this.entity.getLevel(), this.entity.getBlockPos());
|
||||
if (ship != null) {
|
||||
((ISimpleWheelController) SimpleWheelController.getOrCreate(ship)).setSuspensionAdjust(vec);
|
||||
}
|
||||
}
|
||||
|
||||
@LuaFunction
|
||||
public final void GetSuspensionAdjust(IArguments arguments) throws LuaException {
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue