Skip to content

Commit bdfbe3d

Browse files
geiger counter (WORKING!!!)
1 parent e551953 commit bdfbe3d

7 files changed

Lines changed: 148 additions & 1 deletion

File tree

src/main/java/net/tcmfatbird/tutorialmod/TutorialMod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.tcmfatbird.tutorialmod.item.ModItemGroups;
2020
import net.tcmfatbird.tutorialmod.item.ModItems;
2121
import net.tcmfatbird.tutorialmod.network.BlockHighlightPacket;
22+
import net.tcmfatbird.tutorialmod.network.RadiationLevelPacket;
2223
import net.tcmfatbird.tutorialmod.util.ChatFormatter;
2324
import net.minecraft.text.MutableText;
2425
import net.minecraft.text.Text;
@@ -42,6 +43,7 @@ public class TutorialMod implements ModInitializer {
4243
public void onInitialize() {
4344
MutationEnchantment.register();
4445
PayloadTypeRegistry.playC2S().register(SetTimePacket.ID, SetTimePacket.CODEC);
46+
PayloadTypeRegistry.playS2C().register(RadiationLevelPacket.ID, RadiationLevelPacket.CODEC);
4547

4648
ServerPlayNetworking.registerGlobalReceiver(SetTimePacket.ID, (payload, context) -> {
4749
context.server().execute(() -> {

src/main/java/net/tcmfatbird/tutorialmod/TutorialModClient.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
import net.minecraft.text.Text;
1010
import net.minecraft.util.Formatting;
1111
import net.tcmfatbird.tutorialmod.feature.BlockHighlightRenderer;
12+
import net.tcmfatbird.tutorialmod.feature.GeigerCounterClient;
1213
import net.tcmfatbird.tutorialmod.gui.ClockScreen;
14+
import net.tcmfatbird.tutorialmod.item.ModItems;
1315
import net.tcmfatbird.tutorialmod.network.BlockHighlightPacket;
1416
import net.tcmfatbird.tutorialmod.network.ClockTogglePacket;
17+
import net.tcmfatbird.tutorialmod.network.RadiationLevelPacket;
1518
import org.lwjgl.glfw.GLFW;
1619

1720
public class TutorialModClient implements ClientModInitializer {
@@ -29,6 +32,12 @@ public void onInitializeClient() {
2932
"key.category.tutorialmod"
3033
));
3134

35+
ClientPlayNetworking.registerGlobalReceiver(RadiationLevelPacket.ID, (payload, context) -> {
36+
context.client().execute(() -> {
37+
GeigerCounterClient.setRadiationLevel(payload.level());
38+
});
39+
});
40+
3241
// --- REGISTER C2S PACKET ---
3342
//PayloadTypeRegistry.playC2S().register(SetTimePacket.ID, SetTimePacket.CODEC);
3443

@@ -54,6 +63,20 @@ public void onInitializeClient() {
5463

5564
// --- TICK ---
5665
ClientTickEvents.END_CLIENT_TICK.register(client -> {
66+
67+
if (client.player == null) {
68+
GeigerCounterClient.reset();
69+
} else {
70+
boolean holdingGeiger = client.player.getMainHandStack().isOf(ModItems.GEIGER_COUNTER)
71+
|| client.player.getOffHandStack().isOf(ModItems.GEIGER_COUNTER);
72+
73+
if (holdingGeiger) {
74+
GeigerCounterClient.tick(client);
75+
} else {
76+
GeigerCounterClient.reset();
77+
}
78+
}
79+
5780
BlockHighlightRenderer.tick();
5881

5982
// Open clock GUI on keypress
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package net.tcmfatbird.tutorialmod.feature;
2+
3+
import net.minecraft.client.MinecraftClient;
4+
import net.minecraft.sound.SoundEvents;
5+
import net.minecraft.sound.SoundCategory;
6+
7+
public class GeigerCounterClient {
8+
9+
private static int radiationLevel = 0;
10+
private static int tickCounter = 0;
11+
12+
// Beep every N ticks depending on level
13+
private static final int[] BEEP_INTERVALS = {40, 15, 4};
14+
15+
public static void setRadiationLevel(int level) {
16+
radiationLevel = level;
17+
}
18+
19+
public static void tick(MinecraftClient client) {
20+
if (client.world == null || client.player == null) return;
21+
22+
tickCounter++;
23+
int interval = BEEP_INTERVALS[radiationLevel];
24+
25+
if (tickCounter >= interval) {
26+
tickCounter = 0;
27+
client.world.playSound(
28+
client.player.getX(),
29+
client.player.getY(),
30+
client.player.getZ(),
31+
SoundEvents.BLOCK_STONE_BUTTON_CLICK_ON,
32+
SoundCategory.PLAYERS,
33+
radiationLevel == 2 ? 0.4f : 0.2f,
34+
radiationLevel == 2 ? 1.8f : 1.2f,
35+
false
36+
);
37+
}
38+
}
39+
40+
public static void reset() {
41+
radiationLevel = 0;
42+
tickCounter = 0;
43+
}
44+
}

src/main/java/net/tcmfatbird/tutorialmod/feature/UraniumRadiationHandler.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
import java.util.Map;
1515
import java.util.UUID;
1616

17+
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
18+
import net.tcmfatbird.tutorialmod.item.ModItems;
19+
import net.tcmfatbird.tutorialmod.network.RadiationLevelPacket;
20+
1721
public class UraniumRadiationHandler {
1822
private static final int CHECK_RADIUS = 3;
1923
private static final int EXPOSURE_THRESHOLD_TICKS = 100;
@@ -30,7 +34,9 @@ private static void onWorldTick(ServerWorld world) {
3034
UUID uuid = player.getUuid();
3135
int exposure = exposureTicks.getOrDefault(uuid, 0);
3236

33-
if (isNearUraniumOre(world, player.getBlockPos())) {
37+
boolean nearUranium = isNearUraniumOre(world, player.getBlockPos());
38+
39+
if (nearUranium) {
3440
exposure = Math.min(MAX_EXPOSURE, exposure + 1);
3541
} else {
3642
exposure = Math.max(0, exposure - 2);
@@ -45,11 +51,42 @@ private static void onWorldTick(ServerWorld world) {
4551
} else {
4652
exposureTicks.put(uuid, exposure);
4753
}
54+
55+
// Geiger counter logic
56+
boolean holdingGeiger = player.getMainHandStack().isOf(ModItems.GEIGER_COUNTER)
57+
|| player.getOffHandStack().isOf(ModItems.GEIGER_COUNTER);
58+
59+
if (holdingGeiger) {
60+
int level = getRadiationLevel(world, player.getBlockPos());
61+
ServerPlayNetworking.send(player, new RadiationLevelPacket(level));
62+
}
4863
}
4964

5065
cleanupDisconnectedPlayers(world);
5166
}
5267

68+
private static int getRadiationLevel(ServerWorld world, BlockPos center) {
69+
if (isNearUraniumOreInRadius(world, center, 4)) return 2;
70+
if (isNearUraniumOreInRadius(world, center, 10)) return 1;
71+
return 0;
72+
}
73+
74+
private static boolean isNearUraniumOreInRadius(ServerWorld world, BlockPos center, int radius) {
75+
BlockPos.Mutable mutablePos = new BlockPos.Mutable();
76+
for (int x = -radius; x <= radius; x++) {
77+
for (int y = -radius; y <= radius; y++) {
78+
for (int z = -radius; z <= radius; z++) {
79+
mutablePos.set(center.getX() + x, center.getY() + y, center.getZ() + z);
80+
Block block = world.getBlockState(mutablePos).getBlock();
81+
if (block == ModBlocks.URANIUM_ORE || block == ModBlocks.URANIUM_DEEPSLATE_ORE) {
82+
return true;
83+
}
84+
}
85+
}
86+
}
87+
return false;
88+
}
89+
5390
private static boolean isNearUraniumOre(ServerWorld world, BlockPos center) {
5491
BlockPos.Mutable mutablePos = new BlockPos.Mutable();
5592

src/main/java/net/tcmfatbird/tutorialmod/item/ModItems.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public static void registerModItems() {
5353
ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register(fabricItemGroupEntries -> {
5454
fabricItemGroupEntries.add(PINK_GARNET);
5555
fabricItemGroupEntries.add(RAW_PINK_GARNET);
56+
fabricItemGroupEntries.add(GEIGER_COUNTER);
5657
});
5758
}
5859
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package net.tcmfatbird.tutorialmod.network;
2+
3+
import net.minecraft.network.RegistryByteBuf;
4+
import net.minecraft.network.codec.PacketCodec;
5+
import net.minecraft.network.codec.PacketCodecs;
6+
import net.minecraft.network.packet.CustomPayload;
7+
import net.minecraft.util.Identifier;
8+
9+
public record RadiationLevelPacket(int level) implements CustomPayload {
10+
// 0 = none, 1 = far (10 blocks), 2 = close (4 blocks)
11+
12+
public static final Id<RadiationLevelPacket> ID =
13+
new Id<>(Identifier.of("tutorialmod", "radiation_level"));
14+
15+
public static final PacketCodec<RegistryByteBuf, RadiationLevelPacket> CODEC =
16+
PacketCodecs.INTEGER
17+
.xmap(RadiationLevelPacket::new, RadiationLevelPacket::level)
18+
.cast();
19+
20+
@Override
21+
public Id<? extends CustomPayload> getId() { return ID; }
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"type": "minecraft:crafting_shaped",
3+
"show_notification": true,
4+
"category": "equipment",
5+
"key": {
6+
"#": {"item": "minecraft:iron_nugget"},
7+
"X": {"item": "minecraft:redstone"},
8+
"G": {"item": "minecraft:gold_ingot"}
9+
},
10+
"pattern": [
11+
"#G#",
12+
"GXG"
13+
],
14+
"result": {
15+
"count": 1,
16+
"id": "tutorialmod:geiger_counter"
17+
}
18+
}

0 commit comments

Comments
 (0)