mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-11-06 08:22:59 +00:00
147 lines
5.9 KiB
Java
147 lines
5.9 KiB
Java
/*
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
* Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
|
|
* Send enquiries to dratcliffe@gmail.com
|
|
*/
|
|
|
|
package dan200.computercraft.shared.proxy;
|
|
|
|
import dan200.computercraft.ComputerCraft;
|
|
import dan200.computercraft.api.ComputerCraftAPI;
|
|
import dan200.computercraft.api.media.IMedia;
|
|
import dan200.computercraft.api.peripheral.IPeripheralTile;
|
|
import dan200.computercraft.api.turtle.event.TurtleEvent;
|
|
import dan200.computercraft.core.computer.MainThread;
|
|
import dan200.computercraft.core.tracking.Tracking;
|
|
import dan200.computercraft.shared.TurtlePermissions;
|
|
import dan200.computercraft.shared.command.CommandComputerCraft;
|
|
import dan200.computercraft.shared.command.arguments.ArgumentSerializers;
|
|
import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider;
|
|
import dan200.computercraft.shared.common.TileGeneric;
|
|
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
|
|
import dan200.computercraft.shared.data.HasComputerIdLootCondition;
|
|
import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
|
|
import dan200.computercraft.shared.media.items.RecordMedia;
|
|
import dan200.computercraft.shared.network.NetworkHandler;
|
|
import dan200.computercraft.shared.peripheral.commandblock.CommandBlockPeripheral;
|
|
import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods;
|
|
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
|
|
import dan200.computercraft.shared.turtle.FurnaceRefuelHandler;
|
|
import dan200.computercraft.shared.turtle.SignInspectHandler;
|
|
import dan200.computercraft.shared.util.Config;
|
|
import dan200.computercraft.shared.util.TickScheduler;
|
|
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
|
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents;
|
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
|
import net.minecraft.block.entity.BlockEntity;
|
|
import net.minecraft.block.entity.CommandBlockBlockEntity;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.MusicDiscItem;
|
|
import net.minecraft.loot.condition.LootConditionType;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.util.Identifier;
|
|
import net.minecraft.util.registry.Registry;
|
|
|
|
public final class ComputerCraftProxyCommon
|
|
{
|
|
private static MinecraftServer server;
|
|
|
|
public static void init()
|
|
{
|
|
NetworkHandler.setup();
|
|
|
|
registerProviders();
|
|
registerHandlers();
|
|
|
|
ArgumentSerializers.register();
|
|
|
|
ComputerCraftAPI.registerGenericSource( new InventoryMethods() );
|
|
}
|
|
|
|
private static void registerProviders()
|
|
{
|
|
ComputerCraftAPI.registerPeripheralProvider( ( world, pos, side ) -> {
|
|
BlockEntity tile = world.getBlockEntity( pos );
|
|
return tile instanceof IPeripheralTile ? ((IPeripheralTile) tile).getPeripheral( side ) : null;
|
|
} );
|
|
|
|
ComputerCraftAPI.registerPeripheralProvider( ( world, pos, side ) -> {
|
|
BlockEntity tile = world.getBlockEntity( pos );
|
|
return ComputerCraft.enableCommandBlock && tile instanceof CommandBlockBlockEntity ?
|
|
new CommandBlockPeripheral( (CommandBlockBlockEntity) tile ) : null;
|
|
} );
|
|
|
|
// Register bundled power providers
|
|
ComputerCraftAPI.registerBundledRedstoneProvider( new DefaultBundledRedstoneProvider() );
|
|
|
|
// Register media providers
|
|
ComputerCraftAPI.registerMediaProvider( stack -> {
|
|
Item item = stack.getItem();
|
|
if( item instanceof IMedia )
|
|
{
|
|
return (IMedia) item;
|
|
}
|
|
if( item instanceof MusicDiscItem )
|
|
{
|
|
return RecordMedia.INSTANCE;
|
|
}
|
|
return null;
|
|
} );
|
|
}
|
|
|
|
private static void registerHandlers()
|
|
{
|
|
CommandRegistrationCallback.EVENT.register( CommandComputerCraft::register );
|
|
|
|
ServerTickEvents.START_SERVER_TICK.register( server -> {
|
|
MainThread.executePendingTasks();
|
|
ComputerCraft.serverComputerRegistry.update();
|
|
TickScheduler.tick();
|
|
} );
|
|
|
|
ServerLifecycleEvents.SERVER_STARTED.register( server -> {
|
|
ComputerCraftProxyCommon.server = server;
|
|
ComputerCraft.serverComputerRegistry.reset();
|
|
WirelessNetwork.resetNetworks();
|
|
MainThread.reset();
|
|
Tracking.reset();
|
|
} );
|
|
|
|
ServerLifecycleEvents.SERVER_STOPPING.register( server -> {
|
|
ComputerCraft.serverComputerRegistry.reset();
|
|
WirelessNetwork.resetNetworks();
|
|
MainThread.reset();
|
|
Tracking.reset();
|
|
ComputerCraftProxyCommon.server = null;
|
|
} );
|
|
|
|
ServerBlockEntityEvents.BLOCK_ENTITY_UNLOAD.register( ( blockEntity, world ) -> {
|
|
if( blockEntity instanceof TileGeneric )
|
|
{
|
|
((TileGeneric) blockEntity).onChunkUnloaded();
|
|
}
|
|
} );
|
|
|
|
// Config
|
|
ServerLifecycleEvents.SERVER_STARTING.register( Config::serverStarting );
|
|
ServerLifecycleEvents.SERVER_STOPPING.register( Config::serverStopping );
|
|
|
|
TurtleEvent.EVENT_BUS.register( FurnaceRefuelHandler.INSTANCE );
|
|
TurtleEvent.EVENT_BUS.register( new TurtlePermissions() );
|
|
TurtleEvent.EVENT_BUS.register( new SignInspectHandler() );
|
|
}
|
|
|
|
public static void registerLoot()
|
|
{
|
|
registerCondition( "block_named", BlockNamedEntityLootCondition.TYPE );
|
|
registerCondition( "player_creative", PlayerCreativeLootCondition.TYPE );
|
|
registerCondition( "has_id", HasComputerIdLootCondition.TYPE );
|
|
}
|
|
|
|
private static void registerCondition( String name, LootConditionType serializer )
|
|
{
|
|
Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, name ), serializer );
|
|
}
|
|
}
|