Compare commits

..

No commits in common. "master" and "v1.0.1" have entirely different histories.

18 changed files with 59 additions and 215 deletions

View file

@ -1,56 +1,4 @@
EAA_MOD EAA_MOD
=============== ===============
This MOD is created by the "Eggwars Am Abend" (EAA) Squad, to increase fun playing Minecraft by avoiding hacking/idiotic players and providing some useful tools.
This mod is 100% client side and does not interact with the server you are playing on.
## Features EAA
Following a list of features, this mod provides
### TAG
It's basically a report system.
Users are able to tag other players with a set of tags. As example as Hacker/Friend/Good player and so on.
In addition, the tag gets weighted by a scale from 0 to 10.
Tagged players are shown when pressing TAB, including their recent tag with grade.
Other commands like playercheck/lobbycheck also use tag data.
### Ping as Number
Heavily inspired by this cool project, check it out!
https://www.curseforge.com/minecraft/mc-mods/better-ping-display-fabric
### Echo
uhm ... yeh ... it echos ... uhm ... you
(used as PoC, will be removed sooner or later)
## Commands
All mod commands start with a double slash (`//`), so they don't get confused with other commands
* `//tag <player> <tag> <grade>`
* Tags player with chosen tag and grade. On success, a notification is shown.
* `//lobby`
* Checks if any unwanted players (Hacker/Idiot/Noob) are in the current lobby.
* `//check <player>`
* shows detailed information about a player, including past player names and tags.
* `//echo <text>`
* reply with text
* `//reload`
* reloads cashed players. Useful when playing in a team and someone tagged another player. Otherwise, the tag would not appear till next game start.
## Settings
Mod needs a file in mod folder called settings.properties containing following values:
```
url=mysql://<DATABASE_URL>/
user=<DATABASE USER>
password=<DATABASE USER PASSWORD>
db_name=<DATABASE NAME>
```
A working sample config is provided in the config folder, setup with a read only user of the developers Database.
## Database
Database-Model and SQL-Starterscript can be found in the config/database folder.
The Mod itself does not create the needed Database structure. The user has to init the Database by himself.

View file

@ -1,5 +1,5 @@
plugins { plugins {
id 'fabric-loom' version '0.10-SNAPSHOT' id 'fabric-loom' version '0.7-SNAPSHOT'
} }
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
@ -24,11 +24,12 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
//include group: 'org.postgresql', name: 'postgresql', version: '42.2.9' //include group: 'org.postgresql', name: 'postgresql', version: '42.2.9'
// https://mvnrepository.com/artifact/mysql/mysql-connector-java // https://mvnrepository.com/artifact/mysql/mysql-connector-java
include group: 'mysql', name: 'mysql-connector-java', version: "${project.jdbc_mysql}" //implementation(include('mysql:mysql-connector-java:8.0.25'))
implementation group: 'mysql', name: 'mysql-connector-java', version: "${project.jdbc_mysql}" include group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
//modImplementation(group: 'mysql', name: 'mysql-connector-java', version: '8.0.25') //modImplementation(group: 'mysql', name: 'mysql-connector-java', version: '8.0.25')
include group: 'com.googlecode.json-simple', name: 'json-simple', version: "${project.json_simple}" include group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: "${project.json_simple}" implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
// Fabric API. This is technically optional, but you probably want it anyway. // Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

View file

@ -1,4 +0,0 @@
url=mysql://mysql2f88.netcup.net/
user=k85020_EAA_MOD_RO
password=EeChf3dfZmwDgMo4rYSFj9bC9i5EaFkKtXfw5F7hPSQyKTZfNv3qougR3jn99ehUiRAgyr9ypLQJUyQhDQAdLf35ymst5sXf34Zo
db_name=k85020_EAA_MOD

View file

@ -4,19 +4,14 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/versions.html # check these on https://fabricmc.net/versions.html
minecraft_version=1.16.5 minecraft_version=1.16.5
yarn_mappings=1.16.5+build.10 yarn_mappings=1.16.5+build.9
loader_version=0.12.11 loader_version=0.11.3
# Mod Properties # Mod Properties
mod_version = 1.1.3 mod_version = 1.0.1
maven_group = net.saltymc.eaa maven_group = net.saltymc.eaa
archives_base_name = EAA_MOD archives_base_name = EAA_MOD
# Dependencies # Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api (or https://fabricmc.net/versions.html) # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api (or https://fabricmc.net/versions.html)
fabric_version=0.42.0+1.16 fabric_version=0.34.2+1.16
#SQL
jdbc_mysql=8.0.27
#JSON
json_simple=1.1.1

View file

@ -2,7 +2,6 @@ package net.saltymc.eaa;
import net.saltymc.eaa.commands.*; import net.saltymc.eaa.commands.*;
import net.saltymc.eaa.util.io.PropertieLoader;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -10,27 +9,15 @@ import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import java.util.Properties;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public final class EaaMod implements ClientModInitializer { public final class EaaMod implements ClientModInitializer {
private static final String SETTINGS_FILE_NAME = "settings.properties";
public static final Logger LOGGER = LogManager.getLogger("EAA-MOD"); public static final Logger LOGGER = LogManager.getLogger("EAA-MOD");
private static Properties settings;
public static Logger getLogger() { public static Logger getLogger() {
return LOGGER; return LOGGER;
} }
public static Properties getSettings(){
if (settings == null)
settings = PropertieLoader.loadProperties(SETTINGS_FILE_NAME);
return settings;
}
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {

View file

@ -35,17 +35,15 @@ public class TagCommand extends EaaModCommand{
.then( .then(
argument("player", StringArgumentType.word()) argument("player", StringArgumentType.word())
.suggests((ctx, builder) -> EntityArgumentType.player().listSuggestions(ctx, builder)) .suggests((ctx, builder) -> EntityArgumentType.player().listSuggestions(ctx, builder))
.then( .then(argument("tag", StringArgumentType.word())
argument("tag", StringArgumentType.word()) .suggests(((context, builder) -> {
.suggests(((context, builder) -> { for (DB_Tag.Type tag : DB_Tag.Type.values())
for (DB_Tag.Type tag : DB_Tag.Type.values()) builder.suggest(tag.name());
builder.suggest(tag.name()); return builder.buildFuture();
return builder.buildFuture(); }))
})) .then(
.then( argument("grade", IntegerArgumentType.integer(0,10))
argument("grade", IntegerArgumentType.integer(0,10)) .executes(this)
.suggests((ctx, builder) -> IntegerArgumentType.integer(0,10).listSuggestions(ctx, builder)) )));
.executes(this)
)));
} }
} }

View file

@ -27,6 +27,7 @@ import net.minecraft.text.OrderedText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.world.GameMode; import net.minecraft.world.GameMode;
import net.saltymc.eaa.function.TagFunction; import net.saltymc.eaa.function.TagFunction;
import net.saltymc.eaa.util.database.DB_Tag;
/** /**
* By: https://github.com/vladmarica/better-ping-display-fabric/ * By: https://github.com/vladmarica/better-ping-display-fabric/
@ -163,21 +164,10 @@ public final class CustomPlayerListHud {
/* /*
* PLAYER TAG * PLAYER TAG
*/ */
int offset_tag_playername = aa; // safe current x offset -> int offset_tag_playername = aa;
TagDTO playerTAG = TagFunction.getScoreboardTag(player.getProfile().getId().toString()); // retrieve Tag object DB_Tag.Type playerTAG = TagFunction.getScoreboardTag(player.getProfile().getId().toString());
mc.textRenderer.drawWithShadow(stack, playerTAG.getType().getTag(), (float)aa, (float)ab, playerTAG.getType().getColor()); // draw tag name mc.textRenderer.drawWithShadow(stack, playerTAG.getTag(), (float)aa, (float)ab, playerTAG.getColor());
offset_tag_playername += mc.textRenderer.getWidth(playerTAG.getTag()) + 2;
offset_tag_playername += mc.textRenderer.getWidth(playerTAG.getType().getTag()) + 1; // add tag name length to offset
// current offset plus amount to center grade text
float tmp_x = offset_tag_playername
+ ((mc.textRenderer.getWidth("10") - mc.textRenderer.getWidth(playerTAG.getGrade() < 1 ? "|" : playerTAG.getGrade() +""))
/ 2.0f);
mc.textRenderer.drawWithShadow(stack,
playerTAG.getGrade() < 1 ? "|" : playerTAG.getGrade() +"", // if not given draw a pipe
(float) tmp_x, (float) ab, playerTAG.getGradeColor());
offset_tag_playername += mc.textRenderer.getWidth("10") + 2; // add offset of largest character
Text playerName = hud.getPlayerName(player); Text playerName = hud.getPlayerName(player);
@ -188,7 +178,7 @@ public final class CustomPlayerListHud {
} }
if (obj != null && player.getGameMode() != GameMode.SPECTATOR) { if (obj != null && player.getGameMode() != GameMode.SPECTATOR) {
int ag = offset_tag_playername + i + 1; int ag = aa + i + 1;
ah = ag + q; ah = ag + q;
if (ah - ag > 5) { if (ah - ag > 5) {
PlayerListHudUtil.renderScoreboardObjective(hud, stack, obj, ab, gameProfile.getName(), ag, ah, player); PlayerListHudUtil.renderScoreboardObjective(hud, stack, obj, ab, gameProfile.getName(), ag, ah, player);

View file

@ -33,7 +33,7 @@ public class PingColors {
computeOffset(PING_MID, PING_END, Math.min(ping, PING_END))); computeOffset(PING_MID, PING_END, Math.min(ping, PING_END)));
} }
public static float computeOffset(int start, int end, int value) { static float computeOffset(int start, int end, int value) {
float offset = (value - start) / (float) ( end - start); float offset = (value - start) / (float) ( end - start);
return MathHelper.clamp(offset, 0.0F, 1.0F); return MathHelper.clamp(offset, 0.0F, 1.0F);
} }

View file

@ -1,39 +0,0 @@
package net.saltymc.eaa.custom.ping;
import net.saltymc.eaa.util.database.DB_Tag;
import static net.saltymc.eaa.custom.ping.PingColors.computeOffset;
public class TagDTO {
final int grade;
final int gradeColor;
final DB_Tag.Type type;
public TagDTO(int grade, DB_Tag.Type type) {
this.grade = grade;
this.gradeColor = calcGradient(grade, type);
this.type = type;
}
public int getGradeColor() {
return gradeColor;
}
public DB_Tag.Type getType() {
return type;
}
private static int calcGradient(int grade, DB_Tag.Type type){
if (grade < 1)
return 0xaaaaaa;
return ColorUtil.interpolate(
0xaaaaaa,
type.getColor(),
computeOffset(0, 10, grade));
}
public int getGrade(){
return grade;
}
}

View file

@ -4,9 +4,7 @@ import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.toast.SystemToast; import net.minecraft.client.toast.SystemToast;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
import net.minecraft.text.Style;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TextColor;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import net.saltymc.eaa.util.database.DB_Player; import net.saltymc.eaa.util.database.DB_Player;
import net.saltymc.eaa.util.database.DB_Tag; import net.saltymc.eaa.util.database.DB_Tag;
@ -59,7 +57,7 @@ public class CheckFunction {
source.sendFeedback(new LiteralText(dateformat.format(curr.getTagDate())).formatted(Formatting.GRAY) source.sendFeedback(new LiteralText(dateformat.format(curr.getTagDate())).formatted(Formatting.GRAY)
.append(new LiteralText(" | ")) .append(new LiteralText(" | "))
.append(new LiteralText(curr.getType().getTag()).setStyle(Style.EMPTY.withColor(TextColor.fromRgb(curr.getType().getColor())))) .append(new LiteralText(curr.getType().getTag()).formatted(curr.getType().getFormatting()))
.append(new LiteralText(" (" + curr.getGrade() + ") ").formatted(getScaleFormat(curr.getGrade()))) .append(new LiteralText(" (" + curr.getGrade() + ") ").formatted(getScaleFormat(curr.getGrade())))
); );
} }
@ -73,7 +71,7 @@ public class CheckFunction {
} }
} }
public static Formatting getScaleFormat(int grade){ private static Formatting getScaleFormat(int grade){
if (grade <= 5) if (grade <= 5)
return Formatting.WHITE; return Formatting.WHITE;
else if (grade < 9) else if (grade < 9)

View file

@ -38,7 +38,7 @@ public class LobbyFunction {
if (type == DB_Tag.Type.HACKER){ if (type == DB_Tag.Type.HACKER){
dangerLvl = 2; dangerLvl = 2;
break; break;
} else if (type == DB_Tag.Type.IDIOT || type == DB_Tag.Type.NOOB){ } else if (type == DB_Tag.Type.IDIOT){
dangerLvl = 1; dangerLvl = 1;
} }
} }
@ -49,7 +49,7 @@ public class LobbyFunction {
SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.WORLD_BACKUP, Text.of("OKAY!"), Text.of("No Hackers found")); SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.WORLD_BACKUP, Text.of("OKAY!"), Text.of("No Hackers found"));
break; break;
case 1: case 1:
SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.TUTORIAL_HINT, Text.of("MEH!"), Text.of("There is an Idiot or Noob!")); SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.TUTORIAL_HINT, Text.of("MEH!"), Text.of("There is an Idiot!"));
break; break;
case 2: case 2:
SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.WORLD_ACCESS_FAILURE, Text.of("ALARM!"), Text.of("There is a Hacker!")); SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.WORLD_ACCESS_FAILURE, Text.of("ALARM!"), Text.of("There is a Hacker!"));

View file

@ -1,9 +1,9 @@
package net.saltymc.eaa.function; package net.saltymc.eaa.function;
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.toast.SystemToast; import net.minecraft.client.toast.SystemToast;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.saltymc.eaa.custom.ping.TagDTO;
import net.saltymc.eaa.util.database.DB_Player; import net.saltymc.eaa.util.database.DB_Player;
import net.saltymc.eaa.util.database.DB_Tag; import net.saltymc.eaa.util.database.DB_Tag;
import net.saltymc.eaa.util.mojangApi.PlayerInfo; import net.saltymc.eaa.util.mojangApi.PlayerInfo;
@ -23,18 +23,16 @@ public class TagFunction {
} }
} }
public static TagDTO getScoreboardTag(String uuid){ public static DB_Tag.Type getScoreboardTag(String uuid){
if (player_tags.containsKey(uuid)) { if (player_tags.containsKey(uuid))
DB_Tag tag = player_tags.get(uuid); return player_tags.get(uuid).getType();
return new TagDTO(tag.getGrade(), tag.getType()); else {
} else {
if (free) { if (free) {
free = false; free = false;
loadPlayer(uuid, false); loadPlayer(uuid, false);
} }
} }
return new TagDTO(-1, DB_Tag.Type.NOTLOADED); return DB_Tag.Type.NOTLOADED;
} }
public static void tagPlayer(String player, DB_Tag.Type tag, int grade, FabricClientCommandSource source){ public static void tagPlayer(String player, DB_Tag.Type tag, int grade, FabricClientCommandSource source){

View file

@ -1,5 +1,7 @@
package net.saltymc.eaa.util.database; package net.saltymc.eaa.util.database;
import net.minecraft.util.Formatting;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -94,30 +96,31 @@ public class DB_Tag {
public enum Type { public enum Type {
HACKER( HACKER(
"HAX", "PLayer who hacks", 0xaa0000 "HAX", "PLayer who hacks", 0xaa0000, Formatting.RED
), FRIENDLY( ), FRIENDLY(
"FND", "Player you like", 0x55ff55 "FND", "Player you like", 0x55ff55, Formatting.GREEN
), GOODPLAYER( ), GOODPLAYER(
"PRO", "Fair player with good skill", 0xffaa00 "PRO", "Fair player with good skill", 0xffaa00, Formatting.GOLD
), IDIOT( ), IDIOT(
"A$$", "Person who is annoying and bad", 0x55ffff "BAD", "Person who is annoying and bad", 0x55ffff, Formatting.AQUA
), NOOB(
"BAD", "Person with low skill", 0xff55ff
), NOTTAGGED( ), NOTTAGGED(
"NaN", "Player is not tagged", 0x555555 "NaN", "Player is not tagged", 0x555555, Formatting.DARK_GRAY
), NOTLOADED( ), NOTLOADED(
"---", "PLayer not loaded", 0xffffff "---", "PLayer not loaded", 0xffffff, Formatting.WHITE
); );
String tag, description; String tag, description;
int color; int color;
Formatting formatting;
Type(String tag, String description, int color){ Type(String tag, String description, int color, Formatting formatting){
this.tag = tag; this.tag = tag;
this.description = description; this.description = description;
this.color = color; this.color = color;
this.formatting = formatting;
} }
public String getTag() { public String getTag() {
return tag; return tag;
} }
@ -129,5 +132,9 @@ public class DB_Tag {
public int getColor() { public int getColor() {
return color; return color;
} }
public Formatting getFormatting(){
return formatting;
}
} }
} }

View file

@ -7,24 +7,15 @@ import com.mysql.cj.jdbc.Driver;
public class Postgre { public class Postgre {
private String url; private final String url = "jdbc:postgresql://localhost/myDB";
private String user; private final String user = "postgres";
private String password; private final String password = "root";
private String db_name;
private final String driverName = "com.mysql.cj.jdbc.Driver";
private static Postgre postgre; private static Postgre postgre;
private Connection connection; private Connection connection;
public Postgre() { public Postgre() {
this.url = EaaMod.getSettings().getProperty("url");
this.user = EaaMod.getSettings().getProperty("user");
this.password = EaaMod.getSettings().getProperty("password");
this.db_name = EaaMod.getSettings().getProperty("db_name");
try { try {
//load driver / config driver //load driver / config driver
EaaMod.LOGGER.debug("Lade DB Treiber"); EaaMod.LOGGER.debug("Lade DB Treiber");

View file

@ -1,26 +0,0 @@
package net.saltymc.eaa.util.io;
import net.saltymc.eaa.EaaMod;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;
public class PropertieLoader {
public static Properties loadProperties(String fileName){
Properties p = new Properties();
try (FileReader reader = new FileReader(System.getProperty("user.dir") + "/mods/" + fileName)){
p.load(reader);
} catch (Exception e){
try (FileWriter writer = new FileWriter(System.getProperty("user.dir") + "/mods/" + fileName)) {
p.store(writer, "init config file");
} catch (Exception ex){
EaaMod.getLogger().error("Cant save Properties" + fileName, e);
}
return loadProperties(fileName);
}
return p;
}
}

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After