Compare commits
14 commits
Author | SHA1 | Date | |
---|---|---|---|
30b5888657 | |||
2c1d63966c | |||
23286e1ec3 | |||
4192c554a5 | |||
87d167d87b | |||
cd0d8928b1 | |||
3d2ba396ef | |||
df3f64bcf3 | |||
8e829e3a01 | |||
1d69f7d2a4 | |||
3e7c44106d | |||
df9060798d | |||
593360c2aa | |||
dead4f21a8 |
18 changed files with 215 additions and 59 deletions
54
README.md
54
README.md
|
@ -1,4 +1,56 @@
|
|||
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.
|
||||
|
||||
EAA
|
||||
## Features
|
||||
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.
|
11
build.gradle
11
build.gradle
|
@ -1,5 +1,5 @@
|
|||
plugins {
|
||||
id 'fabric-loom' version '0.7-SNAPSHOT'
|
||||
id 'fabric-loom' version '0.10-SNAPSHOT'
|
||||
}
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
|
@ -24,12 +24,11 @@ dependencies {
|
|||
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||
//include group: 'org.postgresql', name: 'postgresql', version: '42.2.9'
|
||||
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
|
||||
//implementation(include('mysql:mysql-connector-java:8.0.25'))
|
||||
include group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
|
||||
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
|
||||
include group: 'mysql', name: 'mysql-connector-java', version: "${project.jdbc_mysql}"
|
||||
implementation group: 'mysql', name: 'mysql-connector-java', version: "${project.jdbc_mysql}"
|
||||
//modImplementation(group: 'mysql', name: 'mysql-connector-java', version: '8.0.25')
|
||||
include group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
|
||||
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
|
||||
include group: 'com.googlecode.json-simple', name: 'json-simple', version: "${project.json_simple}"
|
||||
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: "${project.json_simple}"
|
||||
|
||||
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||
|
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
4
config/settings.properties
Normal file
4
config/settings.properties
Normal file
|
@ -0,0 +1,4 @@
|
|||
url=mysql://mysql2f88.netcup.net/
|
||||
user=k85020_EAA_MOD_RO
|
||||
password=EeChf3dfZmwDgMo4rYSFj9bC9i5EaFkKtXfw5F7hPSQyKTZfNv3qougR3jn99ehUiRAgyr9ypLQJUyQhDQAdLf35ymst5sXf34Zo
|
||||
db_name=k85020_EAA_MOD
|
|
@ -4,14 +4,19 @@ org.gradle.jvmargs=-Xmx1G
|
|||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/versions.html
|
||||
minecraft_version=1.16.5
|
||||
yarn_mappings=1.16.5+build.9
|
||||
loader_version=0.11.3
|
||||
|
||||
yarn_mappings=1.16.5+build.10
|
||||
loader_version=0.12.11
|
||||
# Mod Properties
|
||||
mod_version = 1.0.1
|
||||
mod_version = 1.1.3
|
||||
maven_group = net.saltymc.eaa
|
||||
archives_base_name = EAA_MOD
|
||||
|
||||
# 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)
|
||||
fabric_version=0.34.2+1.16
|
||||
fabric_version=0.42.0+1.16
|
||||
|
||||
#SQL
|
||||
jdbc_mysql=8.0.27
|
||||
|
||||
#JSON
|
||||
json_simple=1.1.1
|
|
@ -2,6 +2,7 @@ package net.saltymc.eaa;
|
|||
|
||||
import net.saltymc.eaa.commands.*;
|
||||
|
||||
import net.saltymc.eaa.util.io.PropertieLoader;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
|
@ -9,15 +10,27 @@ import net.fabricmc.api.ClientModInitializer;
|
|||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public final class EaaMod implements ClientModInitializer {
|
||||
public static final Logger LOGGER = LogManager.getLogger("EAA-MOD");
|
||||
|
||||
private static final String SETTINGS_FILE_NAME = "settings.properties";
|
||||
|
||||
public static final Logger LOGGER = LogManager.getLogger("EAA-MOD");
|
||||
private static Properties settings;
|
||||
|
||||
public static Logger getLogger() {
|
||||
return LOGGER;
|
||||
}
|
||||
|
||||
public static Properties getSettings(){
|
||||
if (settings == null)
|
||||
settings = PropertieLoader.loadProperties(SETTINGS_FILE_NAME);
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
|
||||
|
|
|
@ -35,15 +35,17 @@ public class TagCommand extends EaaModCommand{
|
|||
.then(
|
||||
argument("player", StringArgumentType.word())
|
||||
.suggests((ctx, builder) -> EntityArgumentType.player().listSuggestions(ctx, builder))
|
||||
.then(argument("tag", StringArgumentType.word())
|
||||
.suggests(((context, builder) -> {
|
||||
for (DB_Tag.Type tag : DB_Tag.Type.values())
|
||||
builder.suggest(tag.name());
|
||||
return builder.buildFuture();
|
||||
}))
|
||||
.then(
|
||||
argument("grade", IntegerArgumentType.integer(0,10))
|
||||
.executes(this)
|
||||
)));
|
||||
.then(
|
||||
argument("tag", StringArgumentType.word())
|
||||
.suggests(((context, builder) -> {
|
||||
for (DB_Tag.Type tag : DB_Tag.Type.values())
|
||||
builder.suggest(tag.name());
|
||||
return builder.buildFuture();
|
||||
}))
|
||||
.then(
|
||||
argument("grade", IntegerArgumentType.integer(0,10))
|
||||
.suggests((ctx, builder) -> IntegerArgumentType.integer(0,10).listSuggestions(ctx, builder))
|
||||
.executes(this)
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ import net.minecraft.text.OrderedText;
|
|||
import net.minecraft.text.Text;
|
||||
import net.minecraft.world.GameMode;
|
||||
import net.saltymc.eaa.function.TagFunction;
|
||||
import net.saltymc.eaa.util.database.DB_Tag;
|
||||
|
||||
/**
|
||||
* By: https://github.com/vladmarica/better-ping-display-fabric/
|
||||
|
@ -164,10 +163,21 @@ public final class CustomPlayerListHud {
|
|||
/*
|
||||
* PLAYER TAG
|
||||
*/
|
||||
int offset_tag_playername = aa;
|
||||
DB_Tag.Type playerTAG = TagFunction.getScoreboardTag(player.getProfile().getId().toString());
|
||||
mc.textRenderer.drawWithShadow(stack, playerTAG.getTag(), (float)aa, (float)ab, playerTAG.getColor());
|
||||
offset_tag_playername += mc.textRenderer.getWidth(playerTAG.getTag()) + 2;
|
||||
int offset_tag_playername = aa; // safe current x offset ->
|
||||
TagDTO playerTAG = TagFunction.getScoreboardTag(player.getProfile().getId().toString()); // retrieve Tag object
|
||||
mc.textRenderer.drawWithShadow(stack, playerTAG.getType().getTag(), (float)aa, (float)ab, playerTAG.getType().getColor()); // draw tag name
|
||||
|
||||
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);
|
||||
|
@ -178,7 +188,7 @@ public final class CustomPlayerListHud {
|
|||
}
|
||||
|
||||
if (obj != null && player.getGameMode() != GameMode.SPECTATOR) {
|
||||
int ag = aa + i + 1;
|
||||
int ag = offset_tag_playername + i + 1;
|
||||
ah = ag + q;
|
||||
if (ah - ag > 5) {
|
||||
PlayerListHudUtil.renderScoreboardObjective(hud, stack, obj, ab, gameProfile.getName(), ag, ah, player);
|
||||
|
|
|
@ -33,7 +33,7 @@ public class PingColors {
|
|||
computeOffset(PING_MID, PING_END, Math.min(ping, PING_END)));
|
||||
}
|
||||
|
||||
static float computeOffset(int start, int end, int value) {
|
||||
public static float computeOffset(int start, int end, int value) {
|
||||
float offset = (value - start) / (float) ( end - start);
|
||||
return MathHelper.clamp(offset, 0.0F, 1.0F);
|
||||
}
|
||||
|
|
39
src/main/java/net/saltymc/eaa/custom/ping/TagDTO.java
Normal file
39
src/main/java/net/saltymc/eaa/custom/ping/TagDTO.java
Normal file
|
@ -0,0 +1,39 @@
|
|||
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;
|
||||
}
|
||||
}
|
|
@ -4,7 +4,9 @@ import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
|
|||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.toast.SystemToast;
|
||||
import net.minecraft.text.LiteralText;
|
||||
import net.minecraft.text.Style;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TextColor;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.saltymc.eaa.util.database.DB_Player;
|
||||
import net.saltymc.eaa.util.database.DB_Tag;
|
||||
|
@ -57,7 +59,7 @@ public class CheckFunction {
|
|||
|
||||
source.sendFeedback(new LiteralText(dateformat.format(curr.getTagDate())).formatted(Formatting.GRAY)
|
||||
.append(new LiteralText(" | "))
|
||||
.append(new LiteralText(curr.getType().getTag()).formatted(curr.getType().getFormatting()))
|
||||
.append(new LiteralText(curr.getType().getTag()).setStyle(Style.EMPTY.withColor(TextColor.fromRgb(curr.getType().getColor()))))
|
||||
.append(new LiteralText(" (" + curr.getGrade() + ") ").formatted(getScaleFormat(curr.getGrade())))
|
||||
);
|
||||
}
|
||||
|
@ -71,7 +73,7 @@ public class CheckFunction {
|
|||
}
|
||||
}
|
||||
|
||||
private static Formatting getScaleFormat(int grade){
|
||||
public static Formatting getScaleFormat(int grade){
|
||||
if (grade <= 5)
|
||||
return Formatting.WHITE;
|
||||
else if (grade < 9)
|
||||
|
|
|
@ -38,7 +38,7 @@ public class LobbyFunction {
|
|||
if (type == DB_Tag.Type.HACKER){
|
||||
dangerLvl = 2;
|
||||
break;
|
||||
} else if (type == DB_Tag.Type.IDIOT){
|
||||
} else if (type == DB_Tag.Type.IDIOT || type == DB_Tag.Type.NOOB){
|
||||
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"));
|
||||
break;
|
||||
case 1:
|
||||
SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.TUTORIAL_HINT, Text.of("MEH!"), Text.of("There is an Idiot!"));
|
||||
SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.TUTORIAL_HINT, Text.of("MEH!"), Text.of("There is an Idiot or Noob!"));
|
||||
break;
|
||||
case 2:
|
||||
SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.WORLD_ACCESS_FAILURE, Text.of("ALARM!"), Text.of("There is a Hacker!"));
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package net.saltymc.eaa.function;
|
||||
|
||||
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.toast.SystemToast;
|
||||
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_Tag;
|
||||
import net.saltymc.eaa.util.mojangApi.PlayerInfo;
|
||||
|
@ -23,16 +23,18 @@ public class TagFunction {
|
|||
}
|
||||
}
|
||||
|
||||
public static DB_Tag.Type getScoreboardTag(String uuid){
|
||||
if (player_tags.containsKey(uuid))
|
||||
return player_tags.get(uuid).getType();
|
||||
else {
|
||||
public static TagDTO getScoreboardTag(String uuid){
|
||||
if (player_tags.containsKey(uuid)) {
|
||||
DB_Tag tag = player_tags.get(uuid);
|
||||
return new TagDTO(tag.getGrade(), tag.getType());
|
||||
|
||||
} else {
|
||||
if (free) {
|
||||
free = false;
|
||||
loadPlayer(uuid, false);
|
||||
}
|
||||
}
|
||||
return DB_Tag.Type.NOTLOADED;
|
||||
return new TagDTO(-1, DB_Tag.Type.NOTLOADED);
|
||||
}
|
||||
|
||||
public static void tagPlayer(String player, DB_Tag.Type tag, int grade, FabricClientCommandSource source){
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package net.saltymc.eaa.util.database;
|
||||
|
||||
import net.minecraft.util.Formatting;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
@ -96,31 +94,30 @@ public class DB_Tag {
|
|||
|
||||
public enum Type {
|
||||
HACKER(
|
||||
"HAX", "PLayer who hacks", 0xaa0000, Formatting.RED
|
||||
"HAX", "PLayer who hacks", 0xaa0000
|
||||
), FRIENDLY(
|
||||
"FND", "Player you like", 0x55ff55, Formatting.GREEN
|
||||
"FND", "Player you like", 0x55ff55
|
||||
), GOODPLAYER(
|
||||
"PRO", "Fair player with good skill", 0xffaa00, Formatting.GOLD
|
||||
"PRO", "Fair player with good skill", 0xffaa00
|
||||
), IDIOT(
|
||||
"BAD", "Person who is annoying and bad", 0x55ffff, Formatting.AQUA
|
||||
"A$$", "Person who is annoying and bad", 0x55ffff
|
||||
), NOOB(
|
||||
"BAD", "Person with low skill", 0xff55ff
|
||||
), NOTTAGGED(
|
||||
"NaN", "Player is not tagged", 0x555555, Formatting.DARK_GRAY
|
||||
"NaN", "Player is not tagged", 0x555555
|
||||
), NOTLOADED(
|
||||
"---", "PLayer not loaded", 0xffffff, Formatting.WHITE
|
||||
"---", "PLayer not loaded", 0xffffff
|
||||
);
|
||||
|
||||
String tag, description;
|
||||
int color;
|
||||
Formatting formatting;
|
||||
|
||||
Type(String tag, String description, int color, Formatting formatting){
|
||||
Type(String tag, String description, int color){
|
||||
this.tag = tag;
|
||||
this.description = description;
|
||||
this.color = color;
|
||||
this.formatting = formatting;
|
||||
}
|
||||
|
||||
|
||||
public String getTag() {
|
||||
return tag;
|
||||
}
|
||||
|
@ -132,9 +129,5 @@ public class DB_Tag {
|
|||
public int getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public Formatting getFormatting(){
|
||||
return formatting;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,15 +7,24 @@ import com.mysql.cj.jdbc.Driver;
|
|||
|
||||
public class Postgre {
|
||||
|
||||
private final String url = "jdbc:postgresql://localhost/myDB";
|
||||
private final String user = "postgres";
|
||||
private final String password = "root";
|
||||
private String url;
|
||||
private String user;
|
||||
private String password;
|
||||
private String db_name;
|
||||
|
||||
private final String driverName = "com.mysql.cj.jdbc.Driver";
|
||||
|
||||
|
||||
private static Postgre postgre;
|
||||
private Connection connection;
|
||||
|
||||
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 {
|
||||
//load driver / config driver
|
||||
EaaMod.LOGGER.debug("Lade DB Treiber");
|
||||
|
|
26
src/main/java/net/saltymc/eaa/util/io/PropertieLoader.java
Normal file
26
src/main/java/net/saltymc/eaa/util/io/PropertieLoader.java
Normal file
|
@ -0,0 +1,26 @@
|
|||
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;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue