├── fabric ├── gradle.properties ├── src │ ├── testmod │ │ ├── resources │ │ │ ├── data │ │ │ │ ├── accessories │ │ │ │ │ ├── accessories │ │ │ │ │ │ └── slot │ │ │ │ │ │ │ └── belt.json │ │ │ │ │ └── tags │ │ │ │ │ │ └── item │ │ │ │ │ │ ├── face.json │ │ │ │ │ │ ├── hat.json │ │ │ │ │ │ ├── back.json │ │ │ │ │ │ ├── ring.json │ │ │ │ │ │ └── hand.json │ │ │ │ └── testccessories │ │ │ │ │ ├── accessories │ │ │ │ │ ├── slot │ │ │ │ │ │ ├── anklet.json │ │ │ │ │ │ ├── back.json │ │ │ │ │ │ ├── testccessories │ │ │ │ │ │ │ ├── test_slot_1.json │ │ │ │ │ │ │ └── test_slot_2.json │ │ │ │ │ │ └── something.json │ │ │ │ │ └── entity │ │ │ │ │ │ └── test_slots.json │ │ │ │ │ ├── tags │ │ │ │ │ └── item │ │ │ │ │ │ ├── test_slot_1.json │ │ │ │ │ │ └── test_slot_2.json │ │ │ │ │ └── advancements │ │ │ │ │ └── base │ │ │ │ │ ├── root.json │ │ │ │ │ ├── equipped_apple.json │ │ │ │ │ ├── lefthanded_drip.json │ │ │ │ │ └── no_longer_lefthanded_drip.json │ │ │ ├── assets │ │ │ │ └── testccessories │ │ │ │ │ ├── icon.png │ │ │ │ │ └── lang │ │ │ │ │ └── en_us.json │ │ │ └── testccessories-fabric.mixins.json │ │ └── java │ │ │ └── io │ │ │ └── wispforest │ │ │ └── testccessories │ │ │ └── fabric │ │ │ └── client │ │ │ └── TestScreenPacket.java │ └── main │ │ ├── resources │ │ ├── META-INF │ │ │ └── services │ │ │ │ ├── io.wispforest.accessories.AccessoriesInternals │ │ │ │ └── io.wispforest.accessories.AccessoriesLoaderInternals │ │ ├── assets │ │ │ └── accessories │ │ │ │ └── icon.png │ │ └── accessories-fabric.mixins.json │ │ └── java │ │ └── io │ │ └── wispforest │ │ └── accessories │ │ └── fabric │ │ ├── AccessoriesFabricLoaderInternals.java │ │ ├── ExtraEntityTrackingEvents.java │ │ └── mixin │ │ ├── PlayerListMixin.java │ │ └── ServerEntityEvent.java └── build.gradle.kts ├── neoforge ├── gradle.properties ├── src │ ├── main │ │ ├── resources │ │ │ ├── icon.png │ │ │ ├── pack.mcmeta │ │ │ ├── META-INF │ │ │ │ ├── services │ │ │ │ │ ├── io.wispforest.accessories.AccessoriesInternals │ │ │ │ │ └── io.wispforest.accessories.AccessoriesLoaderInternals │ │ │ │ └── accesstransformer.cfg │ │ │ ├── interfaces.json │ │ │ └── accessories-neoforge.mixins.json │ │ └── java │ │ │ └── io │ │ │ └── wispforest │ │ │ └── accessories │ │ │ └── neoforge │ │ │ ├── compat │ │ │ └── NeoAccessoriesClientREIPlugin.java │ │ │ ├── mixin │ │ │ ├── neoforge │ │ │ │ └── BaseRenderStateAccessor.java │ │ │ └── ContextAwareReloadListenerAccessor.java │ │ │ └── AccessoriesNeoforgeLoaderInternals.java │ └── testmod │ │ ├── resources │ │ ├── pack.mcmeta │ │ ├── data │ │ │ ├── accessories │ │ │ │ └── tags │ │ │ │ │ └── item │ │ │ │ │ ├── hat.json │ │ │ │ │ ├── back.json │ │ │ │ │ ├── face.json │ │ │ │ │ ├── ring.json │ │ │ │ │ └── hand.json │ │ │ └── testccessories │ │ │ │ ├── accessories │ │ │ │ └── slot │ │ │ │ │ └── testccessories │ │ │ │ │ ├── test_slot_1.json │ │ │ │ │ └── test_slot_2.json │ │ │ │ ├── tags │ │ │ │ └── item │ │ │ │ │ ├── test_slot_1.json │ │ │ │ │ └── test_slot_2.json │ │ │ │ └── advancements │ │ │ │ └── base │ │ │ │ ├── root.json │ │ │ │ ├── equipped_apple.json │ │ │ │ ├── lefthanded_drip.json │ │ │ │ └── no_longer_lefthanded_drip.json │ │ ├── assets │ │ │ └── testccessories │ │ │ │ └── icon.png │ │ ├── testccessories-neoforge.mixins.json │ │ └── META-INF │ │ │ └── neoforge.mods.toml │ │ └── java │ │ └── io │ │ └── wispforest │ │ └── testccessories │ │ └── neoforge │ │ ├── mixin │ │ ├── AccessoriesNetworkingMixin.java │ │ └── client │ │ │ └── AccessoriesNetworkingMixin.java │ │ └── client │ │ └── TestScreenPacket.java └── build.gradle.kts ├── common ├── src │ └── main │ │ ├── java │ │ └── io │ │ │ └── wispforest │ │ │ └── accessories │ │ │ ├── networking │ │ │ ├── client │ │ │ │ ├── SyncData.java │ │ │ │ └── SyncPlayerOptions.java │ │ │ └── server │ │ │ │ ├── ContainerClose.java │ │ │ │ └── NukeAccessories.java │ │ │ ├── client │ │ │ ├── EntityTarget.java │ │ │ ├── gui │ │ │ │ ├── AbstractButtonExtension.java │ │ │ │ ├── utils │ │ │ │ │ └── Line3d.java │ │ │ │ └── ButtonEvents.java │ │ │ └── ClientLifecycleEvents.java │ │ │ ├── data │ │ │ ├── OperationType.java │ │ │ └── api │ │ │ │ ├── SimpleManagedEndecDataLoader.java │ │ │ │ ├── IdentifiedResourceReloadListener.java │ │ │ │ └── LookupDataLoader.java │ │ │ ├── impl │ │ │ ├── slot │ │ │ │ └── StrictMode.java │ │ │ ├── PlayerEquipControl.java │ │ │ └── option │ │ │ │ └── PlayerOptionsAccess.java │ │ │ ├── compat │ │ │ ├── config │ │ │ │ ├── SlotAmountModifier.java │ │ │ │ ├── RenderSlotTarget.java │ │ │ │ ├── ScreenType.java │ │ │ │ └── client │ │ │ │ │ └── Structured.java │ │ │ ├── emi │ │ │ │ └── AccessoriesClientEMIPlugin.java │ │ │ └── GeckoLibCompat.java │ │ │ ├── pond │ │ │ ├── AccessoriesFrameBufferExtension.java │ │ │ ├── CloseContainerTransfer.java │ │ │ ├── stack │ │ │ │ ├── ItemStackExtension.java │ │ │ │ └── PatchedDataComponentMapExtension.java │ │ │ ├── DroppedStacksExtension.java │ │ │ ├── ScissorStackManipulation.java │ │ │ ├── AccessoriesAPIAccess.java │ │ │ ├── EnchantedItemInUseExtension.java │ │ │ ├── WingsLayerExtension.java │ │ │ ├── ContainerScreenExtension.java │ │ │ ├── ContextedFileToIdConverter.java │ │ │ ├── ReplaceableJsonResourceReloadListener.java │ │ │ ├── AccessoriesRenderStateAPI.java │ │ │ ├── AccessoriesLivingEntityExtension.java │ │ │ └── AccessoriesRenderStateAPImpl.java │ │ │ ├── api │ │ │ ├── equip │ │ │ │ ├── EquipCheck.java │ │ │ │ ├── EquipmentChecking.java │ │ │ │ └── EquipAction.java │ │ │ ├── events │ │ │ │ ├── SlotStateChange.java │ │ │ │ ├── DropRule.java │ │ │ │ └── extra │ │ │ │ │ ├── OnTotemConsumption.java │ │ │ │ │ ├── OnTotemActivate.java │ │ │ │ │ └── ShouldFreezeEntity.java │ │ │ ├── client │ │ │ │ ├── screen │ │ │ │ │ ├── PlayerBasedTargetGetter.java │ │ │ │ │ ├── ScreenBasedTargetGetter.java │ │ │ │ │ ├── ScreenOpener.java │ │ │ │ │ └── ScreenReopener.java │ │ │ │ ├── DefaultedContextKey.java │ │ │ │ ├── RenderStateStorage.java │ │ │ │ └── rendering │ │ │ │ │ ├── Side.java │ │ │ │ │ └── TargetType.java │ │ │ ├── core │ │ │ │ └── AccessoryItem.java │ │ │ ├── slot │ │ │ │ ├── SlotPathWithStack.java │ │ │ │ ├── SlotEntryReference.java │ │ │ │ ├── EntityBasedPredicate.java │ │ │ │ ├── SlotTypeReference.java │ │ │ │ └── DelegatingSlotPath.java │ │ │ ├── SoundEventData.java │ │ │ ├── caching │ │ │ │ ├── ItemPredicate.java │ │ │ │ ├── ItemStackPredicate.java │ │ │ │ └── ItemTagPredicate.java │ │ │ └── data │ │ │ │ └── providers │ │ │ │ └── group │ │ │ │ └── RawSlotGroup.java │ │ │ ├── commands │ │ │ └── api │ │ │ │ ├── OnArgumentRegistration.java │ │ │ │ ├── core │ │ │ │ ├── NamedArgumentGetter.java │ │ │ │ ├── CommandAddition.java │ │ │ │ └── Branch.java │ │ │ │ ├── base │ │ │ │ └── CommandGenerator.java │ │ │ │ ├── ArgumentRegistrationCallback.java │ │ │ │ └── CommandTreeGenerator.java │ │ │ ├── utils │ │ │ ├── ConcurrentBarrier.java │ │ │ ├── InstanceEndec.java │ │ │ ├── ItemStackResize.java │ │ │ ├── HashUtils.java │ │ │ ├── ServiceLoaderUtils.java │ │ │ ├── ItemStackMutation.java │ │ │ └── ServerInstanceHolder.java │ │ │ ├── mixin │ │ │ ├── TooltipFlagMixin.java │ │ │ ├── CommandSelectionAccessor.java │ │ │ ├── LivingEntityAccessor.java │ │ │ ├── client │ │ │ │ ├── AbstractSliderButtonAccessor.java │ │ │ │ ├── ModelPartAccessor.java │ │ │ │ ├── EquipmentLayerRendererAccessor.java │ │ │ │ ├── LivingEntityRenderStateAccessor.java │ │ │ │ ├── AbstractContainerScreenAccessor.java │ │ │ │ ├── owo │ │ │ │ │ ├── DiscreteSliderComponentAccessor.java │ │ │ │ │ ├── OwoEmiPluginMixin.java │ │ │ │ │ └── OwoReiPluginMixin.java │ │ │ │ ├── MinecraftMixin.java │ │ │ │ ├── LivingEntityRendererAccessor.java │ │ │ │ ├── ItemInHandRendererMixin.java │ │ │ │ ├── AbstractRecipeBookScreenMixin.java │ │ │ │ ├── LivingEntityRenderStateMixin.java │ │ │ │ ├── HumanoidArmorLayerAccessor.java │ │ │ │ ├── RenderPhaseMixin.java │ │ │ │ ├── DefaultTooltipPositionerMixin.java │ │ │ │ └── LoadingOverlayMixin.java │ │ │ ├── ItemStackAccessor.java │ │ │ ├── HorseInventoryMenuAccessor.java │ │ │ ├── ServerChunkLoadingManagerAccessor.java │ │ │ ├── EntityTrackerAccessor.java │ │ │ ├── SimpleJsonResourceReloadListenerAccessor.java │ │ │ ├── ResourceArgumentAccessor.java │ │ │ ├── StateHolderAccessor.java │ │ │ ├── owo │ │ │ │ ├── ConfigWrapperAccessor.java │ │ │ │ ├── OptionAccessor.java │ │ │ │ ├── ConfigSynchronizerAccessor.java │ │ │ │ ├── TagValueInputAccessor.java │ │ │ │ └── TagValueOutputAccessor.java │ │ │ ├── CriteriaTriggersAccessor.java │ │ │ ├── DefaultDispenseItemBehaviorAccessor.java │ │ │ ├── PlayerMixin.java │ │ │ ├── DispenserBlockMixin.java │ │ │ ├── DataPackContentsMixin.java │ │ │ ├── PiglinAiMixin.java │ │ │ ├── FileToIdConverterMixin.java │ │ │ ├── GameRulesAccessor.java │ │ │ ├── EnchantedItemInUseMixin.java │ │ │ ├── AbstractContainerMenuMixin.java │ │ │ └── PowderSnowBlockMixin.java │ │ │ ├── AccessoriesLoaderInternals.java │ │ │ ├── menu │ │ │ ├── SlotTypeAccessible.java │ │ │ └── networking │ │ │ │ └── ToggledSlots.java │ │ │ └── AccessoriesClientInternals.java │ │ └── resources │ │ ├── data │ │ └── accessories │ │ │ ├── tags │ │ │ ├── item │ │ │ │ ├── all.json │ │ │ │ └── any.json │ │ │ ├── entity_type │ │ │ │ ├── modifiable_entity_accessories_blacklist.json │ │ │ │ ├── equipment_manageable.json │ │ │ │ ├── cosmetic_animal_armor_targets.json │ │ │ │ ├── defaulted_targets.json │ │ │ │ ├── cosmetic_armor_targets.json │ │ │ │ ├── cosmetic_saddle_targets.json │ │ │ │ └── modifiable_entity_accessories_whitelist.json │ │ │ └── enchantment │ │ │ │ └── valid_for_redirection.json │ │ │ └── accessories │ │ │ ├── group │ │ │ ├── unsorted.json │ │ │ ├── leg.json │ │ │ ├── misc.json │ │ │ ├── head.json │ │ │ ├── feet.json │ │ │ ├── arm.json │ │ │ └── chest.json │ │ │ ├── entity │ │ │ ├── cosmetic_saddle.json │ │ │ ├── cosmetic_animal_armor.json │ │ │ ├── cosmetic_armor.json │ │ │ └── default.json │ │ │ └── slot │ │ │ ├── face.json │ │ │ ├── hand.json │ │ │ ├── ring.json │ │ │ ├── anklet.json │ │ │ ├── belt.json │ │ │ ├── shoes.json │ │ │ ├── wrist.json │ │ │ ├── necklace.json │ │ │ ├── hat.json │ │ │ ├── charm.json │ │ │ ├── back.json │ │ │ └── cape.json │ │ ├── assets │ │ ├── accessories │ │ │ ├── textures │ │ │ │ └── gui │ │ │ │ │ ├── reset_icon.png │ │ │ │ │ ├── slot_frame.png │ │ │ │ │ ├── sprites │ │ │ │ │ ├── widget │ │ │ │ │ │ ├── 12x12 │ │ │ │ │ │ │ ├── button.png.mcmeta │ │ │ │ │ │ │ ├── button_disabled.png.mcmeta │ │ │ │ │ │ │ ├── button_highlighted.png.mcmeta │ │ │ │ │ │ │ ├── button.png │ │ │ │ │ │ │ ├── button_disabled.png │ │ │ │ │ │ │ └── button_highlighted.png │ │ │ │ │ │ ├── 8x8 │ │ │ │ │ │ │ ├── button.png.mcmeta │ │ │ │ │ │ │ ├── button_disabled.png.mcmeta │ │ │ │ │ │ │ ├── button_highlighted.png.mcmeta │ │ │ │ │ │ │ ├── button.png │ │ │ │ │ │ │ ├── button_disabled.png │ │ │ │ │ │ │ └── button_highlighted.png │ │ │ │ │ │ ├── back.png │ │ │ │ │ │ ├── back_dark.png │ │ │ │ │ │ ├── line_shown.png │ │ │ │ │ │ ├── line_hidden.png │ │ │ │ │ │ ├── unused_slots_hidden.png │ │ │ │ │ │ └── unused_slots_shown.png │ │ │ │ │ ├── 8x8 │ │ │ │ │ │ ├── button.png │ │ │ │ │ │ ├── button_disabled.png │ │ │ │ │ │ └── button_highlighted.png │ │ │ │ │ ├── scroll_bar.png │ │ │ │ │ ├── background_patch.png │ │ │ │ │ ├── scroll_bar_patch.png │ │ │ │ │ ├── container │ │ │ │ │ │ └── slot │ │ │ │ │ │ │ ├── back.png │ │ │ │ │ │ │ ├── belt.png │ │ │ │ │ │ │ ├── cape.png │ │ │ │ │ │ │ ├── face.png │ │ │ │ │ │ │ ├── hand.png │ │ │ │ │ │ │ ├── hat.png │ │ │ │ │ │ │ ├── ring.png │ │ │ │ │ │ │ ├── anklet.png │ │ │ │ │ │ │ ├── charm.png │ │ │ │ │ │ │ ├── empty.png │ │ │ │ │ │ │ ├── shoes.png │ │ │ │ │ │ │ ├── socks.png │ │ │ │ │ │ │ ├── wrist.png │ │ │ │ │ │ │ ├── cosmetic.png │ │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ ├── arm.png │ │ │ │ │ │ │ ├── leg.png │ │ │ │ │ │ │ ├── chest.png │ │ │ │ │ │ │ ├── feet.png │ │ │ │ │ │ │ ├── head.png │ │ │ │ │ │ │ ├── misc.png │ │ │ │ │ │ │ └── unknown.png │ │ │ │ │ │ │ └── necklace.png │ │ │ │ │ ├── highlight │ │ │ │ │ │ └── clickbait.png │ │ │ │ │ ├── scroll_bar.png.mcmeta │ │ │ │ │ ├── background_patch.png.mcmeta │ │ │ │ │ └── scroll_bar_patch.png.mcmeta │ │ │ │ │ ├── settings_icon.png │ │ │ │ │ ├── theme │ │ │ │ │ ├── dark │ │ │ │ │ │ ├── slot.png │ │ │ │ │ │ ├── button.png │ │ │ │ │ │ ├── inset.png │ │ │ │ │ │ ├── panel.png │ │ │ │ │ │ ├── scrollbar.png │ │ │ │ │ │ ├── charm_icon.png │ │ │ │ │ │ ├── crafting_grid.png │ │ │ │ │ │ ├── toggle_background.png │ │ │ │ │ │ ├── button_toggle_rounded.png │ │ │ │ │ │ ├── player_inv │ │ │ │ │ │ │ ├── with_crafting.png │ │ │ │ │ │ │ └── without_crafting.png │ │ │ │ │ │ └── entity_view │ │ │ │ │ │ │ ├── double │ │ │ │ │ │ │ ├── 1_slots.png │ │ │ │ │ │ │ ├── 2_slots.png │ │ │ │ │ │ │ ├── 4_slots.png │ │ │ │ │ │ │ └── entity_background.png │ │ │ │ │ │ │ └── single │ │ │ │ │ │ │ ├── 1_slots.png │ │ │ │ │ │ │ ├── 2_slots.png │ │ │ │ │ │ │ ├── 4_slots.png │ │ │ │ │ │ │ └── entity_background.png │ │ │ │ │ ├── light │ │ │ │ │ │ ├── inset.png │ │ │ │ │ │ ├── panel.png │ │ │ │ │ │ ├── slot.png │ │ │ │ │ │ ├── button.png │ │ │ │ │ │ ├── charm_icon.png │ │ │ │ │ │ ├── scrollbar.png │ │ │ │ │ │ ├── crafting_grid.png │ │ │ │ │ │ ├── toggle_background.png │ │ │ │ │ │ ├── button_toggle_rounded.png │ │ │ │ │ │ ├── player_inv │ │ │ │ │ │ │ ├── with_crafting.png │ │ │ │ │ │ │ └── without_crafting.png │ │ │ │ │ │ └── entity_view │ │ │ │ │ │ │ ├── double │ │ │ │ │ │ │ ├── 1_slots.png │ │ │ │ │ │ │ ├── 2_slots.png │ │ │ │ │ │ │ ├── 4_slots.png │ │ │ │ │ │ │ └── entity_background.png │ │ │ │ │ │ │ └── single │ │ │ │ │ │ │ ├── 1_slots.png │ │ │ │ │ │ │ ├── 2_slots.png │ │ │ │ │ │ │ ├── 4_slots.png │ │ │ │ │ │ │ └── entity_background.png │ │ │ │ │ ├── all_arrow_directions.png │ │ │ │ │ └── cosmetic_rainbow_icon.png │ │ │ │ │ ├── accessories_panel.png │ │ │ │ │ ├── charm_toggle_icon.png │ │ │ │ │ ├── cosmetic_toggle_icon.png │ │ │ │ │ ├── crafting_toggle_icon.png │ │ │ │ │ ├── new_gui_image_crop.png │ │ │ │ │ ├── reset_icon_hovered.png │ │ │ │ │ ├── accessories_back_icon.png │ │ │ │ │ ├── accessories_open_icon.png │ │ │ │ │ ├── settings_icon_hovered.png │ │ │ │ │ ├── charm_toggle_icon_hovered.png │ │ │ │ │ ├── container │ │ │ │ │ ├── horizontal_tabs.png │ │ │ │ │ ├── accessories_inventory.png │ │ │ │ │ └── horizontal_tabs_small.png │ │ │ │ │ ├── original_gui_image_crop.png │ │ │ │ │ ├── accessories_back_icon_hovered.png │ │ │ │ │ ├── accessories_open_icon_hovered.png │ │ │ │ │ ├── cosmetic_toggle_icon_hovered.png │ │ │ │ │ └── crafting_toggle_icon_hovered.png │ │ │ ├── nine_patch_textures │ │ │ │ └── theme │ │ │ │ │ ├── dark │ │ │ │ │ ├── inset.json │ │ │ │ │ ├── panel.json │ │ │ │ │ ├── button │ │ │ │ │ │ ├── active.json │ │ │ │ │ │ ├── disabled.json │ │ │ │ │ │ ├── hovered.json │ │ │ │ │ │ └── toggle │ │ │ │ │ │ │ └── rounded │ │ │ │ │ │ │ ├── enabled.json │ │ │ │ │ │ │ ├── disabled.json │ │ │ │ │ │ │ ├── enabled_hovered.json │ │ │ │ │ │ │ └── disabled_hovered.json │ │ │ │ │ └── scrollbar │ │ │ │ │ │ ├── vanilla_vertical.json │ │ │ │ │ │ ├── track.json │ │ │ │ │ │ ├── vanilla_flat.json │ │ │ │ │ │ ├── vanilla_horizontal.json │ │ │ │ │ │ ├── vanilla_vertical_disabled.json │ │ │ │ │ │ └── vanilla_horizontal_disabled.json │ │ │ │ │ └── light │ │ │ │ │ ├── inset.json │ │ │ │ │ ├── panel.json │ │ │ │ │ ├── button │ │ │ │ │ ├── active.json │ │ │ │ │ ├── disabled.json │ │ │ │ │ ├── hovered.json │ │ │ │ │ └── toggle │ │ │ │ │ │ └── rounded │ │ │ │ │ │ ├── enabled.json │ │ │ │ │ │ ├── disabled.json │ │ │ │ │ │ ├── disabled_hovered.json │ │ │ │ │ │ └── enabled_hovered.json │ │ │ │ │ └── scrollbar │ │ │ │ │ ├── vanilla_vertical.json │ │ │ │ │ ├── track.json │ │ │ │ │ ├── vanilla_flat.json │ │ │ │ │ ├── vanilla_horizontal.json │ │ │ │ │ ├── vanilla_vertical_disabled.json │ │ │ │ │ └── vanilla_horizontal_disabled.json │ │ │ └── shaders │ │ │ │ └── core │ │ │ │ ├── fish.vsh │ │ │ │ ├── fish.fsh │ │ │ │ ├── fish.json │ │ │ │ ├── spectrum_position_tex.vsh │ │ │ │ ├── spectrum_position_tex.fsh │ │ │ │ └── spectrum_position_tex.json │ │ └── minecraft │ │ │ └── atlases │ │ │ ├── blocks.json │ │ │ └── gui.json │ │ ├── schemas │ │ └── custom_renderer_schema.json │ │ └── architectury.common.json └── build.gradle.kts ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── info └── INFO_ABOUT_TRANSLATIONS.md ├── settings.gradle.kts ├── .github └── FUNDING.yml └── LICENSE /fabric/gradle.properties: -------------------------------------------------------------------------------- 1 | loom.platform=fabric -------------------------------------------------------------------------------- /neoforge/gradle.properties: -------------------------------------------------------------------------------- 1 | loom.platform=neoforge -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/networking/client/SyncData.java: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/item/all.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [] 4 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /neoforge/src/main/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/neoforge/src/main/resources/icon.png -------------------------------------------------------------------------------- /neoforge/src/main/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "description": "Example Mod", 4 | "pack_format": 15 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "description": "Example Mod", 4 | "pack_format": 15 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/item/any.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "#accessories:all" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/accessories/accessories/slot/belt.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": true, 3 | "amount": 5, 4 | "operation": "set" 5 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/accessories/tags/item/face.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:apple" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/accessories/tags/item/hat.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:tnt" 5 | ] 6 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/accessories/tags/item/hat.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:tnt" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/main/resources/META-INF/services/io.wispforest.accessories.AccessoriesInternals: -------------------------------------------------------------------------------- 1 | io.wispforest.accessories.fabric.AccessoriesFabricInternals -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/accessories/tags/item/back.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:potato" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/accessories/tags/item/ring.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:beacon" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/accessories/slot/anklet.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 3, 4 | "operation": "set" 5 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/accessories/slot/back.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "add" 5 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/accessories/tags/item/back.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:potato" 5 | ] 6 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/accessories/tags/item/face.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:apple" 5 | ] 6 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/accessories/tags/item/ring.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:beacon" 5 | ] 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/modifiable_entity_accessories_blacklist.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [] 4 | } -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/services/io.wispforest.accessories.AccessoriesInternals: -------------------------------------------------------------------------------- 1 | io.wispforest.accessories.neoforge.AccessoriesNeoforgeInternals -------------------------------------------------------------------------------- /fabric/src/main/resources/META-INF/services/io.wispforest.accessories.AccessoriesLoaderInternals: -------------------------------------------------------------------------------- 1 | io.wispforest.accessories.fabric.AccessoriesFabricLoaderInternals -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/accessories/tags/item/hand.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:pointed_dripstone" 5 | ] 6 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/accessories/tags/item/hand.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:pointed_dripstone" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/main/resources/assets/accessories/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/fabric/src/main/resources/assets/accessories/icon.png -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/accessories/slot/testccessories/test_slot_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 100, 3 | "icon": "accessories:gui/slot/cape" 4 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/accessories/slot/testccessories/test_slot_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 200, 3 | "icon": "accessories:gui/slot/cape" 4 | } -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/services/io.wispforest.accessories.AccessoriesLoaderInternals: -------------------------------------------------------------------------------- 1 | io.wispforest.accessories.neoforge.AccessoriesNeoforgeLoaderInternals -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/accessories/slot/testccessories/test_slot_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 100, 3 | "icon": "accessories:gui/slot/cape" 4 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/accessories/slot/testccessories/test_slot_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 200, 3 | "icon": "accessories:gui/slot/cape" 4 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/enchantment/valid_for_redirection.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:mending" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/tags/item/test_slot_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "testccessories:test_item_1" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/tags/item/test_slot_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "testccessories:test_item_2" 5 | ] 6 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/tags/item/test_slot_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "testccessories:test_item_1" 5 | ] 6 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/tags/item/test_slot_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "testccessories:test_item_2" 5 | ] 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/equipment_manageable.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:armor_stand" 5 | ] 6 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/assets/testccessories/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/fabric/src/testmod/resources/assets/testccessories/icon.png -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/assets/testccessories/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/neoforge/src/testmod/resources/assets/testccessories/icon.png -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/client/EntityTarget.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.client; 2 | 3 | public enum EntityTarget { 4 | PLAYER, 5 | LOOKING_ENTITY 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/data/OperationType.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.data; 2 | 3 | public enum OperationType { 4 | SET, 5 | ADD, 6 | SUB 7 | } 8 | -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/accessories/slot/something.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 100, 3 | "icon": "accessories:gui/slot/charm", 4 | "amount": 0, 5 | "operation": "SET" 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/reset_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/reset_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/slot_frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/slot_frame.png -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/impl/slot/StrictMode.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.impl.slot; 2 | 3 | public enum StrictMode { 4 | NONE, 5 | PARTIAL, 6 | FULL, 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "stretch" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "stretch" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/unsorted.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 10, 4 | "slots": [ 5 | ], 6 | "icon": "accessories:container/slot/group/unknown" 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/settings_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/settings_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/slot.png -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/leg.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 40, 4 | "slots": [ 5 | "belt" 6 | ], 7 | "icon": "accessories:container/slot/group/leg" 8 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/accessories_panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/accessories_panel.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/charm_toggle_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/charm_toggle_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button_disabled.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "stretch" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button_disabled.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "stretch" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button_highlighted.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "stretch" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/button.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/inset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/inset.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/panel.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/inset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/inset.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/panel.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/slot.png -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/misc.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 120, 4 | "slots": [ 5 | "charm" 6 | ], 7 | "icon": "accessories:container/slot/group/misc" 8 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/cosmetic_toggle_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/cosmetic_toggle_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/crafting_toggle_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/crafting_toggle_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/new_gui_image_crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/new_gui_image_crop.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/reset_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/reset_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/8x8/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/8x8/button.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/scroll_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/scroll_bar.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button_highlighted.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "stretch" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/back.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/scrollbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/scrollbar.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/button.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/accessories_back_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/accessories_back_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/accessories_open_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/accessories_open_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/settings_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/settings_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/charm_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/charm_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/charm_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/charm_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/scrollbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/scrollbar.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/minecraft/atlases/blocks.json: -------------------------------------------------------------------------------- 1 | { 2 | "sources": [ 3 | { 4 | "type": "directory", 5 | "source": "gui/slot", 6 | "prefix": "gui/slot/" 7 | } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/impl/PlayerEquipControl.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.impl; 2 | 3 | public enum PlayerEquipControl { 4 | MUST_CROUCH, 5 | MUST_NOT_CROUCH, 6 | DISABLED 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/charm_toggle_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/charm_toggle_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/container/horizontal_tabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/container/horizontal_tabs.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/original_gui_image_crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/original_gui_image_crop.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/background_patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/background_patch.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/scroll_bar_patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/scroll_bar_patch.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/back_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/back_dark.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/line_shown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/line_shown.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/crafting_grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/crafting_grid.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/crafting_grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/crafting_grid.png -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/head.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 100, 4 | "slots": [ 5 | "hat", 6 | "face" 7 | ], 8 | "icon": "accessories:container/slot/group/head" 9 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/cosmetic_animal_armor_targets.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:wolf", 5 | "minecraft:horse", 6 | "minecraft:llama" 7 | ] 8 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/defaulted_targets.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:player", 5 | "minecraft:armor_stand", 6 | "minecraft:mannequin" 7 | ] 8 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/accessories/entity/test_slots.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "entities": [ 4 | "#accessories:defaulted_targets" 5 | ], 6 | "slots": [ 7 | "something" 8 | ] 9 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/8x8/button_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/8x8/button_disabled.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/back.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/belt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/belt.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/cape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/cape.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/face.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/hand.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/hat.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/ring.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/highlight/clickbait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/highlight/clickbait.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/line_hidden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/line_hidden.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/all_arrow_directions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/all_arrow_directions.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/cosmetic_rainbow_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/cosmetic_rainbow_icon.png -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/feet.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 20, 4 | "slots": [ 5 | "shoes", 6 | "anklet" 7 | ], 8 | "icon": "accessories:container/slot/group/feet" 9 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/cosmetic_armor_targets.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:player", 5 | "minecraft:armor_stand", 6 | "minecraft:mannequin" 7 | ] 8 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/accessories_back_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/accessories_back_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/accessories_open_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/accessories_open_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/cosmetic_toggle_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/cosmetic_toggle_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/crafting_toggle_icon_hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/crafting_toggle_icon_hovered.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/8x8/button_highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/8x8/button_highlighted.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/anklet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/anklet.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/charm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/charm.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/empty.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/shoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/shoes.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/socks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/socks.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/wrist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/wrist.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/toggle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/toggle_background.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/toggle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/toggle_background.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/container/accessories_inventory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/container/accessories_inventory.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/container/horizontal_tabs_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/container/horizontal_tabs_small.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/cosmetic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/cosmetic.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/arm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/arm.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/leg.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/necklace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/necklace.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/button_toggle_rounded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/button_toggle_rounded.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/chest.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/feet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/feet.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/head.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/misc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/misc.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button_disabled.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/unused_slots_hidden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/unused_slots_hidden.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/unused_slots_shown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/unused_slots_shown.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/player_inv/with_crafting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/player_inv/with_crafting.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/button_toggle_rounded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/button_toggle_rounded.png -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/entity/cosmetic_saddle.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "entities": [ 4 | "#accessories:cosmetic_saddle_targets" 5 | ], 6 | "slots": [ 7 | "accessories_cosmetics:saddle" 8 | ] 9 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/compat/config/SlotAmountModifier.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.compat.config; 2 | 3 | public class SlotAmountModifier { 4 | public String slotType = ""; 5 | public int amount = 0; 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/container/slot/group/unknown.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button_disabled.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button_highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/8x8/button_highlighted.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/1_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/1_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/2_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/2_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/4_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/4_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/1_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/1_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/2_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/2_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/4_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/4_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/player_inv/with_crafting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/player_inv/with_crafting.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/minecraft/atlases/gui.json: -------------------------------------------------------------------------------- 1 | { 2 | "sources": [ 3 | { 4 | "type": "directory", 5 | "source": "gui/group", 6 | "prefix": "gui/group/" 7 | } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/arm.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 60, 4 | "slots": [ 5 | "hand", 6 | "ring", 7 | "wrist" 8 | ], 9 | "icon": "accessories:container/slot/group/arm" 10 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button_highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/sprites/widget/12x12/button_highlighted.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/player_inv/without_crafting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/player_inv/without_crafting.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/1_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/1_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/2_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/2_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/4_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/4_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/1_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/1_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/2_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/2_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/4_slots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/4_slots.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/player_inv/without_crafting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/player_inv/without_crafting.png -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/group/chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "order": 80, 4 | "slots": [ 5 | "necklace", 6 | "cape", 7 | "back" 8 | ], 9 | "icon": "accessories:container/slot/group/chest" 10 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/entity/cosmetic_animal_armor.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "entities": [ 4 | "#accessories:cosmetic_animal_armor_targets" 5 | ], 6 | "slots": [ 7 | "accessories_cosmetics:animal_body" 8 | ] 9 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/AccessoriesFrameBufferExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | public interface AccessoriesFrameBufferExtension { 4 | void accessories$setUseHighlightShader(boolean useHighlightShader); 5 | } 6 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/entity_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/double/entity_background.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/entity_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/dark/entity_view/single/entity_background.png -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/equip/EquipCheck.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.equip; 2 | 3 | import net.minecraft.world.item.ItemStack; 4 | 5 | public interface EquipCheck { 6 | boolean isValid(ItemStack stack, boolean isSwapping); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/OnArgumentRegistration.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api; 2 | 3 | public interface OnArgumentRegistration { 4 | 5 | void registerArgumentTypes(ArgumentRegistrationCallback registration); 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/entity_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/double/entity_background.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/entity_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisp-forest/accessories/HEAD/common/src/main/resources/assets/accessories/textures/gui/theme/light/entity_view/single/entity_background.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | *.ipr 3 | run/ 4 | run_*/ 5 | *.iws 6 | out/ 7 | *.iml 8 | .gradle/ 9 | output/ 10 | bin/ 11 | libs/ 12 | 13 | .classpath 14 | .project 15 | .idea/ 16 | classes/ 17 | .metadata 18 | .vscode 19 | .settings 20 | *.launch 21 | .architectury-transformer/ 22 | .kotlin/ -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/CloseContainerTransfer.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import net.minecraft.client.gui.screens.Screen; 4 | 5 | public interface CloseContainerTransfer { 6 | void accessories$setScreenTransfer(Screen screen); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/scroll_bar.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "nine_slice", 5 | "width": 6, 6 | "height": 6, 7 | "border": 2 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/background_patch.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "nine_slice", 5 | "width": 15, 6 | "height": 15, 7 | "border": 5 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/textures/gui/sprites/scroll_bar_patch.png.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "gui": { 3 | "scaling": { 4 | "type": "nine_slice", 5 | "width": 6, 6 | "height": 6, 7 | "border": 2 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/inset.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/inset.png", 3 | "texture_width": 16, 4 | "texture_height": 16, 5 | "repeat": false, 6 | "patch_size": { 7 | "width": 5, 8 | "height": 5 9 | } 10 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/panel.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/panel.png", 3 | "texture_width": 16, 4 | "texture_height": 16, 5 | "repeat": false, 6 | "patch_size": { 7 | "width": 5, 8 | "height": 5 9 | } 10 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/inset.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/inset.png", 3 | "texture_width": 16, 4 | "texture_height": 16, 5 | "repeat": false, 6 | "patch_size": { 7 | "width": 5, 8 | "height": 5 9 | } 10 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/panel.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/panel.png", 3 | "texture_width": 16, 4 | "texture_height": 16, 5 | "repeat": false, 6 | "patch_size": { 7 | "width": 5, 8 | "height": 5 9 | } 10 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/shaders/core/fish.vsh: -------------------------------------------------------------------------------- 1 | #version 150 2 | 3 | in vec3 Position; 4 | 5 | out vec2 texCoord; 6 | 7 | void main() { 8 | vec2 screenPos = Position.xy * 2.0 - 1.0; 9 | gl_Position = vec4(screenPos.x, screenPos.y, 1.0, 1.0); 10 | texCoord = Position.xy; 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/shaders/core/fish.fsh: -------------------------------------------------------------------------------- 1 | #version 150 2 | 3 | uniform sampler2D DiffuseSampler; 4 | 5 | uniform vec4 ColorModulator; 6 | 7 | in vec2 texCoord; 8 | 9 | out vec4 fragColor; 10 | 11 | void main(){ 12 | fragColor = texture(DiffuseSampler, texCoord) * ColorModulator; 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/ConcurrentBarrier.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | public interface ConcurrentBarrier extends AutoCloseable { 4 | void setSinking(boolean value); 5 | 6 | @Override 7 | default void close() { 8 | setSinking(false); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/face.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 900, 6 | "icon": "accessories:container/slot/face", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/hand.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 2, 4 | "operation": "set", 5 | "order": 900, 6 | "icon": "accessories:container/slot/hand", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/ring.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 2, 4 | "operation": "set", 5 | "order": 800, 6 | "icon": "accessories:container/slot/ring", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /fabric/src/testmod/resources/testccessories-fabric.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "io.wispforest.testccessories.fabric.mixin", 4 | "compatibilityLevel": "JAVA_17", 5 | "minVersion": "0.8", 6 | "client": [ 7 | ], 8 | "mixins": [ 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/compat/config/RenderSlotTarget.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.compat.config; 2 | 3 | import io.wispforest.accessories.api.client.rendering.TargetType; 4 | 5 | public class RenderSlotTarget { 6 | public String slotType = ""; 7 | public TargetType targetType = TargetType.ALL; 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/anklet.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 1000, 6 | "icon": "accessories:container/slot/anklet", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/belt.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 1000, 6 | "icon": "accessories:container/slot/belt", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/shoes.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 900, 6 | "icon": "accessories:container/slot/shoes", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/wrist.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 1000, 6 | "icon": "accessories:container/slot/wrist", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/necklace.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 1000, 6 | "icon": "accessories:container/slot/necklace", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/stack/ItemStackExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond.stack; 2 | 3 | import io.wispforest.accessories.utils.ItemStackResize; 4 | import io.wispforest.owo.util.EventStream; 5 | 6 | public interface ItemStackExtension { 7 | EventStream accessories$getResizeEvent(); 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/cosmetic_saddle_targets.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:horse", 5 | "minecraft:horse", 6 | "minecraft:donkey", 7 | "minecraft:mule", 8 | "minecraft:camel", 9 | "minecraft:llama", 10 | "minecraft:pig", 11 | "minecraft:strider" 12 | ] 13 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/events/SlotStateChange.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.events; 2 | 3 | public enum SlotStateChange { 4 | MUTATION, // The stack was not unequipped but the stack NBT data was changed 5 | REPLACEMENT // The stack was unequipped and replaced with an ItemStack with a different item, NBT or both 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/entity/cosmetic_armor.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "entities": [ 4 | "#accessories:cosmetic_armor_targets" 5 | ], 6 | "slots": [ 7 | "accessories_cosmetics:head", 8 | "accessories_cosmetics:chest", 9 | "accessories_cosmetics:legs", 10 | "accessories_cosmetics:feet" 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/hat.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 1000, 6 | "icon": "accessories:container/slot/hat", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:banner_item", 11 | "accessories:attribute" 12 | ] 13 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/charm.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 1000, 6 | "icon": "accessories:container/slot/charm", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute", 11 | "accessories:totem_item" 12 | ] 13 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/tags/entity_type/modifiable_entity_accessories_whitelist.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:armor_stand", 5 | "minecraft:horse", 6 | "minecraft:donkey", 7 | "minecraft:mule", 8 | "minecraft:camel", 9 | "minecraft:llama", 10 | "minecraft:pig", 11 | "minecraft:strider" 12 | ] 13 | } -------------------------------------------------------------------------------- /neoforge/src/main/java/io/wispforest/accessories/neoforge/compat/NeoAccessoriesClientREIPlugin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.neoforge.compat; 2 | 3 | import io.wispforest.accessories.compat.rei.AccessoriesClientREIPlugin; 4 | import me.shedaniel.rei.forge.REIPluginClient; 5 | 6 | @REIPluginClient 7 | public class NeoAccessoriesClientREIPlugin extends AccessoriesClientREIPlugin {} 8 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/DroppedStacksExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import net.minecraft.world.item.ItemStack; 4 | 5 | import java.util.Collection; 6 | 7 | public interface DroppedStacksExtension { 8 | void addToBeDroppedStacks(Collection list); 9 | 10 | Collection toBeDroppedStacks(); 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/shaders/core/fish.json: -------------------------------------------------------------------------------- 1 | { 2 | "vertex": "accessories:core/fish", 3 | "fragment": "accessories:core/fish", 4 | "attributes": [ "Position" ], 5 | "samplers": [ 6 | { "name": "DiffuseSampler" } 7 | ], 8 | "uniforms": [ 9 | { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/TooltipFlagMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.pond.TooltipFlagExtension; 4 | import net.minecraft.world.item.TooltipFlag; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | 7 | @Mixin(TooltipFlag.class) 8 | public interface TooltipFlagMixin extends TooltipFlagExtension { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/active.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button.png", 3 | "texture_width": 64, 4 | "texture_height": 192, 5 | "repeat": true, 6 | "corner_patch_size": { 7 | "width": 3, 8 | "height": 3 9 | }, 10 | "center_patch_size": { 11 | "width": 58, 12 | "height": 58 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/core/NamedArgumentGetter.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api.core; 2 | 3 | import com.mojang.brigadier.context.CommandContext; 4 | import com.mojang.brigadier.exceptions.CommandSyntaxException; 5 | 6 | public interface NamedArgumentGetter { 7 | T getArgument(CommandContext ctx, String name) throws CommandSyntaxException; 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/active.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button.png", 3 | "texture_width": 64, 4 | "texture_height": 192, 5 | "repeat": true, 6 | "corner_patch_size": { 7 | "width": 3, 8 | "height": 3 9 | }, 10 | "center_patch_size": { 11 | "width": 58, 12 | "height": 58 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/entity/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "entities": [ 4 | "#accessories:defaulted_targets" 5 | ], 6 | "slots": [ 7 | "hat", 8 | "face", 9 | "necklace", 10 | "cape", 11 | "back", 12 | "hand", 13 | "ring", 14 | "wrist", 15 | "belt", 16 | "anklet", 17 | "shoes", 18 | "charm" 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/back.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 800, 6 | "icon": "accessories:container/slot/back", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute", 11 | "accessories:elytra_item", 12 | "accessories:banner_item" 13 | ] 14 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/accessories/accessories/slot/cape.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "amount": 1, 4 | "operation": "set", 5 | "order": 900, 6 | "icon": "accessories:container/slot/cape", 7 | "validators": [ 8 | "accessories:tag", 9 | "accessories:component", 10 | "accessories:attribute", 11 | "accessories:elytra_item", 12 | "accessories:banner_item" 13 | ] 14 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/base/CommandGenerator.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api.base; 2 | 3 | import net.minecraft.commands.CommandSourceStack; 4 | 5 | public final class CommandGenerator extends BaseCommandGenerator { 6 | @Override 7 | public CommandGenerator getThis() { 8 | return this; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/scrollbar/vanilla_vertical.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "repeat": true, 6 | "corner_patch_size": { 7 | "width": 2, 8 | "height": 2 9 | }, 10 | "center_patch_size": { 11 | "width": 8, 12 | "height": 12 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/scrollbar/vanilla_vertical.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "repeat": true, 6 | "corner_patch_size": { 7 | "width": 2, 8 | "height": 2 9 | }, 10 | "center_patch_size": { 11 | "width": 8, 12 | "height": 12 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/screen/PlayerBasedTargetGetter.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client.screen; 2 | 3 | import net.minecraft.client.player.LocalPlayer; 4 | import net.minecraft.world.entity.LivingEntity; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface PlayerBasedTargetGetter { 8 | @Nullable LivingEntity getTarget(LocalPlayer player); 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button.png", 3 | "texture_width": 64, 4 | "texture_height": 192, 5 | "v": 128, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/hovered.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button.png", 3 | "texture_width": 64, 4 | "texture_height": 192, 5 | "v": 64, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/scrollbar/track.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 26, 6 | "repeat": false, 7 | "corner_patch_size": { 8 | "width": 1, 9 | "height": 1 10 | }, 11 | "center_patch_size": { 12 | "width": 4, 13 | "height": 30 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button.png", 3 | "texture_width": 64, 4 | "texture_height": 192, 5 | "v": 128, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/hovered.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button.png", 3 | "texture_width": 64, 4 | "texture_height": 192, 5 | "v": 64, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/testccessories-neoforge.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "io.wispforest.testccessories.neoforge.mixin", 4 | "compatibilityLevel": "JAVA_17", 5 | "minVersion": "0.8", 6 | "client": [ 7 | "client.AccessoriesNetworkingMixin" 8 | ], 9 | "mixins": [ 10 | "AccessoriesNetworkingMixin" 11 | ], 12 | "injectors": { 13 | "defaultRequire": 1 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/scrollbar/track.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 26, 6 | "repeat": false, 7 | "corner_patch_size": { 8 | "width": 1, 9 | "height": 1 10 | }, 11 | "center_patch_size": { 12 | "width": 4, 13 | "height": 30 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/toggle/rounded/enabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "repeat": true, 6 | "corner_patch_size": { 7 | "width": 3, 8 | "height": 3 9 | }, 10 | "center_patch_size": { 11 | "width": 58, 12 | "height": 58 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/scrollbar/vanilla_flat.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 33, 6 | "repeat": false, 7 | "corner_patch_size": { 8 | "width": 1, 9 | "height": 1 10 | }, 11 | "center_patch_size": { 12 | "width": 14, 13 | "height": 30 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/scrollbar/vanilla_flat.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 33, 6 | "repeat": false, 7 | "corner_patch_size": { 8 | "width": 1, 9 | "height": 1 10 | }, 11 | "center_patch_size": { 12 | "width": 14, 13 | "height": 30 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/scrollbar/vanilla_horizontal.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "v": 16, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 2, 9 | "height": 2 10 | }, 11 | "center_patch_size": { 12 | "width": 8, 13 | "height": 12 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/toggle/rounded/enabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "repeat": true, 6 | "corner_patch_size": { 7 | "width": 3, 8 | "height": 3 9 | }, 10 | "center_patch_size": { 11 | "width": 58, 12 | "height": 58 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/scrollbar/vanilla_horizontal.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "v": 16, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 2, 9 | "height": 2 10 | }, 11 | "center_patch_size": { 12 | "width": 8, 13 | "height": 12 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/scrollbar/vanilla_vertical_disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 13, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 2, 9 | "height": 2 10 | }, 11 | "center_patch_size": { 12 | "width": 8, 13 | "height": 12 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/scrollbar/vanilla_vertical_disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 13, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 2, 9 | "height": 2 10 | }, 11 | "center_patch_size": { 12 | "width": 8, 13 | "height": 12 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/shaders/core/spectrum_position_tex.vsh: -------------------------------------------------------------------------------- 1 | #version 150 2 | 3 | in vec3 Position; 4 | in vec2 UV0; 5 | in vec4 Color; 6 | 7 | uniform mat4 ModelViewMat; 8 | uniform mat4 ProjMat; 9 | 10 | out vec2 texCoord0; 11 | out vec4 vertexColor; 12 | 13 | void main() { 14 | gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); 15 | 16 | texCoord0 = UV0; 17 | vertexColor = Color; 18 | } 19 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/interfaces.json: -------------------------------------------------------------------------------- 1 | { 2 | "net/minecraft/world/entity/LivingEntity": [ 3 | "io/wispforest/accessories/pond/AccessoriesAPIAccess" 4 | ], 5 | "net/minecraft/client/renderer/entity/state/LivingEntityRenderState": [ 6 | "io/wispforest/accessories/pond/AccessoriesRenderStateAPI" 7 | ], 8 | "net/minecraft/world/item/TooltipFlag": [ 9 | "io/wispforest/accessories/pond/TooltipFlagExtension" 10 | ] 11 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/toggle/rounded/disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "v": 128, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/toggle/rounded/disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "v": 128, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/schemas/custom_renderer_schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Data Driven Accessory Renderer", 4 | "description": "Defines a data driven way of rendering a given custom renderer for an Accessory", 5 | "type": "object", 6 | "$ref": "https://github.com/wisp-forest/accessories/blob/1.21.x/common/src/main/resources/schemas/rendering_function_schema.json/#/definitions/renderer#" 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/toggle/rounded/enabled_hovered.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "v": 64, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/CommandSelectionAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.commands.Commands; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | @Mixin(Commands.CommandSelection.class) 8 | public interface CommandSelectionAccessor { 9 | @Accessor("includeIntegrated") 10 | boolean accessories$includeIntegrated(); 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/button/toggle/rounded/disabled_hovered.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "v": 192, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/dark/scrollbar/vanilla_horizontal_disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/dark/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 13, 6 | "v": 16, 7 | "repeat": true, 8 | "corner_patch_size": { 9 | "width": 2, 10 | "height": 2 11 | }, 12 | "center_patch_size": { 13 | "width": 8, 14 | "height": 12 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/toggle/rounded/disabled_hovered.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "v": 192, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/button/toggle/rounded/enabled_hovered.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/button_toggle_rounded.png", 3 | "texture_width": 64, 4 | "texture_height": 256, 5 | "v": 64, 6 | "repeat": true, 7 | "corner_patch_size": { 8 | "width": 3, 9 | "height": 3 10 | }, 11 | "center_patch_size": { 12 | "width": 58, 13 | "height": 58 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/nine_patch_textures/theme/light/scrollbar/vanilla_horizontal_disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "texture": "accessories:textures/gui/theme/light/scrollbar.png", 3 | "texture_width": 64, 4 | "texture_height": 32, 5 | "u": 13, 6 | "v": 16, 7 | "repeat": true, 8 | "corner_patch_size": { 9 | "width": 2, 10 | "height": 2 11 | }, 12 | "center_patch_size": { 13 | "width": 8, 14 | "height": 12 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/compat/config/ScreenType.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.compat.config; 2 | 3 | public enum ScreenType { 4 | NONE(-1), 5 | ORIGINAL(1), 6 | PRIMARY_V2(2); 7 | 8 | private final int screenIndex; 9 | 10 | ScreenType(int screenIndex) { 11 | this.screenIndex = screenIndex; 12 | } 13 | 14 | public boolean isValid() { 15 | return this.screenIndex >= 1; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/LivingEntityAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.world.entity.LivingEntity; 4 | import net.minecraft.world.item.ItemStack; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Invoker; 7 | 8 | @Mixin(LivingEntity.class) 9 | public interface LivingEntityAccessor { 10 | @Invoker("breakItem") void accessors$breakItem(ItemStack stack); 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/ScissorStackManipulation.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | public interface ScissorStackManipulation { 6 | 7 | default void accessories$renderWithoutAny(Runnable runnable) { 8 | accessories$renderWithoutEntries(runnable, null); 9 | } 10 | 11 | void accessories$renderWithoutEntries(Runnable runnable, @Nullable Integer levels); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/compat/config/client/Structured.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.compat.config.client; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.FIELD) 10 | public @interface Structured { 11 | boolean sideBySide() default false; 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/core/AccessoryItem.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.core; 2 | 3 | import net.minecraft.world.item.Item; 4 | 5 | /** 6 | * Helper base class for accessory items with automatic registration. 7 | */ 8 | public class AccessoryItem extends Item implements Accessory { 9 | public AccessoryItem(Properties properties) { 10 | super(properties); 11 | 12 | AccessoryRegistry.register(this, this); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/AbstractSliderButtonAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import net.minecraft.client.gui.components.AbstractSliderButton; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | @Mixin(AbstractSliderButton.class) 8 | public interface AbstractSliderButtonAccessor { 9 | @Accessor("value") 10 | void accessories$setValue(double value); 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/InstanceEndec.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | import io.wispforest.endec.SerializationContext; 4 | import io.wispforest.endec.util.MapCarrierDecodable; 5 | import io.wispforest.endec.util.MapCarrierEncodable; 6 | 7 | public interface InstanceEndec { 8 | void encode(MapCarrierEncodable encoder, SerializationContext ctx); 9 | 10 | void decode(MapCarrierDecodable decoder, SerializationContext ctx); 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/AccessoriesAPIAccess.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import io.wispforest.accessories.api.AccessoriesCapability; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | public interface AccessoriesAPIAccess { 7 | 8 | @Nullable 9 | default AccessoriesCapability accessoriesCapability() { 10 | throw new IllegalStateException("[AccessoriesAPIAccess]: Default interface method not implemented!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/stack/PatchedDataComponentMapExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond.stack; 2 | 3 | import io.wispforest.accessories.utils.ItemStackMutation; 4 | import io.wispforest.owo.util.EventStream; 5 | import net.minecraft.world.item.ItemStack; 6 | 7 | public interface PatchedDataComponentMapExtension { 8 | boolean accessories$hasChanged(); 9 | 10 | EventStream accessories$getMutationEvent(ItemStack stack); 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/ItemStackAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.core.component.PatchedDataComponentMap; 4 | import net.minecraft.world.item.ItemStack; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(ItemStack.class) 9 | public interface ItemStackAccessor { 10 | @Accessor("components") 11 | PatchedDataComponentMap accessories$components(); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/EnchantedItemInUseExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import io.wispforest.accessories.api.slot.SlotReference; 4 | import net.minecraft.world.item.enchantment.EnchantedItemInUse; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface EnchantedItemInUseExtension { 8 | 9 | EnchantedItemInUse setSlotReference(SlotReference slotReference); 10 | 11 | @Nullable 12 | SlotReference getSlotReference(); 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/HorseInventoryMenuAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.world.entity.animal.horse.AbstractHorse; 4 | import net.minecraft.world.inventory.HorseInventoryMenu; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(HorseInventoryMenu.class) 9 | public interface HorseInventoryMenuAccessor { 10 | @Accessor("horse") 11 | AbstractHorse accessories$horse(); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/ServerChunkLoadingManagerAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import it.unimi.dsi.fastutil.ints.Int2ObjectMap; 4 | import net.minecraft.server.level.ChunkMap; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(ChunkMap.class) 9 | public interface ServerChunkLoadingManagerAccessor { 10 | @Accessor("entityMap") 11 | Int2ObjectMap accessories$getEntityMap(); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/ArgumentRegistrationCallback.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api; 2 | 3 | import com.mojang.brigadier.arguments.ArgumentType; 4 | import io.wispforest.accessories.commands.api.core.RecordArgumentTypeInfo; 5 | import net.minecraft.resources.ResourceLocation; 6 | 7 | public interface ArgumentRegistrationCallback { 8 | , T> RecordArgumentTypeInfo register(ResourceLocation location, Class clazz, RecordArgumentTypeInfo info); 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/EntityTrackerAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.server.level.ChunkMap; 4 | import net.minecraft.server.network.ServerPlayerConnection; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | import java.util.Set; 9 | 10 | @Mixin(ChunkMap.TrackedEntity.class) 11 | public interface EntityTrackerAccessor { 12 | @Accessor("seenBy") 13 | Set accessories$getSeenBy(); 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/ItemStackResize.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | import io.wispforest.accessories.pond.stack.ItemStackExtension; 4 | import io.wispforest.owo.util.EventStream; 5 | import net.minecraft.world.item.ItemStack; 6 | 7 | public interface ItemStackResize { 8 | static EventStream getEvent(ItemStack stack) { 9 | return ((ItemStackExtension) (Object) stack).accessories$getResizeEvent(); 10 | } 11 | 12 | void onResize(ItemStack stack, int prevSize); 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/SimpleJsonResourceReloadListenerAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import com.mojang.serialization.Codec; 4 | import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(SimpleJsonResourceReloadListener.class) 9 | public interface SimpleJsonResourceReloadListenerAccessor { 10 | 11 | @Accessor("codec") 12 | Codec accessories$getCodec(); 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/WingsLayerExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import com.mojang.blaze3d.vertex.PoseStack; 4 | import net.minecraft.client.renderer.SubmitNodeCollector; 5 | import net.minecraft.client.renderer.entity.state.HumanoidRenderState; 6 | import net.minecraft.world.item.ItemStack; 7 | 8 | public interface WingsLayerExtension { 9 | void renderStack(ItemStack stack, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int i, S humanoidRenderState); 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/client/gui/AbstractButtonExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.client.gui; 2 | 3 | import net.fabricmc.fabric.api.event.Event; 4 | import net.minecraft.client.gui.components.AbstractButton; 5 | 6 | public interface AbstractButtonExtension { 7 | Event getRenderingEvent(); 8 | 9 | default B adjustRendering(ButtonEvents.AdjustRendering event) { 10 | this.getRenderingEvent().register(event); 11 | 12 | return (B) this; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/HashUtils.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | import java.util.Objects; 4 | 5 | public class HashUtils { 6 | 7 | public static int getHash(Throwable throwable) { 8 | var hash = (throwable.getCause() != null) ? getHash(throwable.getCause()) : 0; 9 | 10 | for (var innerThrowable : throwable.getSuppressed()) { 11 | hash = Objects.hash(hash, getHash(innerThrowable)); 12 | } 13 | 14 | return Objects.hash(hash, throwable.getMessage()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/slot/SlotPathWithStack.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.slot; 2 | 3 | import net.minecraft.world.item.ItemStack; 4 | 5 | public interface SlotPathWithStack { 6 | 7 | static SlotPathWithStack of(SlotPath slotPath, ItemStack stack) { 8 | return new SlotPathWithStack() { 9 | @Override public SlotPath path() { return slotPath; } 10 | @Override public ItemStack stack() { return stack; } 11 | }; 12 | } 13 | 14 | SlotPath path(); 15 | 16 | ItemStack stack(); 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/client/gui/utils/Line3d.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.client.gui.utils; 2 | 3 | import net.minecraft.util.Mth; 4 | import org.joml.Vector3d; 5 | import org.joml.Vector3f; 6 | 7 | public record Line3d(Vector3d p1, Vector3d p2) { 8 | public Vector3f lerpPoint(double delta) { 9 | return new Vector3d( 10 | Mth.lerp(delta, p1().x, p2().x), 11 | Mth.lerp(delta, p1().y, p2().y), 12 | Mth.lerp(delta, p1().z, p2().z) 13 | ).get(new Vector3f()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/core/CommandAddition.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api.core; 2 | 3 | import com.mojang.brigadier.builder.ArgumentBuilder; 4 | 5 | import java.util.Objects; 6 | 7 | public interface CommandAddition { 8 | ArgumentBuilder addToBuilder(ArgumentBuilder builder); 9 | 10 | default CommandAddition andWith(CommandAddition addition) { 11 | Objects.requireNonNull(addition); 12 | return (builder) -> addition.addToBuilder(addToBuilder(builder)); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/ResourceArgumentAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.commands.arguments.ResourceArgument; 4 | import net.minecraft.core.Registry; 5 | import net.minecraft.resources.ResourceKey; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | 9 | @Mixin(ResourceArgument.class) 10 | public interface ResourceArgumentAccessor { 11 | @Accessor("registryKey") 12 | ResourceKey> accessories$registryKey(); 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/StateHolderAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import com.mojang.serialization.MapCodec; 4 | import net.minecraft.world.level.block.state.StateHolder; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(StateHolder.class) 9 | public interface StateHolderAccessor { 10 | @Accessor("owner") 11 | O accessories$owner(); 12 | 13 | @Accessor("propertiesCodec") 14 | MapCodec accessories$propertiesCodec(); 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/owo/ConfigWrapperAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.owo; 2 | 3 | import io.wispforest.endec.impl.ReflectiveEndecBuilder; 4 | import io.wispforest.owo.config.ConfigWrapper; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | import java.util.Map; 9 | 10 | @Mixin(value = ConfigWrapper.class, remap = false) 11 | public interface ConfigWrapperAccessor { 12 | @Accessor(value = "builder") 13 | ReflectiveEndecBuilder accessories$builder(); 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/core/Branch.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api.core; 2 | 3 | import io.wispforest.accessories.commands.api.base.Argument; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public interface Branch { 9 | Key branchKey(); 10 | 11 | default List> addStartingToArgs(List> startingArgs) { 12 | var list = new ArrayList<>(startingArgs); 13 | 14 | list.addAll(0, branchKey().asArgumentList()); 15 | 16 | return list; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/ModelPartAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import net.minecraft.client.model.geom.ModelPart; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Mixin(ModelPart.class) 11 | public interface ModelPartAccessor { 12 | @Accessor("cubes") List accessories$getCubes(); 13 | 14 | @Accessor("children") Map accessories$getChildren(); 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/AccessoriesLoaderInternals.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories; 2 | 3 | import io.wispforest.accessories.utils.ServiceLoaderUtils; 4 | 5 | import java.nio.file.Path; 6 | 7 | public abstract class AccessoriesLoaderInternals { 8 | 9 | public static final AccessoriesLoaderInternals INSTANCE = ServiceLoaderUtils.load(AccessoriesLoaderInternals.class); 10 | 11 | public abstract boolean isDevelopmentEnv(); 12 | 13 | public abstract boolean isModLoaded(String mod); 14 | 15 | public abstract Path getConfigPath(); 16 | } 17 | -------------------------------------------------------------------------------- /common/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import io.wispforest.helpers.Extensions.fabricModule 2 | import io.wispforest.helpers.Extensions.modrinth 3 | 4 | plugins { 5 | id("multiloader-mojmap") 6 | id("multiloader-publishing") 7 | } 8 | 9 | dependencies { 10 | // Core Libs 11 | compileOnly(libs.mixin.extras.common) 12 | annotationProcessor(libs.mixin.extras.common) 13 | // -- 14 | 15 | // General Libs 16 | fabricModule(this::modCompileOnlyApi, "fabric-api-base") 17 | // -- 18 | 19 | modrinth(this::modCompileOnly, "sodium" to "${libs.versions.sodium.get()}-fabric") 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/SoundEventData.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api; 2 | 3 | import io.wispforest.accessories.api.core.Accessory; 4 | import io.wispforest.accessories.api.slot.SlotReference; 5 | import net.minecraft.core.Holder; 6 | import net.minecraft.sounds.SoundEvent; 7 | import net.minecraft.world.item.ItemStack; 8 | 9 | /** 10 | * Represents a sound event with volume and pitch data. 11 | * 12 | * @see Accessory#getEquipSound(ItemStack, SlotReference) 13 | */ 14 | public record SoundEventData(Holder event, float volume, float pitch) { } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/EquipmentLayerRendererAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer; 4 | import net.minecraft.client.resources.model.EquipmentAssetManager; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(EquipmentLayerRenderer.class) 9 | public interface EquipmentLayerRendererAccessor { 10 | @Accessor("equipmentAssets") 11 | EquipmentAssetManager accessories$equipmentAssetManager(); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/owo/OptionAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.owo; 2 | 3 | import io.wispforest.owo.config.Option; 4 | import net.minecraft.network.FriendlyByteBuf; 5 | import net.minecraft.network.RegistryFriendlyByteBuf; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Invoker; 8 | 9 | @Mixin(Option.class) 10 | public interface OptionAccessor { 11 | @Invoker("read") 12 | T accessories$read(FriendlyByteBuf buf); 13 | 14 | @Invoker("write") 15 | void accessories$write(FriendlyByteBuf buf); 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/resources/architectury.common.json: -------------------------------------------------------------------------------- 1 | { 2 | "accessWidener": "accessories.accesswidener", 3 | "injected_interfaces": { 4 | "net/minecraft/class_1309": [ 5 | "io/wispforest/accessories/pond/AccessoriesAPIAccess" 6 | ], 7 | "net/minecraft/class_4264": [ 8 | "io/wispforest/accessories/client/gui/AbstractButtonExtension" 9 | ], 10 | "net/minecraft/class_10042": [ 11 | "io/wispforest/accessories/pond/AccessoriesRenderStateAPI" 12 | ], 13 | "net/minecraft/class_1836": [ 14 | "io/wispforest/accessories/pond/TooltipFlagExtension" 15 | ] 16 | } 17 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/impl/option/PlayerOptionsAccess.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.impl.option; 2 | 3 | import java.util.Optional; 4 | 5 | public interface PlayerOptionsAccess { 6 | 7 | Optional getData(PlayerOption option); 8 | 9 | default T getDefaultedData(PlayerOption option) { 10 | return getData(option).orElseGet(option::defaultValue); 11 | } 12 | 13 | default boolean hasData(PlayerOption option) { 14 | return getData(option).isPresent(); 15 | } 16 | 17 | void setData(PlayerOption option, T data); 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/events/DropRule.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.events; 2 | 3 | /** 4 | * Represents what happens to an accessory after death. 5 | */ 6 | public enum DropRule { 7 | /** 8 | * Accessory remains in the player's inventory. 9 | */ 10 | KEEP, 11 | /** 12 | * Accessory is dropped on the ground as an item entity. 13 | */ 14 | DROP, 15 | /** 16 | * Accessory is voided. 17 | */ 18 | DESTROY, 19 | /** 20 | * Default vanilla behaviour (game rules/enchantments) is used. 21 | */ 22 | DEFAULT 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/CriteriaTriggersAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.advancements.CriteriaTriggers; 4 | import net.minecraft.advancements.CriterionTrigger; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Invoker; 7 | 8 | @Mixin(CriteriaTriggers.class) 9 | public interface CriteriaTriggersAccessor { 10 | @Invoker("register") 11 | static > T accessories$callRegister(String name, T trigger) { 12 | throw new UnsupportedOperationException(); 13 | } 14 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/networking/server/ContainerClose.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.networking.server; 2 | 3 | import io.wispforest.endec.Endec; 4 | import io.wispforest.endec.StructEndec; 5 | import net.minecraft.server.level.ServerPlayer; 6 | import net.minecraft.world.entity.player.Player; 7 | 8 | public record ContainerClose() { 9 | public static final StructEndec ENDEC = Endec.unit(ContainerClose::new); 10 | 11 | public static void handlePacket(ContainerClose packet, Player player) { 12 | ((ServerPlayer)player).doCloseContainer(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /neoforge/src/main/java/io/wispforest/accessories/neoforge/mixin/neoforge/BaseRenderStateAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.neoforge.mixin.neoforge; 2 | 3 | import net.minecraft.util.context.ContextKey; 4 | import net.neoforged.neoforge.client.renderstate.BaseRenderState; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | import java.util.Map; 9 | 10 | @Mixin(value = BaseRenderState.class, remap = false) 11 | public interface BaseRenderStateAccessor { 12 | @Accessor("extensions") 13 | Map, Object> accessories$extensions(); 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/DefaultDispenseItemBehaviorAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.core.dispenser.BlockSource; 4 | import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; 5 | import net.minecraft.world.item.ItemStack; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Invoker; 8 | 9 | @Mixin(DefaultDispenseItemBehavior.class) 10 | public interface DefaultDispenseItemBehaviorAccessor { 11 | @Invoker("execute") 12 | ItemStack accessories$execute(BlockSource blockSource, ItemStack item); 13 | } 14 | -------------------------------------------------------------------------------- /fabric/src/main/resources/accessories-fabric.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "io.wispforest.accessories.fabric.mixin", 4 | "plugin": "io.wispforest.accessories.fabric.mixin.AccessoriesFabricMixinConfig", 5 | "compatibilityLevel": "JAVA_17", 6 | "minVersion": "0.8", 7 | "client": [ 8 | "client.AbstractContainerScreenMixin" 9 | ], 10 | "mixins": [ 11 | "DataPackContentsMixin", 12 | "LivingEntityMixin", 13 | "PlayerListMixin", 14 | "ServerEntityEvent", 15 | "trinkets.LivingEntityTrinketComponentMixin" 16 | ], 17 | "injectors": { 18 | "defaultRequire": 1 19 | } 20 | } -------------------------------------------------------------------------------- /info/INFO_ABOUT_TRANSLATIONS.md: -------------------------------------------------------------------------------- 1 | English: 2 | - This mod is primarily written in English, since most of the Dev's on the project primary language is English. Translation PR's are welcome to either add languages or update existing language files with the requirement that at least two or more people confirm that the PR itself reflects best efforts to translate the information without errors or misinterpretations. This is to insure that the information given in the respect language are not just Auto Generated translations that may be of low quality and could be worse in some regards to assisting players in understand what something is, dose or are. 3 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven("https://maven.fabricmc.net/") 4 | maven("https://maven.architectury.dev/") 5 | maven("https://maven.neoforged.net/releases/") 6 | maven("https://maven.parchmentmc.org") 7 | mavenCentral() 8 | gradlePluginPortal() 9 | } 10 | } 11 | 12 | dependencyResolutionManagement { 13 | versionCatalogs { 14 | create("libs") { 15 | from(files("libs.versions.toml")) 16 | } 17 | } 18 | } 19 | 20 | include("common") 21 | include("fabric") 22 | include("neoforge") 23 | 24 | rootProject.name = "accessories" -------------------------------------------------------------------------------- /neoforge/src/main/java/io/wispforest/accessories/neoforge/mixin/ContextAwareReloadListenerAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.neoforge.mixin; 2 | 3 | import com.google.gson.JsonElement; 4 | import net.neoforged.neoforge.common.conditions.ConditionalOps; 5 | import net.neoforged.neoforge.resource.ContextAwareReloadListener; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Invoker; 8 | 9 | @Mixin(ContextAwareReloadListener.class) 10 | public interface ContextAwareReloadListenerAccessor { 11 | @Invoker("makeConditionalOps") 12 | ConditionalOps accessories$makeConditionalOps(); 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/LivingEntityRenderStateAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; 4 | import net.minecraft.client.renderer.item.ItemStackRenderState; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.Mutable; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | 9 | @Mixin(LivingEntityRenderState.class) 10 | public interface LivingEntityRenderStateAccessor { 11 | @Mutable 12 | @Accessor("headItem") 13 | void accessories$headItem(ItemStackRenderState state); 14 | } 15 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/accessories-neoforge.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "io.wispforest.accessories.neoforge.mixin", 4 | "plugin": "io.wispforest.accessories.neoforge.mixin.AccessoriesNeoforgeMixinConfig", 5 | "compatibilityLevel": "JAVA_17", 6 | "minVersion": "0.8", 7 | "client": [ 8 | "NeoForgeLoadingOverlayMixin", 9 | "client.AbstractContainerScreenMixin", 10 | "client.AccessoriesPipelinesMixin" 11 | ], 12 | "mixins": [ 13 | "CommandHelperMixin", 14 | "ContextAwareReloadListenerAccessor", 15 | "curios.CurioInventoryMixin" 16 | ], 17 | "injectors": { 18 | "defaultRequire": 1 19 | } 20 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/DefaultedContextKey.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client; 2 | 3 | import net.minecraft.resources.ResourceLocation; 4 | import net.minecraft.util.context.ContextKey; 5 | 6 | import java.util.function.Supplier; 7 | 8 | public class DefaultedContextKey extends ContextKey { 9 | private final Supplier defaultValue; 10 | 11 | public DefaultedContextKey(ResourceLocation name, Supplier defaultValue) { 12 | super(name); 13 | 14 | this.defaultValue = defaultValue; 15 | } 16 | 17 | public T getDefaultValue() { 18 | return this.defaultValue.get(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/ContainerScreenExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import net.minecraft.world.inventory.Slot; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | public interface ContainerScreenExtension { 7 | 8 | @Nullable 9 | default Boolean isHovering_Logical(Slot slot, double mouseX, double mouseY) { 10 | return null; 11 | } 12 | 13 | @Nullable 14 | default Boolean isHovering_Rendering(Slot slot, double mouseX, double mouseY) { 15 | return null; 16 | } 17 | 18 | @Nullable 19 | default Boolean shouldRenderSlot(Slot slot) { 20 | return null; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/ContextedFileToIdConverter.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import net.minecraft.resources.FileToIdConverter; 4 | import net.minecraft.resources.ResourceLocation; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface ContextedFileToIdConverter { 8 | FileToIdConverter setData(ResourceLocation location, T t); 9 | 10 | @Nullable T getData(ResourceLocation location); 11 | 12 | default T getDataOrDefault(ResourceLocation location, T defaultValue) { 13 | var data = (T) getData(location); 14 | 15 | if (data == null) data = defaultValue; 16 | 17 | return data; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/ReplaceableJsonResourceReloadListener.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; 4 | 5 | public interface ReplaceableJsonResourceReloadListener { 6 | 7 | void accessories$allowReplacementLoading(boolean value); 8 | 9 | boolean accessories$allowReplacementLoading(); 10 | 11 | static void toggleValue(SimpleJsonResourceReloadListener listener) { 12 | if (listener instanceof ReplaceableJsonResourceReloadListener value) { 13 | value.accessories$allowReplacementLoading(!value.accessories$allowReplacementLoading()); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/advancements/base/root.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:potato" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.root.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.root.desc" 11 | }, 12 | "background": "minecraft:textures/block/stone.png", 13 | "frame": "task", 14 | "show_toast": true, 15 | "announce_to_chat": true, 16 | "hidden": false 17 | }, 18 | "criteria": { 19 | "equipped_accessory": { 20 | "trigger": "accessories:equip_accessory", 21 | "conditions": { 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/advancements/base/root.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:potato" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.root.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.root.desc" 11 | }, 12 | "background": "minecraft:textures/block/stone.png", 13 | "frame": "task", 14 | "show_toast": true, 15 | "announce_to_chat": true, 16 | "hidden": false 17 | }, 18 | "criteria": { 19 | "equipped_accessory": { 20 | "trigger": "accessories:equip_accessory", 21 | "conditions": { 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/screen/ScreenBasedTargetGetter.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client.screen; 2 | 3 | import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; 4 | import net.minecraft.world.entity.LivingEntity; 5 | import net.minecraft.world.inventory.AbstractContainerMenu; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public interface ScreenBasedTargetGetter> { 9 | 10 | ScreenBasedTargetGetter> PLAYER_DEFAULTED_TARGET = screen -> null; 11 | 12 | @Nullable LivingEntity getTarget(S screen); 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/slot/SlotEntryReference.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.slot; 2 | 3 | import net.minecraft.world.entity.LivingEntity; 4 | import net.minecraft.world.item.ItemStack; 5 | 6 | /** 7 | * Context object holding onto a given slot's reference and a given stack loosely bound to it 8 | */ 9 | public record SlotEntryReference(SlotReference reference, ItemStack stack) implements SlotPathWithStack { 10 | 11 | public SlotEntryReference(LivingEntity entity, SlotPath path, ItemStack stack){ 12 | this(SlotReference.of(entity, path), stack); 13 | } 14 | 15 | @Override 16 | public SlotPath path() { 17 | return reference.slotPath(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/data/api/SimpleManagedEndecDataLoader.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.data.api; 2 | 3 | import io.wispforest.endec.Endec; 4 | import net.minecraft.resources.ResourceLocation; 5 | import net.minecraft.server.packs.PackType; 6 | 7 | import java.util.Map; 8 | 9 | public class SimpleManagedEndecDataLoader extends ManagedEndecDataLoader { 10 | 11 | protected SimpleManagedEndecDataLoader(ResourceLocation id, String type, Endec endec, PackType packType) { 12 | super(id, type, endec, endec, packType); 13 | } 14 | 15 | @Override 16 | public Map mapFrom(Map rawData) { 17 | return rawData; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/owo/ConfigSynchronizerAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.owo; 2 | 3 | import io.wispforest.owo.config.ConfigSynchronizer; 4 | import io.wispforest.owo.config.ConfigWrapper; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | import org.spongepowered.asm.mixin.gen.Invoker; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | @Mixin(ConfigSynchronizer.class) 13 | public interface ConfigSynchronizerAccessor { 14 | @Accessor(value = "KNOWN_CONFIGS") 15 | static Map> KNOWN_CONFIGS() { 16 | throw new IllegalStateException("UHHHHHHHHHHHHHHHHHH"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/events/extra/OnTotemConsumption.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.events.extra; 2 | 3 | import io.wispforest.accessories.api.slot.SlotReference; 4 | import net.minecraft.world.damagesource.DamageSource; 5 | import net.minecraft.world.item.ItemStack; 6 | import org.jetbrains.annotations.ApiStatus; 7 | 8 | @ApiStatus.Experimental 9 | public interface OnTotemConsumption { 10 | 11 | OnTotemConsumption DEFAULT_BEHAVIOR = (slotReference, currentStack, damageSource) -> { 12 | currentStack.shrink(1); 13 | 14 | return currentStack; 15 | }; 16 | 17 | ItemStack onConsumption(SlotReference slotReference, ItemStack currentStack, DamageSource damageSource); 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/AbstractContainerScreenAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; 4 | import net.minecraft.world.inventory.Slot; 5 | import net.minecraft.world.item.ItemStack; 6 | import org.jetbrains.annotations.Nullable; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.gen.Accessor; 9 | import org.spongepowered.asm.mixin.gen.Invoker; 10 | 11 | @Mixin(AbstractContainerScreen.class) 12 | public interface AbstractContainerScreenAccessor { 13 | @Accessor("leftPos") int accessories$leftPos(); 14 | 15 | @Accessor("topPos") int accessories$topPos(); 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/ServiceLoaderUtils.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | import com.mojang.logging.LogUtils; 4 | import org.slf4j.Logger; 5 | 6 | import java.util.ServiceLoader; 7 | 8 | public class ServiceLoaderUtils { 9 | 10 | private static final Logger LOGGER = LogUtils.getLogger(); 11 | 12 | public static T load(Class clazz) { 13 | final T loadedService = ServiceLoader.load(clazz) 14 | .findFirst() 15 | .orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); 16 | 17 | LOGGER.debug("Loaded {} for service {}", loadedService, clazz); 18 | 19 | return loadedService; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader = "javafml" 2 | loaderVersion = "[1,)" 3 | #issueTrackerURL = "" 4 | license = "MIT" 5 | 6 | [[mods]] 7 | modId = "testccessories" 8 | version = "1.0.0" 9 | displayName = "Testccessories" 10 | authors = "chyzman" 11 | description = ''' 12 | Testmod for accessories 13 | ''' 14 | #logoFile = "" 15 | 16 | [[mixins]] 17 | config = 'testccessories-neoforge.mixins.json' 18 | 19 | [[dependencies.testccessories]] 20 | modId = "neoforge" 21 | required = true 22 | versionRange = "[20,)" 23 | ordering = "NONE" 24 | side = "BOTH" 25 | 26 | [[dependencies.testccessories]] 27 | modId = "minecraft" 28 | required = true 29 | versionRange = "[1.20.4,)" 30 | ordering = "NONE" 31 | side = "BOTH" -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/data/api/IdentifiedResourceReloadListener.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.data.api; 2 | 3 | import io.wispforest.accessories.AccessoriesInternals; 4 | import net.minecraft.resources.ResourceLocation; 5 | import net.minecraft.server.packs.PackType; 6 | import net.minecraft.server.packs.resources.PreparableReloadListener; 7 | 8 | import java.util.Set; 9 | 10 | public interface IdentifiedResourceReloadListener extends PreparableReloadListener { 11 | 12 | ResourceLocation getId(); 13 | 14 | Set getDependencyIds(); 15 | 16 | default void registerForType(PackType packType) { 17 | AccessoriesInternals.INSTANCE.registerLoader(packType, this); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/owo/DiscreteSliderComponentAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client.owo; 2 | 3 | import io.wispforest.owo.ui.component.DiscreteSliderComponent; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | import org.spongepowered.asm.mixin.gen.Invoker; 7 | 8 | @Mixin(value = DiscreteSliderComponent.class) 9 | public interface DiscreteSliderComponentAccessor { 10 | 11 | @Accessor(value = "min", remap = false) void accessories$setMin(double value); 12 | @Accessor(value = "max", remap = false) void accessories$setMax(double value); 13 | 14 | @Invoker(value = "updateMessage") void accessories$updateMessage(); 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/client/gui/ButtonEvents.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.client.gui; 2 | 3 | import net.minecraft.client.gui.GuiGraphics; 4 | import net.minecraft.client.gui.components.AbstractButton; 5 | import net.minecraft.resources.ResourceLocation; 6 | 7 | public class ButtonEvents { 8 | 9 | public static B adjustRendering(B button, AdjustRendering event){ 10 | ((AbstractButtonExtension) button).getRenderingEvent().register(event); 11 | 12 | return button; 13 | } 14 | 15 | public interface AdjustRendering { 16 | boolean render(AbstractButton button, GuiGraphics instance, ResourceLocation sprite, int x, int y, int width, int height); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fabric/src/main/java/io/wispforest/accessories/fabric/AccessoriesFabricLoaderInternals.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.fabric; 2 | 3 | import io.wispforest.accessories.AccessoriesLoaderInternals; 4 | import net.fabricmc.loader.api.FabricLoader; 5 | 6 | import java.nio.file.Path; 7 | 8 | public class AccessoriesFabricLoaderInternals extends AccessoriesLoaderInternals { 9 | 10 | public boolean isDevelopmentEnv() { 11 | return FabricLoader.getInstance().isDevelopmentEnvironment(); 12 | } 13 | 14 | public boolean isModLoaded(String mod) { 15 | return FabricLoader.getInstance().isModLoaded(mod); 16 | } 17 | 18 | public Path getConfigPath() { 19 | return FabricLoader.getInstance().getConfigDir(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/owo/TagValueInputAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.owo; 2 | 3 | import net.minecraft.nbt.CompoundTag; 4 | import net.minecraft.util.ProblemReporter; 5 | import net.minecraft.world.level.storage.TagValueInput; 6 | import net.minecraft.world.level.storage.ValueInputContextHelper; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.gen.Accessor; 9 | 10 | @Mixin(TagValueInput.class) 11 | public interface TagValueInputAccessor { 12 | @Accessor("problemReporter") ProblemReporter accessories$problemReporter(); 13 | 14 | @Accessor("input") CompoundTag accessories$input(); 15 | 16 | @Accessor("context") ValueInputContextHelper accessories$context(); 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/shaders/core/spectrum_position_tex.fsh: -------------------------------------------------------------------------------- 1 | #version 150 2 | 3 | uniform sampler2D Sampler0; 4 | uniform vec4 ColorModulator; 5 | 6 | in vec2 texCoord0; 7 | in vec4 vertexColor; 8 | 9 | out vec4 fragColor; 10 | 11 | vec3 hsv2rgb(vec3 hsv) { 12 | vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); 13 | vec3 p = abs(fract(hsv.xxx + K.xyz) * 6.0 - K.www); 14 | return hsv.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), hsv.y); 15 | } 16 | 17 | void main() { 18 | vec4 color = texture(Sampler0, texCoord0) * vertexColor; 19 | 20 | if (color.a < 0.1) { 21 | discard; 22 | } 23 | 24 | fragColor = vec4( 25 | hsv2rgb(vertexColor.xyz).xyz, 26 | vertexColor.w 27 | ) * ColorModulator; 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/accessories/shaders/core/spectrum_position_tex.json: -------------------------------------------------------------------------------- 1 | { 2 | "vertex": "accessories:core/spectrum_position_tex", 3 | "fragment": "accessories:core/spectrum_position_tex", 4 | "attributes": [], 5 | "samplers": [ 6 | { "name": "Sampler0" } 7 | ], 8 | "uniforms": [ 9 | { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, 10 | { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, 11 | { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/owo/TagValueOutputAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.owo; 2 | 3 | import com.mojang.serialization.DynamicOps; 4 | import net.minecraft.nbt.CompoundTag; 5 | import net.minecraft.nbt.Tag; 6 | import net.minecraft.util.ProblemReporter; 7 | import net.minecraft.world.level.storage.TagValueOutput; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.gen.Accessor; 10 | 11 | @Mixin(TagValueOutput.class) 12 | public interface TagValueOutputAccessor { 13 | @Accessor("problemReporter") ProblemReporter accessories$problemReporter(); 14 | 15 | @Accessor("output") CompoundTag accessories$output(); 16 | 17 | @Accessor("ops") DynamicOps accessories$ops(); 18 | } 19 | -------------------------------------------------------------------------------- /neoforge/src/testmod/java/io/wispforest/testccessories/neoforge/mixin/AccessoriesNetworkingMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.testccessories.neoforge.mixin; 2 | 3 | import io.wispforest.accessories.networking.AccessoriesNetworking; 4 | import io.wispforest.testccessories.neoforge.Testccessories; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | @Mixin(AccessoriesNetworking.class) 11 | public abstract class AccessoriesNetworkingMixin { 12 | @Inject(method = "init", at = @At("TAIL")) 13 | private static void registerOtherPackets(CallbackInfo ci) { 14 | Testccessories.initNetworkPackets(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/menu/SlotTypeAccessible.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.menu; 2 | 3 | import io.wispforest.accessories.api.AccessoriesContainer; 4 | import io.wispforest.accessories.api.slot.SlotPath; 5 | import io.wispforest.accessories.api.slot.SlotType; 6 | 7 | public interface SlotTypeAccessible { 8 | 9 | AccessoriesContainer getContainer(); 10 | 11 | int index(); 12 | 13 | default String slotName() { 14 | return getContainer().getSlotName(); 15 | } 16 | 17 | default SlotType slotType() { 18 | return getContainer().slotType(); 19 | } 20 | 21 | default SlotPath slotPath() { 22 | return getContainer().createPath(index()); 23 | } 24 | 25 | default boolean isCosmeticSlot() { 26 | return false; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fabric/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import io.wispforest.helpers.Utils 2 | import io.wispforest.helpers.Extensions.modrinth 3 | import io.wispforest.helpers.Extensions.modrinthImplementation 4 | 5 | plugins { 6 | id("multiloader-platform") 7 | id("multiloader-publishing") 8 | id("com.github.johnrengelman.shadow") 9 | } 10 | 11 | dependencies { 12 | // Core Libs 13 | modImplementation(libs.fabric.loader) 14 | modImplementation(libs.fabric.api) 15 | // -- 16 | 17 | // General Libs 18 | modCompileOnly(libs.modmenu) 19 | modLocalRuntime(libs.modmenu) 20 | //-- 21 | 22 | // modrinth(this::modLocalRuntime, "ok-boomer" to "0.1.3+1.21") 23 | // modrinth(this::modLocalRuntime, "sodium" to "${libs.versions.sodium.get()}-fabric") 24 | 25 | modCompileOnly(libs.trinkets) 26 | } 27 | 28 | repositories {} -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/ItemStackMutation.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | import io.wispforest.accessories.mixin.ItemStackAccessor; 4 | import io.wispforest.accessories.pond.stack.PatchedDataComponentMapExtension; 5 | import io.wispforest.owo.util.EventStream; 6 | import net.minecraft.core.component.DataComponentType; 7 | import net.minecraft.world.item.ItemStack; 8 | 9 | import java.util.List; 10 | 11 | public interface ItemStackMutation { 12 | 13 | static EventStream getEvent(ItemStack stack) { 14 | return ((PatchedDataComponentMapExtension) (Object) ((ItemStackAccessor) (Object) stack).accessories$components()).accessories$getMutationEvent(stack); 15 | } 16 | 17 | void onMutation(ItemStack stack, List> types); 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/equip/EquipmentChecking.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.equip; 2 | 3 | import io.wispforest.accessories.api.AccessoriesCapability; 4 | import net.minecraft.world.item.Item; 5 | 6 | import java.util.function.Predicate; 7 | 8 | /** 9 | * Controls how {@link AccessoriesCapability} methods handle cosmetic accessories. 10 | * 11 | * @see AccessoriesCapability#getFirstEquipped(Item, EquipmentChecking) 12 | * @see AccessoriesCapability#getFirstEquipped(Predicate, EquipmentChecking) 13 | */ 14 | public enum EquipmentChecking { 15 | /** 16 | * Only non-cosmetic accessories are considered. 17 | */ 18 | ACCESSORIES_ONLY, 19 | /** 20 | * Cosmetic accessories are preferred over non-cosmetic accessories. 21 | */ 22 | COSMETICALLY_OVERRIDABLE 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/MinecraftMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import io.wispforest.accessories.client.AccessoriesClient; 4 | import net.minecraft.client.Minecraft; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | @Mixin(Minecraft.class) 11 | public abstract class MinecraftMixin { 12 | @Inject(method = "resizeDisplay", at = @At(value = "TAIL")) 13 | private void captureResize(CallbackInfo ci){ 14 | var client = ((Minecraft) ((Object) this)); 15 | AccessoriesClient.WINDOW_RESIZE_CALLBACK_EVENT.invoker().onResized(client, client.getWindow()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/events/extra/OnTotemActivate.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.events.extra; 2 | 3 | import io.wispforest.accessories.api.slot.SlotReference; 4 | import net.minecraft.world.damagesource.DamageSource; 5 | import net.minecraft.world.item.ItemStack; 6 | import net.minecraft.world.item.component.DeathProtection; 7 | import org.jetbrains.annotations.ApiStatus; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | @ApiStatus.Experimental 11 | public interface OnTotemActivate { 12 | 13 | OnTotemActivate DEFAULT_BEHAVIOR = (currentProtection, slotReference, triggeredStack, damageSource) -> currentProtection; 14 | 15 | @Nullable DeathProtection onActivation(DeathProtection currentProtection, SlotReference slotReference, ItemStack triggeredStack, DamageSource damageSource); 16 | } 17 | -------------------------------------------------------------------------------- /neoforge/src/testmod/java/io/wispforest/testccessories/neoforge/mixin/client/AccessoriesNetworkingMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.testccessories.neoforge.mixin.client; 2 | 3 | import io.wispforest.accessories.networking.AccessoriesNetworking; 4 | import io.wispforest.testccessories.neoforge.client.TestccessoriesClient; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | @Mixin(AccessoriesNetworking.class) 11 | public abstract class AccessoriesNetworkingMixin { 12 | @Inject(method = "initClient", at = @At("TAIL")) 13 | private static void registerOtherPacketsClient(CallbackInfo ci) { 14 | TestccessoriesClient.initNetworkPackets(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/LivingEntityRendererAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import net.minecraft.client.model.EntityModel; 4 | import net.minecraft.client.renderer.entity.LivingEntityRenderer; 5 | import net.minecraft.client.renderer.entity.layers.RenderLayer; 6 | import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; 7 | import net.minecraft.world.entity.LivingEntity; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.gen.Accessor; 10 | 11 | import java.util.List; 12 | 13 | @Mixin(LivingEntityRenderer.class) 14 | public interface LivingEntityRendererAccessor> { 15 | @Accessor("layers") List> accessories$getLayers(); 16 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/compat/emi/AccessoriesClientEMIPlugin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.compat.emi; 2 | 3 | import dev.emi.emi.api.EmiEntrypoint; 4 | import dev.emi.emi.api.EmiPlugin; 5 | import dev.emi.emi.api.EmiRegistry; 6 | import dev.emi.emi.api.widget.Bounds; 7 | import io.wispforest.accessories.client.gui.AccessoriesScreen; 8 | 9 | @EmiEntrypoint 10 | public class AccessoriesClientEMIPlugin implements EmiPlugin { 11 | 12 | @Override 13 | public void register(EmiRegistry registry) { 14 | registry.addExclusionArea(AccessoriesScreen.class, (screen, consumer) -> { 15 | screen.getComponentRectangles().forEach(rectangle -> { 16 | consumer.accept(new Bounds(rectangle.x(), rectangle.y(), rectangle.width(), rectangle.height())); 17 | }); 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neoforge/src/main/java/io/wispforest/accessories/neoforge/AccessoriesNeoforgeLoaderInternals.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.neoforge; 2 | 3 | import io.wispforest.accessories.AccessoriesLoaderInternals; 4 | import net.neoforged.fml.loading.FMLLoader; 5 | import net.neoforged.fml.loading.FMLPaths; 6 | 7 | import java.nio.file.Path; 8 | 9 | public class AccessoriesNeoforgeLoaderInternals extends AccessoriesLoaderInternals { 10 | 11 | public boolean isDevelopmentEnv() { 12 | return !FMLLoader.getCurrent().isProduction(); 13 | } 14 | 15 | public boolean isModLoaded(String mod) { 16 | return FMLLoader.getCurrent().getLoadingModList().getModFileById(mod) != null; 17 | } 18 | 19 | public Path getConfigPath() { 20 | return FMLLoader.getCurrent().getGameDir().resolve(FMLPaths.CONFIGDIR.relative()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/RenderStateStorage.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client; 2 | 3 | import net.minecraft.util.context.ContextKey; 4 | 5 | public interface RenderStateStorage { 6 | 7 | default T getStateData(ContextKey key) { 8 | throw new IllegalStateException("Interface Stub method not implemented!"); 9 | } 10 | 11 | default boolean hasStateData(ContextKey key) { 12 | throw new IllegalStateException("Interface Stub method not implemented!"); 13 | } 14 | 15 | default void setStateData(ContextKey key, T data) { 16 | throw new IllegalStateException("Interface Stub method not implemented!"); 17 | } 18 | 19 | default void clearExtraData() { 20 | throw new IllegalStateException("Interface Stub method not implemented!"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fabric/src/main/java/io/wispforest/accessories/fabric/ExtraEntityTrackingEvents.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.fabric; 2 | 3 | import net.fabricmc.fabric.api.event.Event; 4 | import net.fabricmc.fabric.api.event.EventFactory; 5 | import net.fabricmc.fabric.api.networking.v1.EntityTrackingEvents; 6 | 7 | public class ExtraEntityTrackingEvents { 8 | 9 | /** 10 | * Variant of Fabric API's event but fired at the tail of the method instead of the head of the method 11 | */ 12 | public static final Event POST_START_TRACKING = EventFactory.createArrayBacked(EntityTrackingEvents.StartTracking.class, callbacks -> (trackedEntity, player) -> { 13 | for (EntityTrackingEvents.StartTracking callback : callbacks) { 14 | callback.onStartTracking(trackedEntity, player); 15 | } 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/advancements/base/equipped_apple.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:apple" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.equipped_apple.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.equipped_apple.desc" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "hidden": false 16 | }, 17 | "parent": "testccessories:base/root", 18 | "criteria": { 19 | "equipped_apple": { 20 | "trigger": "accessories:equip_accessory", 21 | "conditions": { 22 | "items": [ 23 | { 24 | "items": [ 25 | "minecraft:apple" 26 | ] 27 | } 28 | ] 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/advancements/base/equipped_apple.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:apple" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.equipped_apple.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.equipped_apple.desc" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "hidden": false 16 | }, 17 | "parent": "testccessories:base/root", 18 | "criteria": { 19 | "equipped_apple": { 20 | "trigger": "accessories:equip_accessory", 21 | "conditions": { 22 | "items": [ 23 | { 24 | "items": [ 25 | "minecraft:apple" 26 | ] 27 | } 28 | ] 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/slot/EntityBasedPredicate.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.slot; 2 | 3 | import net.fabricmc.fabric.api.util.TriState; 4 | import net.minecraft.world.entity.LivingEntity; 5 | import net.minecraft.world.item.ItemStack; 6 | import net.minecraft.world.level.Level; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | /** 10 | * Similar to {@link SlotBasedPredicate} but allows for {@link LivingEntity} if such is required 11 | */ 12 | public interface EntityBasedPredicate extends SlotBasedPredicate { 13 | 14 | TriState isValid(Level level, @Nullable LivingEntity entity, SlotType slotType, int index, ItemStack stack); 15 | 16 | @Override 17 | default TriState isValid(Level level, SlotType slotType, int slot, ItemStack stack) { 18 | return isValid(level, null, slotType, slot, stack); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/menu/networking/ToggledSlots.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.menu.networking; 2 | 3 | import io.wispforest.owo.util.pond.OwoSlotExtension; 4 | import net.minecraft.world.inventory.AbstractContainerMenu; 5 | 6 | import java.util.Map; 7 | 8 | public record ToggledSlots(Map changedSlotStates) { 9 | 10 | public static void initMenu(AbstractContainerMenu menu) { 11 | menu.addServerboundMessage(ToggledSlots.class, (message) -> { 12 | message.changedSlotStates().forEach((index, state) -> { 13 | if (index >= menu.slots.size() || index < 0) return; 14 | 15 | var slot = ((OwoSlotExtension) menu.getSlot(index)); 16 | 17 | if(state != slot.owo$getDisabledOverride()) slot.owo$setDisabledOverride(state); 18 | }); 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /fabric/src/testmod/resources/assets/testccessories/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "advancement.testccessories.base.root.title": "Testccessories", 3 | "advancement.testccessories.base.root.desc": "chyz was here", 4 | "advancement.testccessories.base.equipped_apple.title": "Abble", 5 | "advancement.testccessories.base.equipped_apple.desc": "bottom text", 6 | "advancement.testccessories.base.lefthanded_drip.title": "Left Handed Drip", 7 | "advancement.testccessories.base.lefthanded_drip.desc": "how ambidextrous of you", 8 | "advancement.testccessories.base.no_longer_lefthanded_drip.title": "No Longer Left Handed Drip", 9 | "advancement.testccessories.base.no_longer_lefthanded_drip.desc": "very cringe", 10 | "accessories.slot_group.testccessories": "Testccessories", 11 | "accessories.slot.testccessories.test_slot_1": "Test Slot 1", 12 | "accessories.slot.testccessories.test_slot_2": "Test Slot 2" 13 | } -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/accesstransformer.cfg: -------------------------------------------------------------------------------- 1 | public net.minecraft.client.gui.screens.MenuScreens register(Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/client/gui/screens/MenuScreens$ScreenConstructor;)V # register 2 | public net.minecraft.resources.RegistryOps$HolderLookupAdapter 3 | public net.minecraft.world.item.enchantment.EnchantmentHelper$EnchantmentInSlotVisitor 4 | public net.minecraft.world.item.enchantment.EnchantmentHelper$EnchantmentVisitor 5 | public net.minecraft.world.inventory.ArmorSlot 6 | public net.minecraft.client.gui.screens.inventory.AbstractContainerScreen renderSlotHighlightBack(Lnet/minecraft/client/gui/GuiGraphics;)V # renderSlotHighlightBack 7 | public net.minecraft.client.gui.screens.inventory.AbstractContainerScreen renderSlotHighlightFront(Lnet/minecraft/client/gui/GuiGraphics;)V # renderSlotHighlightFront 8 | public net.minecraft.server.level.ChunkMap$TrackedEntity -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/ItemInHandRendererMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 4 | import io.wispforest.accessories.client.AccessoriesClient; 5 | import net.minecraft.client.renderer.ItemInHandRenderer; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | 9 | //@Environment(EnvType.CLIENT) 10 | @Mixin(ItemInHandRenderer.class) 11 | public abstract class ItemInHandRendererMixin { 12 | @ModifyExpressionValue(method = "renderTwoHandedMap", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;isInvisible()Z")) 13 | private boolean accessories$overrideFirstPersonInvisibility(boolean original) { 14 | if (original) AccessoriesClient.IS_PLAYER_INVISIBLE = true; 15 | return false; 16 | } 17 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/PlayerMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.pond.DroppedStacksExtension; 4 | import net.minecraft.world.entity.player.Player; 5 | import net.minecraft.world.item.ItemStack; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Unique; 8 | 9 | import java.util.Collection; 10 | import java.util.List; 11 | 12 | @Mixin(Player.class) 13 | public abstract class PlayerMixin implements DroppedStacksExtension { 14 | 15 | @Unique 16 | private Collection toBeDroppedStacks = List.of(); 17 | 18 | @Override 19 | public void addToBeDroppedStacks(Collection list) { 20 | this.toBeDroppedStacks = list; 21 | } 22 | 23 | @Override 24 | public Collection toBeDroppedStacks() { 25 | return this.toBeDroppedStacks; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/rendering/Side.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client.rendering; 2 | 3 | import io.wispforest.endec.Endec; 4 | import net.minecraft.core.Direction; 5 | import net.minecraft.core.Vec3i; 6 | 7 | /** 8 | * Class acting as a wrapper around {@link Direction} with easy 9 | * to understand names used within rendering 10 | */ 11 | public enum Side { 12 | BOTTOM(Direction.DOWN), 13 | TOP(Direction.UP), 14 | BACK(Direction.NORTH), 15 | FRONT(Direction.SOUTH), 16 | LEFT(Direction.WEST), 17 | RIGHT(Direction.EAST); 18 | 19 | public static final Endec ENDEC = Endec.forEnum(Side.class); 20 | 21 | public final Direction direction; 22 | 23 | Side(Direction direction) { 24 | this.direction = direction; 25 | } 26 | 27 | public Vec3i rotationAxis() { 28 | return this.direction.getUnitVec3i(); 29 | } 30 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/DispenserBlockMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; 4 | import com.llamalad7.mixinextras.injector.wrapoperation.Operation; 5 | import io.wispforest.accessories.impl.event.AccessoryEquipmentDispenseItemBehavior; 6 | import net.minecraft.core.dispenser.DispenseItemBehavior; 7 | import net.minecraft.world.item.ItemStack; 8 | import net.minecraft.world.level.block.DispenserBlock; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | 11 | @Mixin(DispenserBlock.class) 12 | public abstract class DispenserBlockMixin { 13 | @WrapMethod(method = "getDefaultDispenseMethod") 14 | private static DispenseItemBehavior accessories$wrapWithAccessoryEquip(ItemStack stack, Operation original) { 15 | return new AccessoryEquipmentDispenseItemBehavior(original.call(stack)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/screen/ScreenOpener.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client.screen; 2 | 3 | import net.minecraft.client.player.LocalPlayer; 4 | import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; 5 | import net.minecraft.world.entity.HasCustomInventoryScreen; 6 | import net.minecraft.world.entity.LivingEntity; 7 | import net.minecraft.world.entity.player.Player; 8 | 9 | public interface ScreenOpener { 10 | 11 | ScreenOpener CUSTOM_INVENTORY = (player, targetEntity) -> { 12 | if (player.getVehicle() instanceof HasCustomInventoryScreen){ 13 | ((LocalPlayer) player).connection.send(new ServerboundPlayerCommandPacket(player, ServerboundPlayerCommandPacket.Action.OPEN_INVENTORY)); 14 | 15 | return true; 16 | } 17 | 18 | return false; 19 | }; 20 | 21 | boolean openScreen(Player player, LivingEntity targetEntity); 22 | } 23 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: blodhgarm 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/rendering/TargetType.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client.rendering; 2 | 3 | import io.wispforest.accessories.api.client.renderers.DefaultAccessoryRenderer; 4 | import net.minecraft.world.item.BlockItem; 5 | import net.minecraft.world.item.Item; 6 | 7 | import java.util.function.Predicate; 8 | 9 | /** 10 | * Class used to check for if a {@link Item} is 11 | * a valid Target for rendering and used within {@link DefaultAccessoryRenderer#render} 12 | */ 13 | public enum TargetType { 14 | ITEM(item -> !(item instanceof BlockItem)), 15 | BLOCK(item -> item instanceof BlockItem), 16 | ALL(item -> true); 17 | 18 | private final Predicate predicate; 19 | 20 | TargetType(Predicate predicate) { 21 | this.predicate = predicate; 22 | } 23 | 24 | public boolean isValid(Item item) { 25 | return this.predicate.test(item); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/utils/ServerInstanceHolder.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.utils; 2 | 3 | import net.minecraft.server.MinecraftServer; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | import java.util.Objects; 7 | import java.util.function.Supplier; 8 | 9 | public class ServerInstanceHolder { 10 | 11 | private static Supplier<@Nullable MinecraftServer> instance = () -> null; 12 | 13 | public static MinecraftServer getInstance() { 14 | var server = instance.get(); 15 | 16 | Objects.requireNonNull(server, "Unable to get current MinecraftServer instance as it has not been set yet!"); 17 | 18 | return server; 19 | } 20 | 21 | public static void setInstance(@Nullable MinecraftServer server) { 22 | setInstance(() -> server); 23 | } 24 | 25 | public static void setInstance(Supplier server) { 26 | instance = server; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fabric/src/main/java/io/wispforest/accessories/fabric/mixin/PlayerListMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.fabric.mixin; 2 | 3 | import io.wispforest.accessories.impl.event.AccessoriesEventHandler; 4 | import net.minecraft.server.players.PlayerList; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | @Mixin(value = PlayerList.class, priority = 2000) 11 | public class PlayerListMixin { 12 | @Inject( 13 | method = "reloadResources", 14 | at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/common/ClientboundUpdateTagsPacket;(Ljava/util/Map;)V") 15 | ) 16 | private void hookOnDataPacksReloaded(CallbackInfo ci) { 17 | AccessoriesEventHandler.dataSync(((PlayerList) (Object) this), null); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/client/screen/ScreenReopener.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.client.screen; 2 | 3 | import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; 4 | import net.minecraft.world.entity.LivingEntity; 5 | import net.minecraft.world.entity.player.Player; 6 | import net.minecraft.world.inventory.AbstractContainerMenu; 7 | 8 | public interface ScreenReopener> { 9 | 10 | ScreenReopener> PLAYER_INVENTORY = (player, targetEntity, prevScreen) -> false; 11 | 12 | ScreenReopener> CUSTOM_INVENTORY = (player, targetEntity, prevScreen) -> ScreenOpener.CUSTOM_INVENTORY.openScreen(player, targetEntity); 13 | 14 | boolean reopenScreen(Player player, LivingEntity targetEntity, S prevScreen); 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/AbstractRecipeBookScreenMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import io.wispforest.owo.ui.layers.Layer; 4 | import io.wispforest.owo.ui.layers.Layers; 5 | import net.minecraft.client.gui.screens.inventory.AbstractRecipeBookScreen; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | 11 | @Mixin(AbstractRecipeBookScreen.class) 12 | public abstract class AbstractRecipeBookScreenMixin { 13 | @Inject(method = "method_64513", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/Button;setPosition(II)V")) 14 | private void updateLayout(CallbackInfo ci){ 15 | Layers.getInstances((AbstractRecipeBookScreen) (Object) this).forEach(Layer.Instance::dispatchLayoutUpdates); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/data/api/LookupDataLoader.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.data.api; 2 | 3 | import net.minecraft.resources.ResourceLocation; 4 | import net.minecraft.world.level.Level; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import java.util.Map; 8 | 9 | public interface LookupDataLoader { 10 | default Map getEntries(Level level) { 11 | return getEntries(level.isClientSide()); 12 | } 13 | 14 | Map getEntries(boolean isClientSide); 15 | 16 | @Nullable 17 | default V getEntry(ResourceLocation id, Level level) { 18 | return getEntry(id, level.isClientSide()); 19 | } 20 | 21 | @Nullable 22 | V getEntry(ResourceLocation id, boolean isClientSide); 23 | 24 | default ResourceLocation getId(V t, Level level) { 25 | return getId(t, level.isClientSide()); 26 | } 27 | 28 | ResourceLocation getId(V t, boolean isClientSide); 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/commands/api/CommandTreeGenerator.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.commands.api; 2 | 3 | import io.wispforest.accessories.commands.api.base.BaseCommandGenerator; 4 | import io.wispforest.accessories.commands.api.base.BranchedCommandGenerator; 5 | import io.wispforest.accessories.commands.api.base.CommandGenerator; 6 | import net.minecraft.commands.CommandBuildContext; 7 | import net.minecraft.commands.CommandSourceStack; 8 | import net.minecraft.commands.Commands; 9 | 10 | public interface CommandTreeGenerator> extends ArgumentsWithContext { 11 | void generateTrees(G rootGenerator, B context, Commands.CommandSelection environment); 12 | 13 | interface Branched extends CommandTreeGenerator { } 14 | 15 | interface Base extends CommandTreeGenerator { } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/DataPackContentsMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.data.EntitySlotLoader; 4 | import net.minecraft.server.ReloadableServerResources; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | // Copied 1:1 from https://github.com/FabricMC/fabric/blob/625ef353552d973b6ed26c720dfa892e064afeef/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/DataPackContentsMixin.java#L41 11 | @Mixin(ReloadableServerResources.class) 12 | public abstract class DataPackContentsMixin { 13 | @Inject(method = "updateStaticRegistryTags", at = @At("TAIL")) 14 | private void removeLoadedTags(CallbackInfo ci) { 15 | EntitySlotLoader.INSTANCE.buildEntryMap(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/LivingEntityRenderStateMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import io.wispforest.accessories.pond.AccessoriesRenderStateAPImpl; 4 | import it.unimi.dsi.fastutil.objects.Reference2ObjectMap; 5 | import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; 6 | import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; 7 | import net.minecraft.util.context.ContextKey; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Unique; 10 | 11 | @Mixin(LivingEntityRenderState.class) 12 | public abstract class LivingEntityRenderStateMixin implements AccessoriesRenderStateAPImpl { 13 | @Unique 14 | private final Reference2ObjectMap, Object> keyToData = new Reference2ObjectOpenHashMap<>(); 15 | 16 | @Override 17 | public Reference2ObjectMap, Object> contextKeyToContextData() { 18 | return keyToData; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/owo/OwoEmiPluginMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client.owo; 2 | 3 | import io.wispforest.accessories.client.gui.AccessoriesScreen; 4 | import io.wispforest.owo.compat.emi.OwoEmiPlugin; 5 | import net.minecraft.client.gui.screens.Screen; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | 11 | import java.util.function.Consumer; 12 | 13 | @Mixin(value = OwoEmiPlugin.class, remap = false) 14 | public abstract class OwoEmiPluginMixin { 15 | 16 | @Inject(method = "lambda$register$2", at = @At("HEAD"), remap = false, cancellable = true) 17 | private static void accessories$preventZonesForAccessoriesScreen(Screen screen, Consumer consumer, CallbackInfo ci) { 18 | if(screen instanceof AccessoriesScreen) ci.cancel(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fabric/src/testmod/java/io/wispforest/testccessories/fabric/client/TestScreenPacket.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.testccessories.fabric.client; 2 | 3 | import io.wispforest.endec.Endec; 4 | import io.wispforest.endec.StructEndec; 5 | import io.wispforest.testccessories.fabric.TestMenu; 6 | import net.minecraft.network.chat.Component; 7 | import net.minecraft.server.level.ServerPlayer; 8 | import net.minecraft.world.MenuProvider; 9 | import net.minecraft.world.SimpleMenuProvider; 10 | import net.minecraft.world.entity.player.Player; 11 | 12 | public record TestScreenPacket() { 13 | 14 | public static final StructEndec ENDEC = Endec.unit(new TestScreenPacket()); 15 | 16 | private static final MenuProvider INSTANCE = new SimpleMenuProvider(TestMenu::new, Component.literal("TEST")); 17 | 18 | public static void handlePacket(TestScreenPacket packet, Player player) { 19 | if(player instanceof ServerPlayer serverPlayer) serverPlayer.openMenu(INSTANCE); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/equip/EquipAction.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.equip; 2 | 3 | import io.wispforest.accessories.api.AccessoriesCapability; 4 | import io.wispforest.accessories.api.AccessoriesContainer; 5 | import net.minecraft.world.item.ItemStack; 6 | 7 | import java.util.Optional; 8 | 9 | /** 10 | * An action callback to attempt to equip some stack to a given {@link AccessoriesContainer} 11 | * returned from {@link AccessoriesCapability#canEquipAccessory(ItemStack, boolean)} allowing 12 | * of the ability to equip later once knowing equipability is possible. 13 | */ 14 | public interface EquipAction { 15 | 16 | /** 17 | * Method used to either equip the given stack or swap the given stack at 18 | * the location within the action 19 | * 20 | * @param stack The given stack to be equipped 21 | * @return The possible swapped stack if allowing swapping 22 | */ 23 | Optional equipStack(ItemStack stack); 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/HumanoidArmorLayerAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import com.mojang.blaze3d.vertex.PoseStack; 4 | import net.minecraft.client.model.HumanoidModel; 5 | import net.minecraft.client.renderer.SubmitNodeCollector; 6 | import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; 7 | import net.minecraft.client.renderer.entity.state.HumanoidRenderState; 8 | import net.minecraft.world.entity.EquipmentSlot; 9 | import net.minecraft.world.item.ItemStack; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.gen.Invoker; 12 | 13 | @Mixin(HumanoidArmorLayer.class) 14 | public interface HumanoidArmorLayerAccessor> { 15 | @Invoker("renderArmorPiece") 16 | void accessories$renderArmorPiece(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, ItemStack itemStack, EquipmentSlot equipmentSlot, int i, S state); 17 | } 18 | -------------------------------------------------------------------------------- /neoforge/src/testmod/java/io/wispforest/testccessories/neoforge/client/TestScreenPacket.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.testccessories.neoforge.client; 2 | 3 | import io.wispforest.endec.Endec; 4 | import io.wispforest.endec.StructEndec; 5 | import io.wispforest.testccessories.neoforge.TestMenu; 6 | import net.minecraft.network.chat.Component; 7 | import net.minecraft.server.level.ServerPlayer; 8 | import net.minecraft.world.MenuProvider; 9 | import net.minecraft.world.SimpleMenuProvider; 10 | import net.minecraft.world.entity.player.Player; 11 | 12 | public record TestScreenPacket() { 13 | 14 | public static final StructEndec ENDEC = Endec.unit(new TestScreenPacket()); 15 | 16 | private static final MenuProvider INSTANCE = new SimpleMenuProvider(TestMenu::new, Component.literal("TEST")); 17 | 18 | public static void handlePacket(TestScreenPacket packet, Player player) { 19 | if(player instanceof ServerPlayer serverPlayer) serverPlayer.openMenu(INSTANCE); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/networking/client/SyncPlayerOptions.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.networking.client; 2 | 3 | import io.wispforest.accessories.impl.option.AccessoriesPlayerOptionsHolder; 4 | import io.wispforest.accessories.utils.EndecUtils; 5 | import io.wispforest.endec.StructEndec; 6 | import io.wispforest.endec.impl.StructEndecBuilder; 7 | import net.minecraft.world.entity.player.Player; 8 | 9 | public record SyncPlayerOptions(AccessoriesPlayerOptionsHolder options) { 10 | public static final StructEndec ENDEC = StructEndecBuilder.of( 11 | EndecUtils.createMapCarrierEndec(AccessoriesPlayerOptionsHolder::new).fieldOf("options", SyncPlayerOptions::options), 12 | SyncPlayerOptions::new 13 | ); 14 | 15 | //@Environment(EnvType.CLIENT) 16 | public static void handlePacket(SyncPlayerOptions packet, Player player) { 17 | EndecUtils.readDataFrom(AccessoriesPlayerOptionsHolder.getOptions(player), packet.options()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/advancements/base/lefthanded_drip.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:pointed_dripstone" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.lefthanded_drip.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.lefthanded_drip.desc" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "hidden": false 16 | }, 17 | "parent": "testccessories:base/root", 18 | "criteria": { 19 | "equipped_pointed_dripstone_left": { 20 | "trigger": "accessories:equip_accessory", 21 | "conditions": { 22 | "items": [ 23 | { 24 | "items": [ 25 | "minecraft:pointed_dripstone" 26 | ] 27 | } 28 | ], 29 | "slots": [ 30 | "hand" 31 | ], 32 | "indices": [ 33 | 1 34 | ] 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/advancements/base/lefthanded_drip.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:pointed_dripstone" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.lefthanded_drip.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.lefthanded_drip.desc" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "hidden": false 16 | }, 17 | "parent": "testccessories:base/root", 18 | "criteria": { 19 | "equipped_pointed_dripstone_left": { 20 | "trigger": "accessories:equip_accessory", 21 | "conditions": { 22 | "items": [ 23 | { 24 | "items": [ 25 | "minecraft:pointed_dripstone" 26 | ] 27 | } 28 | ], 29 | "slots": [ 30 | "hand" 31 | ], 32 | "indices": [ 33 | 1 34 | ] 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/PiglinAiMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.api.events.extra.ExtraEventHandler; 4 | import net.fabricmc.fabric.api.util.TriState; 5 | import net.minecraft.world.entity.LivingEntity; 6 | import net.minecraft.world.entity.monster.piglin.PiglinAi; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | 12 | @Mixin(PiglinAi.class) 13 | public abstract class PiglinAiMixin { 14 | 15 | @Inject(method = "isWearingSafeArmor", at = @At("HEAD"), cancellable = true) 16 | private static void isWearingGoldAccessory(LivingEntity livingEntity, CallbackInfoReturnable cir){ 17 | var state = ExtraEventHandler.isPiglinsNeutral(livingEntity); 18 | 19 | if(state != TriState.DEFAULT) cir.setReturnValue(state.orElse(false)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/FileToIdConverterMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.pond.ContextedFileToIdConverter; 4 | import net.minecraft.resources.FileToIdConverter; 5 | import net.minecraft.resources.ResourceLocation; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Unique; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | @Mixin(FileToIdConverter.class) 13 | public abstract class FileToIdConverterMixin implements ContextedFileToIdConverter { 14 | 15 | @Unique 16 | private final Map contextData = new HashMap<>(); 17 | 18 | @Override 19 | public FileToIdConverter setData(ResourceLocation location, T t) { 20 | contextData.put(location, t); 21 | 22 | return (FileToIdConverter) (Object) this; 23 | } 24 | 25 | @Override 26 | public T getData(ResourceLocation location) { 27 | return (T) contextData.get(location); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/slot/SlotTypeReference.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.slot; 2 | 3 | import io.wispforest.accessories.data.SlotTypeLoader; 4 | import net.minecraft.world.level.Level; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import java.util.function.Supplier; 8 | 9 | /** 10 | * Helper Class used to hold a reference for a SlotType to use later if needed 11 | * with the required context of a level to grab correct side information 12 | */ 13 | public interface SlotTypeReference extends Supplier { 14 | 15 | @Override 16 | default String get() { 17 | return slotName(); 18 | } 19 | 20 | String slotName(); 21 | 22 | @Nullable 23 | default SlotType get(boolean isClientSide) { 24 | if(this.slotName() == null) return null; 25 | 26 | return SlotTypeLoader.INSTANCE.getSlotType(isClientSide, this.slotName()); 27 | } 28 | 29 | @Nullable 30 | default SlotType get(Level level) { 31 | return this.get(level.isClientSide()); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/GameRulesAccessor.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import net.minecraft.server.MinecraftServer; 4 | import net.minecraft.world.level.GameRules; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Invoker; 7 | 8 | import java.util.function.BiConsumer; 9 | 10 | @Mixin(GameRules.class) 11 | public interface GameRulesAccessor { 12 | @Invoker("register") 13 | static > GameRules.Key accessories$register(String name, GameRules.Category category, GameRules.Type type) { 14 | throw new IllegalStateException("UHHHHHHHHH"); 15 | } 16 | 17 | @Mixin(GameRules.BooleanValue.class) 18 | interface BooleanValueAccessor { 19 | @Invoker("create") 20 | static GameRules.Type accessories$create(boolean defaultValue, BiConsumer changeListener) { 21 | throw new IllegalStateException("UHHHHHHHHH"); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fabric/src/main/java/io/wispforest/accessories/fabric/mixin/ServerEntityEvent.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.fabric.mixin; 2 | 3 | import io.wispforest.accessories.fabric.ExtraEntityTrackingEvents; 4 | import net.minecraft.server.level.ServerEntity; 5 | import net.minecraft.server.level.ServerPlayer; 6 | import net.minecraft.world.entity.Entity; 7 | import org.spongepowered.asm.mixin.Final; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin(ServerEntity.class) 15 | public abstract class ServerEntityEvent { 16 | 17 | @Shadow @Final private Entity entity; 18 | 19 | @Inject(method = "addPairing", at = @At("TAIL")) 20 | private void onStartTracking(ServerPlayer player, CallbackInfo ci) { 21 | ExtraEntityTrackingEvents.POST_START_TRACKING.invoker().onStartTracking(this.entity, player); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/caching/ItemPredicate.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.caching; 2 | 3 | import net.minecraft.world.item.Item; 4 | import net.minecraft.world.item.ItemStack; 5 | 6 | import java.util.Objects; 7 | 8 | public class ItemPredicate extends ItemStackBasedPredicate { 9 | 10 | private final Item item; 11 | 12 | public ItemPredicate(String name, Item item) { 13 | super(name); 14 | this.item = item; 15 | } 16 | 17 | @Override 18 | public boolean test(ItemStack stack) { 19 | return stack.getItem().equals(this.item); 20 | } 21 | 22 | @Override 23 | public int hashCode() { 24 | return Objects.hash(this.item); 25 | } 26 | 27 | @Override 28 | protected boolean isEqual(Object other) { 29 | var itemPredicate = (ItemPredicate) other; 30 | 31 | return this.item.equals(itemPredicate.item); 32 | } 33 | 34 | @Override 35 | public String extraStringData() { 36 | return "Item: " + this.item.toString(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /fabric/src/testmod/resources/data/testccessories/advancements/base/no_longer_lefthanded_drip.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:pointed_dripstone" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.no_longer_lefthanded_drip.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.no_longer_lefthanded_drip.desc" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "hidden": false 16 | }, 17 | "parent": "testccessories:base/lefthanded_drip", 18 | "criteria": { 19 | "equipped_pointed_dripstone_left": { 20 | "trigger": "accessories:unequip_accessory", 21 | "conditions": { 22 | "items": [ 23 | { 24 | "items": [ 25 | "minecraft:pointed_dripstone" 26 | ] 27 | } 28 | ], 29 | "slots": [ 30 | "hand" 31 | ], 32 | "indices": [ 33 | 1 34 | ] 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/AccessoriesRenderStateAPI.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import io.wispforest.accessories.api.AccessoriesStorageLookup; 4 | import io.wispforest.accessories.api.client.AccessoriesRenderStateKeys; 5 | import io.wispforest.accessories.api.client.RenderStateStorage; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | import java.util.UUID; 9 | 10 | public interface AccessoriesRenderStateAPI extends RenderStateStorage { 11 | @Nullable 12 | default AccessoriesStorageLookup getStorageLookup() { 13 | return getStateData(AccessoriesRenderStateKeys.STORAGE_LOOKUP); 14 | } 15 | 16 | default UUID getEntityUUIDForState() { 17 | return getStateData(AccessoriesRenderStateKeys.ENTITY_UUID); 18 | } 19 | 20 | default float getEntityPartialTicksForState() { 21 | return getStateData(AccessoriesRenderStateKeys.PARTIAL_TICKS); 22 | } 23 | 24 | default int getEntityIdForState() { 25 | return getStateData(AccessoriesRenderStateKeys.ENTITY_ID); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /neoforge/src/testmod/resources/data/testccessories/advancements/base/no_longer_lefthanded_drip.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "item": "minecraft:pointed_dripstone" 5 | }, 6 | "title": { 7 | "translate": "advancement.testccessories.base.no_longer_lefthanded_drip.title" 8 | }, 9 | "description": { 10 | "translate": "advancement.testccessories.base.no_longer_lefthanded_drip.desc" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "hidden": false 16 | }, 17 | "parent": "testccessories:base/lefthanded_drip", 18 | "criteria": { 19 | "equipped_pointed_dripstone_left": { 20 | "trigger": "accessories:unequip_accessory", 21 | "conditions": { 22 | "items": [ 23 | { 24 | "items": [ 25 | "minecraft:pointed_dripstone" 26 | ] 27 | } 28 | ], 29 | "slots": [ 30 | "hand" 31 | ], 32 | "indices": [ 33 | 1 34 | ] 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/owo/OwoReiPluginMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client.owo; 2 | 3 | import io.wispforest.accessories.client.gui.AccessoriesScreen; 4 | import io.wispforest.owo.compat.rei.OwoReiPlugin; 5 | import io.wispforest.owo.ui.base.BaseOwoHandledScreen; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | 11 | import java.util.Collection; 12 | import java.util.List; 13 | 14 | @Mixin(value = OwoReiPlugin.class, remap = false) 15 | public abstract class OwoReiPluginMixin { 16 | 17 | @Inject(method = "lambda$registerExclusionZones$2", at = @At("HEAD"), remap = false, cancellable = true) 18 | private static void accessories$preventZonesForAccessoriesScreen(BaseOwoHandledScreen screen, CallbackInfoReturnable cir) { 19 | if(screen instanceof AccessoriesScreen) cir.setReturnValue(List.of()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/RenderPhaseMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 4 | import com.mojang.blaze3d.pipeline.RenderTarget; 5 | import io.wispforest.accessories.client.AccessoriesFunkyRenderingState; 6 | import io.wispforest.accessories.client.AccessoriesPipelines; 7 | import net.minecraft.client.renderer.RenderStateShard; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | 11 | @Mixin(RenderStateShard.class) 12 | public abstract class RenderPhaseMixin { 13 | 14 | @ModifyExpressionValue(method = "method_68490", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getMainRenderTarget()Lcom/mojang/blaze3d/pipeline/RenderTarget;")) 15 | private static RenderTarget injectProperRenderTarget(RenderTarget original) { 16 | return (AccessoriesFunkyRenderingState.INSTANCE.isOverrideRenderTarget()) 17 | ? AccessoriesPipelines.getOrCreateBuffer() 18 | : original; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/AccessoriesLivingEntityExtension.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import io.wispforest.accessories.api.AccessoriesCapability; 4 | import io.wispforest.accessories.api.slot.SlotReference; 5 | import net.minecraft.world.item.ItemStack; 6 | import net.minecraft.world.item.enchantment.Enchantment; 7 | import net.minecraft.world.item.enchantment.effects.EnchantmentLocationBasedEffect; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | import java.util.Map; 11 | import java.util.Set; 12 | 13 | public interface AccessoriesLivingEntityExtension { 14 | AccessoriesCapability getOrCreateAccessoriesCapability(); 15 | 16 | void onEquipItem(SlotReference slotReference, ItemStack oldItem, ItemStack newItem); 17 | 18 | void pushEnchantmentContext(ItemStack stack, SlotReference reference); 19 | 20 | @Nullable 21 | SlotReference popEnchantmentContext(ItemStack stack); 22 | 23 | Map> activeLocationDependentEnchantmentsFromSlotReference(SlotReference slotReference); 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/slot/DelegatingSlotPath.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.slot; 2 | 3 | import java.util.List; 4 | 5 | /// 6 | /// A wrapper class used for [SlotReference] that indicates that the given [SlotPath] delegates 7 | /// to another object. 8 | /// 9 | public sealed interface DelegatingSlotPath extends SlotPath permits SlotReference { 10 | SlotPath slotPath(); 11 | 12 | @Override 13 | default SlotPath unpack() { 14 | return this.slotPath(); 15 | } 16 | 17 | @Override 18 | default String slotName() { 19 | return slotPath().slotName(); 20 | } 21 | 22 | @Override 23 | default int index() { 24 | return slotPath().index(); 25 | } 26 | 27 | @Override 28 | default List innerIndices() { 29 | return slotPath().innerIndices(); 30 | } 31 | 32 | @Override 33 | default boolean isNested() { 34 | return slotPath().isNested(); 35 | } 36 | 37 | @Override 38 | default String createString() { 39 | return slotPath().createString(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/EnchantedItemInUseMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.api.slot.SlotReference; 4 | import io.wispforest.accessories.pond.EnchantedItemInUseExtension; 5 | import net.minecraft.world.item.enchantment.EnchantedItemInUse; 6 | import org.apache.commons.lang3.mutable.MutableObject; 7 | import org.jetbrains.annotations.Nullable; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | 10 | @Mixin(EnchantedItemInUse.class) 11 | public abstract class EnchantedItemInUseMixin implements EnchantedItemInUseExtension { 12 | 13 | private final MutableObject<@Nullable SlotReference> slotReferenceHolder = new MutableObject<>(null); 14 | 15 | @Override 16 | public EnchantedItemInUse setSlotReference(SlotReference slotReference) { 17 | this.slotReferenceHolder.setValue(slotReference); 18 | 19 | return (EnchantedItemInUse)(Object) this; 20 | } 21 | 22 | @Override 23 | public @Nullable SlotReference getSlotReference() { 24 | return this.slotReferenceHolder.getValue(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /neoforge/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import io.wispforest.helpers.Extensions.modrinth 2 | import io.wispforest.helpers.neoForgeDataFile 3 | 4 | plugins { 5 | id("multiloader-platform") 6 | id("multiloader-publishing") 7 | id("com.github.johnrengelman.shadow") 8 | } 9 | 10 | dependencies { 11 | // Core Libs 12 | neoForge(libs.neoforge) 13 | // -- 14 | 15 | // Neoforge: Required as these are General Libs that are used by owo and can be used but must be added to runtime path due to not being mods 16 | forgeRuntimeLibrary(libs.endec) 17 | forgeRuntimeLibrary(libs.endec.netty) 18 | forgeRuntimeLibrary(libs.endec.gson) 19 | forgeRuntimeLibrary(libs.endec.jankson) 20 | forgeRuntimeLibrary(libs.jankson) 21 | // -- 22 | 23 | //modrinth(this::modLocalRuntime, "sodium" to "${libs.versions.sodium.get()}-neoforge") 24 | 25 | modCompileOnly(libs.curios) 26 | } 27 | 28 | neoForgeDataFile { 29 | publishAccessTransformersFile("src/main/resources/META-INF/accesstransformer.cfg") 30 | publishInterfaceInjectionsFile("src/main/resources/interfaces.json") 31 | } 32 | 33 | repositories {} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Wisp Forest 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/DefaultTooltipPositionerMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import io.wispforest.accessories.client.gui.AccessoriesScreenBase; 4 | import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; 5 | import org.joml.Vector2i; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | 11 | @Mixin(DefaultTooltipPositioner.class) 12 | public abstract class DefaultTooltipPositionerMixin { 13 | 14 | @Inject(method = "positionTooltip(IILorg/joml/Vector2i;II)V", at = @At(value = "HEAD")) 15 | private void accessories$forceLeftPositioning(int screenWidth, int screenHeight, Vector2i tooltipPos, int tooltipWidth, int tooltipHeight, CallbackInfo ci) { 16 | if (tooltipPos.x + tooltipWidth <= screenWidth && AccessoriesScreenBase.FORCE_TOOLTIP_LEFT.getValue()) { 17 | tooltipPos.x = Math.max(tooltipPos.x - 24 - tooltipWidth, 4); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/client/LoadingOverlayMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin.client; 2 | 3 | import io.wispforest.accessories.client.ClientLifecycleEvents; 4 | import net.minecraft.client.Minecraft; 5 | import net.minecraft.client.gui.screens.LoadingOverlay; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 9 | 10 | import java.util.Optional; 11 | import java.util.function.Consumer; 12 | 13 | @Mixin(LoadingOverlay.class) 14 | public abstract class LoadingOverlayMixin { 15 | @ModifyVariable(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Overlay;()V", shift = At.Shift.AFTER), argsOnly = true) 16 | private Consumer> addEventHook(Consumer> value) { 17 | return (throwable) -> { 18 | ClientLifecycleEvents.END_DATA_PACK_RELOAD.invoker().endDataPackReload(Minecraft.getInstance(), throwable.isEmpty()); 19 | 20 | value.accept(throwable); 21 | }; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/caching/ItemStackPredicate.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.caching; 2 | 3 | import net.minecraft.world.item.ItemStack; 4 | 5 | import java.util.Objects; 6 | import java.util.function.Predicate; 7 | 8 | public class ItemStackPredicate extends ItemStackBasedPredicate { 9 | private final Predicate predicate; 10 | 11 | public ItemStackPredicate(String name, Predicate predicate) { 12 | super(name); 13 | 14 | this.predicate = predicate; 15 | } 16 | 17 | @Override 18 | public boolean test(ItemStack stack) { 19 | return this.predicate.test(stack); 20 | } 21 | 22 | @Override 23 | public int hashCode() { 24 | return Objects.hash(this.predicate); 25 | } 26 | 27 | @Override 28 | protected boolean isEqual(Object other) { 29 | var itemPredicate = (ItemStackPredicate) other; 30 | 31 | return this.predicate.equals(itemPredicate.predicate); 32 | } 33 | 34 | @Override 35 | public String extraStringData() { 36 | return "Predicate: " + this.predicate.toString(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/pond/AccessoriesRenderStateAPImpl.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.pond; 2 | 3 | import it.unimi.dsi.fastutil.objects.Reference2ObjectMap; 4 | import net.minecraft.util.context.ContextKey; 5 | 6 | public interface AccessoriesRenderStateAPImpl extends AccessoriesRenderStateAPI { 7 | 8 | Reference2ObjectMap, Object> contextKeyToContextData(); 9 | 10 | @Override 11 | default T getStateData(ContextKey key) { 12 | return (T) this.contextKeyToContextData().get(key); 13 | } 14 | 15 | @Override 16 | default void setStateData(ContextKey key, T data) { 17 | var map = this.contextKeyToContextData(); 18 | 19 | if (data == null) { 20 | map.remove(key); 21 | } else { 22 | map.put(key, data); 23 | } 24 | } 25 | 26 | @Override 27 | default boolean hasStateData(ContextKey key) { 28 | return this.contextKeyToContextData().containsKey(key); 29 | } 30 | 31 | @Override 32 | default void clearExtraData() { 33 | this.contextKeyToContextData().clear(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/client/ClientLifecycleEvents.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.client; 2 | 3 | import net.fabricmc.fabric.api.event.Event; 4 | import net.fabricmc.fabric.api.event.EventFactory; 5 | import net.minecraft.client.Minecraft; 6 | 7 | //@Environment(EnvType.CLIENT) 8 | public class ClientLifecycleEvents { 9 | 10 | public static final Event END_DATA_PACK_RELOAD = EventFactory.createArrayBacked(EndDataPackReload.class, callbacks -> (client, success) -> { 11 | for (EndDataPackReload callback : callbacks) { 12 | callback.endDataPackReload(client, success); 13 | } 14 | }); 15 | 16 | @FunctionalInterface 17 | public interface EndDataPackReload { 18 | /** 19 | * Called after data packs on a Minecraft client have been reloaded. 20 | * 21 | *

If the reload was not successful, the old data packs will be kept. 22 | * 23 | * @param client the client 24 | * @param success if the reload was successful 25 | */ 26 | void endDataPackReload(Minecraft client, boolean success); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/AbstractContainerMenuMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.menu.variants.AccessoriesMenuBase; 4 | import net.minecraft.world.inventory.AbstractContainerMenu; 5 | import net.minecraft.world.item.ItemStack; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Shadow; 8 | import org.spongepowered.asm.mixin.gen.Invoker; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 12 | 13 | @Mixin(AbstractContainerMenu.class) 14 | public abstract class AbstractContainerMenuMixin { 15 | @Invoker("setCarried") 16 | public abstract void accessories$setCarried(ItemStack stack); 17 | 18 | @Inject(method = "transferState", at = @At("HEAD")) 19 | private void accessories$transferCarriedStack(AbstractContainerMenu menu, CallbackInfo ci) { 20 | if (menu instanceof AccessoriesMenuBase base) { 21 | this.accessories$setCarried(base.getTempCarriedStack()); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/data/providers/group/RawSlotGroup.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.data.providers.group; 2 | 3 | import io.wispforest.endec.Endec; 4 | import io.wispforest.endec.StructEndec; 5 | import io.wispforest.endec.impl.StructEndecBuilder; 6 | import io.wispforest.owo.serialization.endec.MinecraftEndecs; 7 | import net.minecraft.resources.ResourceLocation; 8 | 9 | import java.util.List; 10 | import java.util.Optional; 11 | 12 | public record RawSlotGroup(String name, Optional replace, Optional icon, Optional order, Optional> slots) { 13 | public static final StructEndec ENDEC = StructEndecBuilder.of( 14 | Endec.STRING.fieldOf("name", RawSlotGroup::name), 15 | Endec.BOOLEAN.optionalOf().fieldOf("replace", RawSlotGroup::replace), 16 | MinecraftEndecs.IDENTIFIER.optionalOf().fieldOf("icon", RawSlotGroup::icon), 17 | Endec.INT.optionalOf().fieldOf("order", RawSlotGroup::order), 18 | Endec.STRING.listOf().optionalOf().fieldOf("slots", RawSlotGroup::slots), 19 | RawSlotGroup::new 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/networking/server/NukeAccessories.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.networking.server; 2 | 3 | import com.mojang.logging.LogUtils; 4 | import io.wispforest.endec.Endec; 5 | import io.wispforest.endec.StructEndec; 6 | import net.minecraft.world.entity.player.Player; 7 | import org.slf4j.Logger; 8 | 9 | public record NukeAccessories() { 10 | 11 | public static final StructEndec ENDEC = Endec.unit(new NukeAccessories()); 12 | 13 | private static final Logger LOGGER = LogUtils.getLogger(); 14 | 15 | public static void handlePacket(NukeAccessories packet, Player player) { 16 | // Only players in creative should be able to nuke their accessories 17 | if (!player.getAbilities().instabuild) { 18 | LOGGER.info("A given player sent a NukeAccessories packet not as a Creative Player: [Player: {}]", player.getName()); 19 | 20 | return; 21 | } 22 | 23 | var cap = player.accessoriesCapability(); 24 | 25 | if (cap != null) { 26 | cap.reset(false); 27 | 28 | player.containerMenu.broadcastChanges(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/caching/ItemTagPredicate.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.caching; 2 | 3 | import net.minecraft.tags.TagKey; 4 | import net.minecraft.world.item.Item; 5 | import net.minecraft.world.item.ItemStack; 6 | 7 | import java.util.Objects; 8 | 9 | public class ItemTagPredicate extends ItemStackBasedPredicate{ 10 | 11 | private final TagKey itemTagKey; 12 | 13 | public ItemTagPredicate(String name, TagKey itemTagKey) { 14 | super(name); 15 | this.itemTagKey = itemTagKey; 16 | } 17 | 18 | @Override 19 | public boolean test(ItemStack stack) { 20 | return stack.is(this.itemTagKey); 21 | } 22 | 23 | @Override 24 | public int hashCode() { 25 | return Objects.hash(this.itemTagKey); 26 | } 27 | 28 | @Override 29 | protected boolean isEqual(Object other) { 30 | var itemTagPredicate = (ItemTagPredicate) other; 31 | 32 | return this.itemTagKey.equals(itemTagPredicate.itemTagKey); 33 | } 34 | 35 | @Override 36 | public String extraStringData() { 37 | return "ItemTag: " + this.itemTagKey.toString(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/mixin/PowderSnowBlockMixin.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.mixin; 2 | 3 | import io.wispforest.accessories.api.events.extra.ExtraEventHandler; 4 | import net.fabricmc.fabric.api.util.TriState; 5 | import net.minecraft.world.entity.Entity; 6 | import net.minecraft.world.entity.LivingEntity; 7 | import net.minecraft.world.level.block.PowderSnowBlock; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 12 | 13 | @Mixin(PowderSnowBlock.class) 14 | public abstract class PowderSnowBlockMixin { 15 | 16 | @Inject(method = "canEntityWalkOnPowderSnow", at = @At("HEAD"), cancellable = true) 17 | private static void adjustSnowWalkingAbility(Entity entity, CallbackInfoReturnable cir){ 18 | if(entity instanceof LivingEntity livingEntity){ 19 | var state = ExtraEventHandler.allowWalkingOnSnow(livingEntity); 20 | 21 | if(state != TriState.DEFAULT) cir.setReturnValue(state.orElse(false)); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/AccessoriesClientInternals.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories; 2 | 3 | import io.wispforest.accessories.pond.TooltipFlagExtension; 4 | import io.wispforest.accessories.utils.ServiceLoaderUtils; 5 | import net.minecraft.world.item.TooltipFlag; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public abstract class AccessoriesClientInternals { 9 | 10 | private static boolean hasInstanceBeenSet = false; 11 | 12 | private static AccessoriesClientInternals INSTANCE = new AccessoriesClientInternals() {}; 13 | 14 | public static AccessoriesClientInternals getInstance() { 15 | return INSTANCE; 16 | } 17 | 18 | public static void setInstance(AccessoriesClientInternals instance) { 19 | if (hasInstanceBeenSet) { 20 | throw new IllegalStateException("Unable to set AccessoriesClientInternals as it already has been setup before!"); 21 | } 22 | 23 | INSTANCE = instance; 24 | 25 | hasInstanceBeenSet = true; 26 | } 27 | 28 | public TooltipFlag createTooltipFlag(TooltipFlag flag) { 29 | return TooltipFlagExtension.createFlag(flag, Integer.MAX_VALUE); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/compat/GeckoLibCompat.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.compat; 2 | 3 | import com.mojang.blaze3d.vertex.PoseStack; 4 | import net.minecraft.client.model.HumanoidModel; 5 | import net.minecraft.client.renderer.SubmitNodeCollector; 6 | import net.minecraft.client.renderer.entity.state.HumanoidRenderState; 7 | import net.minecraft.world.entity.EquipmentSlot; 8 | import net.minecraft.world.item.ItemStack; 9 | import org.jetbrains.annotations.ApiStatus; 10 | 11 | @ApiStatus.Internal 12 | public class GeckoLibCompat { 13 | public static , A extends HumanoidModel> boolean renderGeckoArmor(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, S renderState, ItemStack stack, EquipmentSlot equipmentSlot, M parentModel, float partialTicks, int light) { 14 | return false; 15 | // TODO: RE-ENABLE WHEN POSSIBLE 16 | //return InternalUtil.tryRenderGeoArmorPiece(poseStack, bufferSource, renderState, stack, equipmentSlot, parentModel, baseModel, partialTicks, light, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, partVisibilitySetter); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/io/wispforest/accessories/api/events/extra/ShouldFreezeEntity.java: -------------------------------------------------------------------------------- 1 | package io.wispforest.accessories.api.events.extra; 2 | 3 | import io.wispforest.accessories.api.slot.SlotReference; 4 | import net.fabricmc.fabric.api.event.Event; 5 | import net.fabricmc.fabric.api.event.EventFactory; 6 | import net.fabricmc.fabric.api.util.TriState; 7 | import net.minecraft.world.item.ItemStack; 8 | 9 | public interface ShouldFreezeEntity { 10 | 11 | Event EVENT = EventFactory.createArrayBacked(ShouldFreezeEntity.class, invokers -> (stack, reference) -> { 12 | for (var invoker : invokers) { 13 | var state = invoker.shouldFreeze(stack, reference); 14 | 15 | if(state != TriState.DEFAULT) return state; 16 | } 17 | 18 | return TriState.DEFAULT; 19 | }); 20 | 21 | /** 22 | * @param stack The specific stack being evaluated 23 | * @param reference The reference to the specific location within the Accessories Inventory 24 | * @return If the given looking entity sees the given entity as disguised 25 | */ 26 | TriState shouldFreeze(ItemStack stack, SlotReference reference); 27 | } 28 | --------------------------------------------------------------------------------