promotional bannermobile promotional banner

LK: Shop and Market

A player-driven marketplace inspired by Albion Online featuring global buy/sell orders and villager-linked server shops.
Back to Files

LKShopMarket-0.7.0.jar

File nameLKShopMarket-0.7.0.jar
Uploaded
Aug 18, 2026
Downloads
21
Size
1.4 MB
Mod Loaders
Forge
File ID
8679883
Type
R
Release
Supported game versions
  • 1.20.1

Curse Maven Snippet

Forge

implementation fg.deobf("curse.maven:lk-shop-market-1650513:8679883")

Learn more about Curse Maven

What's new

LK Shop & Market v0.7.0

Minecraft 1.20.1 · Forge 47+

⚠️ Upgrading: the network protocol is now 6. Client and server must both run 0.7.0 — a mismatched client is rejected at connection time rather than failing halfway through a purchase.

The two headline additions are direct player-to-player trading and shop villagers that keep their own opening hours and sleep through the night. Around them: public seller profiles, a server-authoritative sound system, scheduled market closures, and a deep pass over the economy's edge cases.


🇬🇧 English

🤝 Direct player trading — new system

A full face-to-face trade window, so deals no longer depend on trusting someone to pay after you drop the goods.

  • /trade <player> to invite, /trade accept / /trade decline to answer — and the invitation   also arrives as a clickable chat message with Accept and Decline buttons, so nobody has to   type anything. Invitations expire on their own, and inviting someone who already invited you is   read as accepting.
  • 12 slots per side, plus coins. Both offers are visible at once: yours on the left, theirs on   the right. The other side's panel is structurally read-only — it is the same container viewed   from the other end, so it cannot accept or release an item no matter what a modified client sends.
  • Everything is held in escrow. What you offer leaves your inventory and sits in the server's   custody for the duration, exactly like items deposited in a sell order. That is what makes it safe   to promise nothing duplicates and nothing is lost: at every instant each item exists in exactly one   place, and if the deal falls apart for any reason — closing the window, disconnecting, walking   away, the server shutting down — there is a single place to return it from. If you disconnect   mid-trade, your items go to your mailbox, never to the floor.
  • Two phases, with an anti-scam delay. First both sides mark Ready, which locks the slots and   the amounts; Confirm only unlocks 3 seconds later, and needs both confirmations. That pause   exists specifically against the last-instant swap: you get time to actually read what you are about   to receive without it moving under your cursor. Any change to either offer drops both phases,   so what gets confirmed is always what was seen.
  • Proximity rules that match intent: 5 blocks to start a trade, 10 to keep one open — tighter to   agree, looser so a step backwards mid-negotiation does not cancel everything.
  • Nothing executes on stale state. Distance, inventory space and both balances are re-checked at   execution, with both players present. Payment is taken from both sides before anything is   delivered, and a failure at the second charge rolls the first one back.

🧑‍🌾 Shop villagers: hours, sleep and looks — new system

  • 🕐 Every shop villager keeps its own hours. In the Villager tab of a linked shop, set when   it closes and when it opens again, in half-hour steps of the Minecraft day. The window is allowed   to run backwards — closing at dusk and reopening before dawn is a night shift, not an error —   so a market district can have day traders and night traders side by side.
  • 😴 Villagers actually sleep. Outside opening hours the shopkeeper heads to bed, closes its eyes   and puffs Zzz particles, and its shop stays shut while it rests. "Closed" becomes something you   can see from across the square instead of a message you only get after clicking.
  • 🎨 Customisation. Give a shopkeeper a custom name (up to 48 characters) and pick from 5   appearance presets plus the default villager. The preview applies to the real villager behind the   screen as you cycle through, so you choose by looking rather than guessing — and an unsaved   changes marker keeps that preview from being mistaken for the saved state.
  • 🖱️ Fixed "sometimes the shop just doesn't open." Vanilla walks both hands when you right-click   and stops at the first that reports the interaction consumed. The server could not answer in time   here, because the shop link lives in the entity's persistent NBT and that is not synced — so the   client retried with the off-hand and the server received two open requests, the second closing   the container the first had just opened. The client now knows which villagers are shops (the server   tells it) and consumes the click once.

🌟 Trust, atmosphere and admin tools

  • ⭐ Public seller profiles. Click any seller's name for their rating in stars with the vote   count, total sales, coins earned, active orders, last seen, and their featured item. Current   balance is never shared — the profile exists to establish trust, not to expose wallets.
  • 🔊 The server decides what you hear. Sound used to be played optimistically the moment you   clicked, so a refusal sounded exactly like a success — you heard "bought!" while the purchase was   failing for want of balance or stock. Now the result comes back from the server and picks the   sound. Every action has its own voice: buying and selling are the same villager tone pitched apart   (0.85 / 1.25) so you can hear which way the coins went, publishing is a bright experience-orb   chime, claiming the mailbox is a level-up, undo and panel-open are a page turn at two pitches, and   refusals — including a frozen account — answer with the villager's unmistakable no.
  • 🌙 Scheduled market closures. New scheduledPause server config closes the whole market during   a window of the Minecraft day, ideal for a nightly maintenance slot. The window may cross midnight.   It is independent of the manual pause: closed if either says so, so a schedule can never   reopen something an operator deliberately closed.
  • 📖 /market help that helps. Colour-coded commands you can click to place in your chat bar   instead of retyping them, with descriptions in your own language. The admin section only appears   for those who can actually use it.
  • 🧪 /market admin debug — an automated QA bench. Reproducing an accounting mismatch or a   duplication takes volume or two things happening at once, which is half an hour of manual setup   per attempt and never quite repeatable. These checks make it one command and, above all, a   comparable result between runs. Every test leaves the save exactly as it found it.

🛡️ Security & exploit fixes

  • 💰 Cancelling an order can no longer print money. Refunds are capped to what could legitimately   have been charged, with both factors clamped before multiplying. Previously an order carrying   impossible numbers — from a hand-edited save, a restored backup, or a build older than the current   limits — saturated the refund to Long.MAX_VALUE. Fixed in all three paths: player cancellation,   admin cancellation, and the expiry sweep, including expiry, which needs nobody to click   anything.
  • 📦 Editing a shop catalogue in Creative no longer destroys the item. Returns now go through the   mod's safe insert helper. Vanilla's Inventory#add zeroes a stack and reports success when   instabuild is set, so the drop-to-floor fallback never ran — and catalogue edits are done by   operators, who are almost always in Creative. Same fix applied to /market admin shop linker.
  • 🛑 Pausing the market now stops trades that are already open. Direct trades re-check the market   pause and account freezes at confirmation and again at execution, one tick apart. Before, an   admin who spotted an exploit and did the obvious thing — pause the market, freeze both accounts —   did not stop a single trade window already in flight. A blocked trade is cancelled cleanly:   everything offered is returned and both players are told why.
  • 🔢 Admin prices are capped at 1,000,000,000 coins. The graphical editor already enforced this;   /market admin shop entry add accepted up to Long.MAX_VALUE and datapack shops were unchecked.   One extra digit was enough to saturate a player's balance at the maximum of a 64-bit integer and   render the server economy meaningless. All four paths — command, datapack, editor packet and   player orders — now share a single constant.
  • 🏷️ Minimum price is enforced on buy orders, server-side. The interface checked it for both   order types, but the server only checked it when selling, so a modified client — or simply one that   had not yet received the rules packet — could publish buy orders under the floor. A check that only   lives in the client is not a check.
  • 🔐 Seller profile requests now require an open market screen, the same guard every other   client-to-server packet carries.

🔧 Stability & quality of life

  • 🧱 One corrupt entry can no longer wipe the order book. Orders, balances and mailboxes are now   read entry by entry: anything unreadable is skipped with a warning that includes its raw data, and   everything else loads normally. Previously a single bad record threw during load, and what followed   was not a visible error but a silent total loss — the file was replaced with an empty one at the   next autosave, taking every escrowed item and every coin held against a buy order.
  • 🔄 Opening a second world no longer kills background writers. The audit log and the data   exporter recreate their worker threads on demand. In singleplayer and LAN the game process survives   leaving a world, so audit logging used to go dead for the rest of the session and   /market admin data export threw an error in the admin's face.
  • 🧹 Nothing follows you between servers. Seller profiles and remembered per-item prices are   cleared on disconnect. You no longer see the previous server's profile for a moment, or get a price   field pre-filled with a figure from an economy that has nothing to do with this one.
  • 🚶 Unlinking a shop villager restores its real speed. It now reads the base value the entity   type itself declares — 0.5 for a villager — instead of the generic attribute default of 0.7,   which left every freed shopkeeper permanently 40% faster than its neighbours, saved into the world.   Any entity can be a shop, so the value is read per species rather than hardcoded.
  • 👻 Removed items can no longer take your coins. A catalogue row whose item no longer resolves —   its mod uninstalled or renamed — is no longer offered for sale or purchase. It used to keep its   price, charge the player, deliver nothing, and get exported to the global market for everyone.
  • 🤝 A crossed trade invitation can no longer vanish in silence. When both players invite each   other, the result of the acceptance is now reported instead of discarded, so a refusal can never be   presented as success with the invitation already consumed.
  • 🧊 Unfreezing an archived account now survives a restart. The change was applied in memory but   not always marked for saving, so the account could come back frozen.
  • 🪟 Fixed the villager settings leaking onto other screens. The Discard button and the hour   steppers could reappear on top of the World Market and My Orders. Tab visibility is now tracked in   one place that no tab can forget, and the villager tab is not even built when there is no villager   to configure.
  • 🖼️ The item preview in the catalogue editor is static again. The spinning 3D preview is gone;   items render at their normal inventory size as before.

🇪🇸 Español

🤝 Tratos directos entre jugadores — sistema nuevo

Una ventana de trato cara a cara, para que cerrar un acuerdo deje de depender de fiarte de que el otro pague después de que sueltes la mercancía.

  • /trade <jugador> para invitar y /trade accept / /trade decline para contestar — y la   invitación llega además como mensaje de chat pulsable con botones de Aceptar y Rechazar, así   que no hace falta escribir nada. Las invitaciones caducan solas, e invitar a quien ya te había   invitado se lee como aceptar.
  • 12 ranuras por lado, más monedas. Las dos ofertas se ven a la vez: la tuya a la izquierda, la   suya a la derecha. El panel del otro es de solo lectura por construcción — es el mismo   contenedor visto desde el otro extremo, así que no acepta ni suelta nada, mande lo que mande un   cliente modificado.
  • Todo queda en custodia. Lo que ofreces sale de tu inventario y se queda en custodia del   servidor mientras dura el trato, igual que los items depositados en una orden de venta. Eso es lo   que permite prometer que nada se duplica ni se pierde: en todo momento cada item está en un solo   sitio, y si el trato se cae por la vía que sea — cerrar la pantalla, desconectarse, alejarse,   apagar el servidor — hay un único lugar del que devolverlo. Si te desconectas a mitad, tus items   van a tu buzón, nunca al suelo.
  • Dos fases, con retardo antitimo. Primero los dos marcan Listo, lo que bloquea las ranuras y   los importes; Confirmar no se habilita hasta 3 segundos después, y hacen falta las dos   confirmaciones. Esa espera existe justo contra el cambiazo de última hora: te da tiempo a leer de   verdad lo que vas a recibir sin que se te mueva debajo del ratón. Cualquier cambio en cualquiera   de las dos ofertas tira las dos fases al suelo, así que lo que se confirma es siempre lo que se   vio.
  • Distancias con sentido: 5 bloques para empezar un trato y 10 para mantenerlo abierto — más   estricto para acordar, más holgado para que un paso atrás a mitad de la negociación no lo cancele   todo.
  • Nada se ejecuta sobre información vieja. La distancia, el hueco en el inventario y los saldos de   los dos se vuelven a comprobar al ejecutar, con ambos jugadores delante. Se cobra a los dos lados   antes de entregar nada, y si el segundo cobro falla se deshace el primero.

🧑‍🌾 Aldeanos tenderos: horario, sueño y aspecto — sistema nuevo

  • 🕐 Cada aldeano tendero tiene su propio horario. En la pestaña Aldeano de una tienda   vinculada se elige a qué hora cierra y a qué hora vuelve a abrir, en pasos de media hora del día de   Minecraft. La franja puede ir al revés — cerrar al anochecer y abrir antes del amanecer es un   turno de noche, no un error —, así que un barrio comercial puede tener tenderos de día y de   noche a la vez.
  • 😴 Los aldeanos duermen de verdad. Fuera de su horario el tendero se va a la cama, cierra los   ojos y suelta partículas Zzz, y su tienda no abre mientras descansa. Que esté cerrado pasa a ser   algo que se ve desde el otro lado de la plaza, en vez de un mensaje que llega tras hacer clic.
  • 🎨 Personalización. Ponle un nombre propio (hasta 48 caracteres) y elige entre 5 presets de   apariencia más el aldeano normal. La vista previa se aplica al aldeano real que hay detrás de la   pantalla mientras cambias de opción, así que eliges mirando y no adivinando; un aviso de cambios   sin guardar impide confundir ese adelanto con lo que está guardado.
  • 🖱️ Corregido el «a veces no abre la tienda». Vanilla recorre las dos manos al hacer clic derecho   y se detiene en la primera que da la interacción por consumida. El servidor no podía contestar a   tiempo aquí, porque el vínculo con la tienda vive en el NBT persistente de la entidad y eso no se   sincroniza, así que el cliente reintentaba con la mano secundaria y el servidor recibía dos   peticiones de apertura: la segunda cerraba el contenedor que acababa de abrir la primera. Ahora el   cliente sabe qué aldeanos son tiendas (se lo dice el servidor) y consume el clic una sola vez.

🌟 Confianza, ambiente y herramientas de administración

  • ⭐ Perfiles públicos de vendedor. Al pulsar el nombre de un vendedor se ve su valoración en   estrellas con el número de votos, ventas totales, monedas ganadas, órdenes activas, última conexión   y su artículo estrella. El saldo actual no se comparte nunca: el perfil está para dar confianza,   no para enseñar carteras ajenas.
  • 🔊 El sonido lo decide el servidor. Antes se reproducía de forma optimista en el momento de   pulsar, así que un rechazo sonaba exactamente igual que un acierto: oías «¡comprado!» mientras la   compra fallaba por falta de saldo o de stock. Ahora el resultado vuelve del servidor y es él quien   elige el sonido. Cada acción tiene su propia voz: comprar y vender son el mismo tono de aldeano   separado por altura (0.85 / 1.25), así que se oye hacia dónde han ido las monedas; publicar es   un tintineo de esfera de experiencia, reclamar el buzón es un level-up, deshacer y abrir panel son   un pasar de página a dos alturas, y los rechazos — incluida una cuenta congelada — contestan con el   inconfundible no del aldeano.
  • 🌙 Cierres programados del mercado. La nueva config scheduledPause cierra el mercado entero   durante una franja del día de Minecraft, ideal para una ventana de mantenimiento nocturna. La franja   puede cruzar la medianoche. Es independiente de la pausa manual: cerrado si lo dice cualquiera   de las dos, de modo que un horario nunca puede reabrir algo que un operador cerró a propósito.
  • 📖 Un /market help que ayuda de verdad. Comandos por colores que puedes pulsar para que se   escriban solos en la barra de chat en vez de teclearlos otra vez, con las descripciones en tu   idioma. La sección de administración solo aparece para quien puede usarla.
  • 🧪 /market admin debug — banco de pruebas automatizado. Reproducir una contabilidad   descuadrada o una duplicación exige volumen o dos cosas a la vez, lo que son media hora de montaje   manual por intento y nunca del todo repetible. Estas comprobaciones lo dejan en un comando y, sobre   todo, en un resultado comparable entre ejecuciones. Toda prueba deja el guardado como lo   encontró.

🛡️ Seguridad y corrección de exploits

  • 💰 Cancelar una orden ya no imprime dinero. El reembolso se limita a lo que se pudo cobrar de   verdad, recortando los dos factores antes de multiplicar. Antes, una orden con cifras imposibles   — de un guardado editado a mano, de una copia restaurada o de una versión anterior a los límites   actuales — saturaba el reembolso en Long.MAX_VALUE. Corregido en las tres vías: cancelación del   jugador, cancelación del administrador y barrido de caducadas, incluida la caducidad, que no   necesita que nadie pulse nada.
  • 📦 Editar el catálogo en creativo ya no destruye el artículo. La devolución pasa por el   insertador seguro del mod. El Inventory#add de vanilla pone el stack a cero y da por entregado lo   que no cabe cuando hay instabuild, así que el rescate de soltar al suelo no llegaba a ejecutarse   — y quien edita un catálogo es un operador, que casi siempre está en creativo. Mismo arreglo en   /market admin shop linker.
  • 🛑 Pausar el mercado ahora corta los tratos ya abiertos. Los tratos directos vuelven a comprobar   la pausa y las cuentas congeladas al confirmar y otra vez al ejecutar, con un tick de   diferencia. Antes, un administrador que veía un exploit y hacía lo evidente — pausar el mercado y   congelar las dos cuentas — no detenía ni una sola ventana de trato en marcha. Un trato bloqueado se   cancela limpiamente: se devuelve todo lo ofrecido y se les explica a los dos por qué.
  • 🔢 Los precios de administrador se topan en 1.000.000.000 de monedas. El editor gráfico ya lo   aplicaba; /market admin shop entry add aceptaba hasta Long.MAX_VALUE y los datapacks no miraban   la magnitud. Un dígito de más bastaba para saturar el saldo de un jugador en el máximo de un entero   de 64 bits y dejar la economía del servidor sin ningún significado. Las cuatro vías — comando,   datapack, paquete del editor y órdenes de jugador — comparten ahora una sola constante.
  • 🏷️ El precio mínimo se aplica también a las órdenes de compra, en el servidor. La interfaz lo   comprobaba para los dos tipos, pero el servidor solo lo hacía al vender, así que un cliente   modificado — o simplemente uno al que aún no le había llegado el paquete de reglas — podía publicar   compras por debajo del suelo. Una comprobación que solo vive en el cliente no es una comprobación.
  • 🔐 Pedir un perfil de vendedor exige tener el mercado abierto, el mismo guardia que llevan todos   los demás paquetes de cliente a servidor.

🔧 Estabilidad y calidad de vida

  • 🧱 Una entrada corrupta ya no se lleva por delante el libro de órdenes. Órdenes, saldos y buzones   se leen entrada por entrada: lo que no se pueda interpretar se salta con un aviso que incluye sus   datos en bruto, y el resto carga con normalidad. Antes, un solo registro malo reventaba la carga, y   lo que había detrás no era un error visible sino una pérdida total y callada: el fichero se   sustituía por uno vacío en el siguiente autoguardado, con todos los artículos depositados y todas   las monedas retenidas de las órdenes de compra.
  • 🔄 Abrir un segundo mundo ya no mata los hilos de escritura. El registro de auditoría y el   exportador vuelven a crear su hilo cuando hace falta. En un mundo local o en LAN el proceso   sobrevive a salir del mundo, así que la auditoría se quedaba muerta el resto de la sesión y   /market admin data export reventaba en la cara del administrador.
  • 🧹 Nada te sigue de un servidor a otro. Los perfiles de vendedor y los precios recordados por   artículo se vacían al desconectar. Ya no se ve un instante el perfil del servidor anterior, ni   aparece el campo de precio relleno con una cifra de una economía que no tiene nada que ver.
  • 🚶 Desvincular un aldeano le devuelve su velocidad real. Ahora se lee el valor base que declara   su propia especie — 0.5 en un aldeano — en vez del valor por defecto genérico del atributo, 0.7,   que dejaba a cada tendero liberado un 40% más rápido que sus vecinos, y además guardado en el mundo.   Cualquier entidad puede ser una tienda, así que el número se consulta por especie en lugar de   escribirse a mano.
  • 👻 Un artículo eliminado ya no puede quedarse con tus monedas. Una línea de catálogo cuyo item ya   no se puede resolver — porque su mod se desinstaló o lo renombró — deja de ofrecerse para comprar y   para vender. Antes conservaba su precio, cobraba al jugador, no entregaba nada y encima se exportaba   al mercado global para todo el mundo.
  • 🤝 Una invitación cruzada ya no puede esfumarse en silencio. Cuando los dos jugadores se invitan   a la vez, el resultado de la aceptación se comunica en vez de descartarse, así que un rechazo no   puede presentarse como un éxito con la invitación ya consumida.
  • 🧊 Descongelar una cuenta archivada sobrevive al reinicio. El cambio se aplicaba en memoria pero   no siempre se marcaba para guardar, así que la cuenta podía volver congelada.
  • 🪟 Corregidos los ajustes del aldeano colándose en otras pantallas. El botón Descartar y los   ajustadores de hora podían reaparecer encima del Mercado Mundial y de Mis Órdenes. La visibilidad de   las pestañas se lleva ahora en un único sitio del que ninguna se puede olvidar, y la pestaña del   aldeano ni siquiera se construye cuando no hay aldeano que configurar.
  • 🖼️ La vista previa del editor de catálogo vuelve a ser estática. Se ha quitado el giro 3D; los   artículos se dibujan a su tamaño de inventario de siempre.

This mod has no additional files