Dear Modding Community,
I'm working on an Wireless Redstone Modification, I am using WorldSaveData to save the Receiver and Transmitter Blocks, but the Power Output of my Receiver Block doesn't change. What is wrong?
Thanks in advance
Aaron
RedstoneReceiverList:
public class RedstoneReceiverList extends WorldSavedData {
private static RedstoneReceiverList clientInstance = new RedstoneReceiverList();
public final HashMap<BlockPos, String> receiver = new HashMap<>();
public static final String RECEIVER_ID = BetterRedstone.MOD_ID + "_RECEIVER";
public static RedstoneReceiverList get(World w) {
if(!w.isRemote) {
DimensionSavedDataManager storage = ((ServerWorld) w).getSavedData();
return storage.getOrCreate(RedstoneReceiverList::new, RECEIVER_ID);
}else {
return clientInstance;
}
}
public RedstoneReceiverList() {
super(RECEIVER_ID);
}
public RedstoneReceiverList(String id) {
super(id);
}
@Override
public void read(@Nonnull CompoundNBT nbt) {
this.receiver.clear();
if(nbt.contains("receiver", Constants.NBT.TAG_LIST)) {
ListNBT list = nbt.getList("receiver", Constants.NBT.TAG_COMPOUND);
for(int i = 0; i < list.size(); i++) {
CompoundNBT entryNBT = list.getCompound(i);
if(entryNBT.contains("x") && entryNBT.contains("y") && entryNBT.contains("z") && entryNBT.contains("id")) {
BlockPos pos = new BlockPos(entryNBT.getInt("x"), entryNBT.getInt("y"), entryNBT.getInt("z")).toImmutable();
String id = entryNBT.getString("id");
if(!id.isEmpty()) {
this.receiver.put(pos, entryNBT.getString("id"));
}
}
}
}
}
@Override
public CompoundNBT write(CompoundNBT nbt) {
ListNBT list = new ListNBT();
for(Map.Entry<BlockPos, String> entry : this.receiver.entrySet()) {
CompoundNBT entryNBT = new CompoundNBT();
entryNBT.putInt("x", entry.getKey().getX());
entryNBT.putInt("y", entry.getKey().getY());
entryNBT.putInt("z", entry.getKey().getZ());
entryNBT.putString("id", entry.getValue());
list.add(entryNBT);
}
nbt.put("receiver", list);
return nbt;
}
public void setReceiver(World w, BlockPos pos, @Nullable String id) {
if(!w.isRemote) {
BlockPos immutablePos = pos.toImmutable();
if(id == null || id.trim().isEmpty()) {
if(this.receiver.containsKey(immutablePos)) {
this.receiver.remove(immutablePos);
}
}else{
String oldID = this.receiver.getOrDefault(immutablePos, null);
if(oldID == null || !oldID.equals(id)) {
this.receiver.put(pos.toImmutable(), id);
}
}
this.markDirty();
}
}
public String getReceiver(BlockPos pos) {
return this.receiver.getOrDefault(pos.toImmutable(), null);
}
}
RedstoneTransmitterList:
public class RedstoneTransmitterList extends WorldSavedData {
private static RedstoneTransmitterList clientInstance = new RedstoneTransmitterList();
public final HashMap<BlockPos, String> transmitter = new HashMap<>();
public static final String TRANSMITTER_ID = BetterRedstone.MOD_ID + "_TRANSMITTER";
public static RedstoneTransmitterList get(World w) {
if(!w.isRemote) {
DimensionSavedDataManager storage = ((ServerWorld) w).getSavedData();
return storage.getOrCreate(RedstoneTransmitterList::new, TRANSMITTER_ID);
}else {
return clientInstance;
}
}
public RedstoneTransmitterList() {
super(TRANSMITTER_ID);
}
public RedstoneTransmitterList(String id) {
super(id);
}
@Override
public void read(@Nonnull CompoundNBT nbt) {
this.transmitter.clear();
if(nbt.contains("transmitter", Constants.NBT.TAG_LIST)) {
ListNBT list = nbt.getList("transmitter", Constants.NBT.TAG_COMPOUND);
for(int i = 0; i < list.size(); i++) {
CompoundNBT entryNBT = list.getCompound(i);
if(entryNBT.contains("x") && entryNBT.contains("y") && entryNBT.contains("z") && entryNBT.contains("id")) {
BlockPos pos = new BlockPos(entryNBT.getInt("x"), entryNBT.getInt("y"), entryNBT.getInt("z")).toImmutable();
String id = entryNBT.getString("id");
if(!id.isEmpty()) {
this.transmitter.put(pos, entryNBT.getString("id"));
}
}
}
}
}
@Override
public CompoundNBT write(CompoundNBT nbt) {
ListNBT list = new ListNBT();
for(Map.Entry<BlockPos, String> entry : this.transmitter.entrySet()) {
CompoundNBT entryNBT = new CompoundNBT();
entryNBT.putInt("x", entry.getKey().getX());
entryNBT.putInt("y", entry.getKey().getY());
entryNBT.putInt("z", entry.getKey().getZ());
entryNBT.putString("id", entry.getValue());
list.add(entryNBT);
}
nbt.put("transmitter", list);
return nbt;
}
public void setTransmitter(World w, BlockPos pos, @Nullable String id) {
if(!w.isRemote) {
BlockPos immutablePos = pos.toImmutable();
if(id == null || id.trim().isEmpty()) {
if(this.transmitter.containsKey(immutablePos)) {
this.transmitter.remove(immutablePos);
}
}else{
String oldID = this.transmitter.getOrDefault(immutablePos, null);
if(oldID == null || !oldID.equals(id)) {
this.transmitter.put(pos.toImmutable(), id);
}
}
this.markDirty();
}
}
public String getTransmitter(BlockPos pos) {
return this.transmitter.getOrDefault(pos.toImmutable(), null);
}
}
RedstoneReceiverBlock:
public class RedstoneReceiverBlock extends Block {
public static final IntegerProperty ID = IntegerProperty.create("id", 0, 99);
int power = 0;
public RedstoneReceiverBlock() {
super(AbstractBlock.Properties.create(Material.IRON, MaterialColor.EMERALD));
this.setDefaultState(this.getStateContainer().getBaseState().with(ID, 0));
}
@Override
public boolean canProvidePower(BlockState state) {
return true;
}
@Override
public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) {
return true;
}
@Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
return power;
}
@Override
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
builder.add(ID);
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
super.onBlockPlacedBy(worldIn, pos, state, placer, stack);
RedstoneReceiverList.get(worldIn).setReceiver(worldIn, pos, state.getValues().get(ID).toString());
BlockPos blockPos = getSingleKeyFromValue(RedstoneTransmitterList.get(worldIn).transmitter, state.getValues().get(ID).toString());
if(RedstoneUtil.isPowered(worldIn, blockPos)) {
power = 15;
}else{
power = 0;
}
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
super.onReplaced(state, worldIn, pos, newState, isMoving);
RedstoneReceiverList.get(worldIn).setReceiver(worldIn, pos, null);
}
public static <K, V> K getSingleKeyFromValue(Map<K, V> map, V value) {
for (Map.Entry<K, V> entry : map.entrySet()) {
if (Objects.equals(value, entry.getValue())) {
return entry.getKey();
}
}
return null;
}
}
RedstoneTransmitterBlock:
public class RedstoneTransmitterBlock extends LeverBlock {
public static final IntegerProperty ID = IntegerProperty.create("id", 0, 99);
public RedstoneTransmitterBlock() {
super(AbstractBlock.Properties.create(Material.IRON, MaterialColor.EMERALD));
this.setDefaultState(this.getStateContainer().getBaseState().with(ID, 0));
}
@Override
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
builder.add(ID, FACE, HORIZONTAL_FACING, POWERED);
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
super.onBlockPlacedBy(worldIn, pos, state, placer, stack);
RedstoneTransmitterList.get(worldIn).setTransmitter(worldIn, pos, state.getValues().get(ID).toString());
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
super.onReplaced(state, worldIn, pos, newState, isMoving);
RedstoneTransmitterList.get(worldIn).setTransmitter(worldIn, pos, null);
}
}