diff options
| -rw-r--r-- | .github/workflows/build-docs.yml | 80 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | Writerside/c.list | 6 | ||||
| -rw-r--r-- | Writerside/cfg/buildprofiles.xml | 13 | ||||
| -rw-r--r-- | Writerside/md.tree | 12 | ||||
| -rw-r--r-- | Writerside/topics/configuration.md | 71 | ||||
| -rw-r--r-- | Writerside/topics/introduction.md | 14 | ||||
| -rw-r--r-- | Writerside/topics/usage.md | 13 | ||||
| -rw-r--r-- | Writerside/v.list | 5 | ||||
| -rw-r--r-- | Writerside/writerside.cfg | 8 | ||||
| -rw-r--r-- | src/client/java/world/anhgelus/molehunt/client/MolehuntClient.java | 12 | ||||
| -rw-r--r-- | src/client/java/world/anhgelus/molehunt/client/mixin/NoNametags.java | 2 | ||||
| -rw-r--r-- | src/client/java/world/anhgelus/molehunt/client/mixin/NoPlayerListHud.java | 2 | ||||
| -rw-r--r-- | src/client/java/world/anhgelus/molehunt/client/mixin/NoSkin.java | 2 | ||||
| -rw-r--r-- | src/main/java/world/anhgelus/molehunt/Molehunt.java | 17 | ||||
| -rw-r--r-- | src/main/java/world/anhgelus/molehunt/game/Game.java (renamed from src/main/java/world/anhgelus/molehunt/Game.java) | 14 | ||||
| -rw-r--r-- | src/main/java/world/anhgelus/molehunt/game/GamePayload.java | 23 |
17 files changed, 286 insertions, 10 deletions
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 0000000..84f9cb0 --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,80 @@ +name: Build documentation
+
+on:
+ push:
+ branches: ["main"]
+ workflow_dispatch:
+
+permissions:
+ id-token: write
+ pages: write
+
+env:
+ INSTANCE: 'Writerside/md'
+ ARTIFACT: 'webHelpMD2-all.zip'
+ DOCKER_VERSION: '241.18775'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Build docs using Writerside Docker builder
+ uses: JetBrains/writerside-github-action@v4
+ with:
+ instance: ${{ env.INSTANCE }}
+ artifact: ${{ env.ARTIFACT }}
+ docker-version: ${{ env.DOCKER_VERSION }}
+
+ - name: Save artifact with build results
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs
+ path: |
+ artifacts/${{ env.ARTIFACT }}
+ artifacts/report.json
+ retention-days: 7
+ test:
+ needs: build
+ runs-on: ubuntu-latest
+ steps:
+ - name: Download artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: docs
+ path: artifacts
+
+ - name: Test documentation
+ uses: JetBrains/writerside-checker-action@v1
+ with:
+ instance: ${{ env.INSTANCE }}
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: [build, test]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Download artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: docs
+
+ - name: Unzip artifact
+ run: unzip -O UTF-8 -qq '${{ env.ARTIFACT }}' -d dir
+
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+
+ - name: Package and upload Pages artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: dir
+
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
@@ -2,6 +2,8 @@ Molehunt is a Minecraft mod creating the game with the same name in this cubic game.
+A complete wiki is available [here](https://www.anhgelus.world/molehunt/introduction.html).
+
## Usage
Install the mod on the server and on all clients.
diff --git a/Writerside/c.list b/Writerside/c.list new file mode 100644 index 0000000..c4c77a2 --- /dev/null +++ b/Writerside/c.list @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE categories + SYSTEM "https://resources.jetbrains.com/writerside/1.0/categories.dtd"> +<categories> + <category id="wrs" name="Writerside documentation" order="1"/> +</categories>
\ No newline at end of file diff --git a/Writerside/cfg/buildprofiles.xml b/Writerside/cfg/buildprofiles.xml new file mode 100644 index 0000000..8ddb9c7 --- /dev/null +++ b/Writerside/cfg/buildprofiles.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE buildprofiles SYSTEM "https://resources.jetbrains.com/writerside/1.0/build-profiles.dtd"> +<buildprofiles xsi:noNamespaceSchemaLocation="https://resources.jetbrains.com/writerside/1.0/build-profiles.xsd" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <variables></variables> + <build-profile instance="md"> + <variables> + <noindex-content>true</noindex-content> + </variables> + </build-profile> + +</buildprofiles> diff --git a/Writerside/md.tree b/Writerside/md.tree new file mode 100644 index 0000000..d77dee5 --- /dev/null +++ b/Writerside/md.tree @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE instance-profile + SYSTEM "https://resources.jetbrains.com/writerside/1.0/product-profile.dtd"> + +<instance-profile id="md" + name="Molehunt Docs" + start-page="introduction.md"> + + <toc-element topic="introduction.md"/> + <toc-element topic="configuration.md"/> + <toc-element topic="usage.md"/> +</instance-profile>
\ No newline at end of file diff --git a/Writerside/topics/configuration.md b/Writerside/topics/configuration.md new file mode 100644 index 0000000..e6fc92a --- /dev/null +++ b/Writerside/topics/configuration.md @@ -0,0 +1,71 @@ +# Configuration + +The mod has two configurations. +The first one modifies the settings of the current world. +The second one modifies the default settings of all your worlds. + +## Common concept + +- Game's duration: `game_duration` (or `gameDuration`). +Sets the game's duration in minutes (default: 90). +- Percentage of mole: `mole_percentage` (or `molePercentage`). +Sets the percentage of mole (default: 25). +- Number of mole: `mole_count` (or `moleCount`). +Sets the number of mole (default: -1). +If you want to use the percentage of mole instead, set this value to -1. +- Enable players' nametag: `show_nametags` (or `showNametags`). +Players' nametag is visible (default: false). +- Enable players' skin: `show_skins` (or `showSkins`). +Players' skin is visible (default: false). +- Enable tab: `show_tab` (or `showTab`). +Tab can be used (default: false). + +Every clientside rules (nametag, skin and tab) are only used by the client during a game. +Before and after the game, they are not used. + +## Configuration per world + +All settings can be modified via gamerules. + +Every gamerule related to this mod starts with the prefix `molehunt:`. + +## Modifying default configuration + +> These settings do not override the configuration per world! +{style="note"} + +A configuration file is available inside the `config` folder. +This is `molehunt.properties`. + +### Default configuration + +```ini +# Molehunt mod configuration file + +# The duration of a molehunt game, in minutes. +# Default: 90 minutes (1 hour 30 minutes). +game_duration = 90 + +# Mole percentage. +# For example, a mole percentage of 25% will get 1 mole every 4 players. +# Default: 25 %. +mole_percentage = 25 + +# Mole count (absolute). +# This setting will overwrite the mole_percentage setting. +# If set below 0, this setting is disabled. +# Default: -1. +mole_count = -1 + +# Show nametags +# Default: false +show_nametags = false + +# Show skins +# Default: false +show_skins = false + +# Show tab +# Default: false +show_tab = false +``` diff --git a/Writerside/topics/introduction.md b/Writerside/topics/introduction.md new file mode 100644 index 0000000..f1fa63e --- /dev/null +++ b/Writerside/topics/introduction.md @@ -0,0 +1,14 @@ +# Introduction + +[Molehunt](https://modrinth.com/mod/molehunt-mod) is a mod creating the Molehunt game in Minecraft. +You can watch this [video](https://www.youtube.com/watch?v=NJBjQ8T_1cc) to understand what it is. +If you are speaking French, I made this [30 seconds video](https://cdn.anhgelus.world/molehunt-presentation.mp4) explaining the concept. + +## Installation + +Download the mod for your version. + +The mod requires [Fabric-API](https://modrinth.com/mod/fabric-api) to works. +[Simple Voice Chat](https://modrinth.com/plugin/simple-voice-chat) is highly recommended. + +The mod has to be installed on the server *and* on every client. diff --git a/Writerside/topics/usage.md b/Writerside/topics/usage.md new file mode 100644 index 0000000..2a02033 --- /dev/null +++ b/Writerside/topics/usage.md @@ -0,0 +1,13 @@ +# Usage + +To start a game, execute `/molehunt start`. +You must be OP. + +To stop a game, execute `/molehunt stop`. +You must be OP. +(They are already an automatic end if there is no more survivors or if the time is over.) + +To get the list of moles, use `/molehunt moles`. +You must be a mole. + +To edit the timer above the hotbar, use `/molehunt timer show` to enable and `/molehunt timer hide` to disable. diff --git a/Writerside/v.list b/Writerside/v.list new file mode 100644 index 0000000..2d12cb3 --- /dev/null +++ b/Writerside/v.list @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE vars SYSTEM "https://resources.jetbrains.com/writerside/1.0/vars.dtd"> +<vars> + <var name="product" value="Writerside"/> +</vars> diff --git a/Writerside/writerside.cfg b/Writerside/writerside.cfg new file mode 100644 index 0000000..1e00bbe --- /dev/null +++ b/Writerside/writerside.cfg @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE ihp SYSTEM "https://resources.jetbrains.com/writerside/1.0/ihp.dtd"> + +<ihp version="2.0"> + <topics dir="topics" web-path="topics"/> + <images dir="images" web-path="images"/> + <instance src="md.tree" web-path="molehunt" version="1.1.0"/> +</ihp>
\ No newline at end of file diff --git a/src/client/java/world/anhgelus/molehunt/client/MolehuntClient.java b/src/client/java/world/anhgelus/molehunt/client/MolehuntClient.java index 1f92573..c8a4d95 100644 --- a/src/client/java/world/anhgelus/molehunt/client/MolehuntClient.java +++ b/src/client/java/world/anhgelus/molehunt/client/MolehuntClient.java @@ -3,6 +3,7 @@ package world.anhgelus.molehunt.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import world.anhgelus.molehunt.config.ConfigPayload; +import world.anhgelus.molehunt.game.GamePayload; public class MolehuntClient implements ClientModInitializer { @@ -10,6 +11,8 @@ public class MolehuntClient implements ClientModInitializer { private static boolean SHOW_NAMETAGS = false; private static boolean SHOW_TAB = false; + private static boolean GAME_STARTED = false; + @Override public void onInitializeClient() { ClientPlayNetworking.registerGlobalReceiver(ConfigPayload.ID, (payload, context) -> { @@ -19,6 +22,11 @@ public class MolehuntClient implements ClientModInitializer { SHOW_TAB = payload.showTab(); }); }); + ClientPlayNetworking.registerGlobalReceiver(GamePayload.ID, (payload, context) -> { + context.client().execute(() -> { + GAME_STARTED = payload.gameLaunched(); + }); + }); } public static boolean showSkins() { @@ -32,4 +40,8 @@ public class MolehuntClient implements ClientModInitializer { public static boolean showTab() { return SHOW_TAB; } + + public static boolean gameStarted() { + return GAME_STARTED; + } } diff --git a/src/client/java/world/anhgelus/molehunt/client/mixin/NoNametags.java b/src/client/java/world/anhgelus/molehunt/client/mixin/NoNametags.java index 3482abb..7f334a0 100644 --- a/src/client/java/world/anhgelus/molehunt/client/mixin/NoNametags.java +++ b/src/client/java/world/anhgelus/molehunt/client/mixin/NoNametags.java @@ -15,7 +15,7 @@ import world.anhgelus.molehunt.client.MolehuntClient; public class NoNametags<T extends Entity> {
@Inject(at = @At("HEAD"), method = "render", cancellable = true)
private void renderLabelOrNot(T entity, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) {
- if (!(entity instanceof PlayerEntity) || MolehuntClient.showNameTags()) return;
+ if (!(entity instanceof PlayerEntity) || MolehuntClient.showNameTags() || !MolehuntClient.gameStarted()) return;
ci.cancel();
}
}
\ No newline at end of file diff --git a/src/client/java/world/anhgelus/molehunt/client/mixin/NoPlayerListHud.java b/src/client/java/world/anhgelus/molehunt/client/mixin/NoPlayerListHud.java index 00308ea..4473b12 100644 --- a/src/client/java/world/anhgelus/molehunt/client/mixin/NoPlayerListHud.java +++ b/src/client/java/world/anhgelus/molehunt/client/mixin/NoPlayerListHud.java @@ -11,7 +11,7 @@ import world.anhgelus.molehunt.client.MolehuntClient; public class NoPlayerListHud {
@Inject(at = @At("HEAD"), method = "render", cancellable = true)
public void render(CallbackInfo ci) {
- if (MolehuntClient.showTab()) return;
+ if (MolehuntClient.showTab() || !MolehuntClient.gameStarted()) return;
ci.cancel();
}
}
diff --git a/src/client/java/world/anhgelus/molehunt/client/mixin/NoSkin.java b/src/client/java/world/anhgelus/molehunt/client/mixin/NoSkin.java index 775d789..6638c1b 100644 --- a/src/client/java/world/anhgelus/molehunt/client/mixin/NoSkin.java +++ b/src/client/java/world/anhgelus/molehunt/client/mixin/NoSkin.java @@ -14,7 +14,7 @@ import world.anhgelus.molehunt.client.MolehuntClient; public class NoSkin {
@Inject(at = @At("HEAD"), method = "getSkinTextures", cancellable = true)
public void getSkin(CallbackInfoReturnable<SkinTextures> cir) {
- if (MolehuntClient.showSkins()) return;
+ if (MolehuntClient.showSkins() || !MolehuntClient.gameStarted()) return;
cir.setReturnValue(new SkinTextures(
Identifier.of(Molehunt.MOD_ID, "textures/skin.png"),
null,
diff --git a/src/main/java/world/anhgelus/molehunt/Molehunt.java b/src/main/java/world/anhgelus/molehunt/Molehunt.java index 7df62fd..450666a 100644 --- a/src/main/java/world/anhgelus/molehunt/Molehunt.java +++ b/src/main/java/world/anhgelus/molehunt/Molehunt.java @@ -24,6 +24,8 @@ import org.slf4j.LoggerFactory; import world.anhgelus.molehunt.config.Config; import world.anhgelus.molehunt.config.ConfigPayload; import world.anhgelus.molehunt.config.SimpleConfig; +import world.anhgelus.molehunt.game.Game; +import world.anhgelus.molehunt.game.GamePayload; import java.util.HashMap; @@ -165,11 +167,18 @@ public class Molehunt implements ModInitializer { newPlayer.changeGameMode(GameMode.SPECTATOR); }); - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> ServerPlayNetworking.send( - handler.player, - new ConfigPayload(CONFIG.areNametagsEnabled(), CONFIG.areSkinsEnabled(), CONFIG.isTabEnabled()) - )); + ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { + ServerPlayNetworking.send( + handler.player, + new ConfigPayload(CONFIG.areNametagsEnabled(), CONFIG.areSkinsEnabled(), CONFIG.isTabEnabled()) + ); + ServerPlayNetworking.send( + handler.player, + new GamePayload(game != null && game.hasStarted()) + ); + }); PayloadTypeRegistry.playS2C().register(ConfigPayload.ID, ConfigPayload.CODEC); + PayloadTypeRegistry.playS2C().register(GamePayload.ID, GamePayload.CODEC); } } diff --git a/src/main/java/world/anhgelus/molehunt/Game.java b/src/main/java/world/anhgelus/molehunt/game/Game.java index 300b4c2..8670f7e 100644 --- a/src/main/java/world/anhgelus/molehunt/Game.java +++ b/src/main/java/world/anhgelus/molehunt/game/Game.java @@ -1,5 +1,6 @@ -package world.anhgelus.molehunt;
+package world.anhgelus.molehunt.game;
+import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket;
import net.minecraft.network.packet.s2c.play.SubtitleS2CPacket;
import net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket;
@@ -9,6 +10,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text;
import net.minecraft.world.GameMode;
import net.minecraft.world.GameRules;
+import world.anhgelus.molehunt.Molehunt;
import world.anhgelus.molehunt.utils.TimeUtils;
import java.util.*;
@@ -104,7 +106,7 @@ public class Game { // reset time and weather
server.getOverworld().setTimeOfDay(0);
server.getOverworld().resetWeather();
- started = true;
+ changeState(true);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
@@ -136,7 +138,7 @@ public class Game { // Stops the border shrinking.
worldBorder.setSize(worldBorder.getSize());
- started = false;
+ changeState(false);
final var pm = server.getPlayerManager();
final var winnerSuspense = new TitleS2CPacket(Text.translatable("molehunt.game.end.suspense.title"));
pm.getPlayerList().forEach(p -> {
@@ -195,4 +197,10 @@ public class Game { public boolean hasStarted() {
return started;
}
+
+ private void changeState(boolean hasStarted) {
+ started = hasStarted;
+ final var payload = new GamePayload(hasStarted);
+ server.getPlayerManager().getPlayerList().forEach(p -> ServerPlayNetworking.send(p, payload));
+ }
}
diff --git a/src/main/java/world/anhgelus/molehunt/game/GamePayload.java b/src/main/java/world/anhgelus/molehunt/game/GamePayload.java new file mode 100644 index 0000000..4f7b8ce --- /dev/null +++ b/src/main/java/world/anhgelus/molehunt/game/GamePayload.java @@ -0,0 +1,23 @@ +package world.anhgelus.molehunt.game;
+
+import net.minecraft.network.RegistryByteBuf;
+import net.minecraft.network.codec.PacketCodec;
+import net.minecraft.network.codec.PacketCodecs;
+import net.minecraft.network.packet.CustomPayload;
+import net.minecraft.util.Identifier;
+import world.anhgelus.molehunt.Molehunt;
+
+public record GamePayload(boolean gameLaunched) implements CustomPayload {
+ public static final Identifier GAME_PACKET_ID = Identifier.of(Molehunt.MOD_ID, "game");
+
+ public static final CustomPayload.Id<GamePayload> ID = new CustomPayload.Id<>(GAME_PACKET_ID);
+ public static final PacketCodec<RegistryByteBuf, GamePayload> CODEC = PacketCodec.tuple(
+ PacketCodecs.BOOL, GamePayload::gameLaunched,
+ GamePayload::new
+ );
+
+ @Override
+ public Id<? extends CustomPayload> getId() {
+ return ID;
+ }
+}
|
