Skip to content

Commit

Permalink
Merge branch '1.18.x/dev' into '1.19.x/dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
Kir-Antipov committed Jul 1, 2022
2 parents 2b2f6f1 + 20cb5fc commit 094d78c
Show file tree
Hide file tree
Showing 17 changed files with 709 additions and 2 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ yarn_mappings=1.19+build.1
loader_version=0.14.7

# Mod Properties
mod_version=4.1
mod_version=4.2
maven_group=dev.kir
archives_base_name=sync

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import dev.kir.sync.api.event.EntityFitnessEvents;
import dev.kir.sync.config.SyncConfig;
import dev.kir.sync.Sync;
import dev.kir.sync.easteregg.technoblade.TechnobladeManager;
import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext;
import net.minecraft.block.BlockState;
import net.minecraft.block.DoubleBlockProperties;
Expand Down Expand Up @@ -69,7 +70,13 @@ private void setRunner(Entity entity) {
EntityFitnessEvents.START_RUNNING.invoker().onStartRunning(this.runner, this);
}

if (this.world != null && !this.world.isClient) {
if (this.world == null) {
return;
}

if (this.world.isClient) {
TechnobladeManager.refreshTechnobladeStatus(entity, this.pos);
} else {
this.markDirty();
this.sync();
}
Expand Down
70 changes: 70 additions & 0 deletions src/main/java/dev/kir/sync/compat/cloth/SyncClothConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
import net.minecraft.util.registry.Registry;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Config(name = Sync.MOD_ID)
Expand Down Expand Up @@ -83,6 +85,9 @@ public static SyncConfig getInstance() {
@ConfigEntry.Gui.Tooltip(count = 2)
public boolean updateTranslationsAutomatically = SyncConfig.super.updateTranslationsAutomatically();

@ConfigEntry.Category(value = "easter_eggs")
@ConfigEntry.Gui.TransitiveObject
public EasterEggs easterEggs = new EasterEggs();

@Override
public boolean enableInstantShellConstruction() {
Expand Down Expand Up @@ -156,6 +161,71 @@ public boolean updateTranslationsAutomatically() {
return this.updateTranslationsAutomatically;
}

@Override
public boolean enableTechnobladeEasterEgg() {
return this.easterEggs.technoblade.enable;
}

@Override
public boolean renderTechnobladeCape() {
return this.easterEggs.technoblade.renderCape;
}

@Override
public boolean allowTechnobladeAnnouncements() {
return this.easterEggs.technoblade.allowAnnouncements;
}

@Override
public boolean allowTechnobladeQuotes() {
return this.easterEggs.technoblade.allowQuotes;
}

@Override
public int TechnobladeQuoteDelay() {
return this.easterEggs.technoblade.quoteDelay;
}

@Override
public boolean isTechnoblade(UUID uuid) {
return this.easterEggs.technoblade.cache.contains(uuid);
}

@Override
public void addTechnoblade(UUID uuid) {
this.easterEggs.technoblade.cache.add(uuid);
AutoConfig.getConfigHolder(SyncClothConfig.class).save();
}

@Override
public void removeTechnoblade(UUID uuid) {
this.easterEggs.technoblade.cache.remove(uuid);
AutoConfig.getConfigHolder(SyncClothConfig.class).save();
}

@Override
public void clearTechnobladeCache() {
this.easterEggs.technoblade.cache.clear();
AutoConfig.getConfigHolder(SyncClothConfig.class).save();
}

public static class EasterEggs {
@ConfigEntry.Gui.CollapsibleObject
public TechnobladeEasterEgg technoblade = new TechnobladeEasterEgg();
}

public static class TechnobladeEasterEgg {
@ConfigEntry.Gui.RequiresRestart
public boolean enable = true;
public boolean renderCape = false;
public boolean allowAnnouncements = true;
public boolean allowQuotes = true;
public int quoteDelay = 1800;

@ConfigEntry.Gui.Excluded
public HashSet<UUID> cache = new HashSet<>();
}

public static class EnergyMapEntry implements SyncConfig.EnergyMapEntry {
@ConfigEntry.Gui.RequiresRestart
public String entityId;
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/dev/kir/sync/config/SyncConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.minecraft.util.registry.Registry;

import java.util.List;
import java.util.UUID;

public interface SyncConfig {
List<EnergyMapEntry> DEFAULT_ENERGY_MAP = List.of(
Expand Down Expand Up @@ -81,6 +82,43 @@ default boolean preserveOrigins() {
return false;
}

default boolean enableTechnobladeEasterEgg() {
return true;
}

default boolean renderTechnobladeCape() {
// Techno hasn't worn a cape lately
return false;
}

default boolean allowTechnobladeAnnouncements() {
return true;
}

default boolean allowTechnobladeQuotes() {
return true;
}

default int TechnobladeQuoteDelay() {
return 1800;
}

default boolean isTechnoblade(UUID uuid) {
return false;
}

default void addTechnoblade(UUID uuid) {

}

default void removeTechnoblade(UUID uuid) {

}

default void clearTechnobladeCache() {

}

interface EnergyMapEntry {
default String entityId() {
return "minecraft:pig";
Expand Down
80 changes: 80 additions & 0 deletions src/main/java/dev/kir/sync/easteregg/mixin/MixinEasterEggs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package dev.kir.sync.easteregg.mixin;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Set;

public final class MixinEasterEggs implements IMixinConfigPlugin {
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
String name = getPackageName(mixinClassName);
JsonObject config = this.getConfig();
if (
config.has(name) && config.get(name) instanceof JsonObject configEntry &&
configEntry.has("enable") && configEntry.get("enable") instanceof JsonPrimitive enable && enable.isBoolean()
) {
return enable.getAsBoolean();
}

return true;
}

@Override
public void onLoad(String mixinPackage) { }

@Override
public String getRefMapperConfig() { return null; }

@Override
public List<String> getMixins() { return null; }

@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) { }

@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { }

@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { }

private static String getPackageName(String mixinClassName) {
int mixinStartI = mixinClassName.lastIndexOf("mixin.");
if (mixinStartI == -1)
return mixinClassName;

int endI = mixinClassName.indexOf('.', mixinStartI + 6);
return mixinClassName.substring(mixinStartI + 6, endI);
}

private JsonObject config;
private JsonObject getConfig() {
if (this.config == null) {
try {
Path path = Path.of("./config/sync.json");
if (Files.isReadable(path)) {
String json = Files.readString(path);
this.config = (JsonObject)JsonParser.parseString(json);
}
} catch (Throwable e) {
this.config = null;
}

if (this.config == null) {
this.config = new JsonObject();
}

if (this.config.has("easterEggs") && this.config.get("easterEggs") instanceof JsonObject easterEggs) {
this.config = easterEggs;
}
}
return this.config;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package dev.kir.sync.easteregg.mixin.technoblade;

import dev.kir.sync.easteregg.technoblade.Technoblade;
import dev.kir.sync.easteregg.technoblade.TechnobladeTransformable;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.sound.EntityTrackingSoundInstance;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.random.Random;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryEntry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.MutableWorldProperties;
import net.minecraft.world.World;
import net.minecraft.world.dimension.DimensionType;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.List;
import java.util.function.Supplier;

@Environment(EnvType.CLIENT)
@Mixin(ClientWorld.class)
abstract class ClientWorldMixin extends World {
@Shadow
private @Final MinecraftClient client;

private ClientWorldMixin(MutableWorldProperties properties, RegistryKey<World> registryRef, RegistryEntry<DimensionType> dimension, Supplier<Profiler> profiler, boolean isClient, boolean debugWorld, long seed, int maxChainedNeighborUpdates) {
super(properties, registryRef, dimension, profiler, isClient, debugWorld, seed, maxChainedNeighborUpdates);
}

@Inject(method = "playSound(DDDLnet/minecraft/sound/SoundEvent;Lnet/minecraft/sound/SoundCategory;FFZJ)V", at = @At("HEAD"), cancellable = true)
private void playSound(double x, double y, double z, SoundEvent sound, SoundCategory category, float volume, float pitch, boolean useDistance, long seed, CallbackInfo ci) {
if (category != SoundCategory.NEUTRAL) {
return;
}

List<MobEntity> Technoblades = this.getEntitiesByClass(MobEntity.class, new Box(x - 0.1, y - 0.1, z - 0.1, x + 0.1, y + 0.1, z + 0.1), e -> e instanceof TechnobladeTransformable && ((TechnobladeTransformable)e).isTechnoblade());
MobEntity entity = Technoblades.size() == 0 ? null : Technoblades.get(0);
if (entity == null) {
return;
}

Technoblade Technoblade = ((TechnobladeTransformable)entity).asTechnoblade();
sound = this.getTechnobladeSound(sound);
if (sound == null) {
ci.cancel();
return;
}

double distance = this.client.gameRenderer.getCamera().getPos().squaredDistanceTo(x, y, z);
PositionedSoundInstance positionedSoundInstance = new PositionedSoundInstance(sound, Technoblade.getSoundCategory(), volume, pitch, Random.create(seed), x, y, z);
if (useDistance && distance > 100) {
this.client.getSoundManager().play(positionedSoundInstance, (int)(Math.sqrt(distance) * 0.5));
} else {
this.client.getSoundManager().play(positionedSoundInstance);
}
ci.cancel();
}

@Inject(method = "playSoundFromEntity", at = @At("HEAD"), cancellable = true)
private void playSoundFromEntity(PlayerEntity except, Entity entity, SoundEvent sound, SoundCategory category, float volume, float pitch, long seed, CallbackInfo ci) {
if (except != this.client.player || !(entity instanceof TechnobladeTransformable) || !((TechnobladeTransformable)entity).isTechnoblade()) {
return;
}

Technoblade Technoblade = ((TechnobladeTransformable)entity).asTechnoblade();
sound = this.getTechnobladeSound(sound);
if (sound == null) {
ci.cancel();
return;
}

this.client.getSoundManager().play(new EntityTrackingSoundInstance(sound, Technoblade.getSoundCategory(), volume, pitch, entity, seed));
ci.cancel();
}

private @Nullable SoundEvent getTechnobladeSound(SoundEvent sound) {
Identifier originalSoundId = sound.getId();
if (originalSoundId.getPath().endsWith(".ambient") || originalSoundId.getPath().endsWith(".death")) {
return null;
}

SoundEvent fixedSound = Registry.SOUND_EVENT.get(new Identifier(originalSoundId.getNamespace(), originalSoundId.getPath().replaceFirst("\\.[^.]+", ".player")));
if (fixedSound == null) {
fixedSound = sound;
}
return fixedSound;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.kir.sync.easteregg.mixin.technoblade;

import dev.kir.sync.easteregg.technoblade.TechnobladeTransformable;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArgs;
import org.spongepowered.asm.mixin.injection.invoke.arg.Args;

@Environment(EnvType.CLIENT)
@Mixin(EntityRenderDispatcher.class)
abstract class EntityRenderDispatcherMixin {
@ModifyArgs(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/EntityRenderDispatcher;renderShadow(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/entity/Entity;FFLnet/minecraft/world/WorldView;F)V"))
private void getShadowOpacity(Args args, Entity entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) {
if (entity instanceof TechnobladeTransformable technobladeTransformable && technobladeTransformable.isTechnoblade()) {
args.set(6, 0f);
}
}
}
Loading

0 comments on commit 094d78c

Please sign in to comment.