Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/generated/resources/assets/anvilcraft/lang/en_ud.json
Original file line number Diff line number Diff line change
Expand Up @@ -872,6 +872,7 @@
"item.anvilcraft.spectral_slingshot": "ʇoɥsᵷuᴉꞁS ꞁɐɹʇɔǝdS",
"item.anvilcraft.spectral_slingshot.unload_return": "pǝpɐoꞁu∩ uǝɥʍ pǝuɹnʇǝᴚ",
"item.anvilcraft.spectral_slingshot.unload_vanish": "pǝpɐoꞁu∩ uǝɥʍ sǝɥsᴉuɐɅ",
"item.anvilcraft.spectral_weapon_launcher": "ɹǝɥɔunɐꞀ uodɐǝM ꞁɐɹʇɔǝdS",
"item.anvilcraft.sponge_gemmule": "ǝꞁnɯɯǝ⅁ ǝᵷuodS",
"item.anvilcraft.stable_neutronium_ingot": "ʇoᵷuI ɯnᴉuoɹʇnǝN ǝꞁqɐʇS",
"item.anvilcraft.structure_tool": "ꞁoo⟘ ǝɹnʇɔnɹʇS",
Expand Down Expand Up @@ -1388,6 +1389,7 @@
"tooltip.anvilcraft.property.multiphase.suffix.3": "δ-",
"tooltip.anvilcraft.property.providence": "sǝɯᴉʇ ǝꞁdᴉʇꞁnɯ sʇuǝɯʇuɐɥɔuǝ [%s pꞁoH] ɹǝᵷᵷᴉɹʇ oʇ ǝɔuɐɥɔ sɐɥ :ǝɔuǝpᴉʌoɹԀ",
"tooltip.anvilcraft.property.providence.shifting": "sǝɯᴉʇ ǝꞁdᴉʇꞁnɯ sʇuǝɯʇuɐɥɔuǝ (%s) ɹǝᵷᵷᴉɹʇ oʇ ǝɔuɐɥɔ sɐɥ :ǝɔuǝpᴉʌoɹԀ",
"tooltip.anvilcraft.property.stored_energy": "%s :ʎᵷɹǝuƎ ᵷuᴉuᴉɐɯǝᴚ",
"tooltip.anvilcraft.redstone.output_mode": "%s :ǝpoW ʇndʇnO ",
"tooltip.anvilcraft.redstone.output_mode.compare": "ǝɹɐdɯoƆ",
"tooltip.anvilcraft.redstone.output_mode.subtract": "ʇɔɐɹʇqnS",
Expand Down
2 changes: 2 additions & 0 deletions src/generated/resources/assets/anvilcraft/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -872,6 +872,7 @@
"item.anvilcraft.spectral_slingshot": "Spectral Slingshot",
"item.anvilcraft.spectral_slingshot.unload_return": "Returned when Unloaded",
"item.anvilcraft.spectral_slingshot.unload_vanish": "Vanishes when Unloaded",
"item.anvilcraft.spectral_weapon_launcher": "Spectral Weapon Launcher",
"item.anvilcraft.sponge_gemmule": "Sponge Gemmule",
"item.anvilcraft.stable_neutronium_ingot": "Stable Neutronium Ingot",
"item.anvilcraft.structure_tool": "Structure Tool",
Expand Down Expand Up @@ -1388,6 +1389,7 @@
"tooltip.anvilcraft.property.multiphase.suffix.3": "-δ",
"tooltip.anvilcraft.property.providence": "Providence: has chance to trigger [Hold %s] enchantments multiple times",
"tooltip.anvilcraft.property.providence.shifting": "Providence: has chance to trigger (%s) enchantments multiple times",
"tooltip.anvilcraft.property.stored_energy": "Remaining Energy: %s",
"tooltip.anvilcraft.redstone.output_mode": " Output Mode: %s",
"tooltip.anvilcraft.redstone.output_mode.compare": "Compare",
"tooltip.anvilcraft.redstone.output_mode.subtract": "Subtract",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "anvilcraft:energy_weapon_make/spectral_weapon_launcher"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"anvilcraft:energy_weapon_make/spectral_weapon_launcher"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"type": "anvilcraft:energy_weapon_make",
"ingredients": [
{
"items": "anvilcraft:spectral_slingshot"
},
{
"count": 8,
"items": "anvilcraft:spectral_anvil"
}
],
"result": {
"count": 1,
"id": "anvilcraft:spectral_weapon_launcher"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"values": [
"anvilcraft:spectral_slingshot"
"anvilcraft:spectral_slingshot",
"anvilcraft:spectral_weapon_launcher"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"anvilcraft:transcendence_resonator",
"anvilcraft:multitool",
"anvilcraft:spectral_slingshot",
"anvilcraft:spectral_weapon_launcher",
"anvilcraft:magnet"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import dev.dubhe.anvilcraft.init.item.ModItemTags;
import dev.dubhe.anvilcraft.init.item.ModItems;
import dev.dubhe.anvilcraft.util.ListUtil;
import dev.dubhe.anvilcraft.util.UnitUtil;
import dev.dubhe.anvilcraft.util.Util;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -241,6 +242,14 @@ public class ItemTooltipManager {
*/
public static void addTooltip(ItemStack stack, List<Component> tooltip) {
final Item item = stack.getItem();
if (stack.has(ModComponents.STORED_ENERGY)) {
propertyTooltip(
"stored_energy",
tooltip,
ChatFormatting.GRAY,
UnitUtil.energyUnit(stack.getOrDefault(ModComponents.STORED_ENERGY, 0), Screen.hasShiftDown())
);
}
if (stack.has(ModComponents.MULTIPHASE)) {
if (AnvilCraftClient.CONFIG.showMultiphaseStoredId) {
propertyTooltip(
Expand Down Expand Up @@ -314,7 +323,7 @@ public static String getTranslationKey(Item item) {
return "tooltip.%s.item.%s".formatted(key.getNamespace(), key.getPath());
}

private static void propertyTooltip(String propertyName, List<Component> tooltip, ChatFormatting color) {
private static void propertyTooltip(String propertyName, List<Component> tooltip, ChatFormatting color, Object... args) {
int i = 0;
for (int j = 0; j < tooltip.size(); j++) {
if (tooltip.get(j).getContents() instanceof TranslatableContents t && t.getKey().contains("enchantment")
Expand All @@ -330,7 +339,7 @@ private static void propertyTooltip(String propertyName, List<Component> tooltip
}
tooltip.add(
1 + i,
Component.translatable("tooltip.anvilcraft.property.%s".formatted(propertyName)).withStyle(color)
Component.translatable("tooltip.anvilcraft.property.%s".formatted(propertyName), args).withStyle(color)
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,13 @@ public void renderByItem(
buffer,
packedLight,
packedOverlay,
bakedModel
bakedModel.getOverrides().resolve(
bakedModel,
ammo,
null,
null,
42
)
);
// poseStack.popPose();
poseStack.popPose();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
package dev.dubhe.anvilcraft.client.renderer.item;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import dev.dubhe.anvilcraft.init.item.ModItems;
import dev.dubhe.anvilcraft.item.weapon.SpectralWeaponLauncherItem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.component.DataComponents;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.ChargedProjectiles;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HalfTransparentBlock;
import net.minecraft.world.level.block.StainedGlassPaneBlock;
import org.jetbrains.annotations.Nullable;

import java.util.Iterator;

public class SpectralWeaponLauncherRenderer extends BlockEntityWithoutLevelRenderer {
private static SpectralWeaponLauncherRenderer instance;

public static SpectralWeaponLauncherRenderer getInstance() {
if (instance == null) {
instance = new SpectralWeaponLauncherRenderer(
Minecraft.getInstance().getBlockEntityRenderDispatcher(),
Minecraft.getInstance().getEntityModels()
);
}
return instance;
}

public SpectralWeaponLauncherRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher, EntityModelSet entityModelSet) {
super(blockEntityRenderDispatcher, entityModelSet);
}

@Override
public void renderByItem(
ItemStack stack,
ItemDisplayContext displayContext,
PoseStack poseStack,
MultiBufferSource buffer,
int packedLight,
int packedOverlay
) {
super.renderByItem(stack, displayContext, poseStack, buffer, packedLight, packedOverlay);
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
if (stack.is(ModItems.SPECTRAL_WEAPON_LAUNCHER)) {
BakedModel normalModel = itemRenderer.getItemModelShaper().getItemModel(stack);
renderItemAtCurrentPoseStack(
itemRenderer,
stack,
displayContext,
poseStack,
buffer,
packedLight,
packedOverlay,
normalModel.getOverrides().resolve(
normalModel,
stack,
null,
null,
42
)
);
ChargedProjectiles cp = stack.get(DataComponents.CHARGED_PROJECTILES);
if (cp != null && !cp.isEmpty()) {
ItemStack ammo = cp.getItems().getFirst();
poseStack.pushPose();
// poseStack.translate(38f / 256f, 5f / 64f, 7f / 8f);
// poseStack.mulPose(Axis.YP.rotationDegrees(90));
// poseStack.mulPose(Axis.XN.rotationDegrees(45));
// poseStack.mulPose(Axis.ZN.rotationDegrees(45));
poseStack.translate(0f, 7f / 16f, 7f / 8f);
poseStack.mulPose(Axis.YP.rotationDegrees(90));
poseStack.mulPose(Axis.ZN.rotationDegrees(45));
// poseStack.pushPose();
BakedModel bakedModel = itemRenderer.getItemModelShaper().getItemModel(ammo);
renderItemAtCurrentPoseStack(
itemRenderer,
ammo,
displayContext,
poseStack,
buffer,
packedLight,
packedOverlay,
bakedModel.getOverrides().resolve(
bakedModel,
ammo,
null,
null,
42
)
);
// poseStack.popPose();
poseStack.popPose();
}
}
}

public static void renderItemAtCurrentPoseStack(
ItemRenderer itemRenderer,
ItemStack itemStack,
ItemDisplayContext displayContext,
PoseStack poseStack,
MultiBufferSource bufferSource,
int combinedLight,
int combinedOverlay,
BakedModel model
) {
boolean flag1;
label78: {
if (displayContext != ItemDisplayContext.GUI && !displayContext.firstPerson()) {
Item var12 = itemStack.getItem();
if (var12 instanceof BlockItem blockitem) {
Block block = blockitem.getBlock();
flag1 = !(block instanceof HalfTransparentBlock) && !(block instanceof StainedGlassPaneBlock);
break label78;
}
}
flag1 = true;
}
for (BakedModel model1 : model.getRenderPasses(itemStack, flag1)) {
VertexConsumer vertexconsumer;
for (Iterator<RenderType> var13 = model1.getRenderTypes(itemStack, flag1).iterator();
var13.hasNext();
itemRenderer.renderModelLists(
model1,
itemStack,
combinedLight,
combinedOverlay,
poseStack,
vertexconsumer
)
) {
RenderType rendertype = var13.next();
vertexconsumer = ItemRenderer.getFoilBuffer(bufferSource, rendertype, true, itemStack.hasFoil());
}
}
}

public static class SpectralWeaponLauncherExtensions extends CustomRenderItemClientExtension {
protected SpectralWeaponLauncherExtensions(BlockEntityWithoutLevelRenderer renderer) {
super(renderer);
}

public static SpectralWeaponLauncherExtensions of(BlockEntityWithoutLevelRenderer renderer) {
return new SpectralWeaponLauncherExtensions(renderer);
}

@Nullable
@Override
public HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack itemStack) {
if (itemStack.is(ModItems.SPECTRAL_WEAPON_LAUNCHER) && SpectralWeaponLauncherItem.isCharged(itemStack)) {
return HumanoidModel.ArmPose.CROSSBOW_HOLD;
}
return super.getArmPose(entityLiving, hand, itemStack);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import dev.dubhe.anvilcraft.AnvilCraft;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemDisplayContext;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
Expand All @@ -15,10 +16,15 @@

@EventBusSubscriber(modid = AnvilCraft.MOD_ID, value = Dist.CLIENT)
public class WrappingItemCustomRenderedModels {
public static final ResourceLocation SPECTRAL_WEAPON_LAUNCHER = AnvilCraft.of("spectral_weapon_launcher");
public static final ResourceLocation SPECTRAL_WEAPON_LAUNCHER_EXHAUSTED = AnvilCraft.of("spectral_weapon_launcher_exhausted");

@SubscribeEvent
public static void onModelBake(ModelEvent.ModifyBakingResult event) {
Map<ModelResourceLocation, BakedModel> modelRegistry = event.getModels();
swapModels(modelRegistry, ModelResourceLocation.inventory(AnvilCraft.of("spectral_slingshot")));
swapModels(modelRegistry, ModelResourceLocation.inventory(SPECTRAL_WEAPON_LAUNCHER));
swapModels(modelRegistry, ModelResourceLocation.inventory(SPECTRAL_WEAPON_LAUNCHER_EXHAUSTED));
}

public static void swapModels(Map<ModelResourceLocation, BakedModel> modelRegistry, ModelResourceLocation modelLocation) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@ public static void init(RegistrumLangProvider provider) {
provider.add("tooltip.anvilcraft.property.eternal", "Eternal: unbreakable, immune fire, explode, cactus, even the time and the void");
provider.add("tooltip.anvilcraft.property.providence", "Providence: has chance to trigger [Hold %s] enchantments multiple times");
provider.add("tooltip.anvilcraft.property.providence.shifting", "Providence: has chance to trigger (%s) enchantments multiple times");
provider.add("tooltip.anvilcraft.property.stored_energy", "Remaining Energy: %s");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@

public class EnergyWeaponMakeRecipeLoader {
public static void init(RegistrumRecipeProvider provider) {
EnergyWeaponMakeRecipe.builder()
.requires(ModItems.SPECTRAL_SLINGSHOT, 1)
.requires(ModBlocks.SPECTRAL_ANVIL, 8)
.result(ModItems.SPECTRAL_WEAPON_LAUNCHER.asStack())
.save(provider);
EnergyWeaponMakeRecipe.builder()
.requires(ModBlocks.ACCELERATION_RING, 4)
.requires(ModBlocks.SLIDING_RAIL, 4)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,13 @@ public SpectralProjectileEntity(Level level, LivingEntity owner, ItemStack picku
this.entityData.set(AS_ITEM_STACK, ItemStack.EMPTY);
}

public static SpectralProjectileEntity of(Level level, LivingEntity owner, ItemStack asStack, @Nullable ItemStack firedFromWeapon) {
public static SpectralProjectileEntity of(
Level level,
LivingEntity owner,
ItemStack asStack,
@Nullable ItemStack firedFromWeapon,
double damageAmplification
) {
SpectralProjectileEntity sp = new SpectralProjectileEntity(
level,
owner,
Expand All @@ -67,7 +73,7 @@ public static SpectralProjectileEntity of(Level level, LivingEntity owner, ItemS
}
}
}
if (dmg > 0) sp.setBaseDamage(dmg * 0.5);
if (dmg > 0) sp.setBaseDamage(dmg * damageAmplification);
}
return sp;
}
Expand Down
Loading
Loading