promotional bannermobile promotional banner

Arcadia Pets

Collect pets, level their skills, fuse them up, and duel other players. Summon them to walk beside you or ride on your shoulder !

File Details

arcadia-pets-1.2.6

  • R
  • Apr 23, 2026
  • 524.64 KB
  • 28.0K
  • 1.21.1
  • NeoForge

File Name

arcadia-pets-1.2.6.jar

Supported Versions

  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:arcadia-pets-1493098:7971273"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

## [1.2.6] - 2026-04-23 (latest)

### Fixed

- **Pocket-pet desync — other players still see a ghost after recall** — Pocket-pet activate/recall packets were broadcast with a 64-block range (`broadcastToNearby`), so any remote client that was out of range at the moment the owner recalled kept its stale client-side state and rendered a ghost pocket pet when they returned within range. Fix (two fronts): (1) every **recall** path (manual recall, mode switch out of pocket, defeat cooldown, item-gone validator) now calls a new `broadcastToAll` that sends the clear-packet to every online player — negligible cost, the packet is ~20 bytes and recall events are rare. (2) New `PlayerEvent.StartTracking` handler on the server: when a client starts tracking another player's entity, push the owner's current pocket-pet state (activate packet with the right mobType/scale/name, or recall if none) to that tracker — covers the symmetric case where a remote client missed the initial activate and just came into range.

### Correctifs

- **Desync pocket-pet — d'autres joueurs voient encore le pet après recall** — Les paquets d'activation/recall du pocket-pet étaient diffusés avec un rayon de 64 blocs (`broadcastToNearby`), donc tout client distant hors de portée au moment où le propriétaire rappelait conservait son état client obsolète et affichait un pet fantôme lorsqu'il revenait à portée. Correction (sur deux fronts) : (1) tous les chemins de **recall** (rappel manuel, sortie du mode pocket, cooldown de mort, validateur d'item disparu) appellent maintenant un nouveau `broadcastToAll` qui envoie le paquet clear à tous les joueurs en ligne — coût négligeable, paquet de ~20 octets et événements de recall rares. (2) Nouveau gestionnaire `PlayerEvent.StartTracking` côté serveur : quand un client commence à tracker l'entité d'un autre joueur, l'état pocket-pet courant du propriétaire (paquet activate avec mobType/scale/nom correct, ou recall si aucun) est poussé à ce tracker — couvre le cas symétrique où un client distant avait raté l'activate initial et arrive juste à portée.

---

## [1.2.5] - 2026-04-23

### Fixed

- **Orphan pet entity left behind after CarryOn pickup** — Third-party mods that grab a living entity (e.g. **CarryOn**) remove the tracked entity and re-spawn a fresh one when released, invalidating our {@code Entity} handle and leaving an untracked NBT-tagged entity in the world — the "little pet with no owner" reported in-game. `PetManager.validateActivePetItems` now also (a) detects when the tracked active-pet entity becomes `isRemoved() || !isAlive()` and re-summons from the still-held pet item so the player never loses their pet, and (b) scans every `ServerLevel` for entities tagged `arcadia_pet` that are absent from our entity-ID → owner reverse map, and discards them as orphans. Runs once per second on the existing validator tick (no extra cost).

### Correctifs

- **Entité pet orpheline après pickup CarryOn** — Les mods tiers qui prennent une entité vivante (p. ex. **CarryOn**) retirent l'entité trackée et en re-spawn une neuve au relâchement, invalidant notre référence `Entity` et laissant une entité taguée NBT non-trackée dans le monde — le "petit pet sans maître" observé en jeu. `PetManager.validateActivePetItems` détecte désormais aussi (a) quand l'entité pet active trackée devient `isRemoved() || !isAlive()` et re-summon depuis l'item pet toujours détenu pour que le joueur ne perde pas son familier, et (b) scanne chaque `ServerLevel` pour les entités taguées `arcadia_pet` absentes de notre map inverse entity-ID → owner, et les supprime comme orphelines. Tourne une fois par seconde sur le tick validator existant (aucun coût supplémentaire).

---

## [1.2.4] - 2026-04-23

### Fixed

- **Pet collection save deadlock** — Two `saveCollection` calls for the same owner could be picked up by different threads of the 4-threaded DB executor and race on the `(owner_uuid, slot_index)` PK index, triggering `MySQLTransactionRollbackException: Deadlock found when trying to get lock`. Added per-owner Java-level serialization (`ConcurrentHashMap<UUID, Object>` monitor) so at most one transaction is in flight per player at any time — this alone removes the deadlock window. As belt-and-suspenders, a single automatic retry kicks in if MySQL still reports SQLSTATE 40001. Also takes a defensive snapshot (copy) of the ItemStack list at enqueue time so later inventory mutations cannot race with the async write.

### Correctifs

- **Deadlock à la sauvegarde de collection** — Deux `saveCollection` pour le même propriétaire pouvaient être pris par des threads différents de l'exécuteur DB 4-threadé et racer sur l'index PK `(owner_uuid, slot_index)`, déclenchant `MySQLTransactionRollbackException: Deadlock found when trying to get lock`. Ajout d'une sérialisation Java par owner (monitor `ConcurrentHashMap<UUID, Object>`) — au plus une transaction en vol par joueur à la fois, ce qui ferme à lui seul la fenêtre de deadlock. En ceinture-bretelle, un retry automatique unique est déclenché si MySQL renvoie encore SQLSTATE 40001. Snapshot défensif de la liste d'ItemStacks à l'enqueue pour que les mutations d'inventaire ultérieures ne courent pas avec l'écriture asynchrone.

---

## [1.2.3] - 2026-04-23

### Fixed

- **Pet duplication exploit (active-pet item exfiltration)** — When a player summoned a pet, the pet item remained in their inventory. Dropping, trading, chest-storing or listing it in the AH transferred the item to someone else while the original summon stayed active — two players ended up with the same pet (same `petId`). Added a once-per-second server-side validator (`PetManager.validateActivePetItems`) that despawns any active/pocket pet whose source item is no longer held by its owner (checked against both inventory and saved collection). Paired with an AH-side guard (`arcadia_pets.msg.pet_active_cannot_list`) that refuses to list a pet the seller is currently summoning. New soft-dep hook `ArcadiaModRegistry.registerPetActiveChecker` (lib ≥ 1.2.2) exposes the check to arcadia-ah without a hard import.

### Correctifs

- **Exploit de duplication de pet (exfiltration de l'item actif)** — Quand un joueur invoquait un pet, l'item restait dans son inventaire. Le lâcher, le trader, le mettre dans un coffre ou le vendre à l'HDV transférait l'item à un autre joueur pendant que l'invocation originale restait active — deux joueurs se retrouvaient avec le même pet (même `petId`). Ajout d'un validateur serveur (1 fois/seconde, `PetManager.validateActivePetItems`) qui fait rappeler tout pet actif/pocket dont l'item source n'est plus détenu par son propriétaire (vérifié dans l'inventaire ET la collection sauvegardée). Couplé à un garde côté HDV (`arcadia_pets.msg.pet_active_cannot_list`) qui refuse de mettre en vente un pet actuellement invoqué par le vendeur. Nouveau hook soft-dep `ArcadiaModRegistry.registerPetActiveChecker` (lib ≥ 1.2.2) expose la vérification à arcadia-ah sans import dur.

---

## [1.2.2] - 2026-04-23

### Fixed

- **Missing `arcadia_duel_elo` table** — `EloDatabase` (duel ELO ranking) read and wrote this table but the `CREATE TABLE IF NOT EXISTS` was never registered in `PetsTableDefinition`. On MySQL-backed servers every load/save raised `SQLSyntaxErrorException: Table '...arcadia_duel_elo' doesn't exist` — duel ratings, wins, losses and leaderboard were silently discarded. Added the schema with `(uuid)` PK and a `rating` index for leaderboard queries.

### Correctifs

- **Table `arcadia_duel_elo` manquante** — `EloDatabase` (classement ELO des duels) lisait et écrivait cette table mais le `CREATE TABLE IF NOT EXISTS` n'était pas enregistré dans `PetsTableDefinition`. Sur les serveurs MySQL chaque load/save levait `SQLSyntaxErrorException: Table '...arcadia_duel_elo' doesn't exist` — les notes ELO, victoires, défaites et le classement étaient silencieusement perdus. Ajout du schéma avec PK `(uuid)` et un index `rating` pour les requêtes de leaderboard.

---

## [1.2.1] - 2026-04-23

### Fixed

- **Pet collection save race** — `PetCollectionDatabase.saveCollection` used a non-atomic `DELETE + INSERT` pattern that raised `SQLIntegrityConstraintViolationException: Duplicate entry '<uuid>-<slot>' for key 'arcadia_pet_collections.PRIMARY'` when two saves for the same owner interleaved (e.g. mailbox delivery + pet capture in the same tick). Now runs in a single transaction: prunes slots with `slot_index >= collection.size()` (handles shrinks) and upserts live slots via `INSERT ... ON DUPLICATE KEY UPDATE`. Commit-or-rollback guarantees a consistent state under concurrent writes.

### Correctifs

- **Race condition sur sauvegarde de collection** — `PetCollectionDatabase.saveCollection` utilisait un pattern `DELETE + INSERT` non atomique qui levait `SQLIntegrityConstraintViolationException: Duplicate entry '<uuid>-<slot>' for key 'arcadia_pet_collections.PRIMARY'` quand deux sauvegardes pour le même propriétaire s'entrecroisaient (ex. livraison mailbox + capture de pet au même tick). Désormais dans une transaction unique : purge des slots `slot_index >= collection.size()` (gère les réductions) et upsert des slots vivants via `INSERT ... ON DUPLICATE KEY UPDATE`. Le commit-ou-rollback garantit un état cohérent sous écritures concurrentes.