Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
50 changes: 28 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,48 @@
# ucutils

UCUtils is a utility mod for the UnicaCity roleplay server, inspired by the former UnicacityAddon. It provides useful commands, QoL features, and custom tools tailored for UnicaCity, enhancing gameplay and making everyday interactions smoother and more enjoyable.
UCUtils is a utility mod for the UnicaCity roleplay server, inspired by the former UnicacityAddon. It provides useful commands, QoL
features, and custom tools tailored for UnicaCity, enhancing gameplay and making everyday interactions smoother and more enjoyable.

## Features & Funktionen

### Allgemein
- Sollte ein Command mit einem Großbuchstaben eingegeben werden (z. B. `/Afk` statt `/afk`) wird dieser Command automatisch zu einem gültigen Command umgewandelt

- 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
- Es werden Sounds abgespielt für Notrufe, Bomben und weitere Situationen

### Auto

- Das Auf-/Abschließen eines Fahrzeuges wurde teilweise automatisiert (automatisches Klicken des Items im Inventar)
- Beim Rechtsklick auf das eigene Fahrzeug wird automatisch `/car lock` ausgeführt
- Steigt man in ein Fahrzeug ein, wird dieses automatisch gestartet und abgeschlossen

### Fraktionen

- Hinter dem Spielernamen befindet sich ein Symbol, um die dazugehörige Fraktion zu erkennen (auch für bewusstlose Personen)
- Sollte ein Spieler Contract, auf der Blacklist stehen, Hausverbot oder Wanted-Punkte haben, wird der Name dementsprechend eingefärbt und in der Spielerliste angezeigt
- Es werden für alle Fraktionen verschiedene Aktivitäten wie Reinforcements, Verhaftungen, Wiederbelebungen und weiteres gezählt
- 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
- Für das FBI, die Polizei und den Rettungsdienst gibt es einen Timer, der die Dauer der Bombe anzeigt
- Für die Polizei wurde ein Minuspunkte-System hinzugefügt
- Mit einem Rechtsklick auf ein Fraktionstor (nicht Fraktionstür) wird dieses automatisch geöffnet oder geschlossen

### Jobs

- Bei Transport-Jobs werden nach der Eingabe des `/droptransport` alle weiteren Kisten automatisch abgegeben
- Beim Hochseefischer-Job wird das Netz automatisch ausgeworfen und der gefangene Fisch am Ende automatisch abgegeben
- Für den Transport des Tabaks zur Shisha-Bar wird der Tabak am Ende automatisch abgegeben
- Der Müllmann-Job gibt am Ende den gesammelten Müll automatisch ab, ohne dass der `/dropwaste` Command ausgeführt werden muss
- Für den Pizzalieferanten-Job wird `/getpizza` automatisch ausgeführt, bis 10 Pizzen gesammelt wurden
- Es werden Countdowns angezeigt, bis ein Job wieder ausgeführt werden kann
- Bei der Abgabe von Uran am Atomkraftwerk muss man nicht mehr aus dem Auto aussteigen
- Aktive Mining XP-Booster werden angezeigt

### Widgets

- Aktuelles Datum und Uhrzeit
- Informationen über den PayDay (Dauer bis zum nächsten PayDay, Gehalt und Erfahrung)
- Status des Autos (offen/abgeschlossen)
Expand All @@ -45,14 +52,13 @@ UCUtils is a utility mod for the UnicaCity roleplay server, inspired by the form

**Allgemein**

| Befehl | Beschreibung |
|----------------------------------|----------------------------------------------------------------------------------------|
| `/ucutils` | Zeigt nützliche Status-Informationen über das Projekt an |
| `/sync` | Startet die Synchronisierung um Daten wie Fraktionsmitglieder mit der Mod abzugleichen |
| `/todo` | Zeigt eine Todoliste an (`/todo add <Aufgabe>`) |
| `/mi` | Alias für `/memberinfo` |
| `/mia` | Alias für `/memberinfoall` |
| `/todo` (`/todo add <Aufgabe>`) | Zeigt eine Todoliste an |
| Befehl | Beschreibung |
|----------------------------------|---------------------------------------------------------------------------------------------|
| `/ucutils` (`/ucutils sync`) | Zeigt nützliche Status-Informationen über das Projekt an oder startet eine Synchronisierung |
| `/todo` | Zeigt eine Todoliste an (`/todo add <Aufgabe>`) |
| `/mi` | Alias für `/memberinfo` |
| `/mia` | Alias für `/memberinfoall` |
| `/todo` (`/todo add <Aufgabe>`) | Zeigt eine Todoliste an |

**Chat**

Expand All @@ -64,11 +70,11 @@ UCUtils is a utility mod for the UnicaCity roleplay server, inspired by the form

**Fraktionen**

| Befehl | Beschreibung |
|----------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| `/asetbl` | Setzt Blacklist-Gründe automatisch (Blacklist-Gründe können mit einem Ticket auf dem Discord beantragt werden) |
| `/eigenbedarf` | Nimmt eine eingestellte Menge an Drogen aus der Drogenbank einer Fraktion oder gibt diese an einen Spieler |
| `schwarzmarkt` | Zeigt alle Schwarzmärkte an einschließlich des Zeitpunkts des letzten Besuchs des Ortes und einer Markierung ob sich der Schwarzmarkt dort befand |
| Befehl | Beschreibung |
|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| `/asetbl` | Setzt Blacklist-Gründe automatisch (Blacklist-Gründe können mit einem Ticket auf dem Discord beantragt werden) |
| `/eigenbedarf` | Nimmt eine eingestellte Menge an Drogen aus der Drogenbank einer Fraktion oder gibt diese an einen Spieler |
| `/schwarzmarkt` | Zeigt alle Schwarzmärkte an einschließlich des Zeitpunkts des letzten Besuchs des Ortes und einer Markierung ob sich der Schwarzmarkt dort befand |

**Geld**

Expand All @@ -80,7 +86,7 @@ UCUtils is a utility mod for the UnicaCity roleplay server, inspired by the form

**Handy**

| Befehl | Beschreibung |
|-----------------------------------|------------------------------------------------------------------------------------|
| `/acall <Spielername>` | Ermöglicht das Anrufen mittels Spielername statt der Nummer |
| `/asms <Spielername> <Nachricht>` | Ermöglicht das Schreiben einer SMS mittels Spielername statt der Nummer |
| Befehl | Beschreibung |
|-----------------------------------|-------------------------------------------------------------------------|
| `/acall <Spielername>` | Ermöglicht das Anrufen mittels Spielername statt der Nummer |
| `/asms <Spielername> <Nachricht>` | Ermöglicht das Schreiben einer SMS mittels Spielername statt der Nummer |
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ org.gradle.configuration-cache=false
minecraft_version=1.21.10
yarn_mappings=1.21.10+build.2
loader_version=0.17.3
loom_version=1.14.1
loom_version=1.14.4

# Mod Properties
mod_version=2.0.1
mod_version=2.1.0
maven_group=de.rettichlp
archives_base_name=ucutils

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/de/rettichlp/ucutils/UCUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ public class UCUtils implements ModInitializer {
public void onInitialize() {
// This entrypoint is suitable for setting up client-specific logic, such as rendering.

syncService.syncFactionMembers();

this.registry.registerSounds();

ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
Expand All @@ -64,6 +66,7 @@ public void onInitialize() {
client.execute(() -> {
this.registry.registerListeners();
renderService.initializeWidgets();
syncService.syncFactionSpecificData();
syncService.checkForUpdates();
});
});
Expand Down
63 changes: 4 additions & 59 deletions src/main/java/de/rettichlp/ucutils/command/ModCommand.java
Original file line number Diff line number Diff line change
@@ -1,35 +1,25 @@
package de.rettichlp.ucutils.command;

import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import de.rettichlp.ucutils.common.registry.CommandBase;
import de.rettichlp.ucutils.common.registry.UCUtilsCommand;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.metadata.Person;
import net.minecraft.client.network.PlayerListEntry;
import net.minecraft.text.ClickEvent;
import org.jetbrains.annotations.NotNull;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.StringJoiner;

import static com.mojang.brigadier.arguments.StringArgumentType.word;
import static de.rettichlp.ucutils.UCUtils.MOD_ID;
import static de.rettichlp.ucutils.UCUtils.commandService;
import static de.rettichlp.ucutils.UCUtils.messageService;
import static de.rettichlp.ucutils.UCUtils.networkHandler;
import static de.rettichlp.ucutils.UCUtils.player;
import static de.rettichlp.ucutils.UCUtils.storage;
import static de.rettichlp.ucutils.UCUtils.syncService;
import static de.rettichlp.ucutils.UCUtils.utilService;
import static java.net.URI.create;
import static java.time.LocalDateTime.MIN;
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
import static net.minecraft.command.CommandSource.suggestMatching;
import static net.minecraft.text.Text.empty;
import static net.minecraft.text.Text.of;
import static net.minecraft.util.Formatting.DARK_GRAY;
Expand All @@ -42,56 +32,18 @@ public class ModCommand extends CommandBase {
@Override
public LiteralArgumentBuilder<FabricClientCommandSource> execute(@NotNull LiteralArgumentBuilder<FabricClientCommandSource> node) {
return node
.then(literal("userinfo")
.requires(fabricClientCommandSource -> commandService.isSuperUser())
.then(argument("player", word())
.suggests((context, builder) -> {
List<String> list = networkHandler.getPlayerList().stream()
.map(PlayerListEntry::getProfile)
.map(GameProfile::name)
.toList();
return suggestMatching(list, builder);
})
.executes(context -> {
String playerName = context.getArgument("player", String.class);
// api.getUserInfo(playerName, response -> {
//
// player.sendMessage(empty(), false);
//
// messageService.sendModMessage("UCUtils User Information - " + playerName, false);
//
// messageService.sendModMessage(empty()
// .append(of("Version").copy().formatted(GRAY))
// .append(of(":").copy().formatted(DARK_GRAY)).append(" ")
// .append(of(response.version()).copy().formatted(WHITE)), false);
//
// messageService.sendModMessage(empty()
// .append(of("Aktivitäten").copy().formatted(GRAY))
// .append(of(":").copy().formatted(DARK_GRAY)).append(" ")
// .append(of("Klick ↗").copy().styled(style -> style
// .withColor(WHITE)
// .withClickEvent(new ClickEvent.SuggestCommand("/activity player " + playerName)))), false);
//
// player.sendMessage(empty(), false);
// });

return 1;
})))
.then(literal("sync")
.then(literal("faction")
.executes(context -> {
syncService.syncFactionMembersWithCommand(() -> {});
return 1;
}))
.executes(context -> {
syncService.syncFactionMembers();
syncService.checkForUpdates();
syncService.syncFactionSpecificData();

utilService.delayedAction(syncService::syncFactionSpecificData, 2000);

return 1;
}))
.executes(context -> {
String version = utilService.getVersion();
String authors = getAuthors();
LocalDateTime lastSyncTimestamp = syncService.getLastSyncTimestamp();

player.sendMessage(empty(), false);

Expand All @@ -116,13 +68,6 @@ public LiteralArgumentBuilder<FabricClientCommandSource> execute(@NotNull Litera
.withColor(WHITE)
.withClickEvent(new ClickEvent.OpenUrl(create("https://github.com/UnicacityAddon/ucutils"))))), false);

messageService.sendModMessage(empty()
.append(of("Letzte Synchronisierung").copy().formatted(GRAY))
.append(of(":").copy().formatted(DARK_GRAY)).append(" ")
.append(of(lastSyncTimestamp.equals(MIN)
? "Nie"
: messageService.dateTimeToFriendlyString(lastSyncTimestamp)).copy().formatted(WHITE)), false);

player.sendMessage(empty(), false);

storage.print();
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/de/rettichlp/ucutils/common/Storage.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public Faction getCachedFaction(String playerName) {
public Faction getFaction(String playerName) {
Faction faction = this.factionEntries.stream()
.filter(factionEntry -> factionEntry.members().stream()
.anyMatch(factionMember -> factionMember.playerName().equalsIgnoreCase(playerName)))
.anyMatch(factionMember -> factionMember.username().equalsIgnoreCase(playerName)))
.findFirst()
.map(FactionEntry::faction)
.orElse(NULL);
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/de/rettichlp/ucutils/common/api/Api.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.google.gson.reflect.TypeToken;
import com.mojang.authlib.GameProfile;
import de.rettichlp.ucutils.common.api.response.ErrorResponse;
import de.rettichlp.ucutils.common.models.Faction;
import de.rettichlp.ucutils.common.models.FactionMember;
import lombok.Getter;
import net.minecraft.client.MinecraftClient;
import org.jetbrains.annotations.Contract;
Expand Down Expand Up @@ -69,6 +71,10 @@ public void getModrinthVersions(Consumer<List<Map<String, Object>>> callback) {
get("https://api.modrinth.com/v2/project/ucutils/version", new TypeToken<>() {}, callback);
}

public void getFactionMembers(@NotNull Faction faction, Consumer<List<FactionMember>> callback) {
get("https://api.unicacity.eu/api/factions/" + faction.getApiKey() + "/members", new TypeToken<>() {}, callback);
}

private <T> void get(@NotNull String uri, TypeToken<T> typeToken, Consumer<T> callback) {
HttpRequest httpRequest = this.requestBuilder.copy()
.uri(uri.startsWith("https://") ? create(uri) : create(this.baseUrl + uri))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.rettichlp.ucutils.common.models;

import de.rettichlp.ucutils.common.gui.widgets.CountdownWidget;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.minecraft.text.Text;

Expand All @@ -16,6 +17,7 @@
import static net.minecraft.util.Formatting.GRAY;
import static net.minecraft.util.Formatting.WHITE;

@Getter
@RequiredArgsConstructor
public class Countdown {

Expand Down
31 changes: 16 additions & 15 deletions src/main/java/de/rettichlp/ucutils/common/models/Faction.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,26 @@
@AllArgsConstructor
public enum Faction {

NULL("", false, GRAY, ""),
POLIZEI("Polizei", false, BLUE, "✯"),
FBI("FBI", false, DARK_BLUE, "✯"),
RETTUNGSDIENST("Rettungsdienst", false, DARK_RED, "✚"),
NULL("", "", false, GRAY, ""),
POLIZEI("Polizei", "police", false, BLUE, "✯"),
FBI("FBI", "fbi", false, DARK_BLUE, "✯"),
RETTUNGSDIENST("Rettungsdienst", "medic", false, DARK_RED, "✚"),

LA_COSA_NOSTRA("La Cosa Nostra", true, DARK_AQUA, "⚜"),
WESTSIDE_BALLAS("Westside Ballas", true, DARK_PURPLE, "☠"),
CALDERON_KARTELL("Calderón Kartell", true, GOLD, "☀"),
KERZAKOV_FAMILIE("Kerzakov Familie", true, RED, "✮"),
HAYAT_KARTELL("Hayat Kartell", true, DARK_GREEN, "Ħ"),
YAKUZA("Yakuza", true, GREEN, "☯"),
VELENTZAS("Velentzas", true, WHITE, "δ"),
LA_COSA_NOSTRA("La Cosa Nostra", "mafia", true, DARK_AQUA, "⚜"),
WESTSIDE_BALLAS("Westside Ballas", "gang", true, DARK_PURPLE, "☠"),
CALDERON_KARTELL("Calderón Kartell", "mexican", true, GOLD, "☀"),
KERZAKOV_FAMILIE("Kerzakov Familie", "kerzakov", true, RED, "✮"),
HAYAT_KARTELL("Hayat Kartell", "hayat_kartell", true, DARK_GREEN, "Ħ"),
YAKUZA("Yakuza", "yakuza", true, GREEN, "☯"),
VELENTZAS("Velentzas", "velentzas", true, WHITE, "δ"),

HITMAN("Hitman", false, AQUA, "➹"),
TERRORISTEN("Terroristen", false, GRAY, "❇"),
KIRCHE("Kirche", false, LIGHT_PURPLE, "†"),
NEWS("News", false, YELLOW, "✉");
HITMAN("Hitman", "hitman", false, AQUA, "➹"),
TERRORISTEN("Terroristen", "terror", false, GRAY, "❇"),
KIRCHE("Kirche", "church", false, LIGHT_PURPLE, "†"),
NEWS("News", "news", false, YELLOW, "✉");

private final String displayName;
private final String apiKey;
private final boolean isBadFaction;
private final Formatting color;
private final String icon;
Expand Down
Loading