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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
// 1.21.1 2025-07-06T23:10:14.258795717 Registrate Provider for numismatics [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (enchantments), Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider]
// 1.21.1 2025-08-12T23:13:17.5266632 Registrate Provider for numismatics [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (enchantments), Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider]
f7f43dd6d567ec8303c73b79409bc92d8b56574a assets/numismatics/blockstates/andesite_depositor.json
3961fdf3030140fc32e0e8c1d440ac395e62f5b6 assets/numismatics/blockstates/bank_terminal.json
06ecd28cd97f4e8200dc396858695cad57b871c8 assets/numismatics/blockstates/blaze_banker.json
160d556c6bfdb651082b39784258f6d06c21ca8f assets/numismatics/blockstates/brass_depositor.json
95ef415a564eba1d212053195d25b199427b94e3 assets/numismatics/blockstates/creative_vendor.json
d2b105f0657bad99b8efed45dc0a8df8ff775c10 assets/numismatics/blockstates/vendor.json
6dd2c5d0c4c607aa601fb66217f4f60a5c008489 assets/numismatics/lang/en_ud.json
bb6968537ab305ee37b6268f9037a689b8c8a9c9 assets/numismatics/lang/en_us.json
7876db60df471405f6593ff4e01569bc6e60c852 assets/numismatics/lang/en_ud.json
0807126a759d0f21c95f49e53178463e07a491d8 assets/numismatics/lang/en_us.json
265ef24d62bc7580e763e1fb6802bf4e58dc0194 assets/numismatics/models/block/andesite_depositor.json
4f78ca868db20495aa20be7c6a14e2678fb16f9f assets/numismatics/models/block/andesite_depositor_locked.json
411b79f79547a0adcb665bf7440e8169f7dcb24e assets/numismatics/models/block/brass_depositor.json
74a4c7ca7a48382782e5dba33018dfc8255192c5 assets/numismatics/models/block/brass_depositor_locked.json
2449b7346e1657ef1c6ab4c134aab55b216ec783 assets/numismatics/models/item/andesite_depositor.json
228b67a48aa045bfe809c54c756df80eb0765aad assets/numismatics/models/item/bank_terminal.json
83ce6c9d27970b4c643f0f9f3dfeb58668fca3d4 assets/numismatics/models/item/banking_guide.json
228b67a48aa045bfe809c54c756df80eb0765aad assets/numismatics/models/item/bank_terminal.json
52b48750de8a5a571a08bce3f2f025474153d50b assets/numismatics/models/item/bevel.json
84ab8c91452f94501b3acc31ec1e0bc64417f839 assets/numismatics/models/item/black_card.json
70c481f36a9718ac48632e6939ac6ba785be4c9e assets/numismatics/models/item/black_id_card.json
Expand Down Expand Up @@ -56,9 +56,9 @@ c1863c2bd08a5910a534aee0dcbc61a352fb9577 assets/numismatics/models/item/white_ca
a96d3d02794064cd9be1bca25a9ba6217675e6c5 assets/numismatics/models/item/white_id_card.json
9c20dd40c03605721d0231ffde829d55e36b1c05 assets/numismatics/models/item/yellow_card.json
c05836600bd1689f598515841869634b1d709cca assets/numismatics/models/item/yellow_id_card.json
a615f3af71b117b4f5974a64a1c744ff072fba54 data/c/tags/block/relocation_not_supported.json
b8a840be34886ce90bc6ebbd48ac70a40060ada1 data/create/tags/block/fan_transparent.json
b8a840be34886ce90bc6ebbd48ac70a40060ada1 data/create/tags/block/passive_boiler_heaters.json
a615f3af71b117b4f5974a64a1c744ff072fba54 data/c/tags/block/relocation_not_supported.json
0604bc1712ca30d404c0c27b4c1469f729fdefd6 data/minecraft/tags/block/mineable/axe.json
ce83b2be6bbae03794f249386337ee5110241e57 data/minecraft/tags/block/mineable/pickaxe.json
9e6e50d40e3688ae681107e60ac5ff5fc22585f9 data/numismatics/loot_table/blocks/andesite_depositor.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
"block.numismatics.vendor.tooltip.trade_item": "ǝpɐɹ⟘ oʇ ɯǝʇI",
"command.numismatics.arguments.enum.invalid": "%s :ǝɹɐ sǝnןɐʌ pıןɐΛ ˙,%s, ǝnןɐʌ ɯnuǝ pıןɐʌuI :ɹoɹɹƎ",
"gui.numismatics.bank_terminal.balance": "¤%s '%s %s :ǝɔuɐןɐᗺ",
"gui.numismatics.checkout_screen.header": "ʇnoʞɔǝɥƆ",
"gui.numismatics.checkout_screen.pay_with_card": "pɹɐƆ ɥʇıʍ ʎɐԀ",
"gui.numismatics.checkout_screen.pay_with_coins": "suıoƆ ɥʇıʍ ʎɐԀ",
"gui.numismatics.checkout_screen.total": "¤%s '%s %s :ןɐʇo⟘ ɹǝpɹO",
"gui.numismatics.trust_list": "ʇsıꞀ ʇsnɹ⟘",
"gui.numismatics.vendor.count": ")x%s( ",
"gui.numismatics.vendor.full": "ןןnɟ sı ɹopuǝΛ",
Expand Down Expand Up @@ -106,5 +110,8 @@
"item.numismatics.yellow_id_card": "pɹɐƆ ᗡI ʍoןןǝʎ",
"itemGroup.numismatics": "sɔıʇɐɯsıɯnN :ǝʇɐǝɹƆ",
"numismatics.andesite_depositor.price": "ǝɔıɹԀ",
"numismatics.checkout.failure": "˙pǝbɹɐɥɔ uǝǝq ʇou ǝʌɐɥ noʎ ¡uoıʇɔɐsuɐɹʇ buıssǝɔoɹd ɹoɹɹƎ",
"numismatics.checkout.insufficient_funds": "¡spunɟ ʇuǝıɔıɟɟnsuI",
"numismatics.checkout.unauthorized": "pɹɐɔ ʇɐɥʇ ǝsn oʇ pǝzıɹoɥʇnɐ ʇou ǝɹ,noʎ",
"numismatics.trust_list.configure": "ʇsıꞀ ʇsnɹ⟘ ǝɹnbıɟuoƆ"
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
"block.numismatics.vendor.tooltip.trade_item": "Item to Trade",
"command.numismatics.arguments.enum.invalid": "Error: Invalid enum value '%s'. Valid values are: %s",
"gui.numismatics.bank_terminal.balance": "Balance: %s %s, %s¤",
"gui.numismatics.checkout_screen.header": "Checkout",
"gui.numismatics.checkout_screen.pay_with_card": "Pay with Card",
"gui.numismatics.checkout_screen.pay_with_coins": "Pay with Coins",
"gui.numismatics.checkout_screen.total": "Order Total: %s %s, %s¤",
"gui.numismatics.trust_list": "Trust List",
"gui.numismatics.vendor.count": " (%sx)",
"gui.numismatics.vendor.full": "Vendor is full",
Expand Down Expand Up @@ -106,5 +110,8 @@
"item.numismatics.yellow_id_card": "Yellow ID Card",
"itemGroup.numismatics": "Create: Numismatics",
"numismatics.andesite_depositor.price": "Price",
"numismatics.checkout.failure": "Error processing transaction! You have not been charged.",
"numismatics.checkout.insufficient_funds": "Insufficient funds!",
"numismatics.checkout.unauthorized": "You're not authorized to use that card",
"numismatics.trust_list.configure": "Configure Trust List"
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.simibubi.create.foundation.item.TooltipModifier;
import dev.architectury.injectables.annotations.ExpectPlatform;
import dev.ithundxr.createnumismatics.content.backend.GlobalBankManager;
import dev.ithundxr.createnumismatics.content.checkout.GlobalDeferredCheckoutOrderManager;
import dev.ithundxr.createnumismatics.multiloader.Loader;
import dev.ithundxr.createnumismatics.registry.NumismaticsCommands;
import dev.ithundxr.createnumismatics.registry.NumismaticsCreativeModeTabs.Tabs;
Expand All @@ -30,6 +31,7 @@ public class Numismatics {
public static final String VERSION = findVersion();
public static final Logger LOGGER = LoggerFactory.getLogger(NAME);
public static final GlobalBankManager BANK = new GlobalBankManager();
public static final GlobalDeferredCheckoutOrderManager DEFERRED_ORDERS = new GlobalDeferredCheckoutOrderManager();

private static final CreateRegistrate REGISTRATE = CreateRegistrate.create(MOD_ID);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,12 @@ public static Coin closest(int value) {
}
return closest;
}

public static final Coin[] byValueAscending = new Coin[] {
SPUR, BEVEL, SPROCKET, COG, CROWN, SUN
};

public static final Coin[] byValueDescending = new Coin[] {
SUN, CROWN, COG, SPROCKET, BEVEL, SPUR
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package dev.ithundxr.createnumismatics.content.checkout;

import com.simibubi.create.foundation.gui.menu.MenuBase;
import dev.ithundxr.createnumismatics.content.bank.CardItem;
import dev.ithundxr.createnumismatics.content.bank.CardSlot;
import dev.ithundxr.createnumismatics.registry.NumismaticsTags;
import dev.ithundxr.createnumismatics.util.Utils;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.ContainerHelper;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Function;

public class CheckoutMenu extends MenuBase<DeferredCheckoutOrderMenuProvider> {
private CheckoutMenu.CardSwitchContainer cardSwitchContainer;
protected UUID currentCardUUID = Utils.emptyUUID;

public CheckoutMenu(MenuType<?> type, int id, Inventory inv, RegistryFriendlyByteBuf extraData) {
super(type, id, inv, extraData);
}

public CheckoutMenu(MenuType<?> type, int id, Inventory inv, DeferredCheckoutOrderMenuProvider contentHolder) {
super(type, id, inv, contentHolder);
}

@Override
protected DeferredCheckoutOrderMenuProvider createOnClient(RegistryFriendlyByteBuf extraData) {
return DeferredCheckoutOrderMenuProvider.clientSide(extraData);
}

@Override
protected void initAndReadInventory(DeferredCheckoutOrderMenuProvider contentHolder) {
}

@Override
protected void addSlots() {
if (cardSwitchContainer == null)
cardSwitchContainer = new CheckoutMenu.CardSwitchContainer(this::slotsChanged, (id) -> {
currentCardUUID = id;
return true;
});

addSlot(new CardSlot.BoundCardSlot(cardSwitchContainer, 0, 148, 73));
addPlayerSlots(40, 152);
}

@Override
protected void addPlayerSlots(int x, int y) {
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) {
this.addSlot(new LockableSlot(playerInventory, hotbarSlot, x + hotbarSlot * 18, y + 58, hotbarSlot == playerInventory.selected));
}
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 9; ++col) {
int slot = col + row * 9 + 9;
this.addSlot(new LockableSlot(playerInventory, slot, x + col * 18, y + row * 18, slot == playerInventory.selected));
}
}
}

@Override
protected void saveData(DeferredCheckoutOrderMenuProvider contentHolder) {
}

@Override
public void removed(Player playerIn) {
super.removed(playerIn);
if (playerIn instanceof ServerPlayer) {
clearContainer(player, cardSwitchContainer);
}
}

@Override
public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { // index is slot that was clicked
Slot clickedSlot = this.slots.get(index);

if (!clickedSlot.hasItem())
return ItemStack.EMPTY;

if (NumismaticsTags.AllItemTags.CARDS.matches(clickedSlot.getItem())) {
if (index == 0) // They've clicked the card in the slot
moveItemStackTo(clickedSlot.getItem(), 1, player.getInventory().getContainerSize() + 1, false);
else // They've clicked a card in their inventory
moveItemStackTo(clickedSlot.getItem(), 0, 1, false);
}

return ItemStack.EMPTY;
}

private class CardSwitchContainer implements Container {
private final Consumer<CheckoutMenu.CardSwitchContainer> slotsChangedCallback;
private final Function<UUID, Boolean> uuidChangedCallback; // should return success

@NotNull
protected final List<ItemStack> stacks = new ArrayList<>();

public CardSwitchContainer(Consumer<CheckoutMenu.CardSwitchContainer> slotsChangedCallback, Function<UUID, Boolean> uuidChangedCallback) {
this.slotsChangedCallback = slotsChangedCallback;
this.uuidChangedCallback = uuidChangedCallback;
stacks.add(ItemStack.EMPTY);
}

@Override
public int getContainerSize() {
return 1;
}

protected ItemStack getStack() {
return stacks.get(0);
}

@Override
public boolean isEmpty() {
return getStack().isEmpty();
}

@Override
public @NotNull ItemStack getItem(int slot) {
return getStack();
}

@Override
public @NotNull ItemStack removeItem(int slot, int amount) {
ItemStack stack = ContainerHelper.removeItem(this.stacks, 0, amount);
if (!stack.isEmpty()) {
this.slotsChangedCallback.accept(this);
}
return stack;
}

@Override
public @NotNull ItemStack removeItemNoUpdate(int slot) {
return ContainerHelper.takeItem(this.stacks, 0);
}

@Override
public void setItem(int slot, @NotNull ItemStack stack) {
this.stacks.set(0, stack);
if (CardItem.isBound(stack) && NumismaticsTags.AllItemTags.CARDS.matches(stack)) {
if (!this.uuidChangedCallback.apply(CardItem.get(stack))) {
// Non-existent account
stacks.set(0, CardItem.clear(stack));
CheckoutMenu.this.clearContainer(CheckoutMenu.this.player, this);
}
}
this.slotsChangedCallback.accept(this);
}

@Override
public void setChanged() {
}

@Override
public boolean stillValid(@NotNull Player player) {
return true;
}

@Override
public void clearContent() {
this.stacks.set(0, ItemStack.EMPTY);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dev.ithundxr.createnumismatics.content.checkout;

import io.netty.buffer.ByteBuf;
import net.createmod.catnip.codecs.stream.CatnipStreamCodecBuilders;
import net.minecraft.network.codec.StreamCodec;

public enum CheckoutPaymentMethod {
CANCEL_TRANSACTION,
CARD,
COINS;

public static final StreamCodec<ByteBuf, CheckoutPaymentMethod> STREAM_CODEC = CatnipStreamCodecBuilders.ofEnum(CheckoutPaymentMethod.class);

}
Loading