Compare commits

..

No commits in common. "1.20" and "urgent-bugfix-1.1" have entirely different histories.

197 changed files with 2364 additions and 3425 deletions

1
.gitignore vendored
View file

@ -21,4 +21,3 @@ build
# other
eclipse
run
/.idea/

69
Common/build.gradle Normal file
View file

@ -0,0 +1,69 @@
plugins {
id 'java'
id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT'
id 'maven-publish'
}
archivesBaseName = "${mod_name}-common-${minecraft_version}"
minecraft {
version(minecraft_version)
runs {
if (project.hasProperty('common_runs_enabled') ? project.findProperty('common_runs_enabled').toBoolean() : true) {
server(project.hasProperty('common_server_run_name') ? project.findProperty('common_server_run_name') : 'vanilla_server') {
workingDirectory(this.file("run"))
}
client(project.hasProperty('common_client_run_name') ? project.findProperty('common_client_run_name') : 'vanilla_client') {
workingDirectory(this.file("run"))
}
}
}
}
repositories {
maven {
url "https://cursemaven.com"
content {
includeGroup "curse.maven"
}
}
}
dependencies {
compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5'
implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1'
// CC: R and TARDIM
//implementation("curse.maven:cc-restitched-462672:3908334")
//compileOnly("org.squiddev:cc-tweaked-1.19.1:${cc_version}")
//compileOnly("curse.maven:tardim-531315:4453925")
//implementation ("org.squiddev:cc-tweaked-1.19.1:${cc_version}")
}
processResources {
def buildProps = project.properties.clone()
filesMatching(['pack.mcmeta']) {
expand buildProps
}
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId project.group
artifactId project.archivesBaseName
version project.version
from components.java
}
}
repositories {
maven {
url "file://" + System.getenv("local_maven")
}
}
}

View file

@ -1,4 +1,4 @@
package su.a71.tardim_ic;
package su.a71.tardim_ic.tardim_ic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View file

@ -1,4 +1,4 @@
package su.a71.tardim_ic.utils;
package su.a71.tardim_ic.tardim_ic.utils;
import com.mojang.authlib.GameProfile;
import net.minecraft.core.BlockPos;
@ -7,18 +7,14 @@ import net.minecraft.world.level.Level;
import java.util.UUID;
/**
* This class is used whenever we need a player for a function but cannot get one
* (i.g we are on server side and need to execute TARDIM command)
*/
public class FakePlayer extends Player {
public FakePlayer(Level lvl, BlockPos blockPos) {
super(lvl, blockPos, 0, new GameProfile(UUID.randomUUID(), "FakePlayer_tardimic"));
super(lvl, blockPos, 0, new GameProfile(UUID.randomUUID(), "FakePlayer_tardimic"), null);
}
public FakePlayer(Level lvl, BlockPos blockPos, UUID id) {
super(lvl, blockPos, 0, new GameProfile(id, "FakePlayer_tardimic"));
super(lvl, blockPos, 0, new GameProfile(id, "FakePlayer_tardimic"), null);
}
@ -32,3 +28,5 @@ public class FakePlayer extends Player {
return false;
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "tardim_ic:block/tardim_dock"
}
}
}

View file

@ -2,9 +2,7 @@
"block.tardim_ic.digital_tardim_interface": "Digital TARDIM Interface",
"block.tardim_ic.redstone_tardim_input": "Redstone TARDIM Input",
"block.tardim_ic.tardim_dock": "TARDIM Dock",
"block.tardim_ic.food_machine": "TARDIM food machine",
"itemGroup.tardim_ic": "TARDIM: In Control",
"itemGroup.minecraft.tardim_ic": "TARDIM: In Control",
"subtitles.tardim_ic.cloister": "Cloister bell rings",
"display_source.fuel_level": "TARDIM fuel level"
"subtitles.tardim_ic.cloister": "Cloister bell rings"
}

View file

@ -0,0 +1,8 @@
{
"block.tardim_ic.digital_tardim_interface": "Digital TARDIM Interface",
"block.tardim_ic.redstone_tardim_input": "Redstone TARDIM Input",
"block.tardim_ic.tardim_dock": "TARDIM Dock",
"itemGroup.tardim_ic": "TARDIM: In Control",
"itemGroup.minecraft.tardim_ic": "TARDIM: In Control",
"subtitles.tardim_ic.cloister": "Cloister bell rings"
}

View file

@ -2,9 +2,7 @@
"block.tardim_ic.digital_tardim_interface": "Цифровой интерфейс TARDIM",
"block.tardim_ic.redstone_tardim_input": "Редстоуновый ввод TARDIM",
"block.tardim_ic.tardim_dock": "Стыковочная станция для TARDIM",
"block.tardim_ic.food_machine": "Раздатчик еды",
"itemGroup.tardim_ic": "TARDIM: In Control",
"itemGroup.minecraft.tardim_ic": "TARDIM: In Control",
"subtitles.tardim_ic.cloister": "Звон монастырского колокола",
"display_source.fuel_level": "Уровень топлива в TARDIM"
"subtitles.tardim_ic.cloister": "Звон монастырского колокола"
}

View file

@ -1,5 +1,5 @@
{
"credit": "Made with Blockbench",
"credit": "Made by karoter2 with Blockbench",
"parent": "digital_tardim_interface",
"texture_size": [64, 64],
"textures": {

View file

@ -1,5 +1,5 @@
{
"credit": "Made with Blockbench",
"credit": "Made by karoter2 with Blockbench",
"parent": "block/cube_all",
"ambientocclusion": false,
"textures": {

View file

@ -1,9 +1,9 @@
{
"credit": "Made by karoter2 (Feulim)",
"credit": "Made by karoter2 with Blockbench",
"texture_size": [64, 64],
"textures": {
"1": "tardim_ic:block/tardim_dock",
"particle": "tardim_ic:block/tardim_dock"
"1": "tardim_ic:blocks/tardim_dock",
"particle": "tardim_ic:blocks/tardim_dock"
},
"elements": [
{

View file

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

View file

@ -0,0 +1,6 @@
{
"pack": {
"description": "TARDIM: In Control resources",
"pack_format": 6
}
}

73
Fabric/build.gradle Normal file
View file

@ -0,0 +1,73 @@
plugins {
id 'fabric-loom' version '0.12-SNAPSHOT'
id 'maven-publish'
id 'idea'
}
archivesBaseName = "${mod_name}-fabric-${minecraft_version}"
dependencies {
minecraft "com.mojang:minecraft:${minecraft_version}"
mappings loom.officialMojangMappings()
modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}"
implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1'
implementation project(":Common")
// Blame CC: Restitched for this...
modApi 'com.electronwill.night-config:core:3.6.3'
modApi 'com.electronwill.night-config:toml:3.6.3'
modApi 'org.squiddev:Cobalt:0.5.5'
modImplementation "io.netty:netty-codec-http:4.1.77.Final"
modImplementation "curse.maven:tardim-531315:4453924"
modImplementation "curse.maven:cc-restitched-462672:3908334"
}
loom {
runs {
client {
client()
setConfigName("Fabric Client")
ideConfigGenerated(true)
runDir("run")
}
server {
server()
setConfigName("Fabric Server")
ideConfigGenerated(true)
runDir("run")
}
}
}
processResources {
from project(":Common").sourceSets.main.resources
inputs.property "version", project.version
filesMatching("fabric.mod.json") {
expand "version": project.version
}
}
tasks.withType(JavaCompile) {
source(project(":Common").sourceSets.main.allSource)
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId project.group
artifactId project.archivesBaseName
version project.version
from components.java
}
}
repositories {
maven {
url "file://" + System.getenv("local_maven")
}
}
}

View file

@ -0,0 +1,111 @@
package su.a71.tardim_ic.tardim_ic;
import com.swdteam.tardim.common.block.BlockTardimDoors;
import com.swdteam.tardim.common.block.BlockTardimFloor;
import com.swdteam.tardim.common.block.BlockTardimRoof;
import com.swdteam.tardim.common.init.TardimRegistry;
import com.swdteam.tardim.tileentity.TileEntityTardim;
import dan200.computercraft.api.ComputerCraftAPI;
import com.mojang.datafixers.types.Type;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.datafix.fixes.References;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.core.Registry;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceBlock;
import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfacePeripheralProvider;
import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceTileEntity;
import su.a71.tardim_ic.tardim_ic.redstone_input.RedstoneInputBlock;
import su.a71.tardim_ic.tardim_ic.redstone_input.RedstoneInputTileEntity;
import su.a71.tardim_ic.tardim_ic.Constants;
import su.a71.tardim_ic.tardim_ic.registration.CommandInit;
import su.a71.tardim_ic.tardim_ic.soviet_chronobox.SovietChronoboxTileEntity;
public class Registration {
// Blocks
public static Block DOOR_SOVIET_CHRONOBOX;
public static Block ROOF_SOVIET_CHRONOBOX;
public static Block FLOOR_SOVIET_CHRONOBOX;
public static BlockEntityType<TileEntityTardim> TILE_SOVIET_CHRONOBOX;
public static final Block DIGITAL_TARDIM_INTERFACE = new DigitalInterfaceBlock();
public static final Block REDSTONE_TARDIM_INPUT = new RedstoneInputBlock();
// Tile Entities
public static final BlockEntityType<RedstoneInputTileEntity> REDSTONE_TARDIM_INPUT_TILEENTITY = Registry.register(
Registry.BLOCK_ENTITY_TYPE,
new ResourceLocation("tardim_ic", "redstone_tardim_input"),
FabricBlockEntityTypeBuilder.create(RedstoneInputTileEntity::new, REDSTONE_TARDIM_INPUT).build()
);
public static final BlockEntityType<DigitalInterfaceTileEntity> DIGITAL_TARDIM_INTERFACE_TILEENTITY = Registry.register(
Registry.BLOCK_ENTITY_TYPE,
new ResourceLocation("tardim_ic", "digital_tardim_interface"),
FabricBlockEntityTypeBuilder.create(DigitalInterfaceTileEntity::new, DIGITAL_TARDIM_INTERFACE).build()
);
private static final CreativeModeTab TARDIM_IC_TAB = FabricItemGroupBuilder
.create(new ResourceLocation("tardim_ic"))
.icon(() -> new ItemStack(DIGITAL_TARDIM_INTERFACE))
.build();
// Cloister bell
public static final ResourceLocation CLOISTER_SOUND = new ResourceLocation("tardim_ic:cloister");
public static SoundEvent CLOISTER_SOUND_EVENT = new SoundEvent(CLOISTER_SOUND);
public static TardimRegistry.TardimBuilder TARDIM_TYPE_SOVIET;
private static <T extends BlockEntity> BlockEntityType<T> createTardimTile(String string, FabricBlockEntityTypeBuilder<T> builder) {
Type<?> type = Util.fetchChoiceType(References.BLOCK_ENTITY, string);
return (BlockEntityType)Registry.register(Registry.BLOCK_ENTITY_TYPE, new ResourceLocation(Constants.MOD_ID, string), builder.build(type));
}
// Register our stuff
public static void register() {
Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "redstone_tardim_input"), REDSTONE_TARDIM_INPUT);
Registry.register(Registry.ITEM, new ResourceLocation(Constants.MOD_ID, "redstone_tardim_input"), new BlockItem(REDSTONE_TARDIM_INPUT, new FabricItemSettings().tab(TARDIM_IC_TAB)));
Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "digital_tardim_interface"), DIGITAL_TARDIM_INTERFACE);
Registry.register(Registry.ITEM, new ResourceLocation(Constants.MOD_ID, "digital_tardim_interface"), new BlockItem(DIGITAL_TARDIM_INTERFACE, new FabricItemSettings().tab(TARDIM_IC_TAB)));
Registry.register(Registry.SOUND_EVENT, CLOISTER_SOUND, CLOISTER_SOUND_EVENT);
FLOOR_SOVIET_CHRONOBOX = Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "tardim_floor_soviet"), new BlockTardimFloor(FabricBlockSettings.of(Material.WOOD).sounds(SoundType.WOOD).strength(-1.0F, 3600000.0F).noLootTable().noOcclusion(), new BlockTardimFloor.TardimTileData() {
public BlockEntityType<TileEntityTardim> getType() {
return TILE_SOVIET_CHRONOBOX;
}
public BlockEntityTicker<? super TileEntityTardim> getTicker() {
return TileEntityTardim::serverTick;
}
public BlockEntity createBlockEntity(BlockPos var1, BlockState var2) {
return new SovietChronoboxTileEntity(var1, var2);
}
}));
TILE_SOVIET_CHRONOBOX = createTardimTile("tardim_soviet_chronobox", FabricBlockEntityTypeBuilder.create(SovietChronoboxTileEntity::new, new Block[]{FLOOR_SOVIET_CHRONOBOX}));
DOOR_SOVIET_CHRONOBOX = Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "tardim_door_soviet"), new BlockTardimDoors(FabricBlockSettings.of(Material.WOOD).sounds(SoundType.WOOD).strength(-1.0F, 3600000.0F).noLootTable().noOcclusion()));
ROOF_SOVIET_CHRONOBOX = Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "tardim_roof_soviet"), new BlockTardimRoof(FabricBlockSettings.of(Material.WOOD).sounds(SoundType.WOOD).strength(-1.0F, 3600000.0F).noLootTable().noOcclusion()));
TARDIM_TYPE_SOVIET = new TardimRegistry.TardimBuilder(new ResourceLocation(Constants.MOD_ID, "tardim_soviet_chronobox"), "TARDIM Soviet Chronobox", ROOF_SOVIET_CHRONOBOX, DOOR_SOVIET_CHRONOBOX, FLOOR_SOVIET_CHRONOBOX);
ComputerCraftAPI.registerPeripheralProvider(new DigitalInterfacePeripheralProvider());
CommandInit.init();
}
}

View file

@ -1,10 +1,9 @@
package su.a71.tardim_ic;
package su.a71.tardim_ic.tardim_ic;
import net.fabricmc.api.ModInitializer;
import su.a71.tardim_ic.tardim_ic.registration.Registration;
public class TardimInControl implements ModInitializer {
@Override
public void onInitialize() {
Registration.register();

View file

@ -1,4 +1,4 @@
package su.a71.tardim_ic.command;
package su.a71.tardim_ic.tardim_ic.command;
import com.swdteam.tardim.common.command.tardim.CommandTardimBase;
import com.swdteam.tardim.common.command.tardim.ICommand;
@ -9,12 +9,9 @@ import net.minecraft.core.BlockPos;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import su.a71.tardim_ic.tardim_ic.registration.Registration;
import su.a71.tardim_ic.tardim_ic.Registration;
/*
This command transmits the cloister bell sound in a big enough radius that you could hear it in any reasonably sized interior.
*/
public class CommandCloisterBell implements ICommand {
@Override
public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
@ -23,12 +20,12 @@ public class CommandCloisterBell implements ICommand {
if (data != null) {
if (data.hasPermission(player)) {
try {
Level lvl = player.level();
Level lvl = player.getLevel();
if (!lvl.isClientSide) {
lvl.playSound(
null,
pos,
Registration.CLOISTER_BELL,
Registration.CLOISTER_SOUND_EVENT,
SoundSource.BLOCKS,
1.5f,
1f

View file

@ -1,4 +1,4 @@
package su.a71.tardim_ic.command;
package su.a71.tardim_ic.tardim_ic.command;
// This will be added whenever I manage to convince TARDIM devs to make CommandManager.register public
// 13.04.23 ITS ALIVE
@ -14,11 +14,6 @@ import dan200.computercraft.api.network.Packet;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
/*
This command sends out a ComputerCraft modem signal
This could be useful for connecting advanced navigation systems into "vanilla" controls
You can specify both channels, message and even make the message go across dimensions
*/
public class CommandModemTransmit implements ICommand {
@Override
public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
@ -38,10 +33,10 @@ public class CommandModemTransmit implements ICommand {
if (allDimensions)
{
ComputerCraftAPI.getWirelessNetwork(player.getServer()).transmitInterdimensional(new Packet(sendChannel, replyChannel, message, new CommandSender(player, data.getTravelLocation().getPos())));
ComputerCraftAPI.getWirelessNetwork().transmitInterdimensional(new Packet(sendChannel, replyChannel, message, new CommandSender(player, data.getTravelLocation().getPos())));
}
else {
ComputerCraftAPI.getWirelessNetwork(player.getServer()).transmitSameDimension(new Packet(sendChannel, replyChannel, message,
ComputerCraftAPI.getWirelessNetwork().transmitSameDimension(new Packet(sendChannel, replyChannel, message,
new CommandSender(player, data.getTravelLocation().getPos())), 300);
}
CommandTardimBase.sendResponse(player, "Sent modem message", CommandTardimBase.ResponseType.COMPLETE, source);

View file

@ -1,13 +1,13 @@
package su.a71.tardim_ic.command;
package su.a71.tardim_ic.tardim_ic.command;
import dan200.computercraft.api.network.PacketSender;
import dan200.computercraft.api.network.IPacketSender;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class CommandSender implements PacketSender {
public class CommandSender implements IPacketSender {
private final Player player;
private final Level level;
@ -15,7 +15,7 @@ public class CommandSender implements PacketSender {
CommandSender(Player player, BlockPos pos) {
this.player = player;
this.level = player.level();
this.level = player.level;
this.pos = pos;
}

View file

@ -0,0 +1,26 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import org.jetbrains.annotations.NotNull;
import su.a71.tardim_ic.tardim_ic.Registration;
import javax.annotation.Nullable;
public class DigitalInterfaceBlock extends Block implements EntityBlock {
public DigitalInterfaceBlock() {
super(Properties.of(Material.METAL).strength(2, 4).noOcclusion());
}
@Nullable
@Override
public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
return Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.create(pos, state);
}
}

View file

@ -0,0 +1,862 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.mojang.datafixers.util.Pair;
import com.swdteam.tardim.common.command.tardim.CommandTardimBase;
import com.swdteam.tardim.common.command.tardim.CommandTravel;
import com.swdteam.tardim.common.data.DimensionMapReloadListener;
import com.swdteam.tardim.common.init.TRDSounds;
import com.swdteam.tardim.common.init.TardimRegistry;
import com.swdteam.tardim.common.item.ItemTardim;
import com.swdteam.tardim.main.Tardim;
import com.swdteam.tardim.tardim.TardimData;
import com.swdteam.tardim.tardim.TardimData.Location;
import com.swdteam.tardim.tardim.TardimManager;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.ObjectLuaTable;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.PlayerList;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.Vec3;
import su.a71.tardim_ic.tardim_ic.Registration;
import su.a71.tardim_ic.tardim_ic.utils.FakePlayer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
public class DigitalInterfacePeripheral implements IPeripheral {
private final List<IComputerAccess> connectedComputers = new ArrayList<>(); // List of computers connected to the peripheral
private final IDigitalInterfaceEntity tileEntity; // Peripheral's BlockEntity, used for accessing coordinates
/**
* @param tileEntity the tile entity of this peripheral
* @hidden
*/
public DigitalInterfacePeripheral(IDigitalInterfaceEntity tileEntity) {
this.tileEntity = tileEntity;
}
/** Setting name for the peripheral. A computer will see it as "digital_tardim_interface_n"
* @hidden
*/
@Nonnull
@Override
public String getType() { return "digital_tardim_interface"; }
/** Apparently CC uses this to check if the peripheral in front of a modem is this one
* @hidden
* @param iPeripheral The peripheral to compare against. This may be {@code null}.
* @return {@code true} if the peripheral is the same as this one.
*/
@Override
public boolean equals(@Nullable IPeripheral iPeripheral) { return this == iPeripheral; }
/** Called when a computer disconnects from the peripheral
* @hidden
* @param computer The interface to the computer that is being detached. Remember that multiple computers can be
* attached to a peripheral at once.
*/
@Override
public void detach(@Nonnull IComputerAccess computer) { connectedComputers.remove(computer); }
/** Called when a computer connects to the peripheral
* @hidden
* @param computer The interface to the computer that is being attached. Remember that multiple computers can be
* attached to a peripheral at once.
*/
@Override
public void attach(@Nonnull IComputerAccess computer) { connectedComputers.add(computer); }
/**
* I *think* I use this to get peripheral's world position
* @hidden
* @return
*/
public IDigitalInterfaceEntity getTileEntity() {
return tileEntity;
}
/**
* Get TARDIM's data, which we need for *every* function
* <p>
* We can't do a simple
* <code>TardimManager.getFromPos(getTileEntity().getPos())</code>
* <p>
* because if someone attempts to call a method outside a TARDIM, this would create a new TARDIM/Point to the one with ID of 0 (Due to the way TardimSaveHandler.loadTardisData works).
* Which is obviously not what we want.
* <p>
* So instead we use this, and get the ability to give user a LuaException if they think that fiddling with time is funny
* This is mostly a copy of getIDForXZ function with some added checks
*
* @return TardimData of the TARDIM that the peripheral is in
* @hidden
*/
public TardimData getTardimDataInitial() {
int X = getTileEntity().getPos().getX(), Z = getTileEntity().getPos().getZ();
int index = 0;
int x = 0;
int y = 0;
int dx = 0;
int dy = 1;
int segment_length = 1;
int segment_passed = 0;
boolean found = false;
long timecheck = System.currentTimeMillis();
while(true) {
if (System.currentTimeMillis() - timecheck > 10000L) {
System.out.println("Finding ID from XZ Coordinates is taking too long!");
break;
}
if (X >= x * TardimManager.INTERIOR_BOUNDS
&& X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS
&& Z >= y * TardimManager.INTERIOR_BOUNDS
&& Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) {
found = true;
break;
}
x += dx;
y += dy;
if (++segment_passed == segment_length) {
segment_passed = 0;
int buffer = dy;
dy = -dx;
dx = buffer;
if (buffer == 0) {
++segment_length;
}
}
++index;
}
// We really don't want to access a ghost TARDIM, do we?
// If we fail checks here are not inside a TARDIM
if (!found) {
return null;
}
TardimData T = TardimManager.getTardim(index);
if (T.getCurrentLocation() == null || T.getOwnerName() == null) {
return null;
}
return T;
}
public TardimData getTardimData() throws LuaException {
TardimData data = this.getTileEntity().getTardim();
if (data == null || data.getCurrentLocation() == null || data.getOwnerName() == null) {
throw new LuaException("Peripheral is not inside a TARDIM");
}
return data;
}
// Peripheral methods ===============================================================
/**
* Return how much fuel is left in the TARDIM
*
* @return Fuel left (Out of 100)
*/
@LuaFunction(mainThread = true)
public final double getFuel() throws LuaException {
return getTardimData().getFuel();
}
/**
* Get how much fuel it would take to travel to the destination
* @return Amount of fuel needed (Out of 100)
*/
@LuaFunction(mainThread = true)
public final double calculateFuelForJourney() throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) return 0;
Location curr = data.getCurrentLocation();
Location dest = data.getTravelLocation();
double fuel = 0.0;
if (curr.getLevel() != dest.getLevel())
{
fuel = 10.0;
}
Vec3 posA = new Vec3(curr.getPos().getX(), curr.getPos().getY(), curr.getPos().getZ());
Vec3 posB = new Vec3(dest.getPos().getX(), dest.getPos().getY(), dest.getPos().getZ());
fuel += posA.distanceTo(posB) / 100.0;
if (fuel > 100.0) fuel = 100.0;
return fuel;
}
/**
* Check whether the TARDIM is locked
* @return true if locked, false if not
*/
@LuaFunction(mainThread = true)
public final boolean isLocked() throws LuaException {
return getTardimData().isLocked();
}
/**
* Check whether the TARDIM is in flight
* @return true if in flight, false if not
*/
@LuaFunction(mainThread = true)
public final boolean isInFlight() throws LuaException { return getTardimData().isInFlight(); }
/**
* Supposedly gets UNIX timestamp of when we entered flight
* @return UNIX timestamp if in flight, -1 if not
*/
@LuaFunction(mainThread = true)
public final long getTimeEnteredFlight() throws LuaException {
TardimData data = getTardimData();
if (!data.isInFlight()) {
return -1;
}
return data.getTimeEnteredFlight();
}
/**
* Get username of the TARDIM's owner
* @return String of the owner's username
*/
@LuaFunction(mainThread = true)
public final String getOwnerName() throws LuaException {
TardimData data = getTardimData();
return data.getOwnerName();
}
/**
* Lock/unlock the TARDIM
* @param locked true to lock, false to unlock
*/
@LuaFunction(mainThread = true)
public final void setLocked(boolean locked) throws LuaException {
getTardimData().setLocked(locked);
}
/**
* Get the current location of the TARDIM
* @return ObjectLuaTable of the current location with the following keys:
* <ul>
* <li>dimension - String of the dimension</li>
* <li>pos - table with the keys x, y, z that hold numbers</li>
* <li>facing - String of the facing</li>
* </ul>
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getCurrentLocation() throws LuaException {
Location loc = getTardimData().getCurrentLocation();
return new ObjectLuaTable(Map.of(
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
));
}
/**
* Get the current location of the TARDIM
* @return if there is no destination returns null.
* <p>
* Otherwise, ObjectLuaTable of the current location with the following keys:
* <ul>
* <li>dimension - String of the dimension</li>
* <li>pos - table with the keys x, y, z that hold numbers</li>
* <li>facing - String of the facing</li>
* </ul>
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getTravelLocation() throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) {
data.setTravelLocation(data.getCurrentLocation());
}
Location loc = data.getTravelLocation();
return new ObjectLuaTable(Map.of(
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
));
}
/**
* Get list of the TARDIM owner's companions
* @return ObjectLuaTable containing the usernames of the companions
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getCompanions() throws LuaException {
TardimData data = getTardimData();
Map<Integer, String> companions = new HashMap<>();
for (int i = 0; i < data.getCompanions().size(); i++) {
companions.put(i + 1, data.getCompanions().get(i).getUsername());
}
return new ObjectLuaTable(companions);
}
/**
* CommandTravel.isValidPath is for some reason private on Fabric so we reverse engineer it :/
* SWDteam pls fix
* @hidden
*/
private static boolean isValidPathTemp(String s) {
for(int i = 0; i < s.length(); ++i) {
if (!CommandTravel.validPathChar(s.charAt(i))) {
return false;
}
}
return true;
}
/**
* Set dimension for the TARDIM to travel to
* <p>
* This is a serious hazard right now due to the fact that I am unable to check if the dimension is valid.
* <p>
* TODO: If invalid dimension is given, the TARDIM is unable to land until the dimension is changed. Add proper checks.
* @param dimension String of the dimension e.g. "minecraft:overworld"
*/
@LuaFunction(mainThread = true)
public final void setDimension(String dimension) throws LuaException {
TardimData data = getTardimData();
String key = dimension;
dimension = DimensionMapReloadListener.toTitleCase(dimension);
if (TardimManager.DIMENSION_MAP.containsKey(dimension)) {
key = (String)TardimManager.DIMENSION_MAP.get(dimension);
} else {
dimension = dimension.toLowerCase();
}
if (!isValidPathTemp(key)) {
throw new LuaException("Invalid dimension");
} else {
ResourceKey<Level> dim = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(dimension));
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
data.getTravelLocation().setLocation(dim);
}
}
/**
* Set the destination's coordinates
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
*/
@LuaFunction(mainThread = true)
public final void setTravelLocation(int x, int y, int z) throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
data.getTravelLocation().setPosition(x, y, z);
}
/**
* Set destination to the TARDIM's owner's home (Must be online)
*/
@LuaFunction(mainThread = true)
public final void home() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
TardimData data = getTardimData();
UUID uuid = data.getOwner();
String username = data.getOwnerName();
if (uuid == null || username == null) {
throw new LuaException("TARDIM has no owner");
}
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
ServerPlayer player = playerList.getPlayer(uuid);
if (player == null) {
throw new LuaException("TARDIM owner is not online");
}
ResourceKey<Level> dim = player.getRespawnDimension();
BlockPos pos = player.getRespawnPosition();
if (pos == null) {
throw new LuaException("TARDIM owner has no home");
}
setDimension(dim.location().toString());
setTravelLocation(pos.getX(), pos.getY(), pos.getZ());
}
/**
* Set destination for a player's location (Player must be online)
* @param username - String of the username of the player
*/
@LuaFunction(mainThread = true)
public final void locatePlayer(String username) throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
ServerPlayer player = playerList.getPlayerByName(username);
if (player == null) {
throw new LuaException("Player not found");
}
ResourceKey<Level> dim = player.getCommandSenderWorld().dimension();
BlockPos pos = player.blockPosition();
setDimension(dim.location().toString());
setTravelLocation(pos.getX(), pos.getY(), pos.getZ());
}
/**
* Get online players. Useful for making a GUI for the locate function or just a nice dashboard.
*
* @return ObjectLuaTable of the online players
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getOnlinePlayers() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return null;
}
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
Map<Integer, String> players = new HashMap<>();
for (int i = 0; i < playerList.getPlayers().size(); i++) {
players.put(i + 1, playerList.getPlayers().get(i).getGameProfile().getName());
}
return new ObjectLuaTable(players);
}
/**
* Get the rotation of the TARDIM's door
* @return String of the door rotation ("north", "south", "east", "west")
*/
@LuaFunction(mainThread = true)
public final String getDoorRotation() throws LuaException {
TardimData data = getTardimData();
Direction rotation = data.getTravelLocation().getFacing();
switch (rotation) {
case NORTH -> {
return "north";
}
case EAST -> {
return "east";
}
case SOUTH -> {
return "south";
}
case WEST -> {
return "west";
}
default -> {
throw new LuaException("Invalid door rotation");
}
}
}
/**
* Set the rotation of the TARDIM's door
* @param rotation String of the door rotation ("north", "south", "east", "west")
*/
@LuaFunction(mainThread = true)
public final void setDoorRotation(String rotation) throws LuaException {
TardimData data = getTardimData();
switch (rotation) {
case "north" -> data.getTravelLocation().setFacing(Direction.NORTH);
case "east" -> data.getTravelLocation().setFacing(Direction.EAST);
case "south" -> data.getTravelLocation().setFacing(Direction.SOUTH);
case "west" -> data.getTravelLocation().setFacing(Direction.WEST);
default -> throw new LuaException("Invalid door rotation");
}
data.save();
}
/**
* Toggle the rotation of the TARDIM's door (north -> east -> south -> west -> north)
*/
@LuaFunction(mainThread = true)
public final void toggleDoorRotation() throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
if (data.getTravelLocation().getFacing() == null) {
data.getTravelLocation().setFacing(Direction.NORTH);
}
switch (data.getTravelLocation().getFacing()) {
case NORTH -> data.getTravelLocation().setFacing(Direction.EAST);
case EAST -> data.getTravelLocation().setFacing(Direction.SOUTH);
case SOUTH -> data.getTravelLocation().setFacing(Direction.WEST);
case WEST -> data.getTravelLocation().setFacing(Direction.NORTH);
default -> data.getTravelLocation().setFacing(Direction.NORTH);
}
data.save();
}
/**
* Add a number to the destination's coordinates
* @param axis String of the axis ("x", "y", "z")
* @param amount Number to add to the axis
*/
@LuaFunction(mainThread = true)
public final void coordAdd(String axis, int amount) throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
Location location = data.getTravelLocation();
switch (axis) {
case "x" -> location.addPosition(amount, 0, 0);
case "y" -> location.addPosition(0, amount, 0);
case "z" -> location.addPosition(0, 0, amount);
default -> throw new LuaException("Invalid axis");
}
}
/**
* Dematerialize the TARDIM
*/
@LuaFunction(mainThread = true)
public final void demat() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
TardimData data = getTardimData();
if (data.isInFlight()) {
throw new LuaException("TARDIM is already in flight");
}
Location loc = data.getCurrentLocation();
ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(loc.getLevel());
ItemTardim.destroyTardim(level, loc.getPos(), Direction.NORTH);
data.setInFlight(true);
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
// TODO: This is a horrendous way of doing this. Please fix.
String level_str = "tardim:tardis_dimension";
this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_TAKEOFF, SoundSource.AMBIENT, 1.0F, 1.0F);
data.save();
}
/**
* Materialize the TARDIM at the destination
* <p>
* Has a LOT of checks to make sure the TARDIM can materialize, so please implement error handling if you use this.
*/
@LuaFunction(mainThread = true)
public final void remat() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
TardimData data = getTardimData();
if (data.isInFlight()) {
if (data.getTimeEnteredFlight() < System.currentTimeMillis() / 1000L - 10L) {
Location loc = data.getTravelLocation();
ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(loc.getLevel());
double fuel = data.calculateFuelForJourney(
this.tileEntity.getLevel().getServer().getLevel(data.getCurrentLocation().getLevel()), level, data.getCurrentLocation().getPos(), loc.getPos()
);
if (data.getFuel() >= fuel) {
level.getChunk(loc.getPos());
BlockPos landingPosButBetter = CommandTravel.getLandingPosition(level, loc.getPos());
boolean recalc = false;
for(int jj = 0; jj < 32; ++jj) {
if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
BlockPos pos2 = landingPosButBetter.offset(
level.random.nextInt(10) * (level.random.nextBoolean() ? 1 : -1),
0,
level.random.nextInt(10) * (level.random.nextBoolean() ? 1 : -1)
);
landingPosButBetter = CommandTravel.getLandingPosition(level, pos2);
if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
recalc = true;
break;
}
}
}
if (!recalc) {
for(int jj = 0; jj < 32; ++jj) {
if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
BlockPos pos2 = landingPosButBetter.offset(
level.random.nextInt(30) * (level.random.nextBoolean() ? 1 : -1),
0,
level.random.nextInt(30) * (level.random.nextBoolean() ? 1 : -1)
);
landingPosButBetter = CommandTravel.getLandingPosition(level, pos2);
if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
recalc = true;
break;
}
}
}
}
if (!recalc) {
for(int jj = 0; jj < 32; ++jj) {
if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
BlockPos pos2 = landingPosButBetter.offset(
level.random.nextInt(50) * (level.random.nextBoolean() ? 1 : -1),
0,
level.random.nextInt(50) * (level.random.nextBoolean() ? 1 : -1)
);
landingPosButBetter = CommandTravel.getLandingPosition(level, pos2);
if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
recalc = true;
break;
}
}
}
}
if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
loc.setPosition(landingPosButBetter.getX(), landingPosButBetter.getY(), landingPosButBetter.getZ());
if (Tardim.isPosValid(level, loc.getPos())) {
TardimRegistry.TardimBuilder builder = TardimRegistry.getTardimBuilder(data.getTardimID());
builder.buildTardim(level, loc.getPos(), data.getTravelLocation().getFacing(), data.getId());
data.setCurrentLocation(data.getTravelLocation());
data.setTravelLocation(null);
data.setInFlight(false);
data.addFuel(-fuel);
data.save();
// if (!recalc) {
// sendResponse(player, "TARDIM is landing", CommandTardimBase.ResponseType.COMPLETE, source);
// } else {
// sendResponse(player, "Landing recalculated due to obstruction", CommandTardimBase.ResponseType.INFO, source);
// sendResponse(player, "TARDIM is landing", CommandTardimBase.ResponseType.COMPLETE, source);
// }
String level_str = "tardim:tardis_dimension";
this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_LANDING, SoundSource.AMBIENT, 1.0F, 1.0F);
} else {
throw new LuaException("TARDIM landing obstructed. Aborting...");
}
} else {
throw new LuaException("TARDIM landing obstructed. Aborting...");
}
} else {
throw new LuaException("Not enough fuel for journey");
}
} else {
throw new LuaException("TARDIM is still taking off");
}
} else {
throw new LuaException("TARDIM has already landed");
}
}
/**
* Locate a biome
* @param biome_str String of the biome e.g. "minecraft:plains"
*/
@LuaFunction(mainThread = true)
public final void locateBiome(String biome_str) throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
TardimData data = getTardimData();
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
Optional<Biome> biome = this.tileEntity.getLevel().getServer()
.registryAccess()
.registryOrThrow(Registry.BIOME_REGISTRY)
.getOptional(new ResourceLocation(biome_str));
if (biome != null && biome.isPresent()) {
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(data.getTravelLocation().getLevel());
BlockPos blockpos = new BlockPos(
data.getTravelLocation().getPos().getX(),
level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, data.getTravelLocation().getPos()).getY(),
data.getTravelLocation().getPos().getZ()
);
BlockPos blockpos1 = this.findNearestBiome(level, (Biome)biome.get(), blockpos, 6400, 8);
if (blockpos1 != null) {
data.getTravelLocation().setPosition(blockpos1.getX(), blockpos1.getY(), blockpos1.getZ());
data.save();
} else {
throw new LuaException("Biome not found");
}
} else {
throw new LuaException("Unknown biome");
}
}
/**
* Helper method to find a biome
* @param level ServerLevel to search
* @param biome Biome to find
* @param pos BlockPos to start from
* @param i Idk what this is, likely a radius
* @param j No idea about this either
* @return BlockPos of the biome
* @hidden
*/
public BlockPos findNearestBiome(ServerLevel level, Biome biome, BlockPos pos, int i, int j) {
Pair<BlockPos, Holder<Biome>> bb = level.getChunkSource()
.getGenerator()
.getBiomeSource()
.findBiomeHorizontal(
pos.getX(),
pos.getY(),
pos.getZ(),
i,
j,
b_val -> b_val.value() == biome,
level.random,
true,
level.getChunkSource().randomState().sampler()
);
return bb != null && bb.getFirst() != null ? (BlockPos)bb.getFirst() : null;
}
/**
* Set the skin of the TARDIM
* @param skin Skin name to change to
* @hidden
*/
@LuaFunction(mainThread = true)
public final void setSkin(String skin) throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
TardimData data = getTardimData();
ResourceLocation skinToApply = null;
Iterator var13 = TardimRegistry.getRegistry().keySet().iterator();
label39: {
ResourceLocation builder;
TardimRegistry.TardimBuilder b;
do {
if (!var13.hasNext()) {
break label39;
}
builder = (ResourceLocation)var13.next();
b = TardimRegistry.getTardimBuilder(builder);
} while(!b.getDisplayName().equalsIgnoreCase(skin) && !builder.toString().equalsIgnoreCase(skin));
skinToApply = builder;
}
if (skinToApply == null) {
throw new LuaException("Skin '" + skin + "' not found");
}
TardimData.Location loc = data.getCurrentLocation();
ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(loc.getLevel());
data.setIdentifier(skinToApply);
// FakePlayer...
TardimRegistry.getTardimBuilder(skinToApply).changeTardimSkin(data, level, loc.getPos(), loc.getFacing(), new FakePlayer(this.tileEntity.getLevel(), this.tileEntity.getPos()));
}
/**
* Get all available TARDIM skins. Useful for making a GUI skin selection.
*
* @return ObjectLuaTable of the available skins
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getSkins() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return null;
}
Map<Integer, String> skins = new HashMap<>();
Iterator var5 = TardimRegistry.getRegistry().keySet().iterator();
int i = 0;
while(var5.hasNext()) {
ResourceLocation builder = (ResourceLocation)var5.next();
TardimRegistry.TardimBuilder b = TardimRegistry.getTardimBuilder(builder);
skins.put(i + 1, b.getDisplayName());
i++;
}
return new ObjectLuaTable(skins);
}
/**
* Play cloister bell sound.
*/
@LuaFunction(mainThread = true)
public final void cloisterBell() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
try {
Level lvl = this.tileEntity.getLevel();
if (!lvl.isClientSide) {
lvl.playSound(
null,
this.tileEntity.getPos(),
Registration.CLOISTER_SOUND_EVENT,
SoundSource.BLOCKS,
1.5f,
1f
);
}
} catch (Exception var9) {
throw new LuaException("There was an error trying to play the sound");
}
}
}

View file

@ -0,0 +1,22 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class DigitalInterfacePeripheralProvider implements IPeripheralProvider {
@NotNull
@Override
public IPeripheral getPeripheral(@NotNull Level level, @NotNull BlockPos blockPos, @NotNull Direction direction) {
if (level.isClientSide()) return null; // Please...?
if (level.getBlockState(blockPos).getBlock() instanceof DigitalInterfaceBlock) {
return new DigitalInterfacePeripheral(new FakeDigitalInterfaceTileEntity(blockPos, level));
}
return null;
}
}

View file

@ -0,0 +1,96 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.tardim.TardimData;
import com.swdteam.tardim.tardim.TardimManager;
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 su.a71.tardim_ic.tardim_ic.Registration;
public class DigitalInterfaceTileEntity extends BlockEntity {//implements IDigitalInterfaceEntity {
//public TardimData data; // Our TARDIM
public DigitalInterfaceTileEntity(BlockPos pos, BlockState state) {
super(Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY, pos, state);
//this.data = getTardimDataInitial();
}
// public BlockPos getPos() {
// return this.worldPosition;
// }
//
// @Override
// public TardimData getTardim() {
// return null;
// }
// /**
// * The peripheral
// */
// protected DigitalInterfacePeripheral peripheral = new DigitalInterfacePeripheral(this);
// public TardimData getTardimDataInitial() {
// int X = this.getPos().getX(), Z = this.getPos().getZ();
//
// int index = 0;
// int x = 0;
// int y = 0;
// int dx = 0;
// int dy = 1;
// int segment_length = 1;
// int segment_passed = 0;
// boolean found = false;
// long timecheck = System.currentTimeMillis();
//
// while(true) {
// if (System.currentTimeMillis() - timecheck > 10000L) {
// System.out.println("Finding ID from XZ Coordinates is taking too long!");
// break;
// }
//
// if (X >= x * TardimManager.INTERIOR_BOUNDS
// && X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS
// && Z >= y * TardimManager.INTERIOR_BOUNDS
// && Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) {
// found = true;
// break;
// }
//
// x += dx;
// y += dy;
// if (++segment_passed == segment_length) {
// segment_passed = 0;
// int buffer = dy;
// dy = -dx;
// dx = buffer;
// if (buffer == 0) {
// ++segment_length;
// }
// }
//
// ++index;
// }
//
// // We really don't want to access a ghost TARDIM, do we?
// // If we fail checks here are not inside a TARDIM
// if (!found) {
// return null;
// }
// TardimData T = TardimManager.getTardim(index);
// if (T.getCurrentLocation() == null || T.getOwnerName() == null) {
// return null;
// }
//
// return T;
// }
//
// @Override
// public void load(CompoundTag tag) {
// super.load(tag);
// this.data = getTardimDataInitial();
// }
}

View file

@ -1,17 +1,17 @@
package su.a71.tardim_ic.computercraft_compat.entity;
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.tardim.TardimData;
import com.swdteam.tardim.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
public class FakeTardimPeripheralTileEntity implements ITardimPeripheralTileEntity {
public class FakeDigitalInterfaceTileEntity implements IDigitalInterfaceEntity {
public BlockPos blockPos;
public Level level;
public TardimData data; // Our TARDIM
public FakeTardimPeripheralTileEntity(BlockPos in_block, Level in_level) {
FakeDigitalInterfaceTileEntity(BlockPos in_block, Level in_level) {
this.blockPos = in_block;
this.level = in_level;
this.data = getTardimDataInitial();
@ -32,11 +32,6 @@ public class FakeTardimPeripheralTileEntity implements ITardimPeripheralTileEnti
return this.data;
}
@Override
public Block getBlock() {
return this.level.getBlockState(this.blockPos).getBlock();
}
public TardimData getTardimDataInitial() {
int X = this.getPos().getX(), Z = this.getPos().getZ();

View file

@ -0,0 +1,12 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.tardim.TardimData;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
public interface IDigitalInterfaceEntity {
public BlockPos getPos();
public Level getLevel();
public TardimData getTardim();
}

View file

@ -1,4 +1,4 @@
package su.a71.tardim_ic.blocks.redstone_input;
package su.a71.tardim_ic.tardim_ic.redstone_input;
import com.swdteam.tardim.common.block.BlockBaseTardimPanel;
import com.swdteam.tardim.common.init.TRDDimensions;
@ -26,25 +26,24 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.MapColor;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.NotNull;
import su.a71.tardim_ic.tardim_ic.registration.Registration;
import su.a71.tardim_ic.utils.FakePlayer;
import su.a71.tardim_ic.tardim_ic.Registration;
import su.a71.tardim_ic.tardim_ic.utils.FakePlayer;
import javax.annotation.Nullable;
public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBlock {
public RedstoneInputBlock() {
super(FabricBlockSettings.create().strength(2, 4).mapColor(MapColor.TERRACOTTA_ORANGE)); // No occlusion? this.setDefaultState((BlockState)this.getDefaultState().with(ON, false));
super(FabricBlockSettings.of(Material.METAL).strength(2, 4)); // No occlusion?
}
@Nullable
@Override
public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
return Registration.REDSTONE_INPUT_BE.create(pos, state);
return Registration.REDSTONE_TARDIM_INPUT_TILEENTITY.create(pos, state);
}
@Override
@ -54,10 +53,10 @@ public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBl
w.playSound(null, blockPos, TRDSounds.TARDIM_BEEP, SoundSource.BLOCKS, 0.3F, 0.5F);
BlockEntity be = w.getBlockEntity(blockPos);
if (be instanceof RedstoneInputBlockEntity && w.dimension() == TRDDimensions.TARDIS) {
if (be instanceof RedstoneInputTileEntity && w.dimension() == TRDDimensions.TARDIS) {
TardimData data = TardimManager.getFromPos(blockPos);
if (data != null && data.hasPermission(player)) {
((RedstoneInputBlockEntity) be).lastPlayer = player.getGameProfile().getId();
((RedstoneInputTileEntity) be).lastPlayer = player.getGameProfile().getId();
NetworkHandler.sendTo((ServerPlayer)player, new PacketOpenEditGui(blockPos, 1));
return InteractionResult.CONSUME;
}
@ -79,26 +78,25 @@ public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBl
DebugPackets.sendNeighborsUpdatePacket(level, blockPos);
BlockEntity be = level.getBlockEntity(blockPos);
if (!(be instanceof RedstoneInputBlockEntity)) {
if (!(be instanceof RedstoneInputTileEntity)) {
return;
}
// get redstone signal
Direction direction = blockState.getValue(FACING);
int redstoneSignal = level.getSignal(blockPos, direction);
if (redstoneSignal > 0 && !((RedstoneInputBlockEntity) be).isPowered) {
((RedstoneInputBlockEntity) be).isPowered = true;
if (redstoneSignal > 0 && !((RedstoneInputTileEntity) be).isPowered) {
((RedstoneInputTileEntity) be).isPowered = true;
if (level.dimension() == TRDDimensions.TARDIS) {
TardimData data = TardimManager.getFromPos(blockPos);
if (data != null && !level.isClientSide && ((RedstoneInputBlockEntity) be).lastPlayer != null) {
if (data != null && !level.isClientSide && ((RedstoneInputTileEntity) be).lastPlayer != null) {
if (((TileEntityBaseTardimPanel)be).hasCommand()) {
((TileEntityBaseTardimPanel)be).execute(new FakePlayer(level, blockPos, ((RedstoneInputBlockEntity) be).lastPlayer));
((TileEntityBaseTardimPanel)be).execute(new FakePlayer(level, blockPos, ((RedstoneInputTileEntity) be).lastPlayer));
}
}
}
} else if (redstoneSignal == 0 && ((RedstoneInputBlockEntity) be).isPowered) {
((RedstoneInputBlockEntity) be).isPowered = false;
}
} else if (redstoneSignal == 0 && ((RedstoneInputTileEntity) be).isPowered)
((RedstoneInputTileEntity) be).isPowered = false;
}
}
}

View file

@ -1,21 +1,21 @@
package su.a71.tardim_ic.blocks.redstone_input;
package su.a71.tardim_ic.tardim_ic.redstone_input;
import com.swdteam.tardim.tileentity.TileEntityBaseTardimPanel;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.state.BlockState;
import su.a71.tardim_ic.tardim_ic.registration.Registration;
import su.a71.tardim_ic.tardim_ic.Registration;
import java.util.UUID;
public class RedstoneInputBlockEntity extends TileEntityBaseTardimPanel {
public class RedstoneInputTileEntity extends TileEntityBaseTardimPanel {
public boolean isPowered = false;
public UUID lastPlayer = null;
public RedstoneInputBlockEntity(BlockPos pos, BlockState state) {
super(Registration.REDSTONE_INPUT_BE, pos, state);
public RedstoneInputTileEntity(BlockPos pos, BlockState state) {
super(Registration.REDSTONE_TARDIM_INPUT_TILEENTITY, pos, state);
}
public BlockPos getPos() {

View file

@ -1,15 +1,14 @@
package su.a71.tardim_ic.command;
package su.a71.tardim_ic.tardim_ic.registration;
import com.swdteam.tardim.common.init.CommandManager;
import su.a71.tardim_ic.tardim_ic.command.CommandCloisterBell;
import su.a71.tardim_ic.tardim_ic.command.CommandModemTransmit;
public class CommandInit {
public static void init() {
CommandManager.register(new CommandCloisterBell());
CommandManager.register(new CommandListBiomes());
CommandManager.register(new CommandListDimensions());
}
public static void addCC() {
CommandManager.register(new CommandModemTransmit());
CommandManager.register(new CommandCloisterBell());
}
}

View file

@ -1,13 +1,13 @@
package su.a71.tardim_ic.soviet_chronobox;
package su.a71.tardim_ic.tardim_ic.soviet_chronobox;
import com.swdteam.tardim.common.init.TRDTiles;
import com.swdteam.tardim.tileentity.TileEntityTardim;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.state.BlockState;
import su.a71.tardim_ic.tardim_ic.registration.Exteriors;
import su.a71.tardim_ic.tardim_ic.Registration;
public class SovietChronoboxTileEntity extends TileEntityTardim {
public SovietChronoboxTileEntity(BlockPos pos, BlockState state) {
super(Exteriors.TILE_SOVIET_CHRONOBOX, pos, state);
super(Registration.TILE_SOVIET_CHRONOBOX, pos, state);
}
}

View file

@ -0,0 +1,34 @@
{
"schemaVersion": 1,
"id": "tardim_ic",
"version": "${version}",
"name": "Tardim: In Control",
"description": "All of time and space, now automated. Control your TARDIM using ComputerCraft: Tweaked.",
"authors": [
"Andrew_7_1"
],
"contact": {
"sources": "https://github.com/Andrew-71/tardim-in-control"
},
"license": "MIT",
"icon": "icon.png",
"environment": "*",
"entrypoints": {
"main": [
"su.a71.tardim_ic.tardim_ic.TardimInControl"
]
},
"depends": {
"fabricloader": ">=0.14.10",
"fabric": "*",
"minecraft": "1.19.x",
"java": ">=17",
"tardim": ">=1.2.2",
"computercraft": ">=1.101.0"
}
}

View file

@ -1,27 +1,29 @@
plugins {
id 'idea'
id 'maven-publish'
id 'net.neoforged.gradle' version '[6.0.18,6.2)'
id 'org.spongepowered.mixin'
buildscript {
repositories {
maven { url = 'https://maven.minecraftforge.net' }
mavenCentral()
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true
classpath 'org.spongepowered:mixingradle:0.7.+'
}
}
base {
archivesName = "${mod_name}-forge-${minecraft_version}"
}
mixin {
add(sourceSets.main, "${mod_id}.refmap.json")
apply plugin: 'java'
apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
apply plugin: 'org.spongepowered.mixin'
config("${mod_id}.mixins.json")
config("${mod_id}.forge.mixins.json")
}
archivesBaseName = "${mod_name}-forge-${minecraft_version}"
minecraft {
mappings channel: 'official', version: minecraft_version
// Automatically enable forge AccessTransformers if the file exists
// This location is hardcoded in Forge and can not be changed.
// https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123
if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) {
if (project.hasProperty('forge_ats_enabled') && project.findProperty('forge_ats_enabled').toBoolean()) {
// This location is hardcoded in Forge and can not be changed.
// https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
project.logger.debug('Forge Access Transformers are enabled for this project.')
}
runs {
@ -34,7 +36,7 @@ minecraft {
mods {
modClientRun {
source sourceSets.main
source project(":common").sourceSets.main
source project(":Common").sourceSets.main
}
}
}
@ -48,7 +50,7 @@ minecraft {
mods {
modServerRun {
source sourceSets.main
source project(":common").sourceSets.main
source project(":Common").sourceSets.main
}
}
}
@ -63,43 +65,48 @@ minecraft {
mods {
modDataRun {
source sourceSets.main
source project(":common").sourceSets.main
source project(":Common").sourceSets.main
}
}
}
}
}
mixin {
add sourceSets.main, 'refmap.tardim_ic.json'
config 'mixins.tardim_ic.json'
}
sourceSets.main.resources.srcDir 'src/generated/resources'
dependencies {
minecraft "net.neoforged:forge:${minecraft_version}-${neoforged_version}"
compileOnly project(":common")
annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor")
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
compileOnly project(":Common")
implementation fg.deobf("curse.maven:tardim-531315:4453925")
implementation fg.deobf("org.squiddev:cc-tweaked-1.19.1:${cc_version}")
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
}
tasks.withType(JavaCompile).configureEach {
source(project(":common").sourceSets.main.allSource)
}
tasks.withType(Javadoc).configureEach {
source(project(":common").sourceSets.main.allJava)
}
tasks.named("sourcesJar", Jar) {
from(project(":common").sourceSets.main.allSource)
tasks.withType(JavaCompile) {
source(project(":Common").sourceSets.main.allSource)
}
processResources {
from project(":common").sourceSets.main.resources
from project(":Common").sourceSets.main.resources
}
jar.finalizedBy('reobfJar')
publishing {
publications {
mavenJava(MavenPublication) {
artifactId base.archivesName.get()
from components.java
fg.component(it)
groupId project.group
artifactId project.archivesBaseName
version project.version
artifact jar
}
}
repositories {

View file

@ -0,0 +1,65 @@
package su.a71.tardim_ic.tardim_ic;
import com.google.common.collect.Sets;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceBlock;
import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceTileEntity;
import su.a71.tardim_ic.tardim_ic.redstone_input.RedstoneInputBlock;
import su.a71.tardim_ic.tardim_ic.redstone_input.RedstoneInputTileEntity;
import su.a71.tardim_ic.tardim_ic.registration.CommandInit;
import java.util.function.Supplier;
public class Registration {
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, TardimInControl.MODID);
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TardimInControl.MODID);
public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, TardimInControl.MODID);
public static final DeferredRegister<SoundEvent> SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, TardimInControl.MODID);
public static final CreativeModeTab TARDIM_IC_TAB = new CreativeModeTab("tardim_ic") {
@Override
public ItemStack makeIcon() {
return new ItemStack(Registration.DIGITAL_TARDIM_INTERFACE.get());
}
};
// Blocks
private static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) {
RegistryObject<T> registryObject = BLOCKS.register(name, block);
ITEMS.register(name, () -> new BlockItem(registryObject.get(), new Item.Properties().tab(TARDIM_IC_TAB)));
return registryObject;
}
public static final RegistryObject<Block> DIGITAL_TARDIM_INTERFACE = register("digital_tardim_interface", DigitalInterfaceBlock::new);
public static final RegistryObject<Block> REDSTONE_TARDIM_INPUT = register("redstone_tardim_input", RedstoneInputBlock::new);
// Tile Entities
public static final RegistryObject<BlockEntityType<DigitalInterfaceTileEntity>> DIGITAL_TARDIM_INTERFACE_TILEENTITY = Registration.BLOCK_ENTITIES.register("digital_tardim_interface", () -> new BlockEntityType<>(DigitalInterfaceTileEntity::new, Sets.newHashSet(DIGITAL_TARDIM_INTERFACE.get()), null));
public static final RegistryObject<BlockEntityType<RedstoneInputTileEntity>> REDSTONE_TARDIM_INPUT_TILEENTITY = Registration.BLOCK_ENTITIES.register("redstone_tardim_input", () -> new BlockEntityType<>(RedstoneInputTileEntity::new, Sets.newHashSet(REDSTONE_TARDIM_INPUT.get()), null));
// Cloister bell
public static final RegistryObject<SoundEvent> CLOISTER_SOUND = SOUNDS.register("cloister", () -> new SoundEvent(new ResourceLocation(TardimInControl.MODID, "cloister")));
// Register our stuff
public static void register() {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
BLOCKS.register(modEventBus);
ITEMS.register(modEventBus);
BLOCK_ENTITIES.register(modEventBus);
SOUNDS.register(modEventBus);
}
}

View file

@ -1,10 +1,18 @@
package su.a71.tardim_ic;
package su.a71.tardim_ic.tardim_ic;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import su.a71.tardim_ic.tardim_ic.registration.CommandInit;
import com.swdteam.tardim.TardimSaveHandler;
// The value here should match an entry in the META-INF/mods.toml file
@Mod(Constants.MOD_ID)
public class TardimInControl {
// Our mod id
public static final String MODID = Constants.MOD_ID;
public TardimInControl() {
Registration.register();

View file

@ -0,0 +1,59 @@
package su.a71.tardim_ic.tardim_ic.command;
import com.swdteam.common.command.tardim.CommandTardimBase;
import com.swdteam.common.command.tardim.ICommand;
import com.swdteam.tardim.TardimData;
import com.swdteam.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import su.a71.tardim_ic.tardim_ic.Registration;
public class CommandCloisterBell implements ICommand {
@Override
public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
if (args.length == 0) {
TardimData data = TardimManager.getFromPos(pos);
if (data != null) {
if (data.hasPermission(player)) {
try {
Level lvl = player.getLevel();
if (!lvl.isClientSide) {
lvl.playSound(
null,
pos,
Registration.CLOISTER_SOUND.get(),
SoundSource.BLOCKS,
1.5f,
1f
);
}
} catch (Exception var9) {
CommandTardimBase.sendResponse(player, "There was an error", CommandTardimBase.ResponseType.FAIL, source);
}
} else {
CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source);
}
}
} else {
CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source);
}
}
@Override
public String getCommandName() {
return "cloister-bell";
}
@Override
public String getUsage() {
return "/cloister-bell";
}
@Override
public CommandTardimBase.CommandSource allowedSource() {
return CommandTardimBase.CommandSource.BOTH;
}
}

View file

@ -0,0 +1,69 @@
package su.a71.tardim_ic.tardim_ic.command;
// This will be added whenever I manage to convince TARDIM devs to make CommandManager.register public
// 13.04.23 ITS ALIVE
import com.swdteam.common.command.tardim.CommandTardimBase;
import com.swdteam.common.command.tardim.ICommand;
import com.swdteam.tardim.TardimData;
import com.swdteam.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import dan200.computercraft.api.network.Packet;
import dan200.computercraft.api.ComputerCraftAPI;
public class CommandModemTransmit implements ICommand {
@Override
public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
if (args.length == 3) { // TODO: 3 or 4???
TardimData data = TardimManager.getFromPos(pos);
if (data != null) {
if (data.hasPermission(player)) {
try {
int sendChannel = Integer.parseInt(args[0]);
int replyChannel = Integer.parseInt(args[1]);
String message = args[2];
boolean allDimensions = Boolean.parseBoolean(args[3]) || args[3].equals("true");
if (data.getTravelLocation() == null) {
data.setTravelLocation(new TardimData.Location(data.getCurrentLocation()));
}
if (allDimensions)
{
ComputerCraftAPI.getWirelessNetwork().transmitInterdimensional(new Packet(sendChannel, replyChannel, message, new CommandSender(player, data.getTravelLocation().getPos())));
}
else {
ComputerCraftAPI.getWirelessNetwork().transmitSameDimension(new Packet(sendChannel, replyChannel, message,
new CommandSender(player, data.getTravelLocation().getPos())), 300);
}
CommandTardimBase.sendResponse(player, "Sent modem message", CommandTardimBase.ResponseType.COMPLETE, source);
} catch (Exception var9) {
CommandTardimBase.sendResponse(player, "Invalid coordinates", CommandTardimBase.ResponseType.FAIL, source);
}
} else {
CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source);
}
}
} else {
CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source);
}
}
@Override
public String getCommandName() {
return "cc-modem-transmit";
}
@Override
public String getUsage() {
return "/cc-modem-transmit <Chnl> <replyChnl> <msg> <ender: bool>";
}
@Override
public CommandTardimBase.CommandSource allowedSource() {
return CommandTardimBase.CommandSource.BOTH;
}
}

View file

@ -0,0 +1,40 @@
package su.a71.tardim_ic.tardim_ic.command;
import dan200.computercraft.api.network.IPacketSender;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class CommandSender implements IPacketSender {
private final Player player;
private final Level level;
private final BlockPos pos;
CommandSender(Player player, BlockPos pos) {
this.player = player;
this.level = player.level;
this.pos = pos;
}
@NotNull
@Override
public Level getLevel() {
return this.level;
}
@NotNull
@Override
public Vec3 getPosition() {
return new Vec3(this.pos.getX(), this.pos.getY(), this.pos.getZ());
}
@NotNull
@Override
public String getSenderID() {
return this.player.getName().getString();
}
}

View file

@ -1,13 +1,14 @@
package su.a71.tardim_ic.computercraft_compat.digital_interface;
package su.a71.tardim_ic.tardim_ic.digital_interface;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.MapColor;
import net.minecraft.world.level.material.Material;
import org.jetbrains.annotations.NotNull;
import su.a71.tardim_ic.tardim_ic.registration.ComputerCraftCompat;
import su.a71.tardim_ic.tardim_ic.Registration;
import javax.annotation.Nullable;
@ -15,12 +16,12 @@ import javax.annotation.Nullable;
public class DigitalInterfaceBlock extends Block implements EntityBlock {
public DigitalInterfaceBlock() {
super(Properties.of().strength(2, 4).noOcclusion().mapColor(MapColor.METAL));
super(Properties.of(Material.METAL).strength(2, 4).noOcclusion());
}
@Nullable
@Override
public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
return ComputerCraftCompat.DIGITAL_INTERFACE_BE.create(pos, state);
return Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.get().create(pos, state);
}
}

View file

@ -1,24 +1,26 @@
package su.a71.tardim_ic.computercraft_compat.peripherals;
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.common.command.tardim.CommandTravel;
import com.swdteam.tardim.common.init.TRDSounds;
import com.swdteam.tardim.common.init.TardimRegistry;
import com.swdteam.tardim.common.item.ItemTardim;
import com.swdteam.tardim.tardim.TardimData;
import com.swdteam.tardim.tardim.TardimData.Location;
import com.swdteam.tardim.tardim.TardimManager;
import com.mojang.datafixers.util.Pair;
import com.swdteam.common.command.tardim.CommandTardimBase;
import com.swdteam.common.command.tardim.CommandTravel;
import com.swdteam.common.data.DimensionMapReloadListener;
import com.swdteam.common.init.TRDSounds;
import com.swdteam.common.init.TardimRegistry;
import com.swdteam.common.item.ItemTardim;
import com.swdteam.main.Tardim;
import com.swdteam.tardim.TardimData;
import com.swdteam.tardim.TardimData.Location;
import com.swdteam.tardim.TardimManager;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.ObjectLuaTable;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import com.mojang.datafixers.util.Pair;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
@ -26,30 +28,148 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.PlayerList;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.Vec3;
import su.a71.tardim_ic.tardim_ic.Registration;
import su.a71.tardim_ic.tardim_ic.utils.FakePlayer;
import su.a71.tardim_ic.computercraft_compat.digital_interface.DigitalInterfaceBlock;
import su.a71.tardim_ic.computercraft_compat.entity.FakeTardimPeripheralTileEntity;
import su.a71.tardim_ic.tardim_ic.registration.Registration;
import su.a71.tardim_ic.utils.FakePlayer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfaceBlock> implements IPeripheral {
public class DigitalInterfacePeripheral implements IPeripheral {
private final List<IComputerAccess> connectedComputers = new ArrayList<>(); // List of computers connected to the peripheral
private final IDigitalInterfaceEntity tileEntity; // Peripheral's BlockEntity, used for accessing coordinates
/**
* @param tileEntity the tile entity of this peripheral
* @hidden
*/
public DigitalInterfacePeripheral(FakeTardimPeripheralTileEntity tileEntity) {
super(tileEntity, "digital_tardim_interface", (DigitalInterfaceBlock) tileEntity.getBlock());
public DigitalInterfacePeripheral(IDigitalInterfaceEntity tileEntity) {
this.tileEntity = tileEntity;
}
/** Setting name for the peripheral. A computer will see it as "digital_tardim_interface_n"
* @hidden
*/
@Nonnull
@Override
public String getType() { return "digital_tardim_interface"; }
/** Apparently CC uses this to check if the peripheral in front of a modem is this one
* @hidden
* @param iPeripheral The peripheral to compare against. This may be {@code null}.
* @return {@code true} if the peripheral is the same as this one.
*/
@Override
public boolean equals(@Nullable IPeripheral iPeripheral) { return this == iPeripheral; }
/** Called when a computer disconnects from the peripheral
* @hidden
* @param computer The interface to the computer that is being detached. Remember that multiple computers can be
* attached to a peripheral at once.
*/
@Override
public void detach(@Nonnull IComputerAccess computer) { connectedComputers.remove(computer); }
/** Called when a computer connects to the peripheral
* @hidden
* @param computer The interface to the computer that is being attached. Remember that multiple computers can be
* attached to a peripheral at once.
*/
@Override
public void attach(@Nonnull IComputerAccess computer) { connectedComputers.add(computer); }
/**
* I *think* I use this to get peripheral's world position
* @hidden
* @return
*/
public IDigitalInterfaceEntity getTileEntity() {
return tileEntity;
}
/**
* Get TARDIM's data, which we need for *every* function
* <p>
* We can't do a simple
* <code>TardimManager.getFromPos(getTileEntity().getPos())</code>
* <p>
* because if someone attempts to call a method outside a TARDIM, this would create a new TARDIM/Point to the one with ID of 0 (Due to the way TardimSaveHandler.loadTardisData works).
* Which is obviously not what we want.
* <p>
* So instead we use this, and get the ability to give user a LuaException if they think that fiddling with time is funny
* This is mostly a copy of getIDForXZ function with some added checks
*
* @return TardimData of the TARDIM that the peripheral is in
* @hidden
*/
public TardimData getTardimDataInitial() {
int X = getTileEntity().getPos().getX(), Z = getTileEntity().getPos().getZ();
int index = 0;
int x = 0;
int y = 0;
int dx = 0;
int dy = 1;
int segment_length = 1;
int segment_passed = 0;
boolean found = false;
long timecheck = System.currentTimeMillis();
while(true) {
if (System.currentTimeMillis() - timecheck > 10000L) {
System.out.println("Finding ID from XZ Coordinates is taking too long!");
break;
}
if (X >= x * TardimManager.INTERIOR_BOUNDS
&& X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS
&& Z >= y * TardimManager.INTERIOR_BOUNDS
&& Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) {
found = true;
break;
}
x += dx;
y += dy;
if (++segment_passed == segment_length) {
segment_passed = 0;
int buffer = dy;
dy = -dx;
dx = buffer;
if (buffer == 0) {
++segment_length;
}
}
++index;
}
// We really don't want to access a ghost TARDIM, do we?
// If we fail checks here are not inside a TARDIM
if (!found) {
return null;
}
TardimData T = TardimManager.getTardim(index);
if (T.getCurrentLocation() == null || T.getOwnerName() == null) {
return null;
}
return T;
}
public TardimData getTardimData() throws LuaException {
TardimData data = this.getTileEntity().getTardim();
if (data == null || data.getCurrentLocation() == null || data.getOwnerName() == null) {
throw new LuaException("Peripheral is not inside a TARDIM");
}
return data;
}
// Peripheral methods ===============================================================
@ -58,7 +178,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
* Return how much fuel is left in the TARDIM
*
* @return Fuel left (Out of 100)
*/
*/
@LuaFunction(mainThread = true)
public final double getFuel() throws LuaException {
return getTardimData().getFuel();
@ -67,7 +187,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
/**
* Get how much fuel it would take to travel to the destination
* @return Amount of fuel needed (Out of 100)
*/
*/
@LuaFunction(mainThread = true)
public final double calculateFuelForJourney() throws LuaException {
TardimData data = getTardimData();
@ -153,13 +273,13 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
public final ObjectLuaTable getCurrentLocation() throws LuaException {
Location loc = getTardimData().getCurrentLocation();
return new ObjectLuaTable(Map.of(
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
));
}
@ -184,9 +304,9 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
return new ObjectLuaTable(Map.of(
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
));
@ -206,45 +326,6 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
return new ObjectLuaTable(companions);
}
/**
* CommandTravel.isValidPath is for some reason private on Fabric so we reverse engineer it :/
* SWDteam pls fix
* @hidden
*/
private boolean isValidPathTemp(String s) {
for(int i = 0; i < s.length(); ++i) {
if (!CommandTravel.validPathChar(s.charAt(i))) {
return false;
}
}
return true;
}
/**
* DimensionMapReloadListener.toTitleCase is unavailable so we reverse engineer it! :D
* Fabric... pls fix?
* @hidden
*/
private String toTitleCase(String input) {
StringBuilder titleCase = new StringBuilder(input.length());
boolean nextTitleCase = true;
char[] var3 = input.toCharArray();
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
char c = var3[var5];
if (Character.isSpaceChar(c)) {
nextTitleCase = true;
} else if (nextTitleCase) {
c = Character.toTitleCase(c);
nextTitleCase = false;
}
titleCase.append(c);
}
return titleCase.toString();
}
/**
* Set dimension for the TARDIM to travel to
@ -259,17 +340,17 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
TardimData data = getTardimData();
String key = dimension;
dimension = toTitleCase(dimension);
dimension = DimensionMapReloadListener.toTitleCase(dimension);
if (TardimManager.DIMENSION_MAP.containsKey(dimension)) {
key = (String)TardimManager.DIMENSION_MAP.get(dimension);
} else {
dimension = dimension.toLowerCase();
}
if (!isValidPathTemp(key)) {
if (!CommandTravel.isValidPath(key)) {
throw new LuaException("Invalid dimension");
} else {
ResourceKey<Level> dim = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(dimension));
ResourceKey<Level> dim = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(dimension));
if (data.getTravelLocation() == null) {
data.setTravelLocation(new Location(data.getCurrentLocation()));
}
@ -300,7 +381,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
*/
@LuaFunction(mainThread = true)
public final void home() throws LuaException {
if (this.getTileEntity().getLevel().isClientSide()) {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
TardimData data = getTardimData();
@ -311,7 +392,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
throw new LuaException("TARDIM has no owner");
}
PlayerList playerList = this.getTileEntity().getLevel().getServer().getPlayerList();
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
ServerPlayer player = playerList.getPlayer(uuid);
if (player == null) {
throw new LuaException("TARDIM owner is not online");
@ -333,24 +414,17 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
*/
@LuaFunction(mainThread = true)
public final void locatePlayer(String username) throws LuaException {
if (this.getTileEntity().getLevel().isClientSide()) {
if (this.tileEntity.getLevel().isClientSide()) {
return;
}
PlayerList playerList = this.getTileEntity().getLevel().getServer().getPlayerList();
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
ServerPlayer player = playerList.getPlayerByName(username);
if (player == null) {
throw new LuaException("Player not found");
}
// for (ItemStack armour : player.getArmorSlots()) {
//// if (armour.is(PERSONAL_JAMMER)) {
//// throw new LuaException("Player location jammed");
//// };
// // TODO: Re-add
// }
ResourceKey<Level> dim = player.getCommandSenderWorld().dimension();
BlockPos pos = player.blockPosition();
@ -365,11 +439,11 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getOnlinePlayers() throws LuaException {
if (this.getTileEntity().getLevel().isClientSide()) {
if (this.tileEntity.getLevel().isClientSide()) {
return null;
}
PlayerList playerList = this.getTileEntity().getLevel().getServer().getPlayerList();
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
Map<Integer, String> players = new HashMap<>();
for (int i = 0; i < playerList.getPlayers().size(); i++) {
players.put(i + 1, playerList.getPlayers().get(i).getGameProfile().getName());
@ -493,29 +567,11 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
// TODO: This is a horrendous way of doing this. Please fix.
String level_str = "tardim:tardis_dimension";
this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registries.DIMENSION, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_TAKEOFF, SoundSource.AMBIENT, 1.0F, 1.0F);
this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_TAKEOFF.get(), SoundSource.AMBIENT, 1.0F, 1.0F);
data.save();
}
/**
* Way to use function from Tardim (ModInitializer)
* 1WTC pls fix
* @hidden
*/
public static boolean isPosValid(Level level, BlockPos pos) {
return validPos(level, pos) && validPos(level, pos.above()) && validPos(level, pos.above().above()) && validPos(level, pos.north()) && validPos(level, pos.north().above()) && validPos(level, pos.south()) && validPos(level, pos.south().above()) && validPos(level, pos.east()) && validPos(level, pos.east().above()) && validPos(level, pos.west()) && validPos(level, pos.west().above());
}
/**
* @see DigitalInterfacePeripheral#isPosValid(Level, BlockPos)
* @hidden
*/
private static boolean validPos(Level l, BlockPos pos) {
BlockState blockstate = l.getBlockState(pos);
return !blockstate.canBeReplaced() && blockstate.getBlock() != Blocks.SNOW ? blockstate.isAir() : true;
}
/**
* Materialize the TARDIM at the destination
* <p>
@ -592,7 +648,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) {
loc.setPosition(landingPosButBetter.getX(), landingPosButBetter.getY(), landingPosButBetter.getZ());
if (isPosValid(level, loc.getPos())) {
if (Tardim.isPosValid(level, loc.getPos())) {
TardimRegistry.TardimBuilder builder = TardimRegistry.getTardimBuilder(data.getTardimID());
builder.buildTardim(level, loc.getPos(), data.getTravelLocation().getFacing(), data.getId());
data.setCurrentLocation(data.getTravelLocation());
@ -609,7 +665,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
// }
String level_str = "tardim:tardis_dimension";
this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registries.DIMENSION, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_LANDING, SoundSource.AMBIENT, 1.0F, 1.0F);
this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_LANDING.get(), SoundSource.AMBIENT, 1.0F, 1.0F);
} else {
throw new LuaException("TARDIM landing obstructed. Aborting...");
@ -645,7 +701,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
Optional<Biome> biome = this.tileEntity.getLevel().getServer()
.registryAccess()
.registryOrThrow(Registries.BIOME)
.registryOrThrow(Registry.BIOME_REGISTRY)
.getOptional(new ResourceLocation(biome_str));
if (biome != null && biome.isPresent()) {
if (data.getTravelLocation() == null) {
@ -780,7 +836,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
lvl.playSound(
null,
this.tileEntity.getPos(),
Registration.CLOISTER_BELL,
Registration.CLOISTER_SOUND.get(),
SoundSource.BLOCKS,
1.5f,
1f
@ -790,40 +846,4 @@ public class DigitalInterfacePeripheral extends TardimPeripheral<DigitalInterfac
throw new LuaException("There was an error trying to play the sound");
}
}
/**
* Get a table with all registered biomes' names.
* Useful for creating advanced navigation systems.
* @return ObjectLuaTable with all biomes' technical names
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getBiomes() throws LuaException {
Map<Integer, String> biomes = new HashMap<>();
Registry<Biome> biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registries.BIOME);
Iterator<ResourceLocation> biome_it = biomeRegistry.keySet().iterator();
int i = 0;
while (biome_it.hasNext()) {
biomes.put(i + 1, biome_it.next().toString());
i++;
}
return new ObjectLuaTable(biomes);
}
/**
* Get a table with all registered dimensions' names.
* Useful for creating advanced navigation systems.
* @return ObjectLuaTable with all dimensions' technical names
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getDimensions() throws LuaException {
Iterator<ServerLevel> dim_it = this.tileEntity.getLevel().getServer().getAllLevels().iterator(); // TODO: Does this really work?
Map<Integer, String> dimensions = new HashMap<>();
int i = 0;
while (dim_it.hasNext()) {
dimensions.put(i + 1, dim_it.next().dimension().location().toString());
i++;
}
return new ObjectLuaTable(dimensions);
}
}

View file

@ -0,0 +1,118 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.TardimData;
import com.swdteam.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
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 su.a71.tardim_ic.tardim_ic.Registration;
import dan200.computercraft.api.peripheral.IPeripheral;
import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL;
public class DigitalInterfaceTileEntity extends BlockEntity implements IDigitalInterfaceEntity {
public TardimData data; // Our TARDIM
public DigitalInterfaceTileEntity(BlockPos pos, BlockState state) {
super(Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.get(), pos, state);
this.data = getTardimDataInitial();
}
/**
* Our peripheral, we create a new peripheral for each new tile entity
*/
protected DigitalInterfacePeripheral peripheral = new DigitalInterfacePeripheral(this);
private LazyOptional<IPeripheral> peripheralCap;
public BlockPos getPos() {
return this.worldPosition;
}
@Override
public TardimData getTardim() {
return this.data;
}
/**
* When a computer modem tries to wrap our block, the modem will call getCapability to receive our peripheral.
* Then we just simply return a {@link LazyOptional} with our Peripheral
*/
@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);
}
public TardimData getTardimDataInitial() {
int X = this.getPos().getX(), Z = this.getPos().getZ();
int index = 0;
int x = 0;
int y = 0;
int dx = 0;
int dy = 1;
int segment_length = 1;
int segment_passed = 0;
boolean found = false;
long timecheck = System.currentTimeMillis();
while(true) {
if (System.currentTimeMillis() - timecheck > 10000L) {
System.out.println("Finding ID from XZ Coordinates is taking too long!");
break;
}
if (X >= x * TardimManager.INTERIOR_BOUNDS
&& X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS
&& Z >= y * TardimManager.INTERIOR_BOUNDS
&& Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) {
found = true;
break;
}
x += dx;
y += dy;
if (++segment_passed == segment_length) {
segment_passed = 0;
int buffer = dy;
dy = -dx;
dx = buffer;
if (buffer == 0) {
++segment_length;
}
}
++index;
}
// We really don't want to access a ghost TARDIM, do we?
// If we fail checks here are not inside a TARDIM
if (!found) {
return null;
}
TardimData T = TardimManager.getTardim(index);
if (T.getCurrentLocation() == null || T.getOwnerName() == null) {
return null;
}
return T;
}
@Override
public void load(CompoundTag tag) {
super.load(tag);
this.data = getTardimDataInitial();
}
}

View file

@ -0,0 +1,89 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.TardimData;
import com.swdteam.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
public class FakeDigitalInterfaceTileEntity implements IDigitalInterfaceEntity {
public BlockPos blockPos;
public Level level;
public TardimData data; // Our TARDIM
FakeDigitalInterfaceTileEntity(BlockPos in_block, Level in_level) {
this.blockPos = in_block;
this.level = in_level;
this.data = getTardimDataInitial();
}
@Override
public BlockPos getPos() {
return this.blockPos;
}
@Override
public Level getLevel() {
return this.level;
}
@Override
public TardimData getTardim() {
return this.data;
}
public TardimData getTardimDataInitial() {
int X = this.getPos().getX(), Z = this.getPos().getZ();
int index = 0;
int x = 0;
int y = 0;
int dx = 0;
int dy = 1;
int segment_length = 1;
int segment_passed = 0;
boolean found = false;
long timecheck = System.currentTimeMillis();
while(true) {
if (System.currentTimeMillis() - timecheck > 10000L) {
System.out.println("Finding ID from XZ Coordinates is taking too long!");
break;
}
if (X >= x * TardimManager.INTERIOR_BOUNDS
&& X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS
&& Z >= y * TardimManager.INTERIOR_BOUNDS
&& Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) {
found = true;
break;
}
x += dx;
y += dy;
if (++segment_passed == segment_length) {
segment_passed = 0;
int buffer = dy;
dy = -dx;
dx = buffer;
if (buffer == 0) {
++segment_length;
}
}
++index;
}
// We really don't want to access a ghost TARDIM, do we?
// If we fail checks here are not inside a TARDIM
if (!found) {
return null;
}
TardimData T = TardimManager.getTardim(index);
if (T.getCurrentLocation() == null || T.getOwnerName() == null) {
return null;
}
return T;
}
}

View file

@ -0,0 +1,12 @@
package su.a71.tardim_ic.tardim_ic.digital_interface;
import com.swdteam.tardim.TardimData;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
public interface IDigitalInterfaceEntity {
public BlockPos getPos();
public Level getLevel();
public TardimData getTardim();
}

View file

@ -1,22 +1,18 @@
package su.a71.tardim_ic.mixin;
package su.a71.tardim_ic.tardim_ic.mixin;
import com.swdteam.tardim.common.init.CommandManager;
import org.spongepowered.asm.mixin.Mixin;
import com.swdteam.common.init.CommandManager;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import su.a71.tardim_ic.command.CommandInit;
import su.a71.tardim_ic.platform.Services;
import su.a71.tardim_ic.tardim_ic.registration.CommandInit;
// TARDIM loads commands a bit later on Forge, so we have to use mixins for this :/
@Mixin(value = CommandManager.class, remap = false)
public class CommandsMixin {
public abstract class Commands {
@Inject(method="init()V", at=@At("TAIL"))
private static void init(CallbackInfo ci) {
CommandInit.init();
if (Services.PLATFORM.isModLoaded("computercraft")) {
CommandInit.addCC();
}
System.out.println("TARDIM: IC added commands using mixin");
}
}

View file

@ -1,7 +1,6 @@
package su.a71.tardim_ic.tardim_ic.redsone_input;
package su.a71.tardim_ic.tardim_ic.redstone_input;
import com.swdteam.common.block.BlockBaseTardimPanel;
import com.swdteam.common.init.TRDDimensions;
import com.swdteam.common.init.TRDSounds;
import com.swdteam.network.NetworkHandler;
@ -29,16 +28,14 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.common.util.FakePlayerFactory;
import net.minecraftforge.server.ServerLifecycleHooks;
import org.jetbrains.annotations.NotNull;
import su.a71.tardim_ic.tardim_ic.Registration;
import javax.annotation.Nullable;
import su.a71.tardim_ic.tardim_ic.Registration;
import su.a71.tardim_ic.tardim_ic.utils.FakePlayer;
public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBlock {
private boolean isPowered = false;
public RedstoneInputBlock() {
super(Properties.of(Material.METAL).strength(2, 4).noOcclusion());
}
@ -59,6 +56,7 @@ public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBl
if (be instanceof TileEntityBaseTardimPanel && w.dimension() == TRDDimensions.TARDIS) {
TardimData data = TardimManager.getFromPos(blockPos);
if (data != null && data.hasPermission(player)) {
((RedstoneInputTileEntity) be).lastPlayer = player.getGameProfile().getId();
NetworkHandler.sendTo((ServerPlayer)player, new PacketOpenEditGui(1, blockPos));
return InteractionResult.CONSUME;
}
@ -79,22 +77,26 @@ public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBl
public void neighborChanged(BlockState blockState, Level level, BlockPos blockPos, Block block, BlockPos fromPos, boolean isMoving) {
DebugPackets.sendNeighborsUpdatePacket(level, blockPos);
BlockEntity be = level.getBlockEntity(blockPos);
if (!(be instanceof RedstoneInputTileEntity)) {
return;
}
// get redstone signal
Direction direction = blockState.getValue(FACING);
int redstoneSignal = level.getSignal(blockPos, direction);
if (redstoneSignal > 0 && !isPowered) {
isPowered = true;
BlockEntity be = level.getBlockEntity(blockPos);
if (be instanceof TileEntityBaseTardimPanel && level.dimension() == TRDDimensions.TARDIS) {
if (redstoneSignal > 0 && !((RedstoneInputTileEntity) be).isPowered) {
((RedstoneInputTileEntity) be).isPowered = true;
if (level.dimension() == TRDDimensions.TARDIS) {
TardimData data = TardimManager.getFromPos(blockPos);
if (data != null) {
if (data != null && !level.isClientSide && ((RedstoneInputTileEntity) be).lastPlayer != null) {
if (((TileEntityBaseTardimPanel)be).hasCommand()) {
((TileEntityBaseTardimPanel)be).execute(FakePlayerFactory.getMinecraft(ServerLifecycleHooks.getCurrentServer().getLevel(level.dimension())));
((TileEntityBaseTardimPanel)be).execute(new FakePlayer(level, blockPos, ((RedstoneInputTileEntity) be).lastPlayer));
}
}
}
} else if (redstoneSignal == 0 && isPowered)
isPowered = false;
} else if (redstoneSignal == 0 && ((RedstoneInputTileEntity) be).isPowered)
((RedstoneInputTileEntity) be).isPowered = false;
}
}

View file

@ -0,0 +1,41 @@
package su.a71.tardim_ic.tardim_ic.redstone_input;
import com.swdteam.tileentity.TileEntityBaseTardimPanel;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.state.BlockState;
import su.a71.tardim_ic.tardim_ic.Registration;
import java.util.UUID;
public class RedstoneInputTileEntity extends TileEntityBaseTardimPanel {
public boolean isPowered = false;
public UUID lastPlayer = null;
public RedstoneInputTileEntity(BlockPos pos, BlockState state) {
super(Registration.REDSTONE_TARDIM_INPUT_TILEENTITY.get(), pos, state);
}
public BlockPos getPos() {
return this.worldPosition;
}
@Override
public void saveAdditional(CompoundTag tag) {
tag.putBoolean("is_powered", isPowered);
if (lastPlayer != null) {
tag.putUUID("last_player", lastPlayer);
}
super.saveAdditional(tag);
}
@Override
public void load(CompoundTag tag) {
super.load(tag);
isPowered = tag.getBoolean("is_powered");
lastPlayer = tag.getUUID("last_player");
}
}

View file

@ -0,0 +1,13 @@
package su.a71.tardim_ic.tardim_ic.registration;
import su.a71.tardim_ic.tardim_ic.command.CommandModemTransmit;
import su.a71.tardim_ic.tardim_ic.command.CommandCloisterBell;
import com.swdteam.common.init.CommandManager;
public class CommandInit {
public static void init() {
CommandManager.register(new CommandModemTransmit());
CommandManager.register(new CommandCloisterBell());
}
}

View file

@ -0,0 +1,48 @@
modLoader = "javafml" #mandatory
loaderVersion="[43,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
license = "MIT"
[[mods]] #mandatory
# The modid of the mod
modId = "tardim_ic" #mandatory
version = "1.1" #mandatory
# A display name for the mod
displayName = "TARDIM: In Control" #mandatory
# The description text for the mod (multi line!) (#mandatory)
description = '''
All of time and space, now automated. Control your TARDIM using ComputerCraft: Tweaked.
'''
logoFile = "icon.png"
authors = "Andrew_7_1"
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.tardim_ic]] #optional
# the modid of the dependency
modId = "forge" #mandatory
# Does this dependency have to exist - if not, ordering below must be specified
mandatory = true #mandatory
# The version range of the dependency
versionRange="[43,)" #mandatory
# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering = "NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER
side = "BOTH"
# Here's another dependency
[[dependencies.tardim_ic]]
modId = "computercraft"
mandatory = true
versionRange = "1.95.3"
ordering = "NONE"
side = "BOTH"
[[dependencies.tardim_ic]]
modId = "tardim"
mandatory = true
versionRange = "1.2.2"
ordering = "AFTER"
side = "BOTH"
[[dependencies.tardim_ic]]
modId = "minecraft"
mandatory = true
# This version range declares a minimum of the current minecraft version up to but not including the next major version
versionRange = "1.19.2"
ordering = "NONE"
side = "BOTH"

View file

@ -0,0 +1,15 @@
{
"required": true,
"package": "su.a71.tardim_ic.tardim_ic.mixin",
"compatibilityLevel": "JAVA_17",
"refmap": "refmap.tardim_ic.json",
"mixins": [
"Commands"
],
"client": [
],
"injectors": {
"defaultRequire": 1
},
"minVersion": "0.8.4"
}

View file

@ -1,49 +1,43 @@
![TARDIM: IC Banner](https://cdn.modrinth.com/data/xsv4H3pa/images/561e86895ec0b73d8fcbfb8bb83d4cc92b15734d.png)
### All of time and space, *now automated and improved*.
# TARDIM: In Control ![Modrinth Downloads](https://img.shields.io/modrinth/dt/tardim-in-control?color=00AF5C&label=modrinth&style=flat&logo=modrinth)
### All of time and space, *now automated*.
This mod is an addon for the [TARDIM mod](https://www.curseforge.com/minecraft/mc-mods/tardim),
and adds a way to control and manage your time (but mostly space) machine with new blocks, redstone,
and even other mods like [ComputerCraft: Tweaked](https://tweaked.cc) or [Create](https://github.com/Creators-of-Create/Create)
![Example dashboard](https://cdn.modrinth.com/data/xsv4H3pa/images/a6726a966b6ceb6cbfa81d4886b26375ee500854.png)
## Features:
* New commands that let you ring cloister bell or list all biomes and dimensions
* Improved fuel system, which will take in any furnace fuel and won't consume buckets
This mod is an addon for the [TARDIM mod](https://www.curseforge.com/minecraft/mc-mods/tardim), and adds a way to control your time (but mostly space) machine with [ComputerCraft: Tweaked](https://tweaked.cc) computers and redstone using new blocks and peripherals.
### Features:
* Digital TARDIM interface: ComputerCraft peripheral that lets you control a TARDIM using computers! Full list of methods is available in the [Javadoc](http://andrey71.me/TARDIM-ic-docs/su/a71/tardim_ic/tardim_ic/DigitalInterfacePeripheral.html) (Sorry for that, this is the best auto-generated docs I could find for now). The peripheral supports almost all commands that the TARDIM computer panel has.
* Redstone TARDIM Input: New block that lets you execute a TARDIM command with the power of redstone! After saving a command, this block executes it every time it gets powered by redstone
* Full ComputerCraft integration
* Digital TARDIM interface: ComputerCraft peripheral that lets you control a TARDIM using computers! The peripheral supports almost all commands that the TARDIM computer panel has.
* Peripherals for some of the TARDIM blocks that provide a few of digital interface's methods at smaller costs
* New exterior - Soviet Chronobox, styled like a USSR phone booth
* [Coming once Create Fabric is on 1.20] Create integration (display sources): some of the blocks will now be able to act as a display source with Create mod
* [WIP] Food machine - exchange fuel for food. *Currently only in creative mode and half finished.*
* You can see planned features [in the docs](https://tardim.a71.su/planned)
* *This is just the beginning, there are more features to come!*
## Example use-cases
### Example use-cases
* Make a dashboard to monitor fuel levels, current location, and other information on a screen in a nice way.
* Get refined control over your TARDIM, such as saving and loading locations, or setting a destination in a GUI.
* Add visual effects that activate during flight e.g. note blocks or Create mod contraptions.
The possibilities are endless, the only limit is your imagination!
The possibilities are endless, the only limit is your imagination! (And coding skills)
## Documentation
Information about the mod's blocks and integration, crafting recipes, and plans for development are available at https://tardim.a71.su
### Note
Due to nature of the mod **anyone** inside your TARDIM with access to a computer and this mod's peripheral
will be able to run **any** methods. There is no fix that I know of (aside from disabling any commands except "getters" like fuel info), so if you want to use this mod on your server,
please don't let untrustworthy players anywhere near your computer.\
And another thing: the method that sets destination dimension can't check if the dimension is valid. If you cannot land just change dimension to a valid one like overworld or nether.
## FAQ
### FAQ
**Is this for Fabric or Forge?**
: Both! As a Fabric player who recognises Forge's large playerbase, I support both major modloaders.
However, due to nature of development Fabric versions may get released a bit earlier.
**Can I use this in my modpack?**
: Sure, as long as you don't claim the mod as your own. A link to this mod's page would be appreciated too.
**Will there be a 1.20.1 version and beyond?**
: I am in the process of moving to 1.20, with Fabric already out and Forge in progress.
I intend to follow latest versions with TARDIM.
**Will there be a 1.19.3 version and beyond?**
: Right now my focus on 1.19.2, but I will try my best to update to later versions as soon as this mod is fully stable.
**I encountered a bug or have a suggestion. What do I do?**
: If you have a problem or suggestion, the best way to get them to me is through the project's Discord server.
**Do I need to install things like ComputerCraft or Create for this mod?**
: Nope! While I highly suggest you do (because digital interface is in my opinion the star of the show),
you can enjoy a lot of TARDIM: In Control's features with only TARDIM installed.
If you ever decide to add other optional dependencies, the relevant blocks will become available and craftable!
**I don't know ComputerCraft, will this always be a CC-only mod?**
: Ok fine, nobody actually asked that. But in case you did, good news: No! The mod already adds things like Redstone TARDIM Input,
which let you integrate your TARDIM into good old redstone. Going forward,
I plan to add even more ways to control the TARDIM without computers for those who don't want to code their own implementation.

View file

@ -1,15 +1,4 @@
=== HOW MANY PROBLEMS TARDIM HAS?! ===
1. A few log messages definitely left from testing (e.g. aklfjsjsfw)
2. isValidFlightPath is private on Fabric
3. FABRIC AND FORGE HAVE DIFFERENT JAVA IMPORT PATHS
4. [FIXED] Adding custom commands was private for literally 0 reason
5. com.swdteam.tardim.common.data.DimensionMapReloadListener has modid tutorial in
public ResourceLocation getFabricId() {
return new ResourceLocation("tutorial", "tardim_dimension_lookup");
}
5.1 Forge's MANIFEST.MF too!
Andrew71's proposals:
1. Quick-return command
2. add support for far more fuel sources via AbstractFurnaceBlockEntity.getFuel() on top of built-in TARDIM method
3. Unify package names on Forge and Fabric
2. isValidFlightPath is private of Fabric
3. FABRIC AND FORGE HAVE DIFFERENT JAVA IMPORT PATHS

10
TODO
View file

@ -1,10 +0,0 @@
=== TODO ===
Doing every fucking thing over again
* Basics
* Registrate creative mode tab
* Registrate a single block. Any block will do
* Digital Interface for TARDIM
* Block
* Peripheral

View file

@ -1,13 +1,7 @@
plugins {
id 'fabric-loom' version '1.3-SNAPSHOT' apply(false)
id 'net.neoforged.gradle' version '[6.0.18,6.2)' apply(false)
id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' apply(false)
id("org.spongepowered.mixin") version "0.7-SNAPSHOT" apply(false)
}
subprojects {
apply plugin: 'java'
java.toolchain.languageVersion = JavaLanguageVersion.of(17)
java.withSourcesJar()
java.withJavadocJar()
@ -25,7 +19,7 @@ subprojects {
'Implementation-Version' : project.jar.archiveVersion,
'Implementation-Vendor' : mod_author,
'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'Timestamp' : System.currentTimeMillis(),
'Timestamp' : System.currentTimeMillis(),
'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})",
'Built-On-Minecraft' : minecraft_version
])
@ -39,63 +33,34 @@ subprojects {
}
repositories {
mavenCentral()
maven {
name = 'Sponge / Mixin'
url = 'https://repo.spongepowered.org/repository/maven-public/'
}
maven {
name = 'BlameJared Maven (JEI / CraftTweaker / Bookshelf)'
name = 'BlameJared Maven (CrT / Bookshelf)'
url = 'https://maven.blamejared.com'
}
// CC: Tweaked
maven {
url "https://squiddev.cc/maven/"
content {
includeGroup("cc.tweaked")
includeModule("org.squiddev", "Cobalt")
}
}
// Curseforge
repositories {
maven {
url "https://cursemaven.com"
}
}
// Create Fabric 1.20 (Jeez that's a lot of mavens)
// maven {
// name "devOSSnapshots"
// url "https://mvn.devos.one/snapshots"
// }
// maven {
// name "tterrag maven"
// url "https://maven.tterrag.com/"
// }
// maven {
// url "https://maven.jamieswhiteshirt.com/libs-release"
// content {
// includeGroup "com.jamieswhiteshirt"
// }
// }
maven { url 'https://squiddev.cc/maven/' }
maven { url "https://cursemaven.com"}
}
tasks.withType(JavaCompile).configureEach {
it.options.encoding = 'UTF-8'
it.options.getRelease().set(17)
}
processResources {
filesMatching(['pack.mcmeta', 'fabric.mod.json', 'mods.toml', '*.mixins.json']) {
expand project.properties
}
it.options.release = 17
}
// Disables Gradle's custom module metadata from being published to maven. The
// metadata includes mapped dependencies which are not reasonably consumable by
// other mod developers.
tasks.withType(GenerateModuleMetadata).configureEach {
tasks.withType(GenerateModuleMetadata) {
enabled = false
}
}
}

View file

@ -1,39 +0,0 @@
plugins {
id 'idea'
id 'java'
id 'maven-publish'
id 'org.spongepowered.gradle.vanilla'
}
base {
archivesName = "${mod_name}-common-${minecraft_version}"
}
minecraft {
version(minecraft_version)
if(file("src/main/resources/${mod_id}.accesswidener").exists()){
accessWideners(file("src/main/resources/${mod_id}.accesswidener"))
}
}
dependencies {
compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5'
implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1'
// ComputerCraft
compileOnly("cc.tweaked:cc-tweaked-$minecraft_version-common-api:$cc_version")
compileOnly(files("./tardim-1.2.2-dev.jar"))
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId base.archivesName.get()
from components.java
}
}
repositories {
maven {
url "file://" + System.getenv("local_maven")
}
}
}

View file

@ -1,62 +0,0 @@
package su.a71.tardim_ic.command;
import com.swdteam.tardim.common.command.tardim.CommandTardimBase;
import com.swdteam.tardim.common.command.tardim.ICommand;
import com.swdteam.tardim.tardim.TardimData;
import com.swdteam.tardim.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.FurnaceFuelSlot;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity;
import net.minecraft.world.level.block.entity.FurnaceBlockEntity;
/*
This command prints list of all biomes into the console to find technical names
You can also pass an argument to search for entries with this string (e.g. amethyst for terralith:amethyst_rainforest
*/
public class CommandListBiomes implements ICommand{
@Override
public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
;
if (args.length == 1 || args.length == 0) {
TardimData data = TardimManager.getFromPos(pos);
if (data != null) {
if (data.hasPermission(player)) {
Registry<Biome> biomeRegistry = player.level().registryAccess().registryOrThrow(Registries.BIOME);
biomeRegistry.keySet().forEach(
(ResourceLocation res) -> {
String out = res.toString();
if (args.length == 0 || out.toLowerCase().contains(args[0].toLowerCase())) {
CommandTardimBase.sendResponse(player, out, CommandTardimBase.ResponseType.INFO, source);
}
}
);
} else {
CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source);
}
}
} else {
CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source);
}
}
@Override
public String getCommandName() {
return "list-biomes";
}
@Override
public String getUsage() {
return "/list-biomes <..search_query>"; // TODO: how to communicate this better
}
@Override
public CommandTardimBase.CommandSource allowedSource() {
return CommandTardimBase.CommandSource.BOTH;
}
}

View file

@ -1,47 +0,0 @@
package su.a71.tardim_ic.command;
import com.swdteam.tardim.common.command.tardim.CommandTardimBase;
import com.swdteam.tardim.common.command.tardim.ICommand;
import com.swdteam.tardim.tardim.TardimData;
import com.swdteam.tardim.tardim.TardimManager;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player;
/*
This command prints list of all dimensions into the console to find technical names
*/
public class CommandListDimensions implements ICommand{
@Override
public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
if (args.length == 0) {
TardimData data = TardimManager.getFromPos(pos);
if (data != null) {
if (data.hasPermission(player)) {
for (ServerLevel serverLevel : player.level().getServer().getAllLevels()) {
CommandTardimBase.sendResponse(player, serverLevel.dimension().location().toString(), CommandTardimBase.ResponseType.INFO, source);
}
} else {
CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source);
}
}
} else {
CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source);
}
}
@Override
public String getCommandName() {
return "list-dimensions";
}
@Override
public String getUsage() {
return "/list-dimensions";
}
@Override
public CommandTardimBase.CommandSource allowedSource() {
return CommandTardimBase.CommandSource.BOTH;
}
}

View file

@ -1,18 +0,0 @@
package su.a71.tardim_ic.computercraft_compat.entity;
import com.swdteam.tardim.tardim.TardimData;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
// This is used to getPost(), getLevel() and getTardim() nicely without refactoring code to account for PeripheralProvider
// At least I believe so. Otherwise, don't really remember why I don't just pass these methods to the peripherals.
public interface ITardimPeripheralTileEntity {
public BlockPos getPos();
public Level getLevel();
public TardimData getTardim();
public Block getBlock();
}

View file

@ -1,65 +0,0 @@
package su.a71.tardim_ic.computercraft_compat.peripherals;
import com.swdteam.tardim.common.block.BlockFuelStorage;
import com.swdteam.tardim.tardim.TardimData;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.world.phys.Vec3;
import su.a71.tardim_ic.computercraft_compat.entity.FakeTardimPeripheralTileEntity;
/*
* CC Peripheral for TARDIM's fuel storage block.
* Only provides getters for the fuel parts for people who cannot afford or don't need the digital interface.
*/
public class FuelStoragePeripheral extends TardimPeripheral<BlockFuelStorage> implements IPeripheral {
/**
* @param tileEntity the tile entity of this peripheral
* @hidden
*/
public FuelStoragePeripheral(FakeTardimPeripheralTileEntity tileEntity) {
super(tileEntity, "tardim_fuel_storage", (BlockFuelStorage) tileEntity.getBlock());
}
// Peripheral methods ===============================================================
/**
* Return how much fuel is left in the TARDIM
*
* @return Fuel left (Out of 100)
*/
@LuaFunction(mainThread = true)
public final double getFuel() throws LuaException {
return getTardimData().getFuel();
}
/**
* Get how much fuel it would take to travel to the destination
* @return Amount of fuel needed (Out of 100)
*/
@LuaFunction(mainThread = true)
public final double calculateFuelForJourney() throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) return 0;
TardimData.Location curr = data.getCurrentLocation();
TardimData.Location dest = data.getTravelLocation();
double fuel = 0.0;
if (curr.getLevel() != dest.getLevel())
{
fuel = 10.0;
}
Vec3 posA = new Vec3(curr.getPos().getX(), curr.getPos().getY(), curr.getPos().getZ());
Vec3 posB = new Vec3(dest.getPos().getX(), dest.getPos().getY(), dest.getPos().getZ());
fuel += posA.distanceTo(posB) / 100.0;
if (fuel > 100.0) fuel = 100.0;
return fuel;
}
}

View file

@ -1,86 +0,0 @@
package su.a71.tardim_ic.computercraft_compat.peripherals;
import com.swdteam.tardim.tardim.TardimData;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import su.a71.tardim_ic.computercraft_compat.entity.ITardimPeripheralTileEntity;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
// Base CC peripheral for whn you need something with access to a TARDIM
public abstract class TardimPeripheral<BL extends Block> implements IPeripheral {
private final List<IComputerAccess> connectedComputers = new ArrayList<>(); // List of computers connected to the peripheral
public final ITardimPeripheralTileEntity tileEntity; // Peripheral's BlockEntity, used for accessing coordinates
public final String name;
private final BL block;
/**
* @param tileEntity the tile entity of this peripheral
* @hidden
*/
public TardimPeripheral(ITardimPeripheralTileEntity tileEntity, String name, BL block) {
this.tileEntity = tileEntity;
this.name = name;
this.block = block;
}
@Override
public BL getTarget() {
return this.block;
}
/** Setting name for the peripheral. A computer will see it as "digital_tardim_interface_n"
* @hidden
*/
@Nonnull
@Override
public String getType() { return this.name; }
/** Apparently CC uses this to check if the peripheral in front of a modem is this one
* @hidden
* @param iPeripheral The peripheral to compare against. This may be {@code null}.
* @return {@code true} if the peripheral is the same as this one.
*/
@Override
public boolean equals(@Nullable IPeripheral iPeripheral) { return this == iPeripheral; }
/** Called when a computer disconnects from the peripheral
* @hidden
* @param computer The interface to the computer that is being detached. Remember that multiple computers can be
* attached to a peripheral at once.
*/
@Override
public void detach(@Nonnull IComputerAccess computer) { connectedComputers.remove(computer); }
/** Called when a computer connects to the peripheral
* @hidden
* @param computer The interface to the computer that is being attached. Remember that multiple computers can be
* attached to a peripheral at once.
*/
@Override
public void attach(@Nonnull IComputerAccess computer) { connectedComputers.add(computer); }
/**
* I *think* I use this to get peripheral's world position
* @hidden
* @return
*/
public ITardimPeripheralTileEntity getTileEntity() {
return tileEntity;
}
public TardimData getTardimData() throws LuaException {
TardimData data = this.getTileEntity().getTardim();
if (data == null || data.getCurrentLocation() == null || data.getOwnerName() == null) {
throw new LuaException("Peripheral is not inside a TARDIM");
}
return data;
}
}

View file

@ -1,144 +0,0 @@
package su.a71.tardim_ic.computercraft_compat.peripherals;
import com.swdteam.tardim.common.block.BlockTardimScanner;
import com.swdteam.tardim.common.init.TardimRegistry;
import com.swdteam.tardim.tardim.TardimData;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.ObjectLuaTable;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.players.PlayerList;
import net.minecraft.world.level.biome.Biome;
import su.a71.tardim_ic.computercraft_compat.entity.FakeTardimPeripheralTileEntity;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/*
* CC Peripheral for TARDIM's scanner block.
* Only provides getters for data-related (mostly table output) methods e.g. biome or companion list
* for people who cannot afford or don't need the digital interface.
*/
public class TardimScannerPeripheral extends TardimPeripheral<BlockTardimScanner> implements IPeripheral {
/**
* @param tileEntity the tile entity of this peripheral
* @hidden
*/
public TardimScannerPeripheral(FakeTardimPeripheralTileEntity tileEntity) {
super(tileEntity, "tardim_scanner", (BlockTardimScanner) tileEntity.getBlock());
}
// Peripheral methods ===============================================================
/**
* Get username of the TARDIM's owner
* @return String of the owner's username
*/
@LuaFunction(mainThread = true)
public final String getOwnerName() throws LuaException {
TardimData data = getTardimData();
return data.getOwnerName();
}
/**
* Get list of the TARDIM owner's companions
* @return ObjectLuaTable containing the usernames of the companions
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getCompanions() throws LuaException {
TardimData data = getTardimData();
Map<Integer, String> companions = new HashMap<>();
for (int i = 0; i < data.getCompanions().size(); i++) {
companions.put(i + 1, data.getCompanions().get(i).getUsername());
}
return new ObjectLuaTable(companions);
}
/**
* Get online players. Useful for making a GUI for the locate function or just a nice dashboard.
*
* @return ObjectLuaTable of the online players
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getOnlinePlayers() throws LuaException {
if (this.tileEntity.getLevel().isClientSide()) {
return null;
}
PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList();
Map<Integer, String> players = new HashMap<>();
for (int i = 0; i < playerList.getPlayers().size(); i++) {
players.put(i + 1, playerList.getPlayers().get(i).getGameProfile().getName());
}
return new ObjectLuaTable(players);
}
/**
* Get all available TARDIM skins. Useful for making a GUI skin selection.
*
* @return ObjectLuaTable of the available skins
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getSkins() throws LuaException {
if (this.getTileEntity().getLevel().isClientSide()) {
return null;
}
Map<Integer, String> skins = new HashMap<>();
Iterator var5 = TardimRegistry.getRegistry().keySet().iterator();
int i = 0;
while(var5.hasNext()) {
ResourceLocation builder = (ResourceLocation)var5.next();
TardimRegistry.TardimBuilder b = TardimRegistry.getTardimBuilder(builder);
skins.put(i + 1, b.getDisplayName());
i++;
}
return new ObjectLuaTable(skins);
}
/**
* Get a table with all registered biomes' names.
* Useful for creating advanced navigation systems.
* @return ObjectLuaTable with all biomes' technical names
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getBiomes() throws LuaException {
Map<Integer, String> biomes = new HashMap<>();
Registry<Biome> biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registries.BIOME);
Iterator<ResourceLocation> biome_it = biomeRegistry.keySet().iterator();
int i = 0;
while (biome_it.hasNext()) {
biomes.put(i + 1, biome_it.next().toString());
i++;
}
return new ObjectLuaTable(biomes);
}
/**
* Get a table with all registered dimensions' names.
* Useful for creating advanced navigation systems.
* @return ObjectLuaTable with all dimensions' technical names
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getDimensions() throws LuaException {
Iterator<ServerLevel> dim_it = this.getTileEntity().getLevel().getServer().getAllLevels().iterator(); // TODO: Does this really work?
Map<Integer, String> dimensions = new HashMap<>();
int i = 0;
while (dim_it.hasNext()) {
dimensions.put(i + 1, dim_it.next().dimension().location().toString());
i++;
}
return new ObjectLuaTable(dimensions);
}
}

View file

@ -1,100 +0,0 @@
package su.a71.tardim_ic.computercraft_compat.peripherals;
import com.swdteam.tardim.common.block.BlockRotor;
import com.swdteam.tardim.tardim.TardimData;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.ObjectLuaTable;
import dan200.computercraft.api.peripheral.IPeripheral;
import su.a71.tardim_ic.computercraft_compat.entity.FakeTardimPeripheralTileEntity;
import java.util.Map;
/*
* CC Peripheral for TARDIM's time rotor block.
* Only provides getters for the flight status for people who cannot afford or don't need the digital interface.
*/
public class TimeRotorPeripheral extends TardimPeripheral<BlockRotor> implements IPeripheral {
/**
* @param tileEntity the tile entity of this peripheral
* @hidden
*/
public TimeRotorPeripheral(FakeTardimPeripheralTileEntity tileEntity) {
super(tileEntity, "tardim_rotor", (BlockRotor) tileEntity.getBlock());
}
// Peripheral methods ===============================================================
/**
* Check whether the TARDIM is in flight
* @return true if in flight, false if not
*/
@LuaFunction(mainThread = true)
public final boolean isInFlight() throws LuaException { return getTardimData().isInFlight(); }
/**
* Supposedly gets UNIX timestamp of when we entered flight
* @return UNIX timestamp if in flight, -1 if not
*/
@LuaFunction(mainThread = true)
public final long getTimeEnteredFlight() throws LuaException {
TardimData data = getTardimData();
if (!data.isInFlight()) {
return -1;
}
return data.getTimeEnteredFlight();
}
/**
* Get the current location of the TARDIM
* @return ObjectLuaTable of the current location with the following keys:
* <ul>
* <li>dimension - String of the dimension</li>
* <li>pos - table with the keys x, y, z that hold numbers</li>
* <li>facing - String of the facing</li>
* </ul>
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getCurrentLocation() throws LuaException {
TardimData.Location loc = getTardimData().getCurrentLocation();
return new ObjectLuaTable(Map.of(
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
));
}
/**
* Get the current location of the TARDIM
* @return if there is no destination returns null.
* <p>
* Otherwise, ObjectLuaTable of the current location with the following keys:
* <ul>
* <li>dimension - String of the dimension</li>
* <li>pos - table with the keys x, y, z that hold numbers</li>
* <li>facing - String of the facing</li>
* </ul>
*/
@LuaFunction(mainThread = true)
public final ObjectLuaTable getTravelLocation() throws LuaException {
TardimData data = getTardimData();
if (data.getTravelLocation() == null) {
data.setTravelLocation(data.getCurrentLocation());
}
TardimData.Location loc = data.getTravelLocation();
return new ObjectLuaTable(Map.of(
"dimension", loc.getLevel().location().toString(),
"pos", new ObjectLuaTable(Map.of(
"x", loc.getPos().getX(),
"y", loc.getPos().getY(),
"z", loc.getPos().getZ()
)),
"facing", loc.getFacing().toString()
));
}
}

View file

@ -1,58 +0,0 @@
//package su.a71.tardim_ic.mixin;
//
//import com.swdteam.tardim.common.command.tardim.CommandLocate;
//import com.swdteam.tardim.common.command.tardim.CommandTardimBase;
//import com.swdteam.tardim.tardim.TardimData;
//import com.swdteam.tardim.tardim.TardimManager;
//import net.minecraft.core.BlockPos;
//import net.minecraft.world.entity.player.Player;
//import net.minecraft.world.item.ItemStack;
//import org.spongepowered.asm.mixin.Mixin;
//import org.spongepowered.asm.mixin.Overwrite;
//
//import static com.swdteam.tardim.common.command.tardim.CommandTardimBase.sendResponse;
//
//@Mixin(value = CommandLocate.class, remap = false)
//public class JammerMixin {
//// @Inject(method="execute()V", at=@At(value = "INVOKE",
//// target = "Lcom/swdteam/tardim/tardim/TardimData;setTravelLocation(Lcom/swdteam/tardim/tardim/TardimData$Location;)V"))
//// public void execute(CallbackInfo ci) {
//// LOG.info("test");
////// for (ItemStack armour : player.getArmorSlots()) {
////// if (armour.is(LOCATION_JAMMER)) {
////// sendResponse(player, "Player's location is jammed", CommandTardimBase.ResponseType.FAIL, source);
////// ci.cancel();
////// };
////// }
//// }
//
// @Overwrite
// public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) {
// if (args.length == 1) {
// TardimData data = TardimManager.getFromPos(pos);
// if (data != null) {
// if (data.hasPermission(player)) {
// Player otherPlayer = player.getServer().getPlayerList().getPlayerByName(args[0]);
// if (otherPlayer != null) {
// for (ItemStack armour : otherPlayer.getArmorSlots()) {
//// if (armour.is(PERSONAL_JAMMER)) {
//// sendResponse(player, otherPlayer.getGameProfile().getName() + "'s location is jammed", CommandTardimBase.ResponseType.FAIL, source);
//// return;
//// }
// // TODO: Re-add
// }
// data.setTravelLocation(new TardimData.Location(otherPlayer.blockPosition(), otherPlayer.level().dimension()));
// sendResponse(player, "Coords locked on to " + otherPlayer.getGameProfile().getName(), CommandTardimBase.ResponseType.COMPLETE, source);
// } else {
// sendResponse(player, "Player does not exist", CommandTardimBase.ResponseType.FAIL, source);
// }
// } else {
// sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source);
// }
// }
// } else {
// sendResponse(player, ((CommandLocate)(Object)this).getUsage(), CommandTardimBase.ResponseType.FAIL, source);
// }
//
// }
//}

View file

@ -1,25 +0,0 @@
package su.a71.tardim_ic.platform;
import su.a71.tardim_ic.Constants;
import su.a71.tardim_ic.platform.services.IPlatformHelper;
import java.util.ServiceLoader;
public class Services {
// Platform helper that lets us do stuff for Forge/Fabric while being in Common
public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class);
// This code is used to load a service for the current environment. Your implementation of the service must be defined
// manually by including a text file in META-INF/services named with the fully qualified class name of the service.
// Inside the file you should write the fully qualified class name of the implementation to load for the platform. For
// example our file on Forge points to ForgePlatformHelper while Fabric points to FabricPlatformHelper.
public static <T> T load(Class<T> clazz) {
final T loadedService = ServiceLoader.load(clazz)
.findFirst()
.orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName()));
// Constants.LOG.debug("Loaded {} for service {}", loadedService, clazz);
return loadedService;
}
}

View file

@ -1,47 +0,0 @@
package su.a71.tardim_ic.platform.services;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import java.util.function.Supplier;
public interface IPlatformHelper {
/**
* Gets the name of the current platform
*
* @return The name of the current platform.
*/
String getPlatformName();
/**
* Checks if a mod with the given id is loaded.
*
* @param modId The mod to check if it is loaded.
* @return True if the mod is loaded, false otherwise.
*/
boolean isModLoaded(String modId);
/**
* Check if the game is currently in a development environment.
*
* @return True if in a development environment, false otherwise.
*/
boolean isDevelopmentEnvironment();
/**
* Gets the name of the environment type as a string.
*
* @return The name of the environment type.
*/
default String getEnvironmentName() {
return isDevelopmentEnvironment() ? "development" : "production";
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 B

View file

@ -1,8 +0,0 @@
{
"variants": {
"facing=north": { "model": "tardim_ic:block/food_machine"},
"facing=east": { "model": "tardim_ic:block/food_machine", "y": 90},
"facing=south": { "model": "tardim_ic:block/food_machine", "y": 180},
"facing=west": { "model": "tardim_ic:block/food_machine", "y": 270}
}
}

View file

@ -1,8 +0,0 @@
{
"variants": {
"facing=north": { "model": "tardim_ic:block/tardim_dock"},
"facing=east": { "model": "tardim_ic:block/tardim_dock", "y": 90},
"facing=south": { "model": "tardim_ic:block/tardim_dock", "y": 180},
"facing=west": { "model": "tardim_ic:block/tardim_dock", "y": 270}
}
}

View file

@ -1,10 +0,0 @@
{
"block.tardim_ic.digital_tardim_interface": "Digital TARDIM interface",
"block.tardim_ic.redstone_tardim_input": "Redstone TARDIM input",
"block.tardim_ic.tardim_dock": "TARDIM dock",
"block.tardim_ic.food_machine": "TARDIM food machine",
"itemGroup.tardim_ic": "TARDIM: In Control",
"itemGroup.minecraft.tardim_ic": "TARDIM: In Control",
"subtitles.tardim_ic.cloister": "Cloister bell rings",
"display_source.fuel_level": "TARDIM fuel level"
}

View file

@ -1,213 +0,0 @@
{
"credit": "Made by karoter2 (Feulim)",
"parent": "digital_tardim_interface",
"texture_size": [64, 64],
"textures": {
"1": "tardim_ic:block/digital_tardim_interface",
"particle": "tardim_ic:block/digital_tardim_interface"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 14, 16],
"faces": {
"north": {"uv": [4, 4, 8, 7.5], "texture": "#1"},
"east": {"uv": [0, 4, 4, 7.5], "texture": "#1"},
"south": {"uv": [12, 4, 16, 7.5], "texture": "#1"},
"west": {"uv": [8, 4, 12, 7.5], "texture": "#1"},
"up": {"uv": [8, 4, 4, 0], "texture": "#1"},
"down": {"uv": [12, 0, 8, 4], "texture": "#1"}
}
},
{
"from": [5, 14, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [1.5, 9, 3, 9.5], "texture": "#1"},
"east": {"uv": [0, 9, 1.5, 9.5], "texture": "#1"},
"south": {"uv": [4.5, 9, 6, 9.5], "texture": "#1"},
"west": {"uv": [3, 9, 4.5, 9.5], "texture": "#1"},
"up": {"uv": [3, 9, 1.5, 7.5], "texture": "#1"},
"down": {"uv": [4.5, 7.5, 3, 9], "texture": "#1"}
}
},
{
"from": [11, 14, 7],
"to": [14, 16, 9],
"faces": {
"north": {"uv": [12.5, 0.5, 13.25, 1], "texture": "#1"},
"east": {"uv": [12, 0.5, 12.5, 1], "texture": "#1"},
"south": {"uv": [13.75, 0.5, 14.5, 1], "texture": "#1"},
"west": {"uv": [13.25, 0.5, 13.75, 1], "texture": "#1"},
"up": {"uv": [13.25, 0.5, 12.5, 0], "texture": "#1"},
"down": {"uv": [14, 0, 13.25, 0.5], "texture": "#1"}
}
},
{
"from": [12.5, 14, 3.5],
"to": [12.5, 15, 12.5],
"faces": {
"north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"south": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"west": {"uv": [13, 3.75, 15.25, 4], "texture": "#1"},
"up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}
}
},
{
"from": [3.5, 14, 12.5],
"to": [12.5, 15, 12.5],
"faces": {
"north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"south": {"uv": [12.5, 3.75, 14.75, 4], "texture": "#1"},
"west": {"uv": [13.5, 3.75, 15.75, 4], "texture": "#1"},
"up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}
}
},
{
"from": [3.5, 14, 3.5],
"to": [12.5, 15, 3.5],
"faces": {
"north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"south": {"uv": [12.5, 3.75, 14.75, 4], "texture": "#1"},
"west": {"uv": [13.5, 3.75, 15.75, 4], "texture": "#1"},
"up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}
}
},
{
"from": [3.5, 14, 3.5],
"to": [3.5, 15, 12.5],
"faces": {
"north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"south": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"west": {"uv": [13, 3.75, 15.25, 4], "texture": "#1"},
"up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"},
"down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}
}
},
{
"from": [2, 14, 7],
"to": [5, 16, 9],
"faces": {
"north": {"uv": [5, 8, 5.75, 8.5], "texture": "#1"},
"east": {"uv": [4.5, 8, 5, 8.5], "texture": "#1"},
"south": {"uv": [6.25, 8, 7, 8.5], "texture": "#1"},
"west": {"uv": [5.75, 8, 6.25, 8.5], "texture": "#1"},
"up": {"uv": [5.75, 8, 5, 7.5], "texture": "#1"},
"down": {"uv": [6.5, 7.5, 5.75, 8], "texture": "#1"}
}
},
{
"from": [7, 14, 2],
"to": [9, 16, 5],
"faces": {
"north": {"uv": [3.25, 12.5, 3.75, 13], "texture": "#1"},
"east": {"uv": [2.5, 12.5, 3.25, 13], "texture": "#1"},
"south": {"uv": [4.5, 12.5, 5, 13], "texture": "#1"},
"west": {"uv": [3.75, 12.5, 4.5, 13], "texture": "#1"},
"up": {"uv": [3.75, 12.5, 3.25, 11.75], "texture": "#1"},
"down": {"uv": [4.25, 11.75, 3.75, 12.5], "texture": "#1"}
}
},
{
"from": [7, 14, 11],
"to": [9, 16, 14],
"faces": {
"north": {"uv": [0.75, 12.5, 1.25, 13], "texture": "#1"},
"east": {"uv": [0, 12.5, 0.75, 13], "texture": "#1"},
"south": {"uv": [2, 12.5, 2.5, 13], "texture": "#1"},
"west": {"uv": [1.25, 12.5, 2, 13], "texture": "#1"},
"up": {"uv": [1.25, 12.5, 0.75, 11.75], "texture": "#1"},
"down": {"uv": [1.75, 11.75, 1.25, 12.5], "texture": "#1"}
}
},
{
"from": [6, 13, -2],
"to": [10, 17, 2],
"faces": {
"north": {"uv": [10, 9.5, 11, 10.5], "texture": "#1"},
"east": {"uv": [9, 9.5, 10, 10.5], "texture": "#1"},
"south": {"uv": [12, 9.5, 13, 10.5], "texture": "#1"},
"west": {"uv": [11, 9.5, 12, 10.5], "texture": "#1"},
"up": {"uv": [11, 9.5, 10, 8.5], "texture": "#1"},
"down": {"uv": [12, 8.5, 11, 9.5], "texture": "#1"}
}
},
{
"from": [6, 13, 14],
"to": [10, 17, 18],
"faces": {
"north": {"uv": [7, 8.5, 8, 9.5], "texture": "#1"},
"east": {"uv": [6, 8.5, 7, 9.5], "texture": "#1"},
"south": {"uv": [9, 8.5, 10, 9.5], "texture": "#1"},
"west": {"uv": [8, 8.5, 9, 9.5], "texture": "#1"},
"up": {"uv": [8, 8.5, 7, 7.5], "texture": "#1"},
"down": {"uv": [9, 7.5, 8, 8.5], "texture": "#1"}
}
},
{
"from": [-2, 13, 6],
"to": [2, 17, 10],
"faces": {
"north": {"uv": [1, 3, 2, 4], "texture": "#1"},
"east": {"uv": [0, 3, 1, 4], "texture": "#1"},
"south": {"uv": [3, 3, 4, 4], "texture": "#1"},
"west": {"uv": [2, 3, 3, 4], "texture": "#1"},
"up": {"uv": [2, 3, 1, 2], "texture": "#1"},
"down": {"uv": [3, 2, 2, 3], "texture": "#1"}
}
},
{
"from": [14, 13, 6],
"to": [18, 17, 10],
"faces": {
"north": {"uv": [1, 1, 2, 2], "texture": "#1"},
"east": {"uv": [0, 1, 1, 2], "texture": "#1"},
"south": {"uv": [3, 1, 4, 2], "texture": "#1"},
"west": {"uv": [2, 1, 3, 2], "texture": "#1"},
"up": {"uv": [2, 1, 1, 0], "texture": "#1"},
"down": {"uv": [3, 0, 2, 1], "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"translation": [0, -1.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"thirdperson_lefthand": {
"translation": [0, -1.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_righthand": {
"translation": [-1.25, 0, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"translation": [3.75, -1.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"translation": [0, -0.5, 0],
"scale": [0.35, 0.35, 0.35]
},
"gui": {
"rotation": [33, 45, 0],
"scale": [0.6, 0.6, 0.6]
},
"head": {
"translation": [0, 0.75, 0],
"scale": [1.1, 1.1, 1.1]
},
"fixed": {
"rotation": [-90, 0, 0],
"translation": [0, 0, 4.25]
}
}
}

View file

@ -1,104 +0,0 @@
{
"credit": "Made by karoter2 (Feulim)",
"texture_size": [128, 128],
"textures": {
"0": "tardim_ic:block/food_machine",
"particle": "tardim_ic:block/food_machine"
},
"elements": [
{
"from": [0, 0, 1],
"to": [16, 10, 16],
"faces": {
"north": {"uv": [1.875, 1.875, 3.875, 3.125], "texture": "#0"},
"east": {"uv": [0, 1.875, 1.875, 3.125], "texture": "#0"},
"south": {"uv": [5.75, 1.875, 7.75, 3.125], "texture": "#0"},
"west": {"uv": [3.875, 1.875, 5.75, 3.125], "texture": "#0"},
"up": {"uv": [3.875, 1.875, 1.875, 0], "texture": "#0"},
"down": {"uv": [5.875, 0, 3.875, 1.875], "texture": "#0"}
}
},
{
"from": [0.5, 1, 16.02],
"to": [15.5, 15, 16.02],
"faces": {
"north": {"uv": [8.25, 1.625, 10.125, 3.375], "texture": "#0"},
"east": {"uv": [8.25, 1.625, 8.25, 3.375], "texture": "#0"},
"south": {"uv": [10.125, 1.625, 12, 3.375], "texture": "#0"},
"west": {"uv": [10.125, 1.625, 10.125, 3.375], "texture": "#0"},
"up": {"uv": [10.125, 1.625, 8.25, 1.625], "texture": "#0"},
"down": {"uv": [12, 1.625, 10.125, 1.625], "texture": "#0"}
}
},
{
"from": [0, 10, 0],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [2, 5.125, 4, 5.375], "texture": "#0"},
"east": {"uv": [0, 5.125, 2, 5.375], "texture": "#0"},
"south": {"uv": [6, 5.125, 8, 5.375], "texture": "#0"},
"west": {"uv": [4, 5.125, 6, 5.375], "texture": "#0"},
"up": {"uv": [4, 5.125, 2, 3.125], "texture": "#0"},
"down": {"uv": [6, 3.125, 4, 5.125], "texture": "#0"}
}
},
{
"from": [0, 12, 9],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0.875, 6.25, 2.875, 6.75], "texture": "#0"},
"east": {"uv": [0, 6.25, 0.875, 6.75], "texture": "#0"},
"south": {"uv": [3.75, 6.25, 5.75, 6.75], "texture": "#0"},
"west": {"uv": [2.875, 6.25, 3.75, 6.75], "texture": "#0"},
"up": {"uv": [2.875, 6.25, 0.875, 5.375], "texture": "#0"},
"down": {"uv": [4.875, 5.375, 2.875, 6.25], "texture": "#0"}
}
},
{
"from": [5, 11, 4],
"to": [11, 14, 10],
"rotation": {"angle": -22.5, "axis": "x", "origin": [9, 12, 8]},
"faces": {
"north": {"uv": [6.5, 6.125, 7.25, 6.5], "texture": "#0"},
"east": {"uv": [5.75, 6.125, 6.5, 6.5], "texture": "#0"},
"south": {"uv": [8, 6.125, 8.75, 6.5], "texture": "#0"},
"west": {"uv": [7.25, 6.125, 8, 6.5], "texture": "#0"},
"up": {"uv": [7.25, 6.125, 6.5, 5.375], "texture": "#0"},
"down": {"uv": [8, 5.375, 7.25, 6.125], "texture": "#0"}
}
},
{
"from": [1, 12, 3],
"to": [4, 13, 6],
"faces": {
"north": {"uv": [0.375, 0.875, 0.75, 1], "texture": "#0"},
"east": {"uv": [0, 0.875, 0.375, 1], "texture": "#0"},
"south": {"uv": [1.125, 0.875, 1.5, 1], "texture": "#0"},
"west": {"uv": [0.75, 0.875, 1.125, 1], "texture": "#0"},
"up": {"uv": [0.75, 0.875, 0.375, 0.5], "texture": "#0"},
"down": {"uv": [1.125, 0.5, 0.75, 0.875], "texture": "#0"}
}
},
{
"from": [12, 12, 3],
"to": [15, 13, 6],
"faces": {
"north": {"uv": [0.375, 0.375, 0.75, 0.5], "texture": "#0"},
"east": {"uv": [0, 0.375, 0.375, 0.5], "texture": "#0"},
"south": {"uv": [1.125, 0.375, 1.5, 0.5], "texture": "#0"},
"west": {"uv": [0.75, 0.375, 1.125, 0.5], "texture": "#0"},
"up": {"uv": [0.75, 0.375, 0.375, 0], "texture": "#0"},
"down": {"uv": [1.125, 0, 0.75, 0.375], "texture": "#0"}
}
}
],
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"color": 0,
"nbt": "{}",
"children": [0, 1, 2, 3, 4, 5, 6]
}
]
}

Some files were not shown because too many files have changed in this diff Show more