Posted October 21, 20204 yr 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); } }
October 23, 20204 yr Author On 10/21/2020 at 9:41 PM, diesieben07 said: Why are you not using a TileEntity for this? For what exactly?
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.