Compare commits

...
Author SHA1 Message Date
YoyoNow 397b10c319 Merge pull request 'Velocity core /event command' (#465) from VelocityCore/EventCommand into main
Deploy / Build (push) Successful in 2m12s
Deploy / Deploy (push) Successful in 10s
Reviewed-on: #465
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-08-14 07:53:43 +02:00
Sakziea cce18124f2 Remove unused translation
Pull Request Build / Build (pull_request) Successful in 3m33s
Backport CommonCore / Create CommonCore backport PRs (pull_request) Failing after 8s
2026-08-05 20:30:36 +02:00
Sakziea 18ad0ad90c Add Clickevents to EventPage 2026-08-05 20:30:28 +02:00
Sakziea a58de898bb Add Clickevents to EventPage 2026-08-05 20:30:25 +02:00
Sakziea 507b7c2569 Add event showtable 2026-08-05 20:30:20 +02:00
Sakziea a18098b8f4 Fix Pull request comments 2026-08-05 20:30:15 +02:00
Sakziea 97773f292d Remove unused import 2026-08-05 20:30:09 +02:00
Sakziea 5fdfc03587 Fix /event [Team] move to /event team [Team] 2026-08-05 20:30:00 +02:00
Sakziea 493e66cc98 Add current event uses eventpage 2026-08-05 20:29:37 +02:00
Sakziea 2be3a136ae Add funktion to show next events and formatet the fights in pages 2026-08-05 20:29:28 +02:00
Sakziea c62a566447 Fix pull Request comment 2026-08-05 20:29:18 +02:00
Sakziea 0684765a76 Remove unused imports 2026-08-05 20:29:09 +02:00
Sakziea c40f29c3c1 Add Wind charge config 2026-08-05 20:28:53 +02:00
Sakziea 72dc4eee9e Fix Wind charges cross middle and interact with Blocks 2026-08-05 20:28:24 +02:00
Sakziea c7a949322e Fix Windcharge remove Water 2026-08-05 20:27:39 +02:00
3 changed files with 149 additions and 18 deletions
@@ -271,7 +271,8 @@ CHALLENGE_ACCEPT_HOVER = §aAccept challenge
#EventCommand
EVENT_TIME_FORMAT = HH:mm
EVENT_DATE_FORMAT = dd.MM.
EVENT_USAGE = §8/§7event §8[§eTeam§8] - §7To teleport to a fight
EVENT_TEAM_USAGE = §8/§7event team §8[§eTeam§8] - §7To teleport to a fight
EVENT_SHOW_FIGHTS_USAGE = §8/§7event showfights §8[§eEvent§8] - §7To show the fights of that Event
EVENT_NO_TEAM = §cThis team does not exist
EVENT_NO_FIGHT_TEAM = §cThis team has no current fight
EVENT_NO_CURRENT = §cThere is no event taking place currently
@@ -282,9 +283,13 @@ EVENT_COMING_SCHEM_DEADLINE = §7 Submission deadline§8: §7{0}
EVENT_COMING_TEAMS = §7 With§8: {0}
EVENT_COMING_TEAM = §{0}{1}
EVENT_CURRENT_EVENT = §e§l{0}
EVENT_CURRENT_FIGHT = §7{0} §{1}{2}§8 vs §{3}{4}
EVENT_CURRENT_FIGHT_1 = §7{0} §{1}{2}
EVENT_CURRENT_FIGHT_VS = §8 vs
EVENT_CURRENT_FIGHT_2 = §{1}{2}
EVENT_CURRENT_FIGHT_WIN = §8: §7Victory §{0}{1}
EVENT_CURRENT_FIGHT_DRAW = §8: §7Draw
EVENT_TEAM_TABLE = §{0}{1}{2} §8 with §e{3} §7points
EVENT_SHOW_TABLE_USAGE = §8/§7event showtable §8[§eEvent§8] - §7To show the table of that Event
#EventRescheduleCommand
EVENTRESCHEDULE_USAGE = §8/§7eventreschedule §8[§eTeam1§8] [§eTeam2§8]
@@ -751,3 +756,9 @@ DC_SCHEMUPLOAD_IGNORED = Skipping `{0}`, not a schematic file.
DC_SCHEMUPLOAD_INVCHAR = `{0}` has invalid characters in its name.
DC_SCHEMUPLOAD_SUCCESS = `{0}` was uploaded successfully.
DC_SCHEMUPLOAD_ERROR = An error has occured during the upload of `{0}`. For more information ask a Developer.
UTIL_LIST_BACK_ARROW = §8««
UTIL_LIST_BACK_ARROW_HOVER = §ePrevious page
UTIL_LIST_PAGE = §e Page §7({0}/{1})
UTIL_LIST_NEXT = §8 »»
UTIL_LIST_NEXT_HOVER = §eNext page
@@ -253,7 +253,8 @@ CHALLENGE_ACCEPT_HOVER = §aHerausforderung annehmen
#EventCommand
EVENT_TIME_FORMAT = HH:mm
EVENT_DATE_FORMAT = dd.MM.
EVENT_USAGE = §8/§7event §8[§eTeam§8] - §7Um dich zum Kampf zu teleportieren
EVENT_TEAM_USAGE=§8/§7event team §8[§eTeam§8] - §7Um dich zum Kampf zu teleportieren
EVENT_SHOW_FIGHTS_USAGE = §8/§7event showfights §8[§eEvent§8] - §7Um die fights des Events zu zeigen
EVENT_NO_TEAM = §cDieses Team gibt es nicht
EVENT_NO_FIGHT_TEAM = §cDas Team kämpft derzeit nicht
EVENT_NO_CURRENT = §cDerzeit findet kein Event statt
@@ -264,9 +265,10 @@ EVENT_COMING_SCHEM_DEADLINE = §7 Einsendeschluss§8: §7{0}
EVENT_COMING_TEAMS = §7 Mit§8: {0}
EVENT_COMING_TEAM = §{0}{1}
EVENT_CURRENT_EVENT = §e§l{0}
EVENT_CURRENT_FIGHT = §7{0} §{1}{2}§8 vs §{3}{4}
EVENT_CURRENT_FIGHT_WIN = §8: §7Sieg §{0}{1}
EVENT_CURRENT_FIGHT_DRAW = §8: §7Unentschieden
EVENT_TEAM_TABLE = §{0}{1}{2} §8 mit §e{3} §7Punkten
EVENT_SHOW_TABLE_USAGE = §8/§7event showtable §8[§eEvent§8] - §7Um die Tabelle des Events zu zeigen.
#EventRescheduleCommand
EVENTRESCHEDULE_USAGE = §8/§7eventreschedule §8[§eTeam1§8] [§eTeam2§8]
@@ -19,6 +19,7 @@
package de.steamwar.velocitycore.commands;
import com.google.protobuf.MapEntry;
import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
@@ -28,13 +29,18 @@ import de.steamwar.messages.Chatter;
import de.steamwar.messages.PlayerChatter;
import de.steamwar.persistent.Subserver;
import de.steamwar.sql.*;
import de.steamwar.sql.Event;
import de.steamwar.velocitycore.EventStarter;
import de.steamwar.velocitycore.SubserverSystem;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import java.awt.*;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -82,35 +88,84 @@ public class EventCommand extends SWCommand {
@Register
public void eventOverview(@Validator(value = "noEvent", invert = true) Chatter sender) {
sender.system("EVENT_USAGE");
sender.system("EVENT_TEAM_USAGE");
Event currentEvent = Event.get();
sender.system("EVENT_CURRENT_EVENT", currentEvent.getEventName());
eventShowFightsPage(sender, currentEvent, 1);
}
DateTimeFormatter format = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_TIME_FORMAT"));
for (EventFight fight : EventFight.getEvent(currentEvent.getEventID())) {
Team blue = Team.byId(fight.getTeamBlue());
Team red = Team.byId(fight.getTeamRed());
StringBuilder fline = new StringBuilder(sender.parseToLegacy("EVENT_CURRENT_FIGHT", fight.getStartTime().toLocalDateTime().format(format), blue.getTeamColor(), blue.getTeamKuerzel(), red.getTeamColor(), red.getTeamKuerzel()));
@Register(value = "showtable", description = "EVENT_SHOW_TABLE_USAGE")
public void eventtable(Chatter sender, Event event) {
if (!Instant.now().isBefore(event.getEnd().toInstant())) return;
if (fight.hasFinished()) {
switch (fight.getErgebnis()) {
Map<Integer, Integer> Teampoints = new HashMap<>();
EventFight.getEvent(event.getEventID()).forEach(eventFight -> {
if (eventFight.hasFinished() && eventFight.getGroup().isPresent()) {
switch (eventFight.getErgebnis()) {
case 1:
fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_WIN", blue.getTeamColor(), blue.getTeamKuerzel()));
//win blue
Teampoints.put(eventFight.getTeamBlue(), Teampoints.getOrDefault(eventFight.getTeamBlue(), 0) + eventFight.getGroup().get().getPointsPerWin());
Teampoints.put(eventFight.getTeamRed(), Teampoints.getOrDefault(eventFight.getTeamRed(),0) + eventFight.getGroup().get().getPointsPerLoss());
break;
case 2:
fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_WIN", red.getTeamColor(), red.getTeamKuerzel()));
//win red
Teampoints.put(eventFight.getTeamBlue(), Teampoints.getOrDefault(eventFight.getTeamBlue(),0) + eventFight.getGroup().get().getPointsPerLoss());
Teampoints.put(eventFight.getTeamRed(), Teampoints.getOrDefault(eventFight.getTeamRed(),0) + eventFight.getGroup().get().getPointsPerWin());
break;
default:
fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_DRAW"));
//draw
Teampoints.put(eventFight.getTeamBlue(), Teampoints.getOrDefault(eventFight.getTeamBlue(),0) + eventFight.getGroup().get().getPointsPerDraw());
Teampoints.put(eventFight.getTeamRed(), Teampoints.getOrDefault(eventFight.getTeamRed(),0) + eventFight.getGroup().get().getPointsPerDraw());
}
}
});
Map<Integer, Integer> Teampointssortet = Teampoints.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(a , b) -> a,
LinkedHashMap::new
));
sender.prefixless("PLAIN_STRING", fline.toString());
for (Map.Entry<Integer, Integer> entry : Teampointssortet.entrySet()) {
Component finalmessage = sender.parse("EVENT_TEAM_TABLE",Team.byId(entry.getKey()).getTeamColor(), Team.byId(entry.getKey()).getTeamKuerzel(), Team.byId(entry.getKey()).getTeamName(), entry.getValue());
finalmessage = finalmessage.clickEvent(ClickEvent.runCommand("/team info " + Team.byId(entry.getKey()).getTeamName()));
sender.sendMessage(finalmessage);
}
}
@Register
@Register(value = "showfights", description = "EVENT_SHOW_FIGHTS_USAGE")
public void eventShowFightsPage(Chatter sender, Event event, @AllowNull @OptionalValue("1") int page) {
if (!Instant.now().isBefore(event.getEnd().toInstant())) return;
int pagecount = sendEventPage(sender, event, page);
Integer nextpage = page + 1;
Integer prevpage = page - 1;
Component finalmessage;
Component pagenumber = sender.parse("UTIL_LIST_PAGE", page, pagecount);
if (pagecount != 0 && page != 1) {
finalmessage = sender.parse("UTIL_LIST_BACK_ARROW");
finalmessage = finalmessage.clickEvent(ClickEvent.runCommand("/event showfights " + event.getEventName() + " " + prevpage));
finalmessage = finalmessage.append(pagenumber);
} else {
finalmessage = pagenumber;
}
if (pagecount != 0 && pagecount > page) {
Component nextbutton = sender.parse("UTIL_LIST_NEXT");
nextbutton = nextbutton.clickEvent(ClickEvent.runCommand("/event showfights " + event.getEventName() + " " + nextpage));
finalmessage = finalmessage.append(nextbutton);
}
sender.sendMessage(finalmessage);
}
@Register(value = "team", description = "EVENT_TEAM_USAGE")
public void eventWithTeam(@Validator(value = "noEvent", invert = true) PlayerChatter sender, @ErrorMessage("EVENT_NO_TEAM") Team team) {
Subserver eventArena = EventStarter.getEventServer().get(team.getTeamId());
if (eventArena == null || !Subserver.getServerList().contains(eventArena)) {
@@ -122,6 +177,69 @@ public class EventCommand extends SWCommand {
}
}
private int sendEventPage(Chatter sender, Event event, int page) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_DATE_FORMAT"));
Map<String, List<EventFight>> dates = EventFight.getEvent(event.getEventID()).stream().collect(Collectors.groupingBy(p -> p.getStartTime().toLocalDateTime().format(dateTimeFormatter)));
if (dates.size() >= page) {
sender.system("EVENT_CURRENT_EVENT", event.getEventName());
DateTimeFormatter format = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_TIME_FORMAT"));
for (EventFight eventFight : dates.get(dates.keySet().toArray()[page - 1])) {
Team blue = Team.byId(eventFight.getTeamBlue());
Team red = Team.byId(eventFight.getTeamRed());
Component finalfightline = sender.parse("EVENT_CURRENT_FIGHT_1", eventFight.getStartTime().toLocalDateTime().format(format), blue.getTeamColor(), blue.getTeamKuerzel());
finalfightline = finalfightline.clickEvent(ClickEvent.runCommand("/team info " + blue.getTeamName()));
Component vs = sender.parse("EVENT_CURRENT_FIGHT_VS");
finalfightline = finalfightline.append(vs);
Component redteam = sender.parse("EVENT_CURRENT_FIGHT_2", red.getTeamColor(), red.getTeamKuerzel());
redteam = redteam.clickEvent(ClickEvent.runCommand("/team info " + red.getTeamName()));
finalfightline = finalfightline.append(redteam);
if (eventFight.hasFinished()) {
Component ergebnis;
switch (eventFight.getErgebnis()) {
case 1:
ergebnis = sender.parse("EVENT_CURRENT_FIGHT_WIN", blue.getTeamColor(), blue.getTeamKuerzel());
break;
case 2:
ergebnis = sender.parse("EVENT_CURRENT_FIGHT_WIN", red.getTeamColor(), red.getTeamKuerzel());
break;
default:
ergebnis = sender.parse("EVENT_CURRENT_FIGHT_DRAW");
}
finalfightline = finalfightline.append(ergebnis);
}
sender.sendMessage(finalfightline);
}
}
return dates.size();
}
protected static TypeMapper<Event> eventTypeMapper() {
return new TypeMapper<>() {
@Override
public Event map(Chatter sender, PreviousArguments previousArguments, String s) {
return Event.get(s);
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
Set<String> events = new HashSet<>();
List<Event> allevents = Event.getAll();
for (Event event : allevents) {
if (!Instant.now().isAfter(event.getEnd().toInstant())) {
events.add(event.getEventName());
}
}
return events;
}
};
}
@ClassMapper(value = Event.class, local = true)
public TypeMapper<Event> eventMapper() {
return eventTypeMapper();
}
protected static TypeMapper<Team> eventTeam(Function<EventFight, List<Integer>> teamMapper) {
return new TypeMapper<>() {
@Override