Skip to content

Commit

Permalink
start networking
Browse files Browse the repository at this point in the history
  • Loading branch information
BlueWeabo committed Jun 21, 2024
1 parent 9a5fbde commit ccf25a9
Show file tree
Hide file tree
Showing 16 changed files with 477 additions and 19 deletions.
4 changes: 3 additions & 1 deletion src/main/java/com/blueweabo/mutecore/CommonProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

public class CommonProxy {

public void preInit(FMLPreInitializationEvent event) {}
public void preInit(FMLPreInitializationEvent event) {
MuTENetwork.init();
}

public void init(FMLInitializationEvent event) {}

Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/blueweabo/mutecore/MuTECore.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.blueweabo.mutecore.api.gui.MultiTileEntityGuiFactory;
import com.blueweabo.mutecore.api.registry.MultiTileContainer.FakeEntity;
import com.blueweabo.mutecore.api.tile.MultiTileEntity;
import com.blueweabo.mutecore.test.TestRegistry;
import com.cleanroommc.modularui.factory.GuiManager;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
Expand All @@ -15,8 +18,11 @@
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.event.FMLServerStoppingEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import dev.dominion.ecs.api.Dominion;
import dev.dominion.ecs.api.Entity;
import dev.dominion.ecs.api.Results;

@Mod(modid = MuTECore.MODID, version = Tags.VERSION, name = "MuTECore", acceptedMinecraftVersions = "[1.7.10]", dependencies = MuTECore.DEPENDENCIES)
public class MuTECore {
Expand All @@ -43,6 +49,7 @@ public void preInit(FMLPreInitializationEvent event) {
SystemRegistrator.registerOtherSystem();
}
GameRegistry.registerTileEntity(MultiTileEntity.class, "multitileentity");
GuiManager.registerFactory(MultiTileEntityGuiFactory.INSTANCE);
proxy.preInit(event);
}

Expand All @@ -63,4 +70,13 @@ public void postInit(FMLPostInitializationEvent event) {
public void serverStarting(FMLServerStartingEvent event) {
proxy.serverStarting(event);
}

@Mod.EventHandler
public void serverStopping(FMLServerStoppingEvent event) {
Results<Entity> results = ENGINE.findAllEntities();
for (Entity entity : results) {
if (entity.has(FakeEntity.class)) continue;
ENGINE.deleteEntity(entity);
}
}
}
135 changes: 135 additions & 0 deletions src/main/java/com/blueweabo/mutecore/MuTENetwork.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package com.blueweabo.mutecore;

import java.io.IOException;
import java.util.List;

import org.jetbrains.annotations.Nullable;

import com.blueweabo.mutecore.api.block.MultiTileEntityBlock;
import com.blueweabo.mutecore.api.data.Coordinates;
import com.blueweabo.mutecore.api.data.WorldStateValidator;
import com.blueweabo.mutecore.api.gui.ComponentData;
import com.blueweabo.mutecore.api.registry.MultiTileContainer;
import com.blueweabo.mutecore.api.registry.MultiTileEntityRegistry;
import com.blueweabo.mutecore.api.tile.MultiTileEntity;
import com.cleanroommc.modularui.factory.GuiManager;
import com.cleanroommc.modularui.network.IPacket;
import com.cleanroommc.modularui.network.NetworkHandler;

import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.relauncher.Side;
import dev.dominion.ecs.api.Entity;
import dev.dominion.ecs.engine.IntEntity;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;

public class MuTENetwork {

private static SimpleNetworkWrapper CHANNEL = NetworkRegistry.INSTANCE.newSimpleChannel(MuTECore.MODID);
private static int packetId = 0;

public static void init() {
registerS2C(MuTEPacket.class);
}

private static void registerC2S(Class<? extends IPacket> clazz) {
CHANNEL.registerMessage(C2SHandler, clazz, packetId++, Side.SERVER);
}

private static void registerS2C(Class<? extends IPacket> clazz) {
CHANNEL.registerMessage(S2CHandler, clazz, packetId++, Side.CLIENT);
}

public static void sendToServer(IPacket packet) {
CHANNEL.sendToServer(packet);
}

public static void sendToWorld(IPacket packet, World world) {
CHANNEL.sendToDimension(packet, world.provider.dimensionId);
}

public static void sendToPlayer(IPacket packet, EntityPlayerMP player) {
CHANNEL.sendTo(packet, player);
}

public static void sentToPlayersInRange(IPacket packet, World world, int x, int z) {
if (!world.isRemote) {
for (EntityPlayer p : world.playerEntities) {
if (!(p instanceof EntityPlayerMP player)) {
continue;
}
Chunk tChunk = world.getChunkFromBlockCoords(x, z);
if (player.getServerForPlayer()
.getPlayerManager()
.isPlayerWatchingChunk(player, tChunk.xPosition, tChunk.zPosition)) {
sendToPlayer(packet, player);
}
}
}
}

final static IMessageHandler<IPacket, IPacket> S2CHandler = (message, ctx) -> {
NetHandlerPlayClient handler = ctx.getClientHandler();
return message.executeClient(handler);
};

final static IMessageHandler<IPacket, IPacket> C2SHandler = (message, ctx) -> {
NetHandlerPlayServer handler = ctx.getServerHandler();
return message.executeServer(handler);
};

public static class MuTEPacket implements IPacket {

NBTTagCompound data;

public void setComponentData(NBTTagCompound data) {
this.data = data;
}

@Override
public void write(PacketBuffer buf) throws IOException {
buf.writeNBTTagCompoundToBuffer(data);
}

@Override
public void read(PacketBuffer buf) throws IOException {
data = buf.readNBTTagCompoundFromBuffer();
}

@Override
public @Nullable IPacket executeClient(NetHandlerPlayClient handler) {
Coordinates coords = new Coordinates(0,0,0);
coords.load(data);
IBlockAccess world = Minecraft.getMinecraft().theWorld;
Block bl = world .getBlock(coords.getX(), coords.getY(), coords.getZ());
if (!(bl instanceof MultiTileEntityBlock mbl)) return null;
TileEntity te = world.getTileEntity(coords.getX(), coords.getY(), coords.getZ());
if (!(te instanceof MultiTileEntity mute)) return null;
MultiTileEntityRegistry registry = mbl.getRegistry();
MultiTileContainer container = registry.getMultiTileContainer(data.getCompoundTag("idData").getInteger("i"));
Entity entity = container.createNewEntity();
Object[] components = ((IntEntity) entity).getComponentArray();
for (int i = 0; i < components.length; i++) {
if (!(components[i] instanceof WorldStateValidator validator)) continue;
validator.load(data);
}
mute.setEntity(entity);
return null;
}
}
}
18 changes: 17 additions & 1 deletion src/main/java/com/blueweabo/mutecore/SystemRegistrator.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package com.blueweabo.mutecore;

import net.minecraft.nbt.NBTTagCompound;

import com.blueweabo.mutecore.api.data.Coordinates;
import com.blueweabo.mutecore.api.data.GUIEvent;
import com.blueweabo.mutecore.api.data.WorldStateValidator;
import com.blueweabo.mutecore.api.gui.MultiTileEntityGuiFactory;
import com.blueweabo.mutecore.api.registry.EventRegistry;
import com.blueweabo.mutecore.api.registry.PlayerInteractionEvent;
import com.blueweabo.mutecore.api.registry.MultiTileContainer.Id;
import com.blueweabo.mutecore.api.utils.PlayerHelper;
import com.cleanroommc.modularui.factory.TileEntityGuiFactory;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import dev.dominion.ecs.api.Composition;
import dev.dominion.ecs.api.Entity;
import dev.dominion.ecs.api.Results;
import dev.dominion.ecs.api.Scheduler;
import dev.dominion.ecs.engine.IntEntity;

public class SystemRegistrator {

Expand Down Expand Up @@ -43,7 +50,16 @@ public static void registerOtherSystem() {
Entity entity = result.entity();
GUIEvent event = entity.get(GUIEvent.class);
Coordinates coords = entity.get(Coordinates.class);
TileEntityGuiFactory.open(event.getPlayer(), coords.getX(), coords.getY(), coords.getZ());
Id id = entity.get(Id.class);
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("entityId", id.getId());
Object[] components = ((IntEntity) entity).getComponentArray();
for (Object component : components) {
if (component instanceof WorldStateValidator validator) {
validator.save(nbt);
}
}
MultiTileEntityGuiFactory.open(event.getPlayer(), coords.getX(), coords.getY(), coords.getZ(), nbt);
entity.removeType(GUIEvent.class);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.common.util.ForgeDirection;

import com.blueweabo.mutecore.MuTECore;
import com.blueweabo.mutecore.api.data.Coordinates;
import com.blueweabo.mutecore.api.registry.EventRegistry;
import com.blueweabo.mutecore.api.registry.MultiTileEntityRegistry;
Expand All @@ -35,13 +36,20 @@ public MultiTileEntityBlock(Material material) {
super(material);
}

@Override
public TileEntity createTileEntity(World world, int metadata) {
return registry.createNewTileEntity(metadata);
}

@Override
public TileEntity createNewTileEntity(World worldIn, int meta) {
return registry.createNewTileEntity(meta);
}

@Override
public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) {}
public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) {
list.addAll(registry.getAllItemStacks());
}

@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) {
Expand Down Expand Up @@ -73,13 +81,16 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer
if (eventComponent != null) break;
}
if (eventComponent == null) return false;
if (mute.getEntity().has(eventComponent.getClass())) return false;
mute.getEntity().add(eventComponent);
return true;
}

@Override
public void breakBlock(World worldIn, int x, int y, int z, Block blockBroken, int meta) {
TileEntity te = worldIn.getTileEntity(x, y, z);
if (!(te instanceof MultiTileEntity mute)) return;
MuTECore.ENGINE.deleteEntity(mute.getEntity());
super.breakBlock(worldIn, x, y, z, blockBroken, meta);
}

Expand All @@ -96,6 +107,10 @@ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metad
return super.getDrops(world, x, y, z, metadata, fortune);
}

public MultiTileEntityRegistry getRegistry() {
return registry;
}

@Internal
public void setRegistry(MultiTileEntityRegistry registry) {
this.registry = registry;
Expand Down
21 changes: 20 additions & 1 deletion src/main/java/com/blueweabo/mutecore/api/data/Coordinates.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.blueweabo.mutecore.api.data;

public class Coordinates {
import net.minecraft.nbt.NBTTagCompound;

public class Coordinates implements WorldStateValidator {

private int x;
private int y;
Expand Down Expand Up @@ -35,4 +37,21 @@ public int getZ() {
public void setZ(int z) {
this.z = z;
}

@Override
public void save(NBTTagCompound nbt) {
NBTTagCompound coordinatesNBT = new NBTTagCompound();
coordinatesNBT.setInteger("x", x);
coordinatesNBT.setInteger("y", y);
coordinatesNBT.setInteger("z", z);
nbt.setTag("coordinates", coordinatesNBT);
}

@Override
public void load(NBTTagCompound nbt) {
NBTTagCompound coordinatesNBT = nbt.getCompoundTag("coordinates");
x = coordinatesNBT.getInteger("x");
y = coordinatesNBT.getInteger("y");
z = coordinatesNBT.getInteger("z");
}
}
15 changes: 14 additions & 1 deletion src/main/java/com/blueweabo/mutecore/api/data/Direction.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.blueweabo.mutecore.api.data;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;

public class Direction {
public class Direction implements WorldStateValidator {

private ForgeDirection direction;

Expand All @@ -17,4 +18,16 @@ public void setDirection(ForgeDirection direction) {
public Direction(ForgeDirection direction) {
this.direction = direction;
}

@Override
public void save(NBTTagCompound nbt) {
NBTTagCompound directionNBT = new NBTTagCompound();
directionNBT.setInteger("i", direction.ordinal());
nbt.setTag("direction", directionNBT);
}

@Override
public void load(NBTTagCompound nbt) {
direction = ForgeDirection.getOrientation(nbt.getCompoundTag("direction").getInteger("i"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.blueweabo.mutecore.api.data;

public class NeighbourUpdateEvent {
}
20 changes: 20 additions & 0 deletions src/main/java/com/blueweabo/mutecore/api/data/WorldContainer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.blueweabo.mutecore.api.data;

import net.minecraft.world.IBlockAccess;

public class WorldContainer {

private IBlockAccess world;

public WorldContainer(IBlockAccess world) {
this.world = world;
}

public IBlockAccess getWorld() {
return world;
}

public void setWorld(IBlockAccess world) {
this.world = world;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.blueweabo.mutecore.api.data;

import net.minecraft.nbt.NBTTagCompound;

public interface WorldStateValidator {

void save(NBTTagCompound nbt);

void load(NBTTagCompound nbt);
}
Loading

0 comments on commit ccf25a9

Please sign in to comment.