From 99773d6a593c444151503de315f127bea6f74d49 Mon Sep 17 00:00:00 2001 From: Lorenz Date: Thu, 7 Jul 2022 00:31:50 +0200 Subject: init lorenz mod --- .../skyblockhud/api/KillTracking.java | 61 ++++++++++++++++++++ .../skyblockhud/api/LeaderboardGetter.java | 65 ++++++++++++++++++++++ .../api/events/LocationChangeEvent.java | 15 +++++ .../skyblockhud/api/events/ProfileJoinedEvent.java | 12 ++++ .../api/events/ProfileSwitchedEvent.java | 12 ++++ .../api/events/SidebarLineUpdateEvent.java | 22 ++++++++ .../skyblockhud/api/events/SidebarPostEvent.java | 21 +++++++ .../skyblockhud/api/events/SidebarPreGetEvent.java | 18 ++++++ .../api/events/SkyBlockEntityKilled.java | 18 ++++++ .../skyblockhud/api/item/IAbility.java | 7 +++ .../api/sbentities/EntityTypeHelper.java | 36 ++++++++++++ .../api/sbentities/EntityTypeRegistry.java | 27 +++++++++ .../skyblockhud/api/sbentities/SkyBlockEntity.java | 27 +++++++++ 13 files changed, 341 insertions(+) create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/KillTracking.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/LocationChangeEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileJoinedEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/events/SkyBlockEntityKilled.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/item/IAbility.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeHelper.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeRegistry.java create mode 100644 src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/SkyBlockEntity.java (limited to 'src/main/java/com/thatgravyboat/skyblockhud/api') diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/KillTracking.java b/src/main/java/com/thatgravyboat/skyblockhud/api/KillTracking.java new file mode 100644 index 000000000..bc98672d8 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/KillTracking.java @@ -0,0 +1,61 @@ +package com.thatgravyboat.skyblockhud.api; + +import com.thatgravyboat.skyblockhud.DevModeConstants; +import com.thatgravyboat.skyblockhud.api.events.SkyBlockEntityKilled; +import com.thatgravyboat.skyblockhud.api.sbentities.EntityTypeRegistry; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.EntityJoinWorldEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +public class KillTracking { + + public static final Set attackedEntities = new HashSet<>(); + + @SubscribeEvent + public void onAttack(AttackEntityEvent event) { + if (event.target != null) { + attackedEntities.add(event.target.getUniqueID()); + } + } + + @SubscribeEvent + public void onDeath(LivingDeathEvent event) { + if (DevModeConstants.mobDeathLogging) { + //Used for testing + System.out.println("----------------------------------------------------------------------------------------------------------------"); + System.out.println("Name : " + event.entity.getName()); + System.out.println("UUID : " + event.entity.getUniqueID()); + NBTTagCompound compound = new NBTTagCompound(); + event.entity.writeToNBT(compound); + System.out.println("Tag : " + compound); + System.out.println("Damage : " + getDamageSourceString(event.source)); + System.out.println("SBH Entity ID: " + EntityTypeRegistry.getEntityId(event.entity)); + System.out.println("----------------------------------------------------------------------------------------------------------------"); + } + if (attackedEntities.contains(event.entity.getUniqueID())) { + if (EntityTypeRegistry.getEntityId(event.entity) != null) { + MinecraftForge.EVENT_BUS.post(new SkyBlockEntityKilled(EntityTypeRegistry.getEntityId(event.entity), event.entity)); + } + attackedEntities.remove(event.entity.getUniqueID()); + } + } + + public static String getDamageSourceString(DamageSource source) { + return ("{ " + source.getDamageType() + ", " + source.isDamageAbsolute() + ", " + source.isDifficultyScaled() + ", " + source.isFireDamage() + ", " + source.isProjectile() + ", " + source.isUnblockable() + ", " + source.isExplosion() + ", " + source.isMagicDamage() + ", " + source.isCreativePlayer() + ", " + source.getSourceOfDamage() + " }"); + } + + @SubscribeEvent + public void onWorldChange(EntityJoinWorldEvent event) { + if (event.entity == Minecraft.getMinecraft().thePlayer) { + attackedEntities.clear(); + } + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java b/src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java new file mode 100644 index 000000000..3c5936057 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/LeaderboardGetter.java @@ -0,0 +1,65 @@ +package com.thatgravyboat.skyblockhud.api; + +import static com.thatgravyboat.skyblockhud.ComponentHandler.SCOREBOARD_CHARACTERS; + +import com.thatgravyboat.skyblockhud.SkyblockHud; +import com.thatgravyboat.skyblockhud.api.events.SidebarLineUpdateEvent; +import com.thatgravyboat.skyblockhud.api.events.SidebarPostEvent; +import com.thatgravyboat.skyblockhud.api.events.SidebarPreGetEvent; +import com.thatgravyboat.skyblockhud.utils.Utils; +import java.util.*; +import java.util.stream.Collectors; +import net.minecraft.client.Minecraft; +import net.minecraft.scoreboard.Score; +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.ScorePlayerTeam; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class LeaderboardGetter { + + private static Map cachedScores = new HashMap<>(); + private static List cachedScoresList = new ArrayList<>(); + + private static int ticks = 0; + + public static List getCachedScores() { + return cachedScoresList; + } + + @SubscribeEvent + public void onClientUpdate(TickEvent.ClientTickEvent event) { + if (event.phase.equals(TickEvent.Phase.START)) return; + ticks++; + if (ticks % 5 != 0) return; + + Minecraft mc = Minecraft.getMinecraft(); + if (mc.theWorld != null && SkyblockHud.hasSkyblockScoreboard()) { + Scoreboard scoreboard = mc.theWorld.getScoreboard(); + ScoreObjective sidebarObjective = scoreboard.getObjectiveInDisplaySlot(1); + + if (sidebarObjective != null && !MinecraftForge.EVENT_BUS.post(new SidebarPreGetEvent(scoreboard, sidebarObjective))) { + Collection scoreList = sidebarObjective.getScoreboard().getSortedScores(sidebarObjective); + Map scores = scoreList.stream().collect(Collectors.toMap(Score::getScorePoints, this::getLine, (s1, s2) -> s1)); + + if (!cachedScores.equals(scores)) { + scores.forEach((score, name) -> { + if (cachedScores.get(score) == null || !cachedScores.get(score).equals(name)) { + MinecraftForge.EVENT_BUS.post(new SidebarLineUpdateEvent(name, SCOREBOARD_CHARACTERS.matcher(name).replaceAll("").trim(), score, scores.size(), scoreboard, sidebarObjective)); + } + }); + cachedScores = scores; + cachedScoresList = scores.values().stream().map(name -> SCOREBOARD_CHARACTERS.matcher(name).replaceAll("").trim()).collect(Collectors.toList()); + } + MinecraftForge.EVENT_BUS.post(new SidebarPostEvent(scoreboard, sidebarObjective, cachedScoresList)); + } + } + } + + public String getLine(Score score) { + ScorePlayerTeam scorePlayerTeam = score.getScoreScoreboard().getPlayersTeam(score.getPlayerName()); + return Utils.removeColor(ScorePlayerTeam.formatPlayerName(scorePlayerTeam, score.getPlayerName())); + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/LocationChangeEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/LocationChangeEvent.java new file mode 100644 index 000000000..384e76d2e --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/LocationChangeEvent.java @@ -0,0 +1,15 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import com.thatgravyboat.skyblockhud.location.Locations; +import net.minecraftforge.fml.common.eventhandler.Event; + +public class LocationChangeEvent extends Event { + + public Locations oldLocation; + public Locations newLocation; + + public LocationChangeEvent(Locations oldLocation, Locations newLocation) { + this.oldLocation = oldLocation; + this.newLocation = newLocation; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileJoinedEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileJoinedEvent.java new file mode 100644 index 000000000..f1d4d38b8 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileJoinedEvent.java @@ -0,0 +1,12 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraftforge.fml.common.eventhandler.Event; + +public class ProfileJoinedEvent extends Event { + + public String profile; + + public ProfileJoinedEvent(String profile) { + this.profile = profile; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java new file mode 100644 index 000000000..408ac8ade --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/ProfileSwitchedEvent.java @@ -0,0 +1,12 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraftforge.fml.common.eventhandler.Event; + +public class ProfileSwitchedEvent extends Event { + + public String profile; + + public ProfileSwitchedEvent(String profile) { + this.profile = profile; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java new file mode 100644 index 000000000..2737ee911 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarLineUpdateEvent.java @@ -0,0 +1,22 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.fml.common.eventhandler.Event; + +public class SidebarLineUpdateEvent extends Event { + + public String rawLine; + public String formattedLine; + public int position; + public Scoreboard scoreboard; + public ScoreObjective objective; + + public SidebarLineUpdateEvent(String rawLine, String formattedLine, int score, int max, Scoreboard scoreboard, ScoreObjective objective) { + this.rawLine = rawLine; + this.formattedLine = formattedLine; + this.position = max - score; + this.scoreboard = scoreboard; + this.objective = objective; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java new file mode 100644 index 000000000..34d27e6bc --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPostEvent.java @@ -0,0 +1,21 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import java.util.List; +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.fml.common.eventhandler.Event; + +public class SidebarPostEvent extends Event { + + public Scoreboard scoreboard; + public ScoreObjective objective; + public List scores; + public String[] arrayScores; + + public SidebarPostEvent(Scoreboard scoreboard, ScoreObjective objective, List scores) { + this.scoreboard = scoreboard; + this.objective = objective; + this.scores = scores; + this.arrayScores = scores.toArray(new String[] {}); + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java new file mode 100644 index 000000000..0db1895c6 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SidebarPreGetEvent.java @@ -0,0 +1,18 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import net.minecraft.scoreboard.ScoreObjective; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraftforge.fml.common.eventhandler.Cancelable; +import net.minecraftforge.fml.common.eventhandler.Event; + +@Cancelable +public class SidebarPreGetEvent extends Event { + + public Scoreboard scoreboard; + public ScoreObjective objective; + + public SidebarPreGetEvent(Scoreboard scoreboard, ScoreObjective objective) { + this.scoreboard = scoreboard; + this.objective = objective; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/events/SkyBlockEntityKilled.java b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SkyBlockEntityKilled.java new file mode 100644 index 000000000..61f8d824f --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/events/SkyBlockEntityKilled.java @@ -0,0 +1,18 @@ +package com.thatgravyboat.skyblockhud.api.events; + +import javax.annotation.Nullable; +import net.minecraft.entity.Entity; +import net.minecraftforge.fml.common.eventhandler.Event; + +public class SkyBlockEntityKilled extends Event { + + public String id; + + @Nullable + public Entity entity; + + public SkyBlockEntityKilled(String id, @Nullable Entity entity) { + this.id = id; + this.entity = entity; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/item/IAbility.java b/src/main/java/com/thatgravyboat/skyblockhud/api/item/IAbility.java new file mode 100644 index 000000000..4f330d9a3 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/item/IAbility.java @@ -0,0 +1,7 @@ +package com.thatgravyboat.skyblockhud.api.item; + +public interface IAbility { + String getAbility(); + + int getAbilityTime(); +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeHelper.java b/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeHelper.java new file mode 100644 index 000000000..bb14e5d21 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeHelper.java @@ -0,0 +1,36 @@ +package com.thatgravyboat.skyblockhud.api.sbentities; + +import com.thatgravyboat.skyblockhud.location.LocationHandler; +import com.thatgravyboat.skyblockhud.location.Locations; +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; + +public class EntityTypeHelper { + + public static boolean isZealot(Entity entity) { + if (entity instanceof EntityEnderman) { + EntityEnderman enderman = ((EntityEnderman) entity); + double maxHealthBase = enderman.getAttributeMap().getAttributeInstanceByName("generic.maxHealth").getBaseValue(); + if (maxHealthBase == 13000 || (maxHealthBase == 2000d && enderman.getHeldBlockState().getBlock().equals(Blocks.end_portal_frame))) { + return LocationHandler.getCurrentLocation().equals(Locations.DRAGONSNEST); + } + } + return false; + } + + public static boolean isCrypt(Entity entity) { + if (entity instanceof EntityZombie) { + EntityZombie zombie = ((EntityZombie) entity); + double maxHealthBase = zombie.getAttributeMap().getAttributeInstanceByName("generic.maxHealth").getBaseValue(); + if (maxHealthBase != 2000d) return false; + if (zombie.getEquipmentInSlot(0) == null || !zombie.getEquipmentInSlot(0).getItem().equals(Items.iron_sword)) return false; + if (zombie.getEquipmentInSlot(1) == null || !zombie.getEquipmentInSlot(1).getItem().equals(Items.chainmail_boots)) return false; + if (zombie.getEquipmentInSlot(2) == null || !zombie.getEquipmentInSlot(2).getItem().equals(Items.chainmail_leggings)) return false; + return zombie.getEquipmentInSlot(3) != null && zombie.getEquipmentInSlot(3).getItem().equals(Items.chainmail_chestplate); + } + return false; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeRegistry.java b/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeRegistry.java new file mode 100644 index 000000000..6ff88fafb --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/EntityTypeRegistry.java @@ -0,0 +1,27 @@ +package com.thatgravyboat.skyblockhud.api.sbentities; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import java.util.List; +import java.util.Map; +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.monster.EntityZombie; + +public class EntityTypeRegistry { + + private static final Map, List> entities = Maps.newHashMap(); + + static { + entities.put(EntityEnderman.class, ImmutableList.of(SkyBlockEntity.of("ZEALOT", EntityTypeHelper::isZealot))); + entities.put(EntityZombie.class, ImmutableList.of(SkyBlockEntity.of("CRYPT_GHOUL", EntityTypeHelper::isCrypt))); + } + + public static String getEntityId(Entity entity) { + if (!entities.containsKey(entity.getClass())) return null; + for (SkyBlockEntity skyBlockEntity : entities.get(entity.getClass())) { + if (skyBlockEntity.isEntity(entity)) return skyBlockEntity.getName(); + } + return null; + } +} diff --git a/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/SkyBlockEntity.java b/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/SkyBlockEntity.java new file mode 100644 index 000000000..bcd1196f5 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/api/sbentities/SkyBlockEntity.java @@ -0,0 +1,27 @@ +package com.thatgravyboat.skyblockhud.api.sbentities; + +import java.util.function.Predicate; +import net.minecraft.entity.Entity; + +public class SkyBlockEntity { + + private final String name; + private final Predicate predicate; + + public static SkyBlockEntity of(String name, Predicate predicate) { + return new SkyBlockEntity(name, predicate); + } + + private SkyBlockEntity(String name, Predicate predicate) { + this.name = name; + this.predicate = predicate; + } + + public String getName() { + return name; + } + + public boolean isEntity(Entity entity) { + return predicate.test(entity); + } +} -- cgit