aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build-docs.yml80
-rw-r--r--README.md2
-rw-r--r--Writerside/c.list6
-rw-r--r--Writerside/cfg/buildprofiles.xml13
-rw-r--r--Writerside/md.tree12
-rw-r--r--Writerside/topics/configuration.md71
-rw-r--r--Writerside/topics/introduction.md14
-rw-r--r--Writerside/topics/usage.md13
-rw-r--r--Writerside/v.list5
-rw-r--r--Writerside/writerside.cfg8
-rw-r--r--src/client/java/world/anhgelus/molehunt/client/MolehuntClient.java12
-rw-r--r--src/client/java/world/anhgelus/molehunt/client/mixin/NoNametags.java2
-rw-r--r--src/client/java/world/anhgelus/molehunt/client/mixin/NoPlayerListHud.java2
-rw-r--r--src/client/java/world/anhgelus/molehunt/client/mixin/NoSkin.java2
-rw-r--r--src/main/java/world/anhgelus/molehunt/Molehunt.java17
-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.java23
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
diff --git a/README.md b/README.md
index f739a69..b3de1f7 100644
--- a/README.md
+++ b/README.md
@@ -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;
+ }
+}