-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ec363ed
commit 84d7411
Showing
18 changed files
with
498 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
130 changes: 130 additions & 0 deletions
130
src/main/java/org/teacon/powertool/PowerToolEvents.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
package org.teacon.powertool; | ||
|
||
import net.minecraft.Util; | ||
import net.minecraft.core.BlockPos; | ||
import net.minecraft.server.level.ServerLevel; | ||
import net.minecraft.server.level.ServerPlayer; | ||
import net.minecraft.world.level.ChunkPos; | ||
import net.minecraft.world.level.chunk.ChunkAccess; | ||
import net.minecraft.world.level.chunk.LevelChunk; | ||
import net.neoforged.bus.api.SubscribeEvent; | ||
import net.neoforged.fml.common.EventBusSubscriber; | ||
import net.neoforged.neoforge.event.level.BlockEvent; | ||
import net.neoforged.neoforge.event.level.ChunkWatchEvent; | ||
import net.neoforged.neoforge.event.level.ExplosionEvent; | ||
import net.neoforged.neoforge.network.PacketDistributor; | ||
import org.teacon.powertool.attachment.PowerToolAttachments; | ||
import org.teacon.powertool.network.client.UpdateDisplayChunkDataPacket; | ||
|
||
import javax.annotation.Nullable; | ||
import java.util.ArrayList; | ||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
@EventBusSubscriber(modid = PowerTool.MODID) | ||
public class PowerToolEvents { | ||
|
||
@SubscribeEvent | ||
public static void on(ChunkWatchEvent.Sent event) { | ||
ChunkPos chunkPos = event.getPos(); | ||
List<BlockPos> list = event.getChunk().getData(PowerToolAttachments.DISPLAY_MODE); | ||
PacketDistributor.sendToPlayer( | ||
event.getPlayer(), | ||
new UpdateDisplayChunkDataPacket( | ||
chunkPos.x, | ||
chunkPos.z, | ||
list | ||
) | ||
); | ||
} | ||
|
||
@SubscribeEvent | ||
public static void on(ExplosionEvent.Detonate event) { | ||
Map<ChunkPos, List<BlockPos>> map = new HashMap<>(); | ||
for (BlockPos affectedBlock : event.getAffectedBlocks()) { | ||
map.computeIfAbsent(new ChunkPos(affectedBlock), it -> new ArrayList<>()) | ||
.add(affectedBlock); | ||
} | ||
map.entrySet() | ||
.stream() | ||
.map(it -> Map.entry( | ||
Map.entry( | ||
event.getLevel().getChunk(it.getKey().x, it.getKey().z), | ||
it.getKey() | ||
), | ||
it.getValue() | ||
)) | ||
.collect(Util.toMap()) | ||
.forEach((entry, list) -> { | ||
LevelChunk chunk = entry.getKey(); | ||
ChunkPos pos = entry.getValue(); | ||
for (BlockPos blockPos : list) { | ||
removeDisplayMode( | ||
(ServerLevel) event.getLevel(), | ||
pos, | ||
chunk, | ||
blockPos, | ||
null | ||
); | ||
} | ||
}); | ||
} | ||
|
||
private static void removeDisplayMode( | ||
ServerLevel level, | ||
ChunkPos chunkPos, | ||
ChunkAccess chunk, | ||
BlockPos pos, | ||
@Nullable ServerPlayer player | ||
) { | ||
List<BlockPos> displayEnabledPosList = chunk.getData(PowerToolAttachments.DISPLAY_MODE); | ||
displayEnabledPosList.remove(pos); | ||
chunk.setUnsaved(true); | ||
chunk.setData(PowerToolAttachments.DISPLAY_MODE, displayEnabledPosList); | ||
UpdateDisplayChunkDataPacket data = new UpdateDisplayChunkDataPacket( | ||
chunkPos.x, | ||
chunkPos.z, | ||
displayEnabledPosList | ||
); | ||
if (player == null) { | ||
PacketDistributor.sendToPlayersTrackingChunk( | ||
level, | ||
chunkPos, | ||
data | ||
); | ||
return; | ||
} | ||
PacketDistributor.sendToPlayer( | ||
player, | ||
data | ||
); | ||
} | ||
|
||
private static void removeDisplayMode( | ||
ServerLevel level, | ||
BlockPos pos, | ||
@Nullable ServerPlayer player | ||
) { | ||
ChunkPos chunkPos = new ChunkPos(pos); | ||
ChunkAccess chunk = level.getChunk(pos); | ||
removeDisplayMode( | ||
level, | ||
chunkPos, | ||
chunk, | ||
pos, | ||
player | ||
); | ||
} | ||
|
||
@SubscribeEvent | ||
public static void on(BlockEvent.BreakEvent event) { | ||
ServerLevel level = (ServerLevel) event.getLevel(); | ||
BlockPos pos = event.getPos(); | ||
removeDisplayMode( | ||
level, | ||
pos, | ||
(ServerPlayer) event.getPlayer() | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
src/main/java/org/teacon/powertool/client/DisplayModeClient.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
package org.teacon.powertool.client; | ||
|
||
import net.minecraft.client.Minecraft; | ||
import net.minecraft.client.gui.screens.Screen; | ||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; | ||
import net.minecraft.core.BlockPos; | ||
import net.minecraft.world.entity.player.Player; | ||
import net.minecraft.world.inventory.AbstractContainerMenu; | ||
import net.minecraft.world.level.ChunkPos; | ||
|
||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
public class DisplayModeClient { | ||
public static final DisplayModeClient INSTANCE = new DisplayModeClient(); | ||
private final Map<ChunkPos, List<BlockPos>> data = new HashMap<>(); | ||
private BlockPos interactionSourcePos = null; | ||
|
||
public boolean isDisplayModeEnabledOn(Screen screen) { | ||
Player player = Minecraft.getInstance().player; | ||
if (player == null || interactionSourcePos == null || player.getAbilities().instabuild) { | ||
return false; | ||
} | ||
if (screen instanceof AbstractContainerScreen<? extends AbstractContainerMenu> abstractContainerScreen) { | ||
ChunkPos pos = new ChunkPos(interactionSourcePos); | ||
if (data.containsKey(pos)){ | ||
return data.get(pos).contains(interactionSourcePos); | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
public void clear() { | ||
data.clear(); | ||
} | ||
|
||
public void updateInteractionSource(BlockPos pos){ | ||
this.interactionSourcePos = pos; | ||
} | ||
|
||
public void update(ChunkPos chunkPos, List<BlockPos> blockPosList) { | ||
data.put(chunkPos, blockPosList); | ||
} | ||
} |
98 changes: 98 additions & 0 deletions
98
src/main/java/org/teacon/powertool/item/DisplayModeToolItem.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
package org.teacon.powertool.item; | ||
|
||
import net.minecraft.ChatFormatting; | ||
import net.minecraft.MethodsReturnNonnullByDefault; | ||
import net.minecraft.core.BlockPos; | ||
import net.minecraft.network.chat.Component; | ||
import net.minecraft.server.level.ServerPlayer; | ||
import net.minecraft.world.InteractionResult; | ||
import net.minecraft.world.MenuProvider; | ||
import net.minecraft.world.entity.player.Player; | ||
import net.minecraft.world.item.Item; | ||
import net.minecraft.world.item.ItemStack; | ||
import net.minecraft.world.item.TooltipFlag; | ||
import net.minecraft.world.item.context.UseOnContext; | ||
import net.minecraft.world.level.ChunkPos; | ||
import net.minecraft.world.level.Level; | ||
import net.minecraft.world.level.block.state.BlockState; | ||
import net.minecraft.world.level.chunk.ChunkAccess; | ||
import net.neoforged.neoforge.network.PacketDistributor; | ||
import org.teacon.powertool.attachment.PowerToolAttachments; | ||
import org.teacon.powertool.network.client.UpdateDisplayChunkDataPacket; | ||
import org.teacon.powertool.utils.VanillaUtils; | ||
|
||
import javax.annotation.ParametersAreNonnullByDefault; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
@MethodsReturnNonnullByDefault | ||
@ParametersAreNonnullByDefault | ||
public class DisplayModeToolItem extends Item { | ||
public DisplayModeToolItem(Properties properties) { | ||
super(properties); | ||
} | ||
|
||
@Override | ||
public boolean isFoil(ItemStack stack) { | ||
return true; | ||
} | ||
|
||
@Override | ||
public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) { | ||
tooltipComponents.add( | ||
Component.translatable("tooltip.powertool.display_tool") | ||
.withStyle(ChatFormatting.GRAY) | ||
); | ||
} | ||
|
||
@Override | ||
public InteractionResult useOn(UseOnContext context) { | ||
Level level = context.getLevel(); | ||
BlockPos pos = context.getClickedPos(); | ||
Player player = context.getPlayer(); | ||
if (player == null || !player.getAbilities().instabuild) { | ||
return InteractionResult.FAIL; | ||
} | ||
if (context.getLevel().isClientSide) { | ||
return InteractionResult.SUCCESS; | ||
} | ||
BlockState blockState = level.getBlockState(pos); | ||
MenuProvider menuProvider = blockState.getMenuProvider(level, pos); | ||
Component blockName = VanillaUtils.getName(blockState.getBlock()); | ||
if (menuProvider == null) { | ||
player.displayClientMessage( | ||
Component.translatable("powertool.gui.display_mode_error", blockName) | ||
.withStyle(ChatFormatting.RED), | ||
true | ||
); | ||
return InteractionResult.SUCCESS; | ||
} | ||
ChunkPos chunkPos = new ChunkPos(pos); | ||
ChunkAccess chunk = level.getChunkAt(pos); | ||
List<BlockPos> displayEnabledPosList = new ArrayList<>(chunk.getData(PowerToolAttachments.DISPLAY_MODE)); | ||
if (displayEnabledPosList.contains(pos)) { | ||
displayEnabledPosList.remove(pos); | ||
player.displayClientMessage( | ||
Component.translatable("powertool.gui.display_mode_disabled", blockName), | ||
true | ||
); | ||
} else { | ||
displayEnabledPosList.add(pos); | ||
player.displayClientMessage( | ||
Component.translatable("powertool.gui.display_mode_enabled", blockName), | ||
true | ||
); | ||
} | ||
chunk.setUnsaved(true); | ||
chunk.setData(PowerToolAttachments.DISPLAY_MODE, displayEnabledPosList); | ||
PacketDistributor.sendToPlayer( | ||
(ServerPlayer) player, | ||
new UpdateDisplayChunkDataPacket( | ||
chunkPos.x, | ||
chunkPos.z, | ||
displayEnabledPosList | ||
) | ||
); | ||
return InteractionResult.SUCCESS; | ||
} | ||
} |
Oops, something went wrong.