Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Часть функционала FunTime events exp 3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
16 Апр 2026
Сообщения
54
Реакции
0
Выберите загрузчик игры
  1. OptiFine
всем здравствуйте пастеры,сливаю фантайм эвенты на мега экспенсив.ss:
Пожалуйста, авторизуйтесь для просмотра ссылки.
ss2:
Пожалуйста, авторизуйтесь для просмотра ссылки.

package DickRecode.functions.impl.misc;

import DickRecode.Dick;
import DickRecode.events.EventDisplay;
import DickRecode.events.EventTarget;
import DickRecode.events.EventUpdate;
import DickRecode.functions.api.Category;
import DickRecode.functions.api.Function;
import DickRecode.functions.api.FunctionRegister;
import DickRecode.functions.settings.Setting;
import DickRecode.functions.settings.impl.BooleanSetting;
import DickRecode.functions.settings.impl.ModeSetting;
import DickRecode.utils.animations.AnimationNew;
import DickRecode.utils.animations.Easing;
import DickRecode.utils.drag.Dragging;
import DickRecode.utils.render.ColorUtils;
import DickRecode.utils.render.DisplayUtils;
import DickRecode.utils.render.font.Fonts;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mojang.blaze3d.matrix.MatrixStack;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@FunctionRegister(
name = "FunTime Events",
description = "показывает ближайшие ивенты.",
type = Category.Miscellaneous
)
public class FunTimeEvents extends Function {

private String token = "82e3fce25fb3d243dd2b86446f0ef097";

private final BooleanSetting showLoot = new BooleanSetting("Показывать лут", true);
private final BooleanSetting showPhase = new BooleanSetting("Показывать фазу", false);
private final BooleanSetting onlyPending = new BooleanSetting("Только ожидающие", true);
private final ModeSetting sortMode = new ModeSetting("Сортировка", "По времени", "По времени", "По серверу");

private final Dragging drag = Dick.getInstance().createDrag(this, "FunTimeEvents", 10.0F, 60.0F);
private final AnimationNew widthAnim = new AnimationNew(Easing.LINEAR, 100L);
private final Map<String, AnimationNew> rowAnims = new HashMap<>();
private final ExecutorService executor = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r, "FunTimeEvents-Fetcher");
t.setDaemon(true);
return t;
});

private static class EventEntry {
String server;
String id;
long secondsLeft;
long fetchedAt;
String phase;
String loot;

EventEntry(String server, String id, long secondsLeft, String phase, String loot) {
this.server = server;
this.id = id;
this.secondsLeft = secondsLeft;
this.fetchedAt = System.currentTimeMillis();
this.phase = phase;
this.loot = loot;
}

long getRealSecondsLeft() {
long elapsed = (System.currentTimeMillis() - fetchedAt) / 1000;
return Math.max(0, secondsLeft - elapsed);
}
}

private final List<EventEntry> events = new ArrayList<>();
private String statusText = "Загрузка...";
private boolean fetching = false;
private long lastFetch = 0;
private static final long FETCH_INTERVAL = 30_000L;

public FunTimeEvents() {
this.addSettings(new Setting[]{showLoot, showPhase, onlyPending, sortMode});
}

@Override
public void onEnable() {
super.onEnable();
fetchEventsForServers(cachedServerList);
}

private List<String> cachedServerList = new ArrayList<>(java.util.Arrays.asList(
"anarchy1001","anarchy1002","anarchy1003","anarchy1004","anarchy1005","anarchy1006",
"anarchy2001","anarchy2002","anarchy2003","anarchy2004","anarchy2005","anarchy2006",
"anarchy2007","anarchy2008","anarchy2009","anarchy2010","anarchy2011","anarchy2012",
"anarchy2013","anarchy2014","anarchy2015","anarchy2016",
"anarchy3001","anarchy3002","anarchy3003","anarchy3004",
"anarchy3005","anarchy3006","anarchy3007","anarchy3008",
"anarchy5001","anarchy5002","anarchy5003","anarchy5004",
"anarchy6001","anarchy6002","anarchy6003"
));



private void fetchEventsForServers(List<String> serverList) {
if (fetching) return;
fetching = true;
executor.submit(() -> {
try {
List<EventEntry> allEvents = new ArrayList<>();
for (int i = 0; i < serverList.size(); i += 30) {
List<String> batch = serverList.subList(i, Math.min(i + 30, serverList.size()));
allEvents.addAll(fetchBatch(batch.toArray(new String[0])));
}
synchronized (events) {
events.clear();
events.addAll(allEvents);
}
statusText = allEvents.isEmpty() ? "Ивентов нет" : "";
lastFetch = System.currentTimeMillis();
} catch (Exception ex) {
statusText = "Ошибка: " + ex.getMessage();
} finally {
fetching = false;
}
});
}

@EventTarget
public void onUpdate(EventUpdate e) {
if (System.currentTimeMillis() - lastFetch > FETCH_INTERVAL && !fetching) {
if (!cachedServerList.isEmpty()) {
fetchEventsForServers(cachedServerList);
} else {
fetchEventsForServers(cachedServerList);
}
}
}

@EventTarget
public void onDisplay(EventDisplay e) {
if (e.getType() != EventDisplay.Type.POST) return;
if (mc.player == null) return;

MatrixStack ms = e.getMatrixStack();

float posX = drag.getX();
float posY = drag.getY();
float width = 60.0F;
float height = 14.0F;

// мега пастеры,замените худ2 на свой худ
DickRecode.functions.impl.render.Hud2 hud2 = Dick.getInstance().getFunctionRegistry().getHud2();
int bgColor = hud2 != null
? ColorUtils.setAlpha(hud2.color.color, (int)(255.0F * hud2.alpha.get()))
: ColorUtils.rgba(30, 30, 30, 220);

List<EventEntry> display = new ArrayList<>();
synchronized (events) {
for (EventEntry ev : events) {
if (onlyPending.get() && ev.phase.equals("CLOSED")) continue;
display.add(ev);
}
}
if (sortMode.is("По времени")) {
display.sort(Comparator.comparingLong(ev -> ev.secondsLeft));
} else {
display.sort(Comparator.comparing(ev -> ev.server));
}
if (display.size() > 10) display = display.subList(0, 10);

DisplayUtils.drawRoundedRect(posX, posY,
(float) widthAnim.getValue(), height,
3.0F, 1.0F, bgColor);

Fonts.sfbold.drawText(ms, "FT Events", posX + 17.0F, posY + 3.5F, -1, 7.0F);
DisplayUtils.drawRectW(posX + 14.5F, posY + 3.0F, 1.0, height - 7.0F,
ColorUtils.rgba(200, 200, 200, 80));
ms.push();
ms.translate(posX + 4.0F, posY + 2.5F, 0);
ms.pop();
Fonts.sfbold.drawText(ms, "\u26A1", posX + 4.0F, posY + 3.5F,
DisplayUtils.getColorStyleStatic(0.0F), 7.0F);

float widthMax = 0.0F;
int i = 0;

if (display.isEmpty()) {
String key = "__empty__";
AnimationNew anim = rowAnims.computeIfAbsent(key, k -> new AnimationNew(Easing.LINEAR, 150L));
anim.run(1.0);
float animVal = (float) anim.getValue();
float streng = animVal * 7.0F - 7.0F;

DisplayUtils.drawRoundedRect(posX + streng, posY + 15.0F,
(float) widthAnim.getValue(), height - 4.0F,
2.0F, 1.0F, ColorUtils.setAlpha(bgColor, (int)(ColorUtils.getAlpha(bgColor) * animVal)));

Fonts.sfbold.drawText(ms, statusText,
posX + 2.0F + streng, posY + 17.0F,
ColorUtils.setAlpha(ColorUtils.rgb(160, 160, 160), (int)(255 * animVal)), 6.0F);
widthMax = Fonts.sfbold.getWidth(statusText, 6.0F) + 10.0F;
i = 1;
} else {
for (EventEntry ev : display) {
String key = ev.server + "_" + ev.id;
AnimationNew anim = rowAnims.computeIfAbsent(key, k -> new AnimationNew(Easing.LINEAR, 150L));
anim.run(1.0);
float animVal = (float) anim.getValue();
float streng = animVal * 7.0F - 7.0F;

DisplayUtils.drawRoundedRect(posX + streng, posY + 15.0F + i * 11,
(float) widthAnim.getValue(), height - 4.0F,
2.0F, 1.0F, ColorUtils.setAlpha(bgColor, (int)(ColorUtils.getAlpha(bgColor) * animVal)));

int nameColor;
switch (ev.phase) {
case "RUNNING": nameColor = ColorUtils.rgb(100, 255, 100); break;
case "ACTIVATING": nameColor = ColorUtils.rgb(255, 220, 50); break;
case "OPENED": nameColor = ColorUtils.rgb(100, 200, 255); break;
default: nameColor = -1; break;
}

String eventName = getEventName(ev.id);
String serverShort = ev.server.replace("anarchy", "an");
String left = serverShort + " \u00BB " + eventName;
if (showLoot.get() && ev.loot != null && !ev.loot.isEmpty()) {
left += " [" + ev.loot + "]";
}

String right;
switch (ev.phase) {
case "RUNNING": right = "ИДЁТ"; break;
case "ACTIVATING": right = "СТАРТ"; break;
default: right = formatTime(ev.secondsLeft); break;
}

float rightW = Fonts.sfbold.getWidth(right, 6.0F);
float leftW = Fonts.sfbold.getWidth(left, 6.0F);

Fonts.sfbold.drawText(ms, left,
posX + 2.0F + streng, posY + 17.0F + i * 11,
ColorUtils.setAlpha(nameColor, (int)(255 * animVal)), 6.0F);

DisplayUtils.drawRoundedRect(
(float)(posX + widthAnim.getValue() - 3.0 + streng - 4.0 - rightW - 2.0),
posY + 17.5F + i * 11,
1.0F, 5.0F, 0.0F, 0.3F,
ColorUtils.setAlpha(ColorUtils.rgb(200, 200, 200), (int)(150 * animVal)));

Fonts.sfbold.drawText(ms, right,
(float)(posX + widthAnim.getValue() - 3.0 + streng - rightW),
posY + 17.0F + i * 11,
ColorUtils.setAlpha(ColorUtils.rgb(255, 200, 80), (int)(255 * animVal)), 6.0F);

widthMax = Math.max(leftW + rightW + 20.0F, widthMax);
i++;
posY += animVal * 11.0F - 11.0F;
}
}

final List<EventEntry> displayFinal = display;
rowAnims.keySet().removeIf(key -> {
if (key.equals("__empty__")) return false;
boolean found = displayFinal.stream().anyMatch(ev -> (ev.server + "_" + ev.id).equals(key));
AnimationNew anim = rowAnims.get(key);
if (!found) { anim.run(0.0); return anim.getValue() == 0.0; }
return false;
});

widthAnim.run(Math.max(width, widthMax));
drag.setWidth((float) widthAnim.getValue());
drag.setHeight(height + i * 11);
}


private void fetchEvents() {
if (fetching) return;
fetching = true;
executor.submit(() -> {
try {
String[] batch1 = {
"an1001","an1002","an1003","an1004","an1005","an1006",
"an2001","an2002","an2003","an2004","an2005","an2006","an2007","an2008",
"an2009","an2010","an2011","an2012","an2013","an2014","an2015","an2016",
"an3001","an3002","an3003","an3004","an3005","an3006","an3007","an3008"
};
String[] batch2 = {
"an5001","an5002","an5003","an5004",
"an6001","an6002","an6003"
};

List<EventEntry> allEvents = new ArrayList<>();
allEvents.addAll(fetchBatch(batch1));
allEvents.addAll(fetchBatch(batch2));

synchronized (events) {
events.clear();
events.addAll(allEvents);
}

if (allEvents.isEmpty()) {
statusText = "Ивентов нет";
}

lastFetch = System.currentTimeMillis();

} catch (Exception ex) {
statusText = "Ошибка: " + ex.getMessage();
System.out.println("[FunTimeEvents] " + ex.getMessage());
} finally {
fetching = false;
}
});
}

private List<EventEntry> fetchBatch(String[] servers) throws Exception {
String serverList = String.join(",", servers);
String urlStr = "
Пожалуйста, авторизуйтесь для просмотра ссылки.
" + serverList;
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization-Token", token);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);

int code = conn.getResponseCode();
System.out.println("[FunTimeEvents] HTTP " + code + " для " + servers.length + " серверов");

if (code == 401) { statusText = "Неверный токен"; return new ArrayList<>(); }
if (code == 402) { statusText = "Лимит запросов"; return new ArrayList<>(); }
if (code != 200) { statusText = "Ошибка " + code; return new ArrayList<>(); }

BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) sb.append(line);
reader.close();

System.out.println("[FunTimeEvents] Ответ: " + sb.toString());
return parseBatch(sb.toString());
}

private List<EventEntry> parseBatch(String json) {
List<EventEntry> result = new ArrayList<>();
try {
JsonObject root = JsonParser.parseString(json).getAsJsonObject();
JsonArray response = root.getAsJsonArray("response");
if (response == null) return result;

for (JsonElement serverEl : response) {
JsonObject serverObj = serverEl.getAsJsonObject();
String serverName = serverObj.has("server") ? serverObj.get("server").getAsString() : "?";
JsonArray eventsArr = serverObj.has("events") ? serverObj.getAsJsonArray("events") : new JsonArray();

for (JsonElement evEl : eventsArr) {
JsonObject ev = evEl.getAsJsonObject();

if (!ev.has("id") || !ev.has("phase")) continue;

String id = ev.get("id").getAsString();
String phase = ev.get("phase").getAsString();
long secondsLeft = ev.has("time-seconds-left") ? ev.get("time-seconds-left").getAsLong() : 0;
String loot = ev.has("loot") ? ev.get("loot").getAsString() : "";
String eventType = ev.has("event-type") ? ev.get("event-type").getAsString() : "system";

if (phase.equals("CLOSED")) continue;
if (id.equals("myst_beacon")) continue;

if (loot.equals("null")) loot = "";

result.add(new EventEntry(serverName, id, secondsLeft, phase, loot));
}
}
} catch (Exception ex) {
System.out.println("[FunTimeEvents] Parse error: " + ex.getMessage());
}
return result;
}


private String getEventName(String id) {
switch (id) {
case "deathchest": return "Сундук смерти";
case "mystic": return "Мистик";
case "beacon": return "Маяк";
case "meteor_rain": return "Метеорит";
case "hellm": return "Шлем ада";
case "helm": return "Шлем";
case "altar": return "Алтарь";
case "express": return "Экспресс";
case "santa": return "Санта";
case "vulkan": return "Вулкан";
case "myst_beacon": return "Мист. маяк";
default: return id;
}
}

private String formatTime(long seconds) {
if (seconds <= 0) return "сейчас";
long h = seconds / 3600;
long m = (seconds % 3600) / 60;
long s = seconds % 60;
if (h > 0) return String.format("%dч %02dм", h, m);
if (m > 0) return String.format("%dм %02dс", m, s);
return String.format("%dс", s);
}

public void setToken(String newToken) {
this.token = newToken;
fetchEvents();
}
}
всем здравствуйте пастеры,сливаю фантайм эвенты на мега экспенсив.ss:
Пожалуйста, авторизуйтесь для просмотра ссылки.
шлем ада ес чо адская резня
 
Последнее редактирование:
Назад
Сверху Снизу