Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
720183c
Refactor NameTagService to use A_DUTY_PREFIX for display name checks
rettichlp May 11, 2026
fac1dbc
Pathfind fix README
rettichlp May 11, 2026
19a6412
Add "dead" state tracking and integrate it into command processing an…
rettichlp May 11, 2026
d043938
Merge pull request #375 from UnicacityAddon/bugfix/aduty-not-detected…
rettichlp May 11, 2026
8bbc297
Merge pull request #377 from UnicacityAddon/bugfix/health-command-on-…
rettichlp May 11, 2026
07c7111
Refine AFK team check logic to include collision rule validation
rettichlp May 11, 2026
686b29f
Merge pull request #378 from UnicacityAddon/bugfix/afk-not-detected-a…
rettichlp May 11, 2026
b9daccf
Remove custom player list entry ordering logic in PlayerListHudMixin
rettichlp May 11, 2026
a1c13df
Remove player-list sorting description from README.md
rettichlp May 11, 2026
bf50e21
Merge pull request #379 from UnicacityAddon/bugfix/playerlist-not-wor…
rettichlp May 11, 2026
292c687
Remove no longer necessary options in NameTagOptionsScreen
rettichlp May 11, 2026
842fb5c
Remove PlayerEntityMixin as it is no longer required
rettichlp May 11, 2026
d9f7043
Add support for new name tag options and refactor related logic
rettichlp May 11, 2026
891d4b1
Clean up NameTagService
rettichlp May 11, 2026
0d94891
Simplify player name extraction logic in PlayerEntityRendererMixin
rettichlp May 11, 2026
9827c1c
Centralize name tag definitions in NameTagService and simplify Player…
rettichlp May 11, 2026
3556e27
Merge pull request #380 from UnicacityAddon/bugfix/nametags-not-worki…
rettichlp May 11, 2026
00c2261
Remove unused classes and simplify related services and components
rettichlp May 11, 2026
5c5c9ad
Merge pull request #381 from UnicacityAddon/bugfix/remove-unused-methods
rettichlp May 11, 2026
52ee79d
Allow superusers to execute BlackMarket and Dealer commands regardles…
rettichlp May 11, 2026
03b2ccf
Resolve code inspection findings
rettichlp May 11, 2026
40d248e
Add "Faction" translations to localization files
rettichlp May 11, 2026
dca5de2
Merge pull request #382 from UnicacityAddon/bugfix/enable-dealer-and-…
rettichlp May 11, 2026
4e0305e
Merge pull request #383 from UnicacityAddon/bugfix/faction-chat-text-…
rettichlp May 11, 2026
3b1f3ac
Remove unused countdown logic in PlayerListener
rettichlp May 11, 2026
629ccbc
Merge pull request #384 from UnicacityAddon/bugfix/graveyard-countdow…
rettichlp May 11, 2026
9f93117
Remove "OUTLAW_TAG" and related logic from NameTagService and PlayerE…
rettichlp May 11, 2026
78f6182
Merge pull request #385 from UnicacityAddon/bugfix/remove-outlaw-nametag
rettichlp May 11, 2026
5a4f741
bump: update mod version to 2.6.1
rettichlp May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ reibungsloser und angenehmer gestalten.

- Sollte ein Command mit einem Großbuchstaben eingegeben werden (z. B. `/Afk` statt `/afk`) wird dieser Command automatisch zu einem
gültigen Command umgewandelt
- Die Tabliste wird nach Teammitgliedern und Fraktionen (FBI, Polizei, Rettungsdienst, News) sortiert
- Als Business-Besitzer wird in der Business-Info ein Button angezeigt, um die Einnahmen direkt abzubuchen
- Wirft man eine Glasflasche in der Nähe eines Shops weg, wird diese als Pfand abgegeben
- Es wird angezeigt wie lang der Cooldown für Bandagen, Schmerzpillen und Absorption ist
Expand All @@ -31,7 +30,7 @@ reibungsloser und angenehmer gestalten.

### Fraktionen

- Hinter dem Spielernamen befindet sich ein Symbol, um die dazugehörige Fraktion zu erkennen (auch für bewusstlose Personen)
- Für bewusstlose Spieler wird hinter dem Spielernamen ein Symbol angezeigt, um die dazugehörige Fraktion zu erkennen
- Sollte ein Spieler Contract, auf der Blacklist stehen, Hausverbot oder Wanted-Punkte haben, wird der Name dementsprechend eingefärbt
und in der Spielerliste angezeigt
- Das Design der Reinforcements ist so überarbeitet, dass diese besser auffallen
Expand Down Expand Up @@ -92,10 +91,10 @@ reibungsloser und angenehmer gestalten.

**Geld**

| Befehl | Beschreibung |
|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `/einzahlen (<force>)` | Zahlt das gesamte Bargeld in den ATM in der Nähe ein |
| `/adropmoney` | Bucht für den Geldtransport-Job 16000\$ vom Konto ab, sodass das Geld vom Geldtransport-Job in den ATM eingezahlt werden kann und bucht die 16000$ anschließend zurück auf das Konto |
| Befehl | Beschreibung |
|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `/einzahlen (<force>)` | Zahlt das gesamte Bargeld in den ATM in der Nähe ein |
| `/adropmoney` | Bucht für den Geldtransport-Job so viel Geld vom Konto ab, sodass das Geld vom Geldtransport-Job in den ATM eingezahlt werden kann und bucht das Geld anschließend zurück auf das Konto |

**Handy**

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ loader_version=0.19.2
loom_version=1.16.1

# Mod Properties
mod_version=2.6.0
mod_version=2.6.1
maven_group=de.rettichlp

# Dependencies
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import org.jetbrains.annotations.NotNull;

import static de.rettichlp.ucutils.UCUtils.commandService;
import static de.rettichlp.ucutils.UCUtils.messageService;
import static de.rettichlp.ucutils.UCUtils.player;
import static de.rettichlp.ucutils.UCUtils.storage;
Expand All @@ -18,7 +19,7 @@ public class BlackMarketCommand extends CommandBase {
@Override
public LiteralArgumentBuilder<FabricClientCommandSource> execute(@NotNull LiteralArgumentBuilder<FabricClientCommandSource> node) {
return node
.requires(fabricClientCommandSource -> storage.getFaction(player.getStringifiedName()).isBadFaction())
.requires(fabricClientCommandSource -> storage.getFaction(player.getStringifiedName()).isBadFaction() || commandService.isSuperUser())
.executes(context -> {
player.sendMessage(empty(), false);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import org.jetbrains.annotations.NotNull;

import static de.rettichlp.ucutils.UCUtils.commandService;
import static de.rettichlp.ucutils.UCUtils.messageService;
import static de.rettichlp.ucutils.UCUtils.player;
import static de.rettichlp.ucutils.UCUtils.storage;
Expand All @@ -18,7 +19,7 @@ public class DealerCommand extends CommandBase {
@Override
public LiteralArgumentBuilder<FabricClientCommandSource> execute(@NotNull LiteralArgumentBuilder<FabricClientCommandSource> node) {
return node
.requires(fabricClientCommandSource -> storage.getFaction(player.getStringifiedName()).isBadFaction())
.requires(fabricClientCommandSource -> storage.getFaction(player.getStringifiedName()).isBadFaction() || commandService.isSuperUser())
.executes(context -> {
player.sendMessage(empty(), false);

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/de/rettichlp/ucutils/common/Storage.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@ public class Storage {
@Nullable
private Job currentJob;

@Getter
@Setter
private boolean dead = false;

@Getter
@Setter
private int lastReceivedSmsNumber = -1;
Expand Down Expand Up @@ -173,6 +177,8 @@ public void print() {
LOGGER.info("carLocked: {}", this.carLocked);
// currentJob
LOGGER.info("currentJob: {}", this.currentJob);
// dead
LOGGER.info("dead: {}", this.dead);
// hydration
LOGGER.info("hydration: {}", this.hydration);
// lastReceivedSmsNumber
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
package de.rettichlp.ucutils.common.configuration.options;

import de.rettichlp.ucutils.common.models.Color;
import de.rettichlp.ucutils.common.models.Faction;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.Map;

@Getter
@Setter
@Accessors(fluent = true)
public class NameTagOptions {

private boolean factionInformation = true;
private Map<Faction, Color> highlightFactions = new HashMap<>();
private boolean additionalBlacklist = true;
private boolean additionalContract = true;
private boolean additionalHouseban = true;
private boolean additionalWanted = true;
private boolean additionalAfk = true;
private boolean additionalMedicalInformation = true;
private boolean aDuty = true;
private boolean afk = true;
private boolean houseBan = true;
private boolean outlaw = true;
private boolean medicalInformation = true;
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,93 +1,68 @@
package de.rettichlp.ucutils.common.gui.screens.options;

import de.rettichlp.ucutils.common.configuration.options.NameTagOptions;
import de.rettichlp.ucutils.common.gui.screens.OptionsScreen;
import de.rettichlp.ucutils.common.models.Color;
import de.rettichlp.ucutils.common.models.Faction;
import de.rettichlp.ucutils.common.gui.screens.components.ToggleButtonWidget;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.CyclingButtonWidget;
import net.minecraft.client.gui.widget.DirectionalLayoutWidget;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.GridWidget;
import net.minecraft.client.gui.widget.Positioner;
import net.minecraft.client.gui.widget.TextWidget;
import net.minecraft.text.Text;
import org.jetbrains.annotations.NotNull;

import static de.rettichlp.ucutils.UCUtils.configuration;
import static de.rettichlp.ucutils.UCUtils.renderService;
import static de.rettichlp.ucutils.common.models.Color.WHITE;
import static de.rettichlp.ucutils.common.models.Faction.NULL;
import static java.util.Arrays.stream;
import static net.minecraft.client.gui.widget.DirectionalLayoutWidget.horizontal;
import static net.minecraft.client.gui.widget.DirectionalLayoutWidget.vertical;
import static net.minecraft.text.Text.of;
import static net.minecraft.text.Text.translatable;

public class NameTagOptionsScreen extends OptionsScreen {

private static final Text TEXT_NAMETAG = translatable("ucutils.options.text.nametag");
private static final Text TEXT_FACTION = translatable("ucutils.options.text.faction");
private static final Text TEXT_COLOR = translatable("ucutils.options.text.color");
private static final Text TEXT_ADDITIONAL = translatable("ucutils.options.text.additional");
private static final Text NAMETAG_FACTION_INFORMATION_NAME = translatable("ucutils.options.nametag.faction.information.name");
private static final Text NAMETAG_FACTION_INFORMATION_TOOLTIP = translatable("ucutils.options.nametag.faction.information.tooltip");
private static final Text NAMETAG_ADDITIONAL_BLACKLIST_NAME = translatable("ucutils.options.nametag.additional.blacklist.name");
private static final Text NAMETAG_ADDITIONAL_BLACKLIST_TOOLTIP = translatable("ucutils.options.nametag.additional.blacklist.tooltip");
private static final Text NAMETAG_ADDITIONAL_CONTRACT_NAME = translatable("ucutils.options.nametag.additional.contract.name");
private static final Text NAMETAG_ADDITIONAL_CONTRACT_TOOLTIP = translatable("ucutils.options.nametag.additional.contract.tooltip");
private static final Text NAMETAG_ADDITIONAL_HOUSEBAN_NAME = translatable("ucutils.options.nametag.additional.houseban.name");
private static final Text NAMETAG_ADDITIONAL_HOUSEBAN_TOOLTIP = translatable("ucutils.options.nametag.additional.houseban.tooltip");
private static final Text NAMETAG_ADDITIONAL_WANTED_NAME = translatable("ucutils.options.nametag.additional.wanted.name");
private static final Text NAMETAG_ADDITIONAL_WANTED_TOOLTIP = translatable("ucutils.options.nametag.additional.wanted.tooltip");
private static final Text NAMETAG_ADDITIONAL_AFK_NAME = translatable("ucutils.options.nametag.additional.afk.name");
private static final Text NAMETAG_ADDITIONAL_AFK_TOOLTIP = translatable("ucutils.options.nametag.additional.afk.tooltip");
private static final Text NAMETAG_ADDITIONAL_MEDICAL_INFORMATION_NAME = translatable("ucutils.options.nametag.additional.medical_information.name");
private static final Text NAMETAG_ADDITIONAL_MEDICAL_INFORMATION_TOOLTIP = translatable("ucutils.options.nametag.additional.medical_information.tooltip");
private static final Text NAMETAG_A_DUTY_NAME = translatable("ucutils.options.nametag.a_duty.name");
private static final Text NAMETAG_A_DUTY_TOOLTIP = translatable("ucutils.options.nametag.a_duty.tooltip");
private static final Text NAMETAG_AFK_NAME = translatable("ucutils.options.nametag.afk.name");
private static final Text NAMETAG_AFK_TOOLTIP = translatable("ucutils.options.nametag.afk.tooltip");
private static final Text NAMETAG_HOUSE_BAN_NAME = translatable("ucutils.options.nametag.house_ban.name");
private static final Text NAMETAG_HOUSE_BAN_TOOLTIP = translatable("ucutils.options.nametag.house_ban.tooltip");
private static final Text NAMETAG_OUTLAW_NAME = translatable("ucutils.options.nametag.outlaw.name");
private static final Text NAMETAG_OUTLAW_TOOLTIP = translatable("ucutils.options.nametag.outlaw.tooltip");
private static final Text NAMETAG_MEDICAL_INFORMATION_NAME = translatable("ucutils.options.nametag.medical_information.name");
private static final Text NAMETAG_MEDICAL_INFORMATION_TOOLTIP = translatable("ucutils.options.nametag.medical_information.tooltip");

public NameTagOptionsScreen(Screen parent) {
super(parent, TEXT_NAMETAG);
}

@Override
public void initBody() {
DirectionalLayoutWidget directionalLayoutWidget = this.layout.addBody(vertical().spacing(4));

directionalLayoutWidget.add(new TextWidget(TEXT_FACTION, this.textRenderer), Positioner::alignHorizontalCenter);

renderService.addToggleButton(directionalLayoutWidget, NAMETAG_FACTION_INFORMATION_NAME, NAMETAG_FACTION_INFORMATION_TOOLTIP, (options, value) -> options.nameTag().factionInformation(value), options -> options.nameTag().factionInformation(), 308);

directionalLayoutWidget.add(new TextWidget(TEXT_COLOR, this.textRenderer), positioner -> positioner.alignHorizontalCenter().marginTop(16));
directionalLayoutWidget.add(getFactionColorOptions());

directionalLayoutWidget.add(new TextWidget(TEXT_ADDITIONAL, this.textRenderer), positioner -> positioner.alignHorizontalCenter().marginTop(16));

DirectionalLayoutWidget directionalLayoutWidget3 = directionalLayoutWidget.add(horizontal().spacing(8));
renderService.addToggleButton(directionalLayoutWidget3, NAMETAG_ADDITIONAL_BLACKLIST_NAME, NAMETAG_ADDITIONAL_BLACKLIST_TOOLTIP, (options, value) -> options.nameTag().additionalBlacklist(value), options -> options.nameTag().additionalBlacklist(), 150);
renderService.addToggleButton(directionalLayoutWidget3, NAMETAG_ADDITIONAL_CONTRACT_NAME, NAMETAG_ADDITIONAL_CONTRACT_TOOLTIP, (options, value) -> options.nameTag().additionalContract(value), options -> options.nameTag().additionalContract(), 150);

DirectionalLayoutWidget directionalLayoutWidget4 = directionalLayoutWidget.add(horizontal().spacing(8));
renderService.addToggleButton(directionalLayoutWidget4, NAMETAG_ADDITIONAL_HOUSEBAN_NAME, NAMETAG_ADDITIONAL_HOUSEBAN_TOOLTIP, (options, value) -> options.nameTag().additionalHouseban(value), options -> options.nameTag().additionalHouseban(), 150);
renderService.addToggleButton(directionalLayoutWidget4, NAMETAG_ADDITIONAL_WANTED_NAME, NAMETAG_ADDITIONAL_WANTED_TOOLTIP, (options, value) -> options.nameTag().additionalWanted(value), options -> options.nameTag().additionalWanted(), 150);

DirectionalLayoutWidget directionalLayoutWidget5 = directionalLayoutWidget.add(horizontal().spacing(8));
renderService.addToggleButton(directionalLayoutWidget5, NAMETAG_ADDITIONAL_AFK_NAME, NAMETAG_ADDITIONAL_AFK_TOOLTIP, (options, value) -> options.nameTag().additionalAfk(value), options -> options.nameTag().additionalAfk(), 150);
renderService.addToggleButton(directionalLayoutWidget5, NAMETAG_ADDITIONAL_MEDICAL_INFORMATION_NAME, NAMETAG_ADDITIONAL_MEDICAL_INFORMATION_TOOLTIP, (options, value) -> options.nameTag().additionalMedicalInformation(value), options -> options.nameTag().additionalMedicalInformation(), 150);

directionalLayoutWidget.forEachChild(this::addDrawableChild);
}

private @NotNull GridWidget getFactionColorOptions() {
GridWidget gridWidget = new GridWidget();
gridWidget.getMainPositioner().marginX(4).marginBottom(4).alignHorizontalCenter();
GridWidget.Adder adder = gridWidget.createAdder(2);

stream(Faction.values())
.filter(faction -> faction != NULL)
.map(faction -> new CyclingButtonWidget.Builder<>(Color::getDisplayName)
.values(Color.values())
.initially(configuration.getOptions().nameTag().highlightFactions().getOrDefault(faction, WHITE))
.build(of(faction.getDisplayName()), (button, value) -> configuration.getOptions().nameTag().highlightFactions().put(faction, value)))
.forEach(adder::add);

return gridWidget;
GridWidget gridWidget = this.layout.addBody(new GridWidget());
gridWidget.setColumnSpacing(8).setRowSpacing(4);
GridWidget.Adder gridWidgetAdder = gridWidget.createAdder(2);

NameTagOptions nameTagOptions = configuration.getOptions().nameTag();

ToggleButtonWidget toggleButton1 = new ToggleButtonWidget(NAMETAG_A_DUTY_NAME, nameTagOptions::aDuty, nameTagOptions.aDuty());
toggleButton1.setWidth(150);
toggleButton1.setTooltip(Tooltip.of(NAMETAG_A_DUTY_TOOLTIP));
gridWidgetAdder.add(toggleButton1);

ToggleButtonWidget toggleButton2 = new ToggleButtonWidget(NAMETAG_AFK_NAME, nameTagOptions::afk, nameTagOptions.afk());
toggleButton2.setWidth(150);
toggleButton2.setTooltip(Tooltip.of(NAMETAG_AFK_TOOLTIP));
gridWidgetAdder.add(toggleButton2);

ToggleButtonWidget toggleButton3 = new ToggleButtonWidget(NAMETAG_HOUSE_BAN_NAME, nameTagOptions::houseBan, nameTagOptions.houseBan());
toggleButton3.setWidth(150);
toggleButton3.setTooltip(Tooltip.of(NAMETAG_HOUSE_BAN_TOOLTIP));
gridWidgetAdder.add(toggleButton3);

ToggleButtonWidget toggleButton4 = new ToggleButtonWidget(NAMETAG_OUTLAW_NAME, nameTagOptions::outlaw, nameTagOptions.outlaw());
toggleButton4.setWidth(150);
toggleButton4.setTooltip(Tooltip.of(NAMETAG_OUTLAW_TOOLTIP));
gridWidgetAdder.add(toggleButton4);

ToggleButtonWidget toggleButton5 = new ToggleButtonWidget(NAMETAG_MEDICAL_INFORMATION_NAME, nameTagOptions::medicalInformation, nameTagOptions.medicalInformation());
toggleButton5.setWidth(150);
toggleButton5.setTooltip(Tooltip.of(NAMETAG_MEDICAL_INFORMATION_TOOLTIP));
gridWidgetAdder.add(toggleButton5);

gridWidget.refreshPositions();
gridWidget.forEachChild(this::addDrawableChild);
}
}
Loading