Skip to content

Commit

Permalink
alchemical collection toggling
Browse files Browse the repository at this point in the history
  • Loading branch information
DonovanDMC committed Jan 26, 2023
1 parent 3df2f0e commit 378d1bb
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@
"text.projectexpansion.failed_to_get_knowledge_provider": "Failed to get knowledge provider for %s.",
"text.projectexpansion.learned": "Learned ✓",
"text.projectexpansion.notLearned": "Not Learned ✗",
"text.projectexpansion.enabled": "Enabled ✓",
"text.projectexpansion.disabled": "Disabled ✗",
"text.projectexpansion.alchemical_collection": "Alchemical Collection: %s",
"enchantment.projectexpansion.alchemical_collection": "Alchemical Collection",
"enchantment.projectexpansion.alchemical_collection.desc": "Converts any mined items with an emc value directly into emc.",
"sounds.projectexpansion.knowledge_sharing_book.store": "Knowledge Stored",
Expand Down
2 changes: 1 addition & 1 deletion src/main/generation
10 changes: 9 additions & 1 deletion src/main/java/cool/furry/mc/forge/projectexpansion/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import cool.furry.mc.forge.projectexpansion.util.Matter;
import cool.furry.mc.forge.projectexpansion.util.NBTNames;
import cool.furry.mc.forge.projectexpansion.util.Star;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
Expand Down Expand Up @@ -65,7 +66,14 @@ private void serverTick(TickEvent.ServerTickEvent event) {
for (ServerPlayerEntity player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) {
for (int i = 0; i < player.inventory.getContainerSize(); i++) {
ItemStack stack = player.inventory.getItem(i);
if (stack.getItem().equals(Items.INFINITE_FUEL.get())) stack.getOrCreateTag().putUUID(NBTNames.OWNER, player.getUUID());
if (stack.getItem().equals(Items.INFINITE_FUEL.get())) {
stack.getOrCreateTag().putUUID(NBTNames.OWNER, player.getUUID());
continue;
}
boolean hasEnch = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.ALCHEMICAL_COLLECTION.get(), stack) > 0;
if(hasEnch && !stack.getOrCreateTag().contains(NBTNames.ALCHEMICAL_COLLECTION_ENABLED)) {
stack.getOrCreateTag().putBoolean(NBTNames.ALCHEMICAL_COLLECTION_ENABLED, true);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import cool.furry.mc.forge.projectexpansion.Main;
import cool.furry.mc.forge.projectexpansion.config.Config;
import cool.furry.mc.forge.projectexpansion.registries.Enchantments;
import cool.furry.mc.forge.projectexpansion.util.ColorStyle;
import cool.furry.mc.forge.projectexpansion.util.NBTNames;
import cool.furry.mc.forge.projectexpansion.util.Util;
import moze_intel.projecte.api.ItemInfo;
import moze_intel.projecte.api.ProjectEAPI;
Expand All @@ -12,6 +14,7 @@
import moze_intel.projecte.utils.text.PELang;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.resources.I18n;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
Expand All @@ -27,51 +30,59 @@
public class ItemTooltipEvent {
// we need to be lower priority than ProjectE's listener so the EMC component is present when we get the event
@SubscribeEvent(priority = EventPriority.LOW)
public static void itemToolTipEvent(net.minecraftforge.event.entity.player.ItemTooltipEvent event) {
if(!Config.enabledLearnedTooltip.get() || (ProjectEConfig.client.shiftEmcToolTips.get() && !Screen.hasShiftDown())) {
return;
}

public static void itemTooltipEvent(net.minecraftforge.event.entity.player.ItemTooltipEvent event) {
ItemStack stack = event.getItemStack();
boolean hasValue = ProjectEAPI.getEMCProxy().hasValue(stack);
if(stack.isEmpty() || !hasValue || event.getPlayer() == null || event.getPlayer().isDeadOrDying()) {
if (stack.isEmpty()|| event.getPlayer() == null || event.getPlayer().isDeadOrDying()) {
return;
}

IKnowledgeProvider provider = Util.getKnowledgeProvider(event.getPlayer());
if(provider == null) {
return;
}
learnedTooltip: if(Config.enabledLearnedTooltip.get() && (!ProjectEConfig.client.shiftEmcToolTips.get() || Screen.hasShiftDown())) {
boolean hasValue = ProjectEAPI.getEMCProxy().hasValue(stack);
if (!hasValue) {
break learnedTooltip;
}

boolean hasKnowledge = provider.hasKnowledge(ItemInfo.fromStack(stack));
long value = ProjectEAPI.getEMCProxy().getValue(stack);
AtomicInteger index = new AtomicInteger(-1);
AtomicInteger peTransmutableIndex = new AtomicInteger(-1);
for (ITextComponent c : event.getToolTip()) {
if (c.getString().equals(EMCHelper.getEmcTextComponent(value, 1).getString())) {
index.set(event.getToolTip().indexOf(c));
continue;
IKnowledgeProvider provider = Util.getKnowledgeProvider(event.getPlayer());
if (provider == null) {
break learnedTooltip;
}

if(c.getString().equals(I18n.get(PELang.EMC_HAS_KNOWLEDGE.getTranslationKey()))) {
peTransmutableIndex.set(event.getToolTip().indexOf(c));
boolean hasKnowledge = provider.hasKnowledge(ItemInfo.fromStack(stack));
long value = ProjectEAPI.getEMCProxy().getValue(stack);
AtomicInteger index = new AtomicInteger(-1);
AtomicInteger peTransmutableIndex = new AtomicInteger(-1);
for (ITextComponent c : event.getToolTip()) {
if (c.getString().equals(EMCHelper.getEmcTextComponent(value, 1).getString())) {
index.set(event.getToolTip().indexOf(c));
continue;
}

if (c.getString().equals(I18n.get(PELang.EMC_HAS_KNOWLEDGE.getTranslationKey()))) {
peTransmutableIndex.set(event.getToolTip().indexOf(c));
}
}
}

// attempt to add a minimal notice
if(index.get() != -1) {
event.getToolTip().set(index.get(), event.getToolTip().get(index.get()).copy().append(new StringTextComponent(" (").setStyle(ColorStyle.WHITE)).append(hasKnowledge ?
new StringTextComponent("✓").setStyle(ColorStyle.GREEN) : new StringTextComponent("✗").setStyle(ColorStyle.RED)
).append(new StringTextComponent(")").setStyle(ColorStyle.WHITE)));
} else {
// if we can't find an existing EMC element, add a new more detailed element
event.getToolTip().add(hasKnowledge ?
new TranslationTextComponent("text.projectexpansion.learned").setStyle(ColorStyle.GREEN) : new TranslationTextComponent("text.projectexpansion.notLearned").setStyle(ColorStyle.RED)
);
// attempt to add a minimal notice
if (index.get() != -1) {
event.getToolTip().set(index.get(), event.getToolTip().get(index.get()).copy().append(new StringTextComponent(" (").setStyle(ColorStyle.WHITE)).append(hasKnowledge ?
new StringTextComponent("✓").setStyle(ColorStyle.GREEN) : new StringTextComponent("✗").setStyle(ColorStyle.RED)
).append(new StringTextComponent(")").setStyle(ColorStyle.WHITE)));
} else {
// if we can't find an existing EMC element, add a new more detailed element
event.getToolTip().add(hasKnowledge ?
new TranslationTextComponent("text.projectexpansion.learned").setStyle(ColorStyle.GREEN) : new TranslationTextComponent("text.projectexpansion.notLearned").setStyle(ColorStyle.RED)
);
}

if (peTransmutableIndex.get() != -1) {
event.getToolTip().remove(peTransmutableIndex.get());
}
}

if(peTransmutableIndex.get() != -1) {
event.getToolTip().remove(peTransmutableIndex.get());
boolean hasEnch = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.ALCHEMICAL_COLLECTION.get(), stack) > 0;
if(hasEnch) {
boolean enabled = stack.getOrCreateTag().getBoolean(NBTNames.ALCHEMICAL_COLLECTION_ENABLED);
event.getToolTip().add(new TranslationTextComponent("text.projectexpansion.alchemical_collection", new TranslationTextComponent(enabled ? "text.projectexpansion.enabled" : "text.projectexpansion.disabled").setStyle(enabled ? ColorStyle.GREEN : ColorStyle.RED)));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cool.furry.mc.forge.projectexpansion.mixin;

import cool.furry.mc.forge.projectexpansion.registries.Enchantments;
import cool.furry.mc.forge.projectexpansion.util.NBTNames;
import cool.furry.mc.forge.projectexpansion.util.Util;
import moze_intel.projecte.api.ItemInfo;
import moze_intel.projecte.api.ProjectEAPI;
Expand Down Expand Up @@ -32,7 +33,7 @@
import java.util.stream.Collectors;

@Mixin(Block.class)
public abstract class EnchantmentMixin {
public abstract class AlchemicalCollectionMixin {
@Inject(at = @At("RETURN"), method = "getDrops(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/entity/Entity;Lnet/minecraft/item/ItemStack;)Ljava/util/List;", cancellable = true)
private static void getDrops(BlockState state, ServerWorld world, BlockPos pos, TileEntity tileEntity, Entity entity, ItemStack stack, CallbackInfoReturnable<List<ItemStack>> cir) {
if(!(entity instanceof ServerPlayerEntity)) return;
Expand All @@ -42,14 +43,18 @@ private static void getDrops(BlockState state, ServerWorld world, BlockPos pos,
IEMCProxy proxy = ProjectEAPI.getEMCProxy();
boolean hasEnch = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.ALCHEMICAL_COLLECTION.get(), stack) > 0;
if(!state.canHarvestBlock(world, pos, player) || !hasEnch) return;
boolean enabled = stack.getOrCreateTag().getBoolean(NBTNames.ALCHEMICAL_COLLECTION_ENABLED);
if(!enabled) {
return;
}
List<ItemStack> initialDrops = cir.getReturnValue();
AtomicLong addEMC = new AtomicLong();
List<ItemStack> knowledgeAdditions = new ArrayList<>();
List<ItemStack> newDrops = initialDrops.stream()
.map(drop -> {
if(proxy.hasValue(drop)) {
addEMC.addAndGet(proxy.getValue(drop));
if(!provider.hasKnowledge(drop)) knowledgeAdditions.add(drop);
if(!provider.hasKnowledge(drop) && !knowledgeAdditions.contains(drop)) knowledgeAdditions.add(drop);
return null;
} else return drop;
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package cool.furry.mc.forge.projectexpansion.mixin;

import cool.furry.mc.forge.projectexpansion.registries.Enchantments;
import cool.furry.mc.forge.projectexpansion.util.NBTNames;
import moze_intel.projecte.api.ProjectEAPI;
import moze_intel.projecte.network.packets.to_server.KeyPressPKT;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.NonNullPredicate;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(KeyPressPKT.class)
public class AlchemicalCollectionToggleMixin {
@Inject(at = @At("HEAD"), method = "tryPerformCapability(Lnet/minecraft/item/ItemStack;Lnet/minecraftforge/common/capabilities/Capability;Lnet/minecraftforge/common/util/NonNullPredicate;)Z", cancellable = true, remap = false)
private static <CAPABILITY> void tryPerformCapability(ItemStack stack, Capability<CAPABILITY> capability, NonNullPredicate<CAPABILITY> perform, CallbackInfoReturnable<Boolean> cir) {
if(capability == ProjectEAPI.EXTRA_FUNCTION_ITEM_CAPABILITY) {
boolean hasEnch = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.ALCHEMICAL_COLLECTION.get(), stack) > 0;
if(hasEnch) {
boolean currentValue = stack.getOrCreateTag().getBoolean(NBTNames.ALCHEMICAL_COLLECTION_ENABLED);
stack.getOrCreateTag().putBoolean(NBTNames.ALCHEMICAL_COLLECTION_ENABLED, !currentValue);
cir.setReturnValue(true);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ public class NBTNames {
public static String REMAINING_FLUID = "RemainingFluid";
public static String LAST_USED = "LastUsed";
public static String KNOWLEDGE_GAINED = "KnowledgeGained";
public static String ALCHEMICAL_COLLECTION_ENABLED = "AlchemicalCollectionEnabled";
}
3 changes: 2 additions & 1 deletion src/main/resources/projectexpansion.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
],
"mixins": [
"AlchemicalBagMixin",
"EnchantmentMixin",
"AlchemicalCollectionToggleMixin",
"AlchemicalCollectionMixin",
"EnchantmentProcessorMixin",
"PhilosophersStoneMixin"
],
Expand Down

0 comments on commit 378d1bb

Please sign in to comment.