package com.hea3ven.hardmodetweaks.sleep; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; import net.minecraftforge.common.util.Constants.NBT; import static com.hea3ven.hardmodetweaks.sleep.SleepManager.sleepPreventionTimeout; public class BedPlacements extends WorldSavedData { private Map<BlockPos, Long> placements = new HashMap<>(); public BedPlacements(String name) { super(name); } @Override public void readFromNBT(NBTTagCompound nbt) { NBTTagList placeNbt = nbt.getTagList("bedPlacements", NBT.TAG_COMPOUND); for (int i = 0; i < placeNbt.tagCount(); i++) { NBTTagCompound placementNbt = placeNbt.getCompoundTagAt(i); placements.put(BlockPos.fromLong(placementNbt.getLong("pos")), placementNbt.getLong("time")); } } @Override public void writeToNBT(NBTTagCompound nbt) { NBTTagList placeNbt = new NBTTagList(); for (Entry<BlockPos, Long> entry : placements.entrySet()) { NBTTagCompound placementNbt = new NBTTagCompound(); placementNbt.setLong("pos", entry.getKey().toLong()); placementNbt.setLong("time", entry.getValue()); placeNbt.appendTag(placementNbt); } nbt.setTag("bedPlacements", placeNbt); } public void onBedPlaced(World world, BlockPos pos) { placements.put(pos, world.getTotalWorldTime()); markDirty(); } public boolean canSleep(Entity entity, BlockPos pos) { Long placement = placements.get(pos); if (placement == null) return true; if ((entity.worldObj.getTotalWorldTime() - placement) > sleepPreventionTimeout) { placements.remove(pos); return true; } return false; } }