Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Surface rocks are spawning and rendering. Packets are sent by the TES…
…R when a player looks at a rock and it doesn't have an item. Should be stable. TODO: make the rendering hitbox larger; rocks are disapearing when still in sight.
  • Loading branch information
alcatrazEscapee committed Jun 19, 2018
1 parent b6e0e49 commit c552da0
Show file tree
Hide file tree
Showing 8 changed files with 234 additions and 44 deletions.
7 changes: 6 additions & 1 deletion src/main/java/net/dries007/tfc/TerraFirmaCraft.java
Expand Up @@ -19,6 +19,8 @@

import net.dries007.tfc.client.ClientEvents;
import net.dries007.tfc.cmd.StripWorldCommand;
import net.dries007.tfc.network.PacketRequestWorldItem;
import net.dries007.tfc.network.PacketUpdateWorldItem;
import net.dries007.tfc.objects.CreativeTabsTFC;
import net.dries007.tfc.objects.entity.EntitiesTFC;
import net.dries007.tfc.objects.fluids.FluidsTFC;
Expand Down Expand Up @@ -92,8 +94,11 @@ public void preInit(FMLPreInitializationEvent event)
network = NetworkRegistry.INSTANCE.newSimpleChannel(MOD_ID);
int id = 0;
network.registerMessage(ChunkDataMessage.Handler.class, ChunkDataMessage.class, ++id, Side.CLIENT);

ChunkCapabilityHandler.preInit();
// For world item rendering
network.registerMessage(PacketUpdateWorldItem.Handler.class, PacketUpdateWorldItem.class, ++id, Side.CLIENT);
network.registerMessage(PacketRequestWorldItem.Handler.class, PacketRequestWorldItem.class, ++id, Side.SERVER);

CalenderTFC.reload();

EntitiesTFC.preInit();
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/net/dries007/tfc/client/render/TESRWorldItem.java
Expand Up @@ -9,20 +9,29 @@
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemStack;

import net.dries007.tfc.TerraFirmaCraft;
import net.dries007.tfc.network.PacketRequestWorldItem;
import net.dries007.tfc.objects.te.TEWorldItem;

public class TESRWorldItem extends TileEntitySpecialRenderer<TEWorldItem>
{
@Override
public void render(TEWorldItem te, double x, double y, double z, float partialTicks, int destroyStage, float alpha){
ItemStack stack = te.inventory.getStackInSlot(0);
if (stack.isEmpty())
{
TerraFirmaCraft.getNetwork().sendToServer(new PacketRequestWorldItem(te));
return;
}
GlStateManager.pushMatrix();
//GlStateManager.translate((i % 2 == 0 ? 1 : 0), 0, (i < 2 ? 1 : 0));
//GlStateManager.rotate(timeD, 0, 1, 0);
GlStateManager.translate(x + 0.5D, y + 0.03125D, z + 0.5D);
GlStateManager.scale(.5d,.5d,.5d); //I used doubles here because I think they will cast to that anyway
GlStateManager.rotate(90f,1f,0f,0f);
Minecraft.getMinecraft().getRenderItem().renderItem(te.getItem(), ItemCameraTransforms.TransformType.FIXED);
Minecraft.getMinecraft().getRenderItem().renderItem(stack, ItemCameraTransforms.TransformType.FIXED);
GlStateManager.popMatrix();
}
}
74 changes: 74 additions & 0 deletions src/main/java/net/dries007/tfc/network/PacketRequestWorldItem.java
@@ -0,0 +1,74 @@
/*
* Work under Copyright. Licensed under the EUPL.
* See the project README.md and LICENSE.txt for more information.
*
*/

package net.dries007.tfc.network;

import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;

import io.netty.buffer.ByteBuf;
import net.dries007.tfc.TerraFirmaCraft;
import net.dries007.tfc.objects.te.TEWorldItem;

public class PacketRequestWorldItem implements IMessage
{

private BlockPos pos;
private int dimension;

public PacketRequestWorldItem(BlockPos pos, int dimension)
{
this.pos = pos;
this.dimension = dimension;
}

public PacketRequestWorldItem(TEWorldItem te)
{
this(te.getPos(), te.getWorld().provider.getDimension());
}

// Needs to be here for forge
public PacketRequestWorldItem() { }

@Override
public void fromBytes(ByteBuf buf)
{
pos = BlockPos.fromLong(buf.readLong());
dimension = buf.readInt();
}

@Override
public void toBytes(ByteBuf buf)
{
buf.writeLong(pos.toLong());
buf.writeInt(dimension);
}

public static class Handler implements IMessageHandler<PacketRequestWorldItem, PacketUpdateWorldItem>
{

@Override
public PacketUpdateWorldItem onMessage(PacketRequestWorldItem message, MessageContext ctx)
{
World world = FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(message.dimension);
TEWorldItem te = (TEWorldItem) world.getTileEntity(message.pos);
if (te != null)
{
TerraFirmaCraft.getLog().debug("Sent an update packet " + te.inventory.getStackInSlot(0).getDisplayName());
return new PacketUpdateWorldItem(te);
}
else
{
return null;
}
}

}
}
73 changes: 73 additions & 0 deletions src/main/java/net/dries007/tfc/network/PacketUpdateWorldItem.java
@@ -0,0 +1,73 @@
/*
* Work under Copyright. Licensed under the EUPL.
* See the project README.md and LICENSE.txt for more information.
*
*/

package net.dries007.tfc.network;

import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;

import io.netty.buffer.ByteBuf;
import net.dries007.tfc.TerraFirmaCraft;
import net.dries007.tfc.objects.te.TEWorldItem;

public class PacketUpdateWorldItem implements IMessage
{

private BlockPos pos;
private ItemStack stack;

public PacketUpdateWorldItem(TEWorldItem te)
{
this(te.getPos(), te.inventory.getStackInSlot(0));
}

public PacketUpdateWorldItem(BlockPos pos, ItemStack stack)
{
this.pos = pos;
this.stack = stack;
}

// Needed for forge to call this class
public PacketUpdateWorldItem() {}

@Override
public void fromBytes(ByteBuf buf)
{
pos = BlockPos.fromLong(buf.readLong());
stack = ByteBufUtils.readItemStack(buf);
}

@Override
public void toBytes(ByteBuf buf)
{
buf.writeLong(pos.toLong());
ByteBufUtils.writeItemStack(buf, stack);
}

public static class Handler implements IMessageHandler<PacketUpdateWorldItem, IMessage>
{

@Override
public IMessage onMessage(PacketUpdateWorldItem message, MessageContext ctx)
{
Minecraft.getMinecraft().addScheduledTask(() -> {
TEWorldItem te = (TEWorldItem) Minecraft.getMinecraft().world.getTileEntity(message.pos);
if (te != null)
{
TerraFirmaCraft.getLog().debug("Got the update packet: " + message.stack.getDisplayName());
te.inventory.setStackInSlot(0, message.stack);
}
});
return null;
}

}
}
14 changes: 11 additions & 3 deletions src/main/java/net/dries007/tfc/objects/blocks/BlockWorldItem.java
Expand Up @@ -5,6 +5,8 @@

package net.dries007.tfc.objects.blocks;

import javax.annotation.ParametersAreNonnullByDefault;

import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
Expand All @@ -20,12 +22,15 @@
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

import mcp.MethodsReturnNonnullByDefault;
import net.dries007.tfc.objects.te.TEWorldItem;
import net.dries007.tfc.util.Helpers;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class BlockWorldItem extends Block implements ITileEntityProvider
{
protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.25D, 0D, 0.25D, 0.75D, 0.0625D, 0.75D);
private static final AxisAlignedBB AABB = new AxisAlignedBB(0.25D, 0D, 0.25D, 0.75D, 0.0625D, 0.75D);

public BlockWorldItem()
{
Expand All @@ -38,7 +43,7 @@ public BlockWorldItem()
@Override
public TileEntity createNewTileEntity(World worldIn, int meta)
{
return new TEWorldItem(worldIn);
return new TEWorldItem();
}

@Override
Expand Down Expand Up @@ -96,7 +101,10 @@ public void breakBlock(World worldIn, BlockPos pos, IBlockState state)
@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
{
worldIn.setBlockToAir(pos);
TEWorldItem te = (TEWorldItem) worldIn.getTileEntity(pos);
if (te == null) return true;
te.inventory.setStackInSlot(0, playerIn.getHeldItem(hand).copy());
//worldIn.setBlockToAir(pos);
return true;
}
}
85 changes: 55 additions & 30 deletions src/main/java/net/dries007/tfc/objects/te/TEWorldItem.java
Expand Up @@ -5,84 +5,109 @@

package net.dries007.tfc.objects.te;

import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;

import net.minecraft.block.state.IBlockState;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.world.World;

import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.ItemStackHandler;

import mcp.MethodsReturnNonnullByDefault;

import static net.dries007.tfc.Constants.MOD_ID;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class TEWorldItem extends TileEntity
{
public TEWorldItem(){ } //this has to be here otherwise it will fail to load somehow
public ItemStackHandler inventory = new ItemStackHandler(1);/*{
@Override
protected void onContentsChanged(int slot) {
if (!world.isRemote) {
TerraFirmaCraft.getNetwork().sendToAllAround(new PacketUpdateWorldItem(TEWorldItem.this),
new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 32));
}
}
};*/

public static final ResourceLocation ID = new ResourceLocation(MOD_ID, "world_item");
//private ItemStack item = ItemStack.EMPTY;

public TEWorldItem(World world){
public TEWorldItem()
{
super();
this.world = world;

this.markDirty();
}
public static final ResourceLocation ID = new ResourceLocation(MOD_ID, "world_item");
private ItemStack item = ItemStack.EMPTY;

public void onBreakBlock()
{
InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), item);
InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inventory.getStackInSlot(0));
}

public void setItem(ItemStack item, boolean doMarkDirty){
/*public void setItem(ItemStack item){
this.item = item;
updateBlock(doMarkDirty);
}
//updateBlock(doMarkDirty);
if(!world.isRemote)
{
this.markDirty();
TerraFirmaCraft.getNetwork().sendToAllAround(new PacketUpdateWorldItem(this),
new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 64));
}
}*/

/*public void setItem(){
}*/

public ItemStack getItem(){
if(item == ItemStack.EMPTY)
updateBlock(false);
/*public ItemStack getItem(){
//if(item == ItemStack.EMPTY)
// updateBlock(false);
return item;
}
}*/

@Override
public void readFromNBT(NBTTagCompound compound)
{
inventory.deserializeNBT(compound.getCompoundTag("inventory"));
super.readFromNBT(compound);
setItem(new ItemStack(compound.getCompoundTag("Item")), false);
//ItemStack stack = new ItemStack(compound.getCompoundTag("Item"));
//TerraFirmaCraft.getLog().debug("Trying to load state + "+compound.getCompoundTag("Item")+" and "+stack.getDisplayName());
//if(stack != null && !stack.isEmpty())
// setItem(stack);
}

@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound)
{
super.writeToNBT(compound);
compound.setTag("Item", item.writeToNBT(new NBTTagCompound()));
return compound;
compound.setTag("inventory", inventory.serializeNBT());
return super.writeToNBT(compound);
//compound.setTag("Item", item.writeToNBT(new NBTTagCompound()));
//return compound;
}

@Override
public void onLoad(){
updateBlock(false);
//if (world.isRemote) {
// TerraFirmaCraft.getNetwork().sendToServer(new PacketRequestWorldItem(this));
//}
// updateBlock(false);
}

public void updateBlock(boolean doMarkDirty)
/*public void updateBlock(boolean doMarkDirty)
{
if(world == null) return;
IBlockState state = world.getBlockState(pos);
world.notifyBlockUpdate(pos, state, state, 2); // sync TE
if(doMarkDirty)
markDirty();
}
}*/

@Nullable
/*@Nullable
@Override
public SPacketUpdateTileEntity getUpdatePacket()
{
Expand All @@ -99,9 +124,9 @@ public NBTTagCompound getUpdateTag()
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt)
{
//readFromNBT(pkt.getNbtCompound());
setItem(new ItemStack(pkt.getNbtCompound()), false);
setItem(new ItemStack(pkt.getNbtCompound()));
//updateBlock();
}
}*/

@Override
@SideOnly(Side.CLIENT)
Expand Down

0 comments on commit c552da0

Please sign in to comment.