Compare commits

...
Author SHA1 Message Date
Test e696c7b37e Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into decorative-items-proofofconceptbranch
# Conflicts:
#	common/src/main/resources/assets/cobblemon/dynamiclights/item/flame_orb.json
#	common/src/main/resources/assets/cobblemon/models/block/display_case.json
#	common/src/main/resources/assets/cobblemon/models/block/kings_rock.json
#	common/src/main/resources/assets/cobblemon/models/item/wearable/exp_share.json
#	common/src/main/resources/assets/cobblemon/models/item/wearable/rocky_helmet.json
2025-11-22 13:05:20 -05:00
Test b543692180 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into decorative-items-proofofconceptbranch
# Conflicts:
#	common/src/main/resources/assets/cobblemon/lang/en_us.json
2025-10-17 22:14:14 -04:00
Test 98fab80fb4 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into decorative-items-proofofconceptbranch
# Conflicts:
#	common/src/main/resources/assets/cobblemon/lang/en_us.json
2025-10-05 22:59:38 -04:00
Test efc1fd719c Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into decorative-items-proofofconceptbranch
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/CobblemonBlocks.kt
#	common/src/main/resources/assets/cobblemon/lang/en_us.json
2025-09-10 22:50:07 -04:00
dhi_holo 9fb20e8850 Batch 1b and 2
Only texture updates, includes a bunch of stuff
2025-08-02 12:05:01 +10:00
dhi_holo ef17a6d496 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-08-02 11:13:20 +10:00
dhi_holo bcb444577b Update luminous_moss.json 2025-07-31 22:06:12 +10:00
dhi_holo 190fccce8f Batch 1a
Everstone, Luminous Moss, Heat Rock, Icy Rock, Smooth Rock, Sharp Beak
2025-07-31 21:59:49 +10:00
dhi_holo 127310ce5b Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-31 21:20:46 +10:00
dhi_holo 72152aa2dd Eviolite 4
It's better now!
2025-07-31 21:18:22 +10:00
dhi_holo f9810a0f00 Changelog.
The Merge Request Draws Near
2025-07-26 17:23:26 +10:00
dhi_holo 15385b9276 Multi-vitamins! 2025-07-26 16:42:24 +10:00
dhi_holo dae2b18353 Fight Fight, Take Your Pills!
Battle Items now are placeable.
2025-07-26 13:04:34 +10:00
dhi_holo ca5bda092f Code Improvement
The Medicine Items use a different logic for determing how they get used, making it still have the menu out of battles, and you can also place them during battle, working exactly like berries (because it's berry code)
2025-07-25 15:18:48 +10:00
dhi_holo 31291713d0 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-25 13:39:10 +10:00
dhi_holo 16bbbf6e18 ETHER!
Ethers and Elixirs, almost
2025-07-25 13:38:38 +10:00
dhi_holo c4ad1dde27 Place Your Meds
It works! I am a geenus!

Also some minor cleanup (and a change I have no idea why happened but seems to not be causing issues..?)
2025-07-24 20:21:06 +10:00
dhi_holo 2c401d26d9 Status Part A
Status Restore Items now have blocks, they're just
Not connected to each other yet
2025-07-24 18:47:38 +10:00
dhi_holo d4714721eb Code Cleanup
Just some minor code cleanup, some stuff probably should be gone over with a more experienced eye before merging, but I'm happy with the level it is currently at.
2025-07-24 16:01:38 +10:00
dhi_holo 2fb22029ff Asset Cleanup
Making some stuff cleaner, improving some decisions, preparing for approval
2025-07-24 13:34:13 +10:00
dhi_holo a96411c50b You Cannot Handle My Potions, Traveller
Yippee, we got Potion Blocks finished up now!
2025-07-23 19:33:16 +10:00
dhi_holo 191005b29a Phone Light?
Dex now emits a small light level as it was meant to
2025-07-23 16:10:26 +10:00
dhi_holo d68759e4a3 Balls
Balls now have recipes
2025-07-23 15:26:35 +10:00
dhi_holo 25bf01ca20 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-23 10:08:47 +10:00
dhi_holo 4b8426d78c Magnetic Personality
Added Magnet Block, improved Six Face code, updated Metal Coat
2025-07-16 13:02:33 +10:00
dhi_holo 26c62acb6c Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-15 20:12:46 +10:00
dhi_holo 70522f3f3f Update metal_coat.png
contrast
2025-07-15 20:12:04 +10:00
dhi_holo 8423df7ef9 Metal Coated
Metal Coat is now placeable, plus some minor tweaks to how the other floor stackables are being handled
2025-07-15 18:12:37 +10:00
dhi_holo d8f83697c8 Remoss
Luminous Moss Remodel, and Galarica Wreath cleanup
2025-07-15 15:36:25 +10:00
dhi_holo 2b81da943e Redstone!!!!!!!!!!!!!!!! 2025-07-15 12:57:49 +10:00
dhi_holo a8e7a01e48 Unjammed 2025-07-14 18:47:31 +10:00
dhi_holo aa2a3d69fb Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-14 17:17:18 +10:00
dhi_holo 880f919f9f Jammed
Eject Button partially implemented as a redstone button - it just doesn't unclick currently, and I'm not certain why
2025-07-14 17:17:08 +10:00
dhi_holo d1557b23b4 Display Target 2025-07-13 19:17:35 +10:00
dhi_holo e3fab0f69c Darts and Cleanup
Ring Target, plus corrected stuff that broke/was inaccurate with the changes I did on a different branch that is now merged
2025-07-13 18:38:14 +10:00
dhi_holo 0f24cf8480 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-13 16:47:31 +10:00
dhi_holo 3ebba3dfe5 ROCK AND STEEL
Hard Stone and Iron Ball
2025-07-12 20:19:41 +10:00
dhi_holo b339b552c6 Beak n Cloak 2025-07-12 14:59:13 +10:00
dhi_holo 3a5095887d Clean Up
Fixed some lighting stuff and item models
2025-07-12 14:11:16 +10:00
dhi_holo 6b9821e170 MORB
Orbs can now be placed on walls and ceilings
2025-07-12 12:37:54 +10:00
dhi_holo e24a0e637a Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-12 10:25:22 +10:00
dhi_holo 924450d4c8 O R B
Life, Flame, Toxic Orbs, Light and Smoke Balls, Yippee
2025-07-11 18:49:38 +10:00
dhi_holo a4aabbb28f Evers
New Everstone and Eviolite models/textures
2025-07-11 13:38:04 +10:00
dhi_holo e5029bf074 Alloy!
Metal Alloy, added a flag to the EXP Share for future versions to pick up on innately, and fixed a bug with oval stone
2025-07-10 20:12:23 +10:00
dhi_holo 8135c3baef Not Evolution Stone Evolutation-Related Stones
Everstone, Eviolite, and Oval Stone, nice and cute in the display case
2025-07-10 20:11:29 +10:00
dhi_holo 72ce0a843d Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-10 11:01:06 +10:00
dhi_holo 2fef675958 Update dusk_stone.json
Whoops
2025-07-09 20:12:39 +10:00
dhi_holo 6b3722f9b9 Stoned
Base 10 Evolution Stones now have models and textures, yippee
2025-07-09 19:35:56 +10:00
dhi_holo 6384fc9fcb Stoning Continues 2025-07-09 12:05:02 +10:00
dhi_holo a8b2e2b72d Stoning
Added model files for all 10 stones, updated texture layouts, updated leaf stone, added sun stone
2025-07-09 08:28:04 +10:00
dhi_holo 431ab62ebb Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-09 08:10:35 +10:00
dhi_holo af50547477 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-08 20:14:29 +10:00
dhi_holo de5ab3d2dc Cleaning some files up
sweep sweep
2025-07-08 20:14:01 +10:00
dhi_holo a803bb9be8 Reorg and Stones
Reorganised how I do the Link Cable/Cobblemon Icons, started working on evolution stones in display case
2025-07-08 15:07:04 +10:00
dhi_holo b19074d130 Display Case Item Fixes
Wearables now render exactly like a regular item
Display Case shading is a bit better, thanks to a cleaned up model and one odd line of code
Placeable Items now in Creative Inventory for easity - should reorganise it later
2025-07-08 13:57:37 +10:00
dhi_holo 3c048b7eb0 Tag Changes
Display Case Items tag now is used for the Display Case, with Item Blocks being entirely separate, rather than being two tags for it.

Also changed the Plaque recipes.
2025-07-08 11:46:21 +10:00
dhi_holo 185b06082c Cleanup 2025-07-07 21:11:52 +10:00
dhi_holo b9bbbc3c4d Display Case Progress
The Decorative Item Blocks that are not wearables now render in the display case! Not perfectly yet, but progress is progress.

Also added temp recipes for the Plaques, they need more design decisions but I wanted the files there for now
2025-07-07 20:43:06 +10:00
dhi_holo f76886bab8 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-07 17:42:09 +10:00
dhi_holo f163cf0722 Update GalaricaWreathBlock.kt
fixing oversight
2025-07-07 17:28:32 +10:00
dhi_holo f1966208a8 Plaques!
Lots of plaques, missing a few recipes still but pretty close to all implemented for the builderinos
2025-07-07 17:27:28 +10:00
dhi_holo 52f4541836 Update CobblemonBlocks.kt 2025-07-06 18:02:11 +10:00
dhi_holo 4c7adb01b7 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-06 15:33:05 +10:00
dhi_holo f40fbf31bb Delete vivichoke_seeds.png
that was a weird file in the wrong place right there
2025-07-06 14:56:33 +10:00
dhi_holo cd1f052837 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-07-06 12:33:36 +10:00
dhi_holo fd323b5e61 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-26 17:46:49 +10:00
dhi_holo 69f4a52621 Pouches and Parity
Sachet, Bright Powder, Metal Powder, and Quick Powder are now placeable, and the DecorativeItemBlocks now place consistently with other blocks.
Tomorrow, we ORB
2025-06-18 20:41:57 +10:00
dhi_holo dff9612db4 Update Sprites
Upgrade, Dubious Disc, and Luminous Moss now use replaced sprites to better match their models. Peat Block now uses the 3D model instead of the sprite, but this can be toggled back using Custom Model Data.
2025-06-17 18:07:38 +10:00
dhi_holo 16049e5476 Slight Texture Relacement, and Moss Has Been Defeated
Block texture folder is becoming a nightmare to navigate, so I've moved my small modelled block textures into a sub-folder, leaving the full block textures in the main folder for now. May do a cleanup to make block texture folder and item texture folder have cleanliness parity at some point, not for this branch.

Also the luminous moss looks good now
2025-06-17 16:36:11 +10:00
dhi_holo 4331375832 It's Destiny
Destiny Knot texture updated with nicer contrast
2025-06-17 12:55:34 +10:00
dhi_holo e1b86ab910 Peatr, the textures are here 2025-06-17 11:37:19 +10:00
dhi_holo 161165d8da The Walls Are No Longer Barren
Galarica Wreath improvements, and two new block types, Wall Attached Decorative Item Blocks, and Wall Attached Stackable Item Blocks. WADIBs include Blunder and Weakness Policies, while WASIBs include the Cleanse and Spell Tags (which are also wearable).
2025-06-16 20:56:59 +10:00
dhi_holo cf5693de8a Peatr and logic for wall decor
the homse was here

Also completely redid the items so far to be itemNameBlockItem as that's a better convention to follow
2025-06-15 20:47:30 +10:00
dhi_holo 9a1afe9342 Never-Melt Crown 2025-06-15 11:21:13 +10:00
dhi_holo b3e77f9eb1 Merge branch 'decorative-items-proofofconceptbranch' of https://gitlab.com/cable-mc/cobblemon into decorative-items-proofofconceptbranch 2025-06-14 21:14:17 +10:00
plastered_crab df06413ffb Potion changes 2025-06-14 04:11:30 -07:00
dhi_holo 9aa67d836b Potion Start and Never-Melt 2025-06-14 20:47:19 +10:00
dhi_holo 24bbb57ca4 Update CobblemonBlocks.kt
Checkpoint of the potion blocks before I totally upend this logic because it feels like class bloat
2025-06-14 17:31:23 +10:00
plastered_crab c976c9f85b Merge remote-tracking branch 'origin/decorative-items-proofofconceptbranch' into decorative-items-proofofconceptbranch 2025-06-13 23:59:21 -07:00
plastered_crab 16b94b19dc Potion changes 2025-06-13 23:59:09 -07:00
dhi_holo 5d2473066d Fixed an import 2025-06-14 16:45:39 +10:00
plastered_crab a835a8d314 Potion changes 2025-06-13 23:16:51 -07:00
plastered_crab 0bc351a533 Merge remote-tracking branch 'origin/decorative-items-proofofconceptbranch' into decorative-items-proofofconceptbranch 2025-06-13 22:56:28 -07:00
plastered_crab 7ad5e88402 Potion change to allow for menu to pop up only when in battle 2025-06-13 22:55:15 -07:00
dhi_holo 5a610932a2 very minor model tweak
NO. MORE. Z-FIGHTING!
2025-06-14 15:37:53 +10:00
dhi_holo 0bafe7e682 Merge branch 'decorative-items-proofofconceptbranch' of https://gitlab.com/cable-mc/cobblemon into decorative-items-proofofconceptbranch 2025-06-14 15:13:28 +10:00
plastered_crab 1260420bfb Potion change to allow for menu to pop up only when in battle 2025-06-13 22:12:38 -07:00
dhi_holo 185e8ec9b2 Translucents and Dubious Fix 2025-06-14 15:10:36 +10:00
dhi_holo f782c0f6ed Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-14 14:54:53 +10:00
dhi_holo aec0717e75 Stacks and Stacks
Ugrades and Dubious Discs are now placeable. They can be placed up to four times within the same block. This is done with a new class to let me do it for any future decorative blocks too! Huzzah.
2025-06-14 14:54:45 +10:00
dhi_holo 55276f5e96 Began Investigating Display Case Stuff
Committing this in an ask for help. I want the Relic Coin Pouch rendering stuff to work for all items added to this tag, just awkwardly shoving it in didn't work, so I'm pushing all my changes to ask for help.
2025-06-13 17:09:01 +10:00
dhi_holo 3e81be4c75 Weather Rocks!
Very good desk decoration
2025-06-13 12:28:04 +10:00
dhi_holo 37c393d314 Update GalaricaWreathBlock.kt 2025-06-12 17:31:19 +10:00
dhi_holo a0ee80b3b6 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-12 16:03:51 +10:00
dhi_holo 3809da42b2 Tick Tock (But Refined)
Metronome now has a togglable animation state, fixed issue with Galarica Wreath waterlogging
2025-06-12 16:03:36 +10:00
dhi_holo a18e96c10d Tick Tock
Metronome block now exists
2025-06-11 19:57:49 +10:00
dhi_holo adf159fd8e Knot Right?
Destiny Knot is now a block

Also added a Galarica block tag
2025-06-11 14:36:38 +10:00
dhi_holo 53dfdfd0c2 Galarica Complete, plus Shelmet Shell Helmet
Also fix something I've been overlooking
2025-06-11 13:11:05 +10:00
dhi_holo b956016c2d Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-11 11:16:05 +10:00
dhi_holo 119d11e03c Galar Foreva!!!
Minor cleanup of how the general decorative voxelshape is handled, and the start of the wreath nightmare
No data files yet, need to improve the placement logic on the wreath to let it have different rules for each direction
2025-06-10 20:19:44 +10:00
dhi_holo 55c8380777 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-10 16:05:58 +10:00
dhi_holo 90c7b88007 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-09 09:54:30 +10:00
dhi_holo 033137029d Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-08 12:59:07 +10:00
dhi_holo fa2246843f moss, yummy 2025-06-07 18:30:07 +10:00
dhi_holo 2dfa3dcdc1 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-07 16:12:08 +10:00
dhi_holo 8812c775cf Better Boundary Kings Rock
Just making it fit the model a little better, nothing fancy
(Also cleaning up some unused bounding boxes for the teapots)
2025-06-06 17:09:24 +10:00
dhi_holo f6c003e90f Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-06 16:29:05 +10:00
Polymeta 9c39cb3ebc make wearable check if a block got passed in and use that translation key otherwise item fallback lang
Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com>
2025-06-05 16:30:45 +01:00
dhi_holo 36f5c4597e Update en_us.json 2025-06-05 20:04:24 +10:00
dhi_holo f0aa728174 Fully Functional 2025-06-05 20:03:41 +10:00
Polymeta 4f34b6b556 fix errors and allow wearbles to be swapped with right click (same as armoritems)
Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com>
2025-06-05 10:07:21 +01:00
Polymeta d639f78571 make wearableItem a blockItem but make sure only valid blocks can be placed
Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com>
2025-06-05 00:11:13 +01:00
dhi_holo 6adc3991db Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-05 08:12:42 +10:00
dhi_holo 2f7889df97 Update CobblemonItems.kt 2025-06-05 08:11:28 +10:00
dhi_holo d8a667c424 Delete kings_rock.png 2025-06-04 20:27:59 +10:00
dhi_holo 9fda6a53c5 You Are King 2025-06-04 20:27:46 +10:00
dhi_holo c80ce11314 you are king 2025-06-04 20:26:38 +10:00
dhi_holo ef58eb86da Would You Care For Some Tea??? 2025-06-04 16:27:17 +10:00
dhi_holo 02129fe2a1 Merge branch 'main' into decorative-items-proofofconceptbranch 2025-06-04 09:46:22 +10:00
dhi_holo 3f2d8cec09 IT WORKS
Implemented a functional placeable Kings Rock!

Still needs a couple things to improve this, like being able to set the hitbox for each instance of the block implementation (like tumblestones), but for a first try I'm proud
2025-01-18 15:16:51 +10:00
805 changed files with 27330 additions and 367 deletions
+487
View File
@@ -2,6 +2,493 @@
## [1.7.1 (MONTH xth, 2025)](#1-7-1)
### Additions
- Added `/npcdelete` uuid parameter support and usuable to console
- Added `/spectateBattle <player>` command to spectate battles without having to manually walk up to the target.
- Added an in-game configuration screen, allowing all settings from `main.json` to be edited directly in-game.
- Added `/cobblemonconfig reload` command to reload `main.json` configuration. **Note:** Some settings require a server restart to take effect; use this command cautiously.
- Added `blacklisted_items_to_hold` and `whitelisted_items_to_hold` tags to allow for controlling which items players can give to their Pokémon. If the whitelist is empty, it will consider all item as allowed (unless they are in the blacklist).
- Pokémon now follow the mouse cursor on the Summary screen, with an option to disable this in the settings.
- Added Datapackable Item interactions with Pokemon
- Pokémon's held items can now be rendered, with a visibility toggle in the Summary screen.
- Added cosmetic item functionality for Pokémon. Certain cosmetic items can be given to applicable Pokémon via the interact menu.
- Added the various log blocks as cosmetic items for Timburr and Komala.
- Added cosmetics for Spoink, Gurdurr, Conkeldurr, Squirtle Line, Sneasler, Sandile line, Treecko line, Braixen, Delphox, and Dragonite.
- Added Gilded Chest cosmetics for Chest Gimmighoul and Gholdengo
- Added `visibility/hidden`, `visibility/hat` and `visibility/face` tags to control where and how certain items are rendered.
- Added Pokémon markings, toggleable within the summary.
- Added `/boxcount` command to change PC boxes amount
- Added `/transformmodelpart (position|rotation|scale) <modelPart> <transform: x y z>` command that can add transformations to a pokemon's model part.
- The player executing the command must be facing the target pokemon entity. Transformations are not persistent and will revert when resources are reloaded.
- Added `legacy` and `special` sourced moves to Pokémon.
- Added lang keys for all moves and abilities up to Generation 9.
- Added `translucent_cull` boolean option into resolver's layer to allow for translucent textures with culling
- Added [LambDynamicLights](https://modrinth.com/mod/lambdynamiclights) support for items held by Pokémon, evolution stone blocks, evolution stone items, Pokédex, Luminous Moss, Flame Orb, and Magmarizer.
- Added the Clear Amulet, Grip Claw, Lagging Tail, Luminous Moss, Metal Alloy, Scroll of Darkness, Scroll of Waters
- Added Recipes for Masterpiece Cup, Eject Pack.
- Added modification to Minecraft Creative Inventory search to account for item names that contain `poké` when input contains `poke`.
- Added Campfire Pot as well as loads of new food items (Poke Puffs, Ponigiri, Sinister Tea, etc)
- Added Hearty Grains, a new crop used in the new cooking mechanic
- Added Tatami blocks and Tatami Mat blocks, made from Hearty Grain, for decorating builds
- Added `/pcsearch <player> <pokemonProperties>` command that searches for a specific Pokémon within a player's PC.
- Added `/pctake <player> <box> <slot>` command that takes a specific Pokémon from a player's PC. Removes the pokemon if target is self or ran from the server.
- Added Hyper Training items (IV Modification) as well as some additional candy items to do so (Health Candy, Sickly Candy)
- Added Galarica Nut Bushes
- Many Pokémon (mostly cats) are now feared by phantoms
- Combees are now capable of gathering nectar from flowers and delivering it to either Saccharine leaves or hives. (Hive interactions are restricted to wild Combees)
- Lightning is now affected by a Pokemon's ability/typing
- Pokémon with the ability Lightning Rod draw in lightning similar to a lightning rod block albeit with a lower priority and range, gain immunity to lightning damage, and receive a temporary damage buff.
- Pokémon with the ability Motor Drive are immune to lightning damage and receive a temporary speed buff when struck by lightning
- Pokémon with the ability Volt Absorb are immune to lightning damage and receive Regeneration II for a short duration
- Ground type Pokémon are immune to lightning damage
- Added functionality to Everstone when held by a Pokémon; suppresses evolution notification and hides evolve button in summary interface.
- Added optional `filePath` parameter to MoLang functions to allow for global stores (ex. `../global/`). Path must end in a forward slash.
- Added new optional property `attachment_options` for most EmitterShapes to be attached to the locator/entities scale, rotation, and/or position. Position is true by default.
- Galarica Nut bushes now generate on beaches
- Added a lot of new blocks
- Floor Placeable: Damp Rock, Heat Rock, Icy Rock, Smooth Rock, Sachet, Bright Powder, Metal Powder, Quick Powder, Luminous Moss, Chipped Pot, Cracked Pot, Masterpiece Teacup, Unremarkable Teacup, Destiny Knot, Iron Ball, Hard Stone, Galarica Cuff, Kings Rock, Never-Melt Ice
- Floor Stackable: Upgrade, Dubious Disc, Metal Coat, Potion, Super Potion, Hyper Potion, Max Potion, Full Restore, Antidote, Awakening, Burn Heal, Ice Heal, Paralyze Heal, Full Heal, Ether, Elixir, Max Ether, Max Elixir, X Accuracy, X Attack, X Defence, X Special Attack, X Special Defence, X Speed, Dire Hit, Guard Spec, HP Up, Protein, Iron, Carbos, Calcium, Zinc, PP Up, PP Max
- Floor Interactive: Metronome
- Wall Placeable: Weakness Policy, Blunder Policy
- Wall Stackable: Cleanse Tag, Spell Tag
- Wall Interactive: Ring Target
- Six Face (Rotation): Galarica Wreath, Magnet, Flame Orb, Toxic Orb, Life Orb, Smoke Ball, Light Ball, White Plaque, Light Gray Plaque, Gray Plaque, Black Plaque, Brown Plaque, Red Plaque, Orange Plaque, Yellow Plaque, Lime Plaque, Green Plaque, Cyan Plaque, Light Blue Plaque, Blue Plaque, Purple Plaque, Magenta Plaque, Pink Plaque
- Six Face (Rotation) Interactive: Eject Button
- Six Directional Block: Peat Block
- Added recipe to Smoke Ball and Light Ball
- Galarica Nut bushes now generate on beaches.
- Some Pokémon now pitch their bodies in the direction they're moving.
- Added new advancements Didn't Stop To Think, We Need To Cook, and Pokémon Jockey!.
- Berries can now be smelted into their respective dyes.
- Added Syrupy Apples.
- Added `/runmolang <molang> [<npc>|<player>|<pokemon>]` command that executes a MoLang expression with the provided options as environment variables, as well as the entity (as `q.entity`) that executed the command.
- Added bubble quirk to Kingler; like Krabby, Kingler will blows bubbles during dusk.
- Added `.Pre` and `.Post` to the following events:
- `PokemonRecallEvent`
- `TradeEvent`
- Added a new gamerule, 'healerHealsPC', when set to true a successful use of a healer will also heal all of the Pokemon in that player's PC.
### Pokémon Added
#### Gen 2
- Marill
- Azumarill
- Hoppip
- Skiploom
- Jumpluff
- Dunsparce
- Togepi
- Togetic
- Unown
- Houndour
- Houndoom
- Ho-Oh
- Lugia
- Alola Bias Pichu (built-in resourcepack)
#### Gen 3
- Azurill
- Meditite
- Medicham
- Electrike
- Manectric
- Spoink
- Grumpig
- Swablu
- Altaria
- Snorunt
- Glalie
- Latias
- Latios
#### Gen 4
- Bronzor
- Bronzong
- Croagunk
- Toxicroak
- Froslass
- Glameow
- Purugly
- Skorupi
- Drapion
- Togekiss
#### Gen 5
- Pansage
- Simisage
- Pansear
- Simisear
- Panpour
- Simipour
- Munna
- Musharna
- Blitzle
- Zebstrika
- Drilbur
- Excadrill
- Trubbish
- Garbodor
- Gothita
- Gothorita
- Gothitelle
- Solosis
- Duosion
- Reuniclus
- Tynamo
- Eelektrik
- Eelektross
- Axew
- Fraxure
- Haxorus
- Mienfoo
- Mienshao
- Sewaddle
- Swadloon
- Leavanny
- Druddigon
#### Gen 6
- Skiddo
- Gogoat
- Espurr
- Meowstic
- Inkay
- Malamar
- Hawlucha
- Dedenne
- Noibat
- Noivern
- Furfrou
- You can change Furfrou's form by using shears on it while it holds a certain dye in its cosmetic slot.
#### Gen 7
- Yungoos
- Gumshoos
- Drampa
- Alolan Grimer
- Alolan Muk
- Togedemaru
#### Gen 8
- Skwovet
- Greedent
- Chewtle
- Drednaw
- Toxel
- Toxtricity
- Morpeko
- Silicobra
- Sandaconda
- Sinistea
- Polteageist
- Galarian Corsola
- Cursola
- Mr. Rime
- Galarian Mr. Mime
- Clobbopus
- Grapploct
- Galarian Weezing
#### Gen 9
- Smoliv
- Dolliv
- Arboliva
- Tarountula
- Spidops
- Orthworm
- Dudunsparce
- Cyclizar
- Poltchageist
- Sinistcha
- Capsakid
- Scovillain
- Tadbulb
- Bellibolt
- Toedscool
- Toedscruel
- Rellor
- Rabsca
- Bramblin
- Brambleghast
### Animation updates for the following Pokémon
- Garchomp
- Tropius
- Nosepass
- Probopass
- Sneasel
- Weavile
- Sneasler
- Braixen
- Delphox
- Cinderace
- Kangaskhan
- Gossifleur
- Eldegoss
- Stonjourner
- Wailmer
- Lechonk
- Oinkologne
- Dratini
- Dragonair
- Dragonite
- G. Corsola
- Cursola
- Dunsparce
- Dudunsparce (both forms)
- Porygon
- Porygon2
- Porygon-Z
- Wattrel
- Kilowattrel
- Golurk
- Spinarak
- Ariados
- Wyrdeer
- Tyrantrum
- Pidove
- Tranquill
- Unfezant
- Beldum
- Metang
- Metagross
- Plusle
- Minun
- Murkrow
- Honchkrow
- Larvesta
- Volcarona
- Dwebble
- Crustle
- Mr. Mime
- Flygon
- Pichu
- Pikachu
- Raichu
- Alolan Raichu
- Espathra
- Abra
- Kadabra
- Alakazam
- Deino
- Zweilous
- Hydreigon
- Slaking
- Klink
- Klang
- Klinklang
- Baltoy
- Claydol
- Mamoswine
- Rufflet
- Braviary
- Girafarig
- Farigiraf
- Rookidee
- Corvisquire
- Corviknight
- Venipede
- Whirlipede
- Scolipede
- Venusaur
- Parasect
- Bastiodon
- Amaura
- Varoom
- Revavroom
- Bouffalant
- Lickilicky
- Blaziken
- Rhyhorn
- Rhydon
- Rhyperior
- Tauros
- Tauros - Paldea Aqua
- Tauros - Paldea Blaze
- Tauros - Paldea Combat
- Dewgong
- Exeggutor - Kanto
### Model updates for the following Pokémon
- Cleffa
- Clefairy
- Clefable
- Gyarados
- Dragonite
- Eevee
- Vaporeon
- Jolteon
- Flareon
- Espeon
- Umbreon
- Leafeon
- Glaceon
- Sylveon
- Treecko
- Grovyle
- Sceptile
- Honchkrow
- Gible
- Gabite
- Garchomp
- Pidgeot
- Nosepass
- Probopass
- Kangaskhan
- Cinderace
- Magnemite
- Magneton
- Magnezone
- Beldum
- Metang
- Metagross
- Hoothoot
- Noctowl
- Teddiursa
- Ursaring
- Ursaluna
- Heatmor
- Bouffalant
- Sigilyph
- Sharpedo
- Maractus
- Clodsire
- Scyther
- Scizor
- Cacturne
- Taillow
- Swellow
- Seel
- Dewgong
- Honedge
- Doublade
- Aegislash
- Drowzee
- Hypno
- Mudkip
- Marshtomp
- Swampert
- Shelmet
- Escavalier
- Klink
- Klank
- Klinklang
- Spinarak
- Ariados
- Pidove
- Tranquill
- Unfezant
- Sobble
- Drizzile
- Inteleon
- Plusle
- Minun
- Murkrow
- Zorua
- Zoroark
- Mime.Jr
- Mr. Mime
- Pichu
- Pikachu
- Raichu
- Alolan Raichu
- Dusknoir
- Deino
- Zweilous
- Hydreigon
- Dreepy
- Drakloak
- Dragapult
- Mamoswine
- Rookidee
- Corvisquire
- Corviknight
- Venipede
- Whirlipede
- Scolipede
- Farigiraf
- Staryu
- Starmie
- Gimmighoul
- Gholdengo
- Starly
- Staravia
- Staraptor
- Varoom
- Revavroom
- Nickit
- Thievul
- Litwick
- Lampent
- Chandelure
### Changes
- Changed pokemon caught and seen count to update based on the current pokedex being looked
- Renamed `chargeGainedPerTick` config to `secondsToChargeHealingMachine`.
- Made Blocks of Gold count as Big Nuggets when held by a Pokémon (for Fling functionality)
- Players can now eat Sweet and Tart Apples, Whipped Dreams, and the Alcremie Sweets.
- Updated Sweet and Tart Apple sprites
- Updated the following recipes: Air Balloon, Assault Vest, Binding Band, Black Belt, Blunder Policy, Choice Band, Choice Scarf, Cleanse Tag, Covert Cloak, Destiny Knot, Eject Button, Expert Belt, Focus Band, Focus Sash, Magnet, Metronome, Muscle Band, Power Anklet, Power Band, Power Belt, Power Bracer, Power Lens, Power Weight, Protective Pads, Protein, Punching Glove, Reaper Cloth, Rocky Helmet, Room Service, Sachet, Safety Goggles, Silk Scarf, Spell Tag, Utility Umbrella, Weakness Policy, Zinc, Chipped Pot, Cracked Pot, Unremarkable Cup, Loaded Dice, Charcoal Stick, Dragon Fang, Miracle Seed, Mystic Water, Never Melt Ice, Twisted Spoon, Black Glasses, Fairy Feather, Hard Stone, Silver Powder, Soft Sand
- Added alternate ingredient options to the following recipes: Cell Battery, Damp Rock, Heat Rock, Icy Rock, Smooth Rock
- Grouped together some recipes within the Recipe Book. Groups include: the seven basic Poké Balls, the seven basic Ancient Poké Balls, Gilded Chests, Pokedexes, and the Weather Rocks.
- Updated some item tags to better integrate behaviours between Cobblemon, Vanilla Minecraft, and other mods
- Removed Cooked Meat, Raw Meat, Protein Ingredients, and Zinc Ingredients, the first two are now using `c` namespace tags, the latter have better integrated use of tags within their recipes which removes need for custom tags.
- Added our seeds tag into `#c:seeds`, which is now made use of for the Miracle Seed recipe.
- Added herbs and snowballs to the consumable in PvE and Wild battle tags
- Tweaked the Natural Materials Vanilla file to fit with the changes to tags
- Substantially optimised spawning checks mainly by front-loading biome filtering.
- When using the `cobblemon` or `generation_9` capture calculators a critical capture with a single shake will always play for successful captures when you've already registered the Pokémon as caught in your Pokédex.
- Improved the performance of saving Pokédex and player data.
- Pokémon hitbox now scales with entity attribute `generic.scale`.
- Removed Shulker aspect and replaced it with cosmetic_item-shulker_shell.
- Shulker shell Forretress is now a cosmetic rather than a special evo and thus all shulker Forretress will revert back to normal until a shulker shell is put in their cosmetic slot.
- Updated `doPokemonSpawning` gamerule to support per-dimension configurations.
- The Pokedex now displays a form name of a "normal" Pokémon for when the base form is still a named form.
- Improved the zoom functionality of the Pokédex Scanner by giving the levels logarithmic scaling.
- Added a subtle rotation effect to the Pokédex Scanner's wheel when zooming.
- Improved parity with vanilla mobs' drop behavior; loot and XP drop on death instead of after the entire death sequence finishes.
- Quirk animations no longer play in the battle GUI since they were pretty distracting.
- A number of Pokemon that float above the ground visually (Gastly, Klingklang, etc.) are no longer considered to be touching the ground
- Changed the recipes for Level, Lure, and Moon Balls to be cleaner
- Renamed `pokemonId` and `type` to `species` in relevant Advancement triggers for conformity, this is a breaking change.
- Added a separate `species` argument to the `pick_starter`, `pasture_use` and `resurrect_pokemon` Advancement triggers.
- Made `CobblemonAgingDespawner` thresholds configurable via the config file.
- Tweaked Berry flavor data to balance cooking pot mechanics
- Made Red, Yellow, Green, Blue, Pink, Black, and White Apricorn Sprout and Saccharine Sapling able to be placed into flower pots.
- Added all Potted Apricorn Sprouts, Potted Saccharine Saplings, and Potted Pep-Up Flowers to the `#minecraft:flower_pots` block tag
- Corrected the healing values of the remedies and energy root, and reintroduced the friendship lowering mechanics for them, revival herb, and heal powder
- Updated battle language keys for side effects to use position-specific formats, improving grammatical consistency
- Saccharine Leaves are now Collectable
- Saccharine Leaves Age 1 or higher will now show Yellow particles when broken
- Destroying a Saccharine Honey Log will now drop a Saccharine Log instead of nothing
- Reworked some compost chances
- Updated interaction interface to include 4 more option spaces
- Made lecterns that hold a Pokédex emit light.
- Updated light levels for active PC, Pasture, Healing Machine, and Data Monitor.
- Vivichokes now always drop one seed when harvested, and converting a fully grown Vivichoke to seeds via crafting results in 1 seed.
- Healing Machine recipe rebalanced.
- Reorganised the `block` texture folder to be more organised, in line with the `item` texture folder.
- Offset in EmitterShape now ignores scale to be more like Blockbench by default. You can get this behaviour back by adding `"scale": true` in the `attachment_options` property in most EmitterShapes.
- Not specifying a dex in `/pokedex printcalculations {player} {dex}` will now print the National Dex statistics instead of showing all dexes. `/pokedex printcalculations {player} all` is how to view all dex statistics in one command.
- `custom_model_data=1` on items can now be displayed when placed in a Display Case by adding to the item tag `cobblemon:display_case_items`
- Upgrade, Dubious Disc, and Luminous Moss sprites have been updated to better match the new block forms
- Updated Peat Block and Peat Mulch recipes
- Minor tab reorganisation
- Removed Braised Vivichoke
- Updated Pokémon state icons shown in party interfaces
- MoLang `face` function can now be run on any `PosableEntity` (Like Pokémon!) instead of just NPCs.
- MoLang `run_action_effect` now works on Pokémon.
- Changed MoLang entity function `is_standing_on` to allow for block tags in the list.
- Added entity (as `q.entity`) that executed the command to the `executemolangscript` command.
- Refactored the following events to `.Pre` and `.Post` for consistency:
- `PokemonSentEvent`
- `ExperienceGainedEvent`
- `BattleStartedEvent`
- Updated `PokemonSentEvent` parameters to include the Position and Level of the Pokémon being sent out.
- Updated `EvolutionCompleteEvent` parameters to include the Source Pokemon that evolved.
- Updated `HatchEggEvent.Post` to include the Pokemon that hatched.
- Roseli Berry Trees now naturally generate in their preferred biomes.
- Refactored dynamic lights compat to be more future proof. The dynamic light support is only tested with LambDynamicLights, on NeoForged use that mod in combination with Sinytra Connector
- Shulker Boxes and Traveler's Backpacks can no longer be held by Pokémon. Thanks Monocle ;) You could re-enable this with a datapack but you'd be crazy.
### Changes
@@ -10,19 +10,26 @@ package com.cobblemon.mod.common
import com.cobblemon.mod.common.api.apricorn.Apricorn
import com.cobblemon.mod.common.block.*
import com.cobblemon.mod.common.block.campfirepot.CampfireBlock
import com.cobblemon.mod.common.block.LecternBlock
import com.cobblemon.mod.common.block.MintBlock.MintType
import com.cobblemon.mod.common.block.campfirepot.CampfireBlock
import com.cobblemon.mod.common.block.campfirepot.CampfirePotBlock
import com.cobblemon.mod.common.block.chest.GildedChestBlock
import com.cobblemon.mod.common.block.decor.*
import com.cobblemon.mod.common.block.decor.DecorativeItemBlock.ItemType
import com.cobblemon.mod.common.block.decor.StackableItemBlock.StackableItemType
import com.cobblemon.mod.common.block.decor.WallAttachedDecorativeItemBlock.WallItemType
import com.cobblemon.mod.common.block.decor.WallAttachedStackableItemBlock.WallStackableItemType
import com.cobblemon.mod.common.block.decor.SixFaceDecorativeItemBlock.SixFaceItemType
import com.cobblemon.mod.common.block.general.BaleBlock
import com.cobblemon.mod.common.block.general.HorizontalRotationCarpetBlock
import com.cobblemon.mod.common.block.general.HorizontalRotationalBlock
import com.cobblemon.mod.common.block.general.SixDirectionalBlock
import com.cobblemon.mod.common.block.grower.SaccharineTreeGrower
import com.cobblemon.mod.common.block.sign.CobblemonHangingSignBlock
import com.cobblemon.mod.common.block.sign.CobblemonSignBlock
import com.cobblemon.mod.common.block.sign.CobblemonWallHangingSignBlock
import com.cobblemon.mod.common.block.sign.CobblemonWallSignBlock
import com.cobblemon.mod.common.block.general.HorizontalRotationCarpetBlock
import com.cobblemon.mod.common.block.general.HorizontalRotationalBlock
import com.cobblemon.mod.common.mixin.invoker.*
import com.cobblemon.mod.common.platform.PlatformRegistry
import com.cobblemon.mod.common.util.cobblemonResource
@@ -460,6 +467,179 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
@JvmField
val RELIC_COIN_SACK = create("relic_coin_sack", CoinPouchBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.RELIC_COIN_SACK_SOUNDS).pushReaction(PushReaction.DESTROY).strength(0.4f), false))
@JvmField
val KINGS_ROCK = create("kings_rock", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.TUMBLESTONE_BLOCK_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), ItemType.GENERIC_7x6))
@JvmField
val CHIPPED_POT = create("chipped_pot", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.TUMBLESTONE_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), ItemType.TEAPOT))
@JvmField
val CRACKED_POT = create("cracked_pot", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.TUMBLESTONE_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), ItemType.TEAPOT))
@JvmField
val MASTERPIECE_TEACUP = create("masterpiece_teacup", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.TUMBLESTONE_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), ItemType.TEACUP))
@JvmField
val UNREMARKABLE_TEACUP = create("unremarkable_teacup", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.TUMBLESTONE_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), ItemType.TEACUP))
@JvmField
val LUMINOUS_MOSS = create("luminous_moss", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.MOSS).mapColor(MapColor.NONE).noOcclusion().lightLevel{5}, ItemType.MOSS))
@JvmField
val GALARICA_CUFF = create("galarica_cuff", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.SWEET_BERRY_BUSH).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().noCollission(), ItemType.GENERIC_8x4))
@JvmField
val GALARICA_WREATH = create("galarica_wreath", GalaricaWreathBlock(BlockBehaviour.Properties.of().sound(SoundType.SWEET_BERRY_BUSH).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().noCollission()))
@JvmField
val DESTINY_KNOT = create("destiny_knot", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOL).mapColor(MapColor.NONE).noOcclusion(), ItemType.KNOT))
@JvmField
val METRONOME = create("metronome", MetronomeBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion()))
@JvmField
val DAMP_ROCK = create("damp_rock", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.DRIPSTONE_BLOCK).mapColor(MapColor.NONE).noOcclusion(), ItemType.GENERIC_8x))
@JvmField
val HEAT_ROCK = create("heat_rock", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.DRIPSTONE_BLOCK).mapColor(MapColor.NONE).noOcclusion(), ItemType.GENERIC_8x))
@JvmField
val ICY_ROCK = create("icy_rock", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.DRIPSTONE_BLOCK).mapColor(MapColor.NONE).noOcclusion(), ItemType.GENERIC_8x))
@JvmField
val SMOOTH_ROCK = create("smooth_rock", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.DRIPSTONE_BLOCK).mapColor(MapColor.NONE).noOcclusion(), ItemType.GENERIC_8x))
@JvmField
val UPGRADE = create("upgrade", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.UPGRADE))
@JvmField
val DUBIOUS_DISC = create("dubious_disc", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.UPGRADE))
@JvmField
val NEVER_MELT_ICE = create("never_melt_ice", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().friction(0.989F), ItemType.GENERIC_7x6))
@JvmField
val PEAT_BLOCK = create("peat_block", SixDirectionalBlock(BlockBehaviour.Properties.of().mapColor(MapColor.CLAY).strength(0.5f).sound(SoundType.MUD)))
@JvmField
val CLEANSE_TAG = create("cleanse_tag", WallAttachedStackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOD).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().noCollission(), WallStackableItemType.TAG))
@JvmField
val SPELL_TAG = create("spell_tag", WallAttachedStackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOD).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().noCollission(), WallStackableItemType.TAG))
@JvmField
val BLUNDER_POLICY = create("blunder_policy", WallAttachedDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOD).mapColor(MapColor.NONE).noOcclusion().noCollission(), WallItemType.POLICY))
@JvmField
val WEAKNESS_POLICY = create("weakness_policy", WallAttachedDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOD).mapColor(MapColor.NONE).noOcclusion().noCollission(), WallItemType.POLICY))
@JvmField
val SACHET = create("sachet", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.RELIC_COIN_POUCH_SOUNDS).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion(), ItemType.POUCH))
@JvmField
val BRIGHT_POWDER = create("bright_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.RELIC_COIN_POUCH_SOUNDS).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().lightLevel{2}, ItemType.POUCH))
@JvmField
val METAL_POWDER = create("metal_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.RELIC_COIN_POUCH_SOUNDS).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion(), ItemType.POUCH))
@JvmField
val QUICK_POWDER = create("quick_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.RELIC_COIN_POUCH_SOUNDS).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion(), ItemType.POUCH))
@JvmField
val LIFE_ORB = create("life_orb", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().lightLevel{2}, SixFaceItemType.GENERIC_8x))
@JvmField
val FLAME_ORB = create("flame_orb", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().lightLevel{15}, SixFaceItemType.GENERIC_8x))
@JvmField
val TOXIC_ORB = create("toxic_orb", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), SixFaceItemType.GENERIC_8x))
@JvmField
val LIGHT_BALL = create("light_ball", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().lightLevel{13}, SixFaceItemType.GENERIC_8x))
@JvmField
val SMOKE_BALL = create("smoke_ball", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), SixFaceItemType.GENERIC_8x))
/*@JvmField
val SOUL_DEW = create("soul_dew", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().lightLevel{11}, SixFaceItemType.GENERIC_8x))*/
@JvmField
val IRON_BALL = create("iron_ball", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion().strength(5f), ItemType.GENERIC_8x)) //TODO Determine whether this should be a falling block with damage source - Idea is solid, but the damage bit is concerning to get working, so leaving it as a maybe for now
@JvmField
val HARD_STONE = create("hard_stone", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.STONE).mapColor(MapColor.NONE).noOcclusion().strength(0.5f), ItemType.GENERIC_8x))
@JvmField
val RING_TARGET = create("ring_target", WallAttachedTargetBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOD).mapColor(MapColor.NONE).noOcclusion().strength(0.5f)))
@JvmField
val EJECT_BUTTON = create("eject_button", EjectButtonBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).strength(1.0f).pushReaction(PushReaction.DESTROY)))
@JvmField
val METAL_COAT = create("metal_coat", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.METAL_COAT))
@JvmField
val MAGNET = create("magnet", SixFaceDecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion(), SixFaceItemType.MAGNET))
@JvmField
val POTION = create("potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.POTION))
@JvmField
val SUPER_POTION = create("super_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.POTION))
@JvmField
val HYPER_POTION = create("hyper_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.POTION))
@JvmField
val MAX_POTION = create("max_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.MAX_POTION))
@JvmField
val FULL_RESTORE = create("full_restore", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.MAX_POTION))
@JvmField
val ANTIDOTE = create("antidote", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.RESTORE))
@JvmField
val AWAKENING = create("awakening", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.RESTORE))
@JvmField
val BURN_HEAL = create("burn_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.RESTORE))
@JvmField
val ICE_HEAL = create("ice_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.RESTORE))
@JvmField
val PARALYZE_HEAL = create("paralyze_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.RESTORE))
@JvmField
val FULL_HEAL = create("full_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.RESTORE))
@JvmField
val ETHER = create("ether", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.ETHER))
@JvmField
val MAX_ETHER = create("max_ether", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.ETHER))
@JvmField
val ELIXIR = create("elixir", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.ETHER))
@JvmField
val MAX_ELIXIR = create("max_elixir", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.ETHER))
@JvmField
val X_ACCURACY = create("x_accuracy", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val X_ATTACK = create("x_attack", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val X_DEFENCE = create("x_defence", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val X_SPECIAL_ATTACK = create("x_special_attack", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val X_SPECIAL_DEFENCE = create("x_special_defence", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val X_SPEED = create("x_speed", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val DIRE_HIT = create("dire_hit", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val GUARD_SPEC = create("guard_spec", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.BATTLE_X))
@JvmField
val HP_UP = create("hp_up", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val PROTEIN = create("protein", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val IRON = create("iron", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val CARBOS = create("carbos", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val CALCIUM = create("calcium", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val ZINC = create("zinc", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val PP_UP = create("pp_up", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val PP_MAX = create("pp_max", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion(), StackableItemType.VITAMIN))
@JvmField
val WHITE_PLAQUE = create("white_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val LIGHT_GRAY_PLAQUE = create("light_gray_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val GRAY_PLAQUE = create("gray_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val BLACK_PLAQUE = create("black_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val BROWN_PLAQUE = create("brown_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val RED_PLAQUE = create("red_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val ORANGE_PLAQUE = create("orange_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val YELLOW_PLAQUE = create("yellow_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val LIME_PLAQUE = create("lime_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val GREEN_PLAQUE = create("green_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val CYAN_PLAQUE = create("cyan_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val LIGHT_BLUE_PLAQUE = create("light_blue_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val BLUE_PLAQUE = create("blue_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val PURPLE_PLAQUE = create("purple_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val MAGENTA_PLAQUE = create("magenta_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val PINK_PLAQUE = create("pink_plaque", PlaqueBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.METAL).noOcclusion().pushReaction(PushReaction.DESTROY).strength(5.0F)))
@JvmField
val GILDED_CHEST = create("gilded_chest", GildedChestBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.CHEST).noOcclusion().sound(CobblemonSounds.GILDED_CHEST_SOUNDS), GildedChestBlock.Type.RED))
@JvmField
@@ -494,7 +674,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
val LECTERN = create("lectern", LecternBlock(BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD).strength(2.5F).ignitedByLava().lightLevel { if (it.getValue(LecternBlock.EMIT_LIGHT) as Boolean) 13 else 0 }))
@JvmField
val DISPLAY_CASE = create("display_case", DisplayCaseBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.DISPLAY_CASE_SOUNDS).noOcclusion().pushReaction(PushReaction.BLOCK).mapColor(MapColor.STONE).strength(0.3F).requiresCorrectToolForDrops()))
val DISPLAY_CASE = create("display_case", DisplayCaseBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.DISPLAY_CASE_SOUNDS).instrument(NoteBlockInstrument.HAT).noOcclusion().pushReaction(PushReaction.BLOCK).mapColor(MapColor.STONE).strength(0.3F).requiresCorrectToolForDrops()))
// TODO after 1.7
// @JvmField
@@ -44,6 +44,7 @@ import com.cobblemon.mod.common.pokeball.PokeBall
import com.cobblemon.mod.common.pokemon.IVs
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.client.renderer.item.ItemProperties
import net.minecraft.core.Registry
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries
@@ -66,6 +67,7 @@ import net.minecraft.world.item.SignItem
import net.minecraft.world.item.SmithingTemplateItem
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
@Suppress("unused", "SameParameterValue")
object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<Item>>, Item>() {
@@ -73,7 +75,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
override val resourceKey: ResourceKey<Registry<Item>> = Registries.ITEM
@JvmField
val NPC_EDITOR = create("npc_editor", CobblemonItem(Item.Properties().stacksTo(1)))
val NPC_EDITOR = create("npc_editor", CobblemonItem(Properties().stacksTo(1)))
@JvmField
val pokeBalls = mutableListOf<PokeBallItem>()
@@ -217,7 +219,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
val TATAMI_MAT = blockItem("tatami_mat", CobblemonBlocks.TATAMI_MAT)
@JvmField
val VIVICHOKE = compostableItem("vivichoke", CobblemonItem(Item.Properties()), 0.80f)
val VIVICHOKE = compostableItem("vivichoke", CobblemonItem(Properties()), 0.80f)
@JvmField
val VIVICHOKE_SEEDS = compostableItem("vivichoke_seeds", VivichokeItem(CobblemonBlocks.VIVICHOKE_SEEDS), 0.30f)
@@ -265,9 +267,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val APRICORN_LEAVES = compostableBlockItem("apricorn_leaves", CobblemonBlocks.APRICORN_LEAVES, 0.30f)
@JvmField
val APRICORN_BOAT = create("apricorn_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, false, Item.Properties().stacksTo(1)))
val APRICORN_BOAT = create("apricorn_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, false, Properties().stacksTo(1)))
@JvmField
val APRICORN_CHEST_BOAT = create("apricorn_chest_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, true, Item.Properties().stacksTo(1)))
val APRICORN_CHEST_BOAT = create("apricorn_chest_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, true, Properties().stacksTo(1)))
@JvmField
val APRICORN_DOOR = blockItem("apricorn_door", CobblemonBlocks.APRICORN_DOOR)
@@ -286,25 +288,33 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val APRICORN_STAIRS = blockItem("apricorn_stairs", CobblemonBlocks.APRICORN_STAIRS)
@JvmField
val APRICORN_SIGN = this.create("apricorn_sign", SignItem(Item.Properties().stacksTo(16), CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN))
val APRICORN_SIGN = this.create("apricorn_sign", SignItem(Properties().stacksTo(16), CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN))
@JvmField
val APRICORN_HANGING_SIGN = this.create("apricorn_hanging_sign", HangingSignItem(CobblemonBlocks.APRICORN_HANGING_SIGN, CobblemonBlocks.APRICORN_WALL_HANGING_SIGN, Item.Properties().stacksTo(16)))
val APRICORN_HANGING_SIGN = this.create("apricorn_hanging_sign", HangingSignItem(CobblemonBlocks.APRICORN_HANGING_SIGN, CobblemonBlocks.APRICORN_WALL_HANGING_SIGN, Properties().stacksTo(16)))
@JvmField
val GILDED_CHEST = this.create("gilded_chest", BlockItem(CobblemonBlocks.GILDED_CHEST, Item.Properties()))
val GILDED_CHEST = this.create("gilded_chest", BlockItem(CobblemonBlocks.GILDED_CHEST, Properties()))
@JvmField
val BLUE_GILDED_CHEST = this.create("blue_gilded_chest", BlockItem(CobblemonBlocks.BLUE_GILDED_CHEST, Item.Properties()))
val BLUE_GILDED_CHEST = this.create("blue_gilded_chest", BlockItem(CobblemonBlocks.BLUE_GILDED_CHEST, Properties()))
@JvmField
val YELLOW_GILDED_CHEST = this.create("yellow_gilded_chest", BlockItem(CobblemonBlocks.YELLOW_GILDED_CHEST, Item.Properties()))
val YELLOW_GILDED_CHEST = this.create("yellow_gilded_chest", BlockItem(CobblemonBlocks.YELLOW_GILDED_CHEST,
Properties()
))
@JvmField
val PINK_GILDED_CHEST = this.create("pink_gilded_chest", BlockItem(CobblemonBlocks.PINK_GILDED_CHEST, Item.Properties()))
val PINK_GILDED_CHEST = this.create("pink_gilded_chest", BlockItem(CobblemonBlocks.PINK_GILDED_CHEST, Properties()))
@JvmField
val BLACK_GILDED_CHEST = this.create("black_gilded_chest", BlockItem(CobblemonBlocks.BLACK_GILDED_CHEST, Item.Properties()))
val BLACK_GILDED_CHEST = this.create("black_gilded_chest", BlockItem(CobblemonBlocks.BLACK_GILDED_CHEST,
Properties()
))
@JvmField
val WHITE_GILDED_CHEST = this.create("white_gilded_chest", BlockItem(CobblemonBlocks.WHITE_GILDED_CHEST, Item.Properties()))
val WHITE_GILDED_CHEST = this.create("white_gilded_chest", BlockItem(CobblemonBlocks.WHITE_GILDED_CHEST,
Properties()
))
@JvmField
val GREEN_GILDED_CHEST = this.create("green_gilded_chest", BlockItem(CobblemonBlocks.GREEN_GILDED_CHEST, Item.Properties()))
val GREEN_GILDED_CHEST = this.create("green_gilded_chest", BlockItem(CobblemonBlocks.GREEN_GILDED_CHEST,
Properties()
))
@JvmField
val GIMMIGHOUL_CHEST = this.create("gimmighoul_chest", BlockItem(CobblemonBlocks.GIMMIGHOUL_CHEST, Item.Properties()))
val GIMMIGHOUL_CHEST = this.create("gimmighoul_chest", BlockItem(CobblemonBlocks.GIMMIGHOUL_CHEST, Properties()))
// Saccharines
@JvmField
@@ -322,9 +332,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val SACCHARINE_LEAVES = compostableBlockItem("saccharine_leaves", CobblemonBlocks.SACCHARINE_LEAVES, 0.35f)
@JvmField
val SACCHARINE_BOAT = create("saccharine_boat", CobblemonBoatItem(CobblemonBoatType.SACCHARINE, false, Item.Properties().stacksTo(1)))
val SACCHARINE_BOAT = create("saccharine_boat", CobblemonBoatItem(CobblemonBoatType.SACCHARINE, false, Properties().stacksTo(1)))
@JvmField
val SACCHARINE_CHEST_BOAT = create("saccharine_chest_boat", CobblemonBoatItem(CobblemonBoatType.SACCHARINE, true, Item.Properties().stacksTo(1)))
val SACCHARINE_CHEST_BOAT = create("saccharine_chest_boat", CobblemonBoatItem(CobblemonBoatType.SACCHARINE, true, Properties().stacksTo(1)))
@JvmField
val SACCHARINE_DOOR = blockItem("saccharine_door", CobblemonBlocks.SACCHARINE_DOOR)
@@ -343,9 +353,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val SACCHARINE_STAIRS = blockItem("saccharine_stairs", CobblemonBlocks.SACCHARINE_STAIRS)
@JvmField
val SACCHARINE_SIGN = this.create("saccharine_sign", SignItem(Item.Properties().stacksTo(16), CobblemonBlocks.SACCHARINE_SIGN, CobblemonBlocks.SACCHARINE_WALL_SIGN))
val SACCHARINE_SIGN = this.create("saccharine_sign", SignItem(Properties().stacksTo(16), CobblemonBlocks.SACCHARINE_SIGN, CobblemonBlocks.SACCHARINE_WALL_SIGN))
@JvmField
val SACCHARINE_HANGING_SIGN = this.create("saccharine_hanging_sign", HangingSignItem(CobblemonBlocks.SACCHARINE_HANGING_SIGN, CobblemonBlocks.SACCHARINE_WALL_HANGING_SIGN, Item.Properties().stacksTo(16)))
val SACCHARINE_HANGING_SIGN = this.create("saccharine_hanging_sign", HangingSignItem(CobblemonBlocks.SACCHARINE_HANGING_SIGN, CobblemonBlocks.SACCHARINE_WALL_HANGING_SIGN, Properties().stacksTo(16)))
@JvmField
val SACCHARINE_SAPLING = compostableBlockItem("saccharine_sapling", CobblemonBlocks.SACCHARINE_SAPLING, 0.30f)
@@ -467,9 +477,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
// Evolution items
@JvmField val LINK_CABLE = create("link_cable", LinkCableItem())
@JvmField val DRAGON_SCALE = noSettingsItem("dragon_scale")
@JvmField val METAL_COAT = noSettingsItem("metal_coat")
@JvmField val UPGRADE = noSettingsItem("upgrade")
@JvmField val DUBIOUS_DISC = noSettingsItem("dubious_disc")
@JvmField val METAL_COAT = itemNameBlockItem("metal_coat", CobblemonBlocks.METAL_COAT)
@JvmField val UPGRADE = itemNameBlockItem("upgrade", CobblemonBlocks.UPGRADE)
@JvmField val DUBIOUS_DISC = itemNameBlockItem("dubious_disc", CobblemonBlocks.DUBIOUS_DISC)
@JvmField val DEEP_SEA_SCALE = noSettingsItem("deep_sea_scale")
@JvmField val DEEP_SEA_TOOTH = noSettingsItem("deep_sea_tooth")
@JvmField val ELECTIRIZER = noSettingsItem("electirizer")
@@ -478,7 +488,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField val PROTECTOR = noSettingsItem("protector")
@JvmField val REAPER_CLOTH = noSettingsItem("reaper_cloth")
@JvmField val PRISM_SCALE = noSettingsItem("prism_scale")
@JvmField val SACHET = noSettingsItem("sachet")
@JvmField val SACHET = itemNameBlockItem("sachet", CobblemonBlocks.SACHET)
@JvmField val WHIPPED_DREAM = create("whipped_dream", foodItem(8, 0.3f))
@JvmField val STRAWBERRY_SWEET = create("strawberry_sweet", foodItem(6, 0.125f))
@JvmField val LOVE_SWEET = create("love_sweet", foodItem(6, 0.125f))
@@ -487,26 +497,41 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField val FLOWER_SWEET = create("flower_sweet", foodItem(6, 0.125f))
@JvmField val STAR_SWEET = create("star_sweet", foodItem(6, 0.125f))
@JvmField val RIBBON_SWEET = create("ribbon_sweet", foodItem(6, 0.125f))
@JvmField val CHIPPED_POT = noSettingsItem("chipped_pot")
@JvmField val CRACKED_POT = noSettingsItem("cracked_pot")
@JvmField val MASTERPIECE_TEACUP = noSettingsItem("masterpiece_teacup")
@JvmField val UNREMARKABLE_TEACUP = noSettingsItem("unremarkable_teacup")
@JvmField val CHIPPED_POT = itemNameBlockItem("chipped_pot", CobblemonBlocks.CHIPPED_POT)
@JvmField val CRACKED_POT = itemNameBlockItem("cracked_pot", CobblemonBlocks.CRACKED_POT)
@JvmField val MASTERPIECE_TEACUP = itemNameBlockItem("masterpiece_teacup", CobblemonBlocks.MASTERPIECE_TEACUP)
@JvmField val UNREMARKABLE_TEACUP = itemNameBlockItem("unremarkable_teacup", CobblemonBlocks.UNREMARKABLE_TEACUP)
@JvmField val SWEET_APPLE = compostableItem("sweet_apple", foodItem(4, 0.3f), 0.65f)
@JvmField val TART_APPLE = compostableItem("tart_apple", foodItem(4, 0.3f), 0.65f)
@JvmField val SYRUPY_APPLE = compostableItem("syrupy_apple", foodItem(4, 0.3f), 0.65f)
@JvmField val GALARICA_CUFF = noSettingsItem("galarica_cuff")
@JvmField val GALARICA_WREATH = noSettingsItem("galarica_wreath")
@JvmField val GALARICA_CUFF = itemNameBlockItem("galarica_cuff", CobblemonBlocks.GALARICA_CUFF)
@JvmField val BLACK_AUGURITE = noSettingsItem("black_augurite")
@JvmField val PEAT_BLOCK = noSettingsItem("peat_block")
@JvmField val PEAT_BLOCK = itemNameBlockItem("peat_block", CobblemonBlocks.PEAT_BLOCK)
@JvmField val RAZOR_CLAW = noSettingsItem("razor_claw")
@JvmField val RAZOR_FANG = noSettingsItem("razor_fang")
@JvmField val AUSPICIOUS_ARMOR = heldItem("auspicious_armor")
@JvmField val MALICIOUS_ARMOR = heldItem("malicious_armor")
@JvmField val SHELL_HELMET = heldItem("shell_helmet")
@JvmField val METAL_ALLOY = noSettingsItem("metal_alloy")
@JvmField val SCROLL_OF_DARKNESS = noSettingsItem("scroll_of_darkness")
@JvmField val SCROLL_OF_WATERS = noSettingsItem("scroll_of_waters")
@JvmField val WHITE_PLAQUE = blockItem("white_plaque", CobblemonBlocks.WHITE_PLAQUE)
@JvmField val LIGHT_GRAY_PLAQUE = blockItem("light_gray_plaque", CobblemonBlocks.LIGHT_GRAY_PLAQUE)
@JvmField val GRAY_PLAQUE = blockItem("gray_plaque", CobblemonBlocks.GRAY_PLAQUE)
@JvmField val BLACK_PLAQUE = blockItem("black_plaque", CobblemonBlocks.BLACK_PLAQUE)
@JvmField val BROWN_PLAQUE = blockItem("brown_plaque", CobblemonBlocks.BROWN_PLAQUE)
@JvmField val RED_PLAQUE = blockItem("red_plaque", CobblemonBlocks.RED_PLAQUE)
@JvmField val ORANGE_PLAQUE = blockItem("orange_plaque", CobblemonBlocks.ORANGE_PLAQUE)
@JvmField val YELLOW_PLAQUE = blockItem("yellow_plaque", CobblemonBlocks.YELLOW_PLAQUE)
@JvmField val LIME_PLAQUE = blockItem("lime_plaque", CobblemonBlocks.LIME_PLAQUE)
@JvmField val GREEN_PLAQUE = blockItem("green_plaque", CobblemonBlocks.GREEN_PLAQUE)
@JvmField val CYAN_PLAQUE = blockItem("cyan_plaque", CobblemonBlocks.CYAN_PLAQUE)
@JvmField val LIGHT_BLUE_PLAQUE = blockItem("light_blue_plaque", CobblemonBlocks.LIGHT_BLUE_PLAQUE)
@JvmField val BLUE_PLAQUE = blockItem("blue_plaque", CobblemonBlocks.BLUE_PLAQUE)
@JvmField val PURPLE_PLAQUE = blockItem("purple_plaque", CobblemonBlocks.PURPLE_PLAQUE)
@JvmField val MAGENTA_PLAQUE = blockItem("magenta_plaque", CobblemonBlocks.MAGENTA_PLAQUE)
@JvmField val PINK_PLAQUE = blockItem("pink_plaque", CobblemonBlocks.PINK_PLAQUE)
private val berries = mutableMapOf<ResourceLocation, BerryItem>()
// Plants
@JvmField val CHERI_BERRY = berryItem("cheri", StatusCuringBerryItem(CobblemonBlocks.CHERI_BERRY, Statuses.PARALYSIS))
@@ -626,17 +651,17 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val EXPERIENCE_CANDY_XL = candyItem("exp_candy_xl") { _, _ -> CandyItem.DEFAULT_XL_CANDY_YIELD }
@JvmField
val CALCIUM = create("calcium", VitaminItem(Stats.SPECIAL_ATTACK))
val CALCIUM = create("calcium", VitaminItem(Stats.SPECIAL_ATTACK, block = CobblemonBlocks.CALCIUM))
@JvmField
val CARBOS = create("carbos", VitaminItem(Stats.SPEED))
val CARBOS = create("carbos", VitaminItem(Stats.SPEED, block = CobblemonBlocks.CARBOS))
@JvmField
val HP_UP = create("hp_up", VitaminItem(Stats.HP))
val HP_UP = create("hp_up", VitaminItem(Stats.HP, block = CobblemonBlocks.HP_UP))
@JvmField
val IRON = create("iron", VitaminItem(Stats.DEFENCE))
val IRON = create("iron", VitaminItem(Stats.DEFENCE, block = CobblemonBlocks.IRON))
@JvmField
val PROTEIN = create("protein", VitaminItem(Stats.ATTACK))
val PROTEIN = create("protein", VitaminItem(Stats.ATTACK, block = CobblemonBlocks.PROTEIN))
@JvmField
val ZINC = create("zinc", VitaminItem(Stats.SPECIAL_DEFENCE))
val ZINC = create("zinc", VitaminItem(Stats.SPECIAL_DEFENCE, block = CobblemonBlocks.ZINC))
@JvmField
val HEALTH_MOCHI = create("health_mochi", MochiItem(Stats.HP))
@JvmField
@@ -664,7 +689,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val CLEVER_FEATHER = create("clever_feather", FeatherItem(Stats.SPECIAL_DEFENCE))
@JvmField
val MEDICINAL_LEEK = heldItem("medicinal_leek", MedicinalLeekItem(CobblemonBlocks.MEDICINAL_LEEK, Item.Properties().food(FoodProperties.Builder().fast().nutrition(1).saturationModifier(0.2f).build())), "leek")
val MEDICINAL_LEEK = heldItem("medicinal_leek", MedicinalLeekItem(CobblemonBlocks.MEDICINAL_LEEK, Properties().food(FoodProperties.Builder().fast().nutrition(1).saturationModifier(0.2f).build())), "leek")
@JvmField
val ROASTED_LEEK = compostableItem("roasted_leek", CobblemonItem(Item.Properties().food(FoodProperties.Builder().fast().nutrition(3).saturationModifier(0.2f).build())), 0.85f)
@JvmField
@@ -699,15 +724,15 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
val MOOMOO_MILK = create("moomoo_milk", MoomooMilk(Item.Properties().craftRemainder(Items.GLASS_BOTTLE).stacksTo((16))))
@JvmField
val POTION = create("potion", PotionItem(PotionType.POTION))
val POTION = potionItem("potion", PotionType.POTION, CobblemonBlocks.POTION)
@JvmField
val SUPER_POTION = create("super_potion", PotionItem(PotionType.SUPER_POTION))
val SUPER_POTION = potionItem("super_potion", PotionType.SUPER_POTION, CobblemonBlocks.SUPER_POTION)
@JvmField
val HYPER_POTION = create("hyper_potion", PotionItem(PotionType.HYPER_POTION))
val HYPER_POTION = potionItem("hyper_potion", PotionType.HYPER_POTION, CobblemonBlocks.HYPER_POTION)
@JvmField
val MAX_POTION = create("max_potion", PotionItem(PotionType.MAX_POTION))
val MAX_POTION = potionItem("max_potion", PotionType.MAX_POTION, CobblemonBlocks.MAX_POTION)
@JvmField
val FULL_RESTORE = create("full_restore", PotionItem(PotionType.FULL_RESTORE))
val FULL_RESTORE = potionItem("full_restore", PotionType.FULL_RESTORE, CobblemonBlocks.FULL_RESTORE)
@JvmField
val HEAL_POWDER = create("heal_powder", HealPowderItem())
@@ -718,9 +743,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val MAX_REVIVE = create("max_revive", ReviveItem(max = true))
@JvmField
val PP_UP = create("pp_up", PPUpItem(1))
val PP_UP = create("pp_up", PPUpItem(1, block = CobblemonBlocks.PP_UP))
@JvmField
val PP_MAX = create("pp_max", PPUpItem(3))
val PP_MAX = create("pp_max", PPUpItem(3, block = CobblemonBlocks.PP_MAX))
@JvmField
val RED_MINT_SEEDS = mintSeed("red", MintType.RED.getCropBlock())
@@ -792,28 +817,29 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val SERIOUS_MINT = mintItem("serious_mint", MintItem(Natures.SERIOUS))
@JvmField val X_ACCURACY = create("x_${Stats.ACCURACY.identifier.path}", XStatItem(Stats.ACCURACY))
@JvmField val X_ATTACK = create("x_${Stats.ATTACK.identifier.path}", XStatItem(Stats.ATTACK))
@JvmField val X_DEFENSE = create("x_${Stats.DEFENCE.identifier.path}", XStatItem(Stats.DEFENCE))
@JvmField val X_SP_ATK = create("x_${Stats.SPECIAL_ATTACK.identifier.path}", XStatItem(Stats.SPECIAL_ATTACK))
@JvmField val X_SP_DEF = create("x_${Stats.SPECIAL_DEFENCE.identifier.path}", XStatItem(Stats.SPECIAL_DEFENCE))
@JvmField val X_SPEED = create("x_${Stats.SPEED.identifier.path}", XStatItem(Stats.SPEED))
@JvmField val X_ACCURACY = create("x_${Stats.ACCURACY.identifier.path}", XStatItem(Stats.ACCURACY, block = CobblemonBlocks.X_ACCURACY))
@JvmField val X_ATTACK = create("x_${Stats.ATTACK.identifier.path}", XStatItem(Stats.ATTACK, block = CobblemonBlocks.X_ATTACK))
@JvmField val X_DEFENSE = create("x_${Stats.DEFENCE.identifier.path}", XStatItem(Stats.DEFENCE, block = CobblemonBlocks.X_DEFENCE))
@JvmField val X_SP_ATK = create("x_${Stats.SPECIAL_ATTACK.identifier.path}", XStatItem(Stats.SPECIAL_ATTACK, block = CobblemonBlocks.X_SPECIAL_ATTACK))
@JvmField val X_SP_DEF = create("x_${Stats.SPECIAL_DEFENCE.identifier.path}", XStatItem(Stats.SPECIAL_DEFENCE, block = CobblemonBlocks.X_SPECIAL_DEFENCE))
@JvmField val X_SPEED = create("x_${Stats.SPEED.identifier.path}", XStatItem(Stats.SPEED, block = CobblemonBlocks.X_SPEED))
@JvmField val DIRE_HIT = create("dire_hit", DireHitItem())
@JvmField val GUARD_SPEC = create("guard_spec", GuardSpecItem())
@JvmField val DIRE_HIT = create("dire_hit", DireHitItem(block = CobblemonBlocks.DIRE_HIT))
@JvmField val GUARD_SPEC = create("guard_spec", GuardSpecItem(block = CobblemonBlocks.GUARD_SPEC))
@JvmField val BURN_HEAL = create("burn_heal", StatusCureItem("item.cobblemon.burn_heal", Statuses.BURN))
@JvmField val PARALYZE_HEAL = create("paralyze_heal", StatusCureItem("item.cobblemon.paralyze_heal", Statuses.PARALYSIS))
@JvmField val ICE_HEAL = create("ice_heal", StatusCureItem("item.cobblemon.ice_heal", Statuses.FROZEN))
@JvmField val ANTIDOTE = create("antidote", StatusCureItem("item.cobblemon.antidote", Statuses.POISON, Statuses.POISON_BADLY))
@JvmField val AWAKENING = create("awakening", StatusCureItem("item.cobblemon.awakening", Statuses.SLEEP))
@JvmField val BURN_HEAL = create("burn_heal", StatusCureItem("item.cobblemon.burn_heal", Statuses.BURN, block = CobblemonBlocks.BURN_HEAL))
@JvmField val PARALYZE_HEAL = create("paralyze_heal", StatusCureItem(
"item.cobblemon.paralyze_heal", Statuses.PARALYSIS, block = CobblemonBlocks.PARALYZE_HEAL))
@JvmField val ICE_HEAL = create("ice_heal", StatusCureItem("item.cobblemon.ice_heal", Statuses.FROZEN, block = CobblemonBlocks.ICE_HEAL))
@JvmField val ANTIDOTE = create("antidote", StatusCureItem("item.cobblemon.antidote", Statuses.POISON, Statuses.POISON_BADLY, block = CobblemonBlocks.ANTIDOTE))
@JvmField val AWAKENING = create("awakening", StatusCureItem("item.cobblemon.awakening", Statuses.SLEEP, block = CobblemonBlocks.AWAKENING))
@JvmField val FULL_HEAL = create("full_heal", StatusCureItem("item.cobblemon.full_heal"))
@JvmField val FULL_HEAL = create("full_heal", StatusCureItem("item.cobblemon.full_heal", block = CobblemonBlocks.FULL_HEAL))
@JvmField val ETHER = create("ether", EtherItem(max = false))
@JvmField val MAX_ETHER = create("max_ether", EtherItem(max = true))
@JvmField val ELIXIR = create("elixir", ElixirItem(max = false))
@JvmField val MAX_ELIXIR = create("max_elixir", ElixirItem(max = true))
@JvmField val ETHER = create("ether", EtherItem(max = false, block = CobblemonBlocks.ETHER))
@JvmField val MAX_ETHER = create("max_ether", EtherItem(max = true, block = CobblemonBlocks.MAX_ETHER))
@JvmField val ELIXIR = create("elixir", ElixirItem(max = false, block = CobblemonBlocks.ELIXIR))
@JvmField val MAX_ELIXIR = create("max_elixir", ElixirItem(max = true, block = CobblemonBlocks.MAX_ELIXIR))
@JvmField
val ABILITY_CAPSULE = this.create("ability_capsule", AbilityChangeItem(AbilityChanger.COMMON_ABILITY))
@@ -898,11 +924,18 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField val CHOICE_SPECS = wearableItem("choice_specs")
@JvmField val EXP_SHARE = wearableItem("exp_share")
@JvmField val FOCUS_BAND = wearableItem("focus_band")
@JvmField val KINGS_ROCK = wearableItem("kings_rock")
@JvmField val KINGS_ROCK = wearableItem("kings_rock", block = CobblemonBlocks.KINGS_ROCK)
@JvmField val MUSCLE_BAND = wearableItem("muscle_band")
@JvmField val ROCKY_HELMET = wearableItem("rocky_helmet")
@JvmField val SAFETY_GOGGLES = wearableItem("safety_goggles")
@JvmField val WISE_GLASSES = wearableItem("wise_glasses")
@JvmField val GALARICA_WREATH = wearableItem("galarica_wreath", block = CobblemonBlocks.GALARICA_WREATH)
@JvmField val SHELL_HELMET = wearableItem("shell_helmet")
@JvmField val NEVER_MELT_ICE = wearableItem("never_melt_ice", block = CobblemonBlocks.NEVER_MELT_ICE)
@JvmField val CLEANSE_TAG = wearableItem("cleanse_tag", block = CobblemonBlocks.CLEANSE_TAG)
@JvmField val SPELL_TAG = wearableItem("spell_tag", block = CobblemonBlocks.SPELL_TAG)
@JvmField val COVERT_CLOAK = wearableItem("covert_cloak")
@JvmField val SHARP_BEAK = wearableItem("sharp_beak")
// Held Items
@JvmField
@@ -922,7 +955,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val BLACK_SLUDGE = heldItem("black_sludge")
@JvmField
val BLUNDER_POLICY = heldItem("blunder_policy")
val BLUNDER_POLICY = itemNameBlockItem("blunder_policy", CobblemonBlocks.BLUNDER_POLICY)
@JvmField
val CELL_BATTERY = heldItem("cell_battery")
@JvmField
@@ -930,17 +963,13 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val CHOICE_SCARF = heldItem("choice_scarf")
@JvmField
val CLEANSE_TAG = heldItem("cleanse_tag")
@JvmField
val CLEAR_AMULET = heldItem("clear_amulet")
@JvmField
val COVERT_CLOAK = heldItem("covert_cloak")
@JvmField
val DESTINY_KNOT = heldItem("destiny_knot")
val DESTINY_KNOT = itemNameBlockItem("destiny_knot", CobblemonBlocks.DESTINY_KNOT)
@JvmField
val DRAGON_FANG = heldItem("dragon_fang")
@JvmField
val EJECT_BUTTON = heldItem("eject_button")
val EJECT_BUTTON = itemNameBlockItem("eject_button", CobblemonBlocks.EJECT_BUTTON)
@JvmField
val EJECT_PACK = heldItem("eject_pack")
@JvmField
@@ -954,7 +983,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val FAIRY_FEATHER = heldItem("fairy_feather")
@JvmField
val FLAME_ORB = heldItem("flame_orb")
val FLAME_ORB = itemNameBlockItem("flame_orb", CobblemonBlocks.FLAME_ORB)
@JvmField
val FLOAT_STONE = heldItem("float_stone")
@JvmField
@@ -964,19 +993,19 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val GRIP_CLAW = heldItem("grip_claw")
@JvmField
val HARD_STONE = heldItem("hard_stone")
val HARD_STONE = itemNameBlockItem("hard_stone", CobblemonBlocks.HARD_STONE)
@JvmField
val HEAVY_DUTY_BOOTS = heldItem("heavy_duty_boots")
@JvmField
val IRON_BALL = heldItem("iron_ball")
val IRON_BALL = itemNameBlockItem("iron_ball", CobblemonBlocks.IRON_BALL)
@JvmField
val LAGGING_TAIL = heldItem("lagging_tail")
@JvmField
val LEFTOVERS = compostableHeldItem("leftovers", null, 0.50f)
@JvmField
val LIFE_ORB = heldItem("life_orb")
val LIFE_ORB = itemNameBlockItem("life_orb", CobblemonBlocks.LIFE_ORB)
@JvmField
val LIGHT_BALL = heldItem("light_ball")
val LIGHT_BALL = itemNameBlockItem("light_ball", CobblemonBlocks.LIGHT_BALL)
@JvmField
val LIGHT_CLAY = heldItem("light_clay")
@JvmField
@@ -984,18 +1013,16 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val LUCKY_EGG = heldItem("lucky_egg")
@JvmField
val LUMINOUS_MOSS = heldItem("luminous_moss")
val LUMINOUS_MOSS = itemNameBlockItem("luminous_moss", CobblemonBlocks.LUMINOUS_MOSS)
@JvmField
val MAGNET = heldItem("magnet")
val MAGNET = itemNameBlockItem("magnet", CobblemonBlocks.MAGNET)
@JvmField
val METRONOME = heldItem("metronome")
val METRONOME = itemNameBlockItem("metronome", CobblemonBlocks.METRONOME)
@JvmField
val MIRACLE_SEED = heldItem("miracle_seed")
@JvmField
val MYSTIC_WATER = heldItem("mystic_water")
@JvmField
val NEVER_MELT_ICE = heldItem("never_melt_ice")
@JvmField
val POISON_BARB = heldItem("poison_barb")
@JvmField
val POWER_ANKLET = heldItem("power_anklet")
@@ -1020,14 +1047,12 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val RED_CARD = heldItem("red_card")
@JvmField
val RING_TARGET = heldItem("ring_target")
val RING_TARGET = itemNameBlockItem("ring_target", CobblemonBlocks.RING_TARGET)
@JvmField
val ROOM_SERVICE = heldItem("room_service")
@JvmField
val SCOPE_LENS = heldItem("scope_lens")
@JvmField
val SHARP_BEAK = heldItem("sharp_beak")
@JvmField
val SHED_SHELL = heldItem("shed_shell")
@JvmField
val SHELL_BELL = heldItem("shell_bell")
@@ -1038,9 +1063,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val SOFT_SAND = heldItem("soft_sand")
@JvmField
val SPELL_TAG = heldItem("spell_tag")
@JvmField
val SMOKE_BALL = heldItem("smoke_ball")
val SMOKE_BALL = itemNameBlockItem("smoke_ball", CobblemonBlocks.SMOKE_BALL)
@JvmField
val SOOTHE_BELL = heldItem("soothe_bell")
@JvmField
@@ -1050,13 +1073,13 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val THROAT_SPRAY = heldItem("throat_spray")
@JvmField
val TOXIC_ORB = heldItem("toxic_orb")
val TOXIC_ORB = itemNameBlockItem("toxic_orb", CobblemonBlocks.TOXIC_ORB)
@JvmField
val TWISTED_SPOON = heldItem("twisted_spoon")
@JvmField
val UTILITY_UMBRELLA = heldItem("utility_umbrella")
@JvmField
val WEAKNESS_POLICY = heldItem("weakness_policy")
val WEAKNESS_POLICY = itemNameBlockItem("weakness_policy", CobblemonBlocks.WEAKNESS_POLICY)
@JvmField
val WIDE_LENS = heldItem("wide_lens")
@JvmField
@@ -1072,19 +1095,19 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val WHITE_HERB = compostableHeldItem("white_herb", null, 0.85F)
@JvmField
val BRIGHT_POWDER = heldItem("bright_powder")
val BRIGHT_POWDER = itemNameBlockItem("bright_powder", CobblemonBlocks.BRIGHT_POWDER)
@JvmField
val METAL_POWDER = heldItem("metal_powder")
val METAL_POWDER = itemNameBlockItem("metal_powder", CobblemonBlocks.METAL_POWDER)
@JvmField
val QUICK_POWDER = heldItem("quick_powder")
val QUICK_POWDER = itemNameBlockItem("quick_powder", CobblemonBlocks.QUICK_POWDER)
@JvmField
val DAMP_ROCK = heldItem("damp_rock")
val DAMP_ROCK = itemNameBlockItem("damp_rock", CobblemonBlocks.DAMP_ROCK)
@JvmField
val HEAT_ROCK = heldItem("heat_rock")
val HEAT_ROCK = itemNameBlockItem("heat_rock", CobblemonBlocks.HEAT_ROCK)
@JvmField
val SMOOTH_ROCK = heldItem("smooth_rock")
val SMOOTH_ROCK = itemNameBlockItem("smooth_rock", CobblemonBlocks.SMOOTH_ROCK)
@JvmField
val ICY_ROCK = heldItem("icy_rock")
val ICY_ROCK = itemNameBlockItem("icy_rock", CobblemonBlocks.ICY_ROCK)
// Mulch
@JvmField
@@ -1152,11 +1175,11 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
val SUSPICIOUS_SHERD = itemWithRarity("suspicious_sherd", Rarity.UNCOMMON)
@JvmField
val TUMBLESTONE = this.create("tumblestone", TumblestoneItem(Item.Properties(), CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE))
val TUMBLESTONE = this.create("tumblestone", TumblestoneItem(Properties(), CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE))
@JvmField
val BLACK_TUMBLESTONE = this.create("black_tumblestone", TumblestoneItem(Item.Properties(), CobblemonBlocks.SMALL_BUDDING_BLACK_TUMBLESTONE))
val BLACK_TUMBLESTONE = this.create("black_tumblestone", TumblestoneItem(Properties(), CobblemonBlocks.SMALL_BUDDING_BLACK_TUMBLESTONE))
@JvmField
val SKY_TUMBLESTONE = this.create("sky_tumblestone", TumblestoneItem(Item.Properties(), CobblemonBlocks.SMALL_BUDDING_SKY_TUMBLESTONE))
val SKY_TUMBLESTONE = this.create("sky_tumblestone", TumblestoneItem(Properties(), CobblemonBlocks.SMALL_BUDDING_SKY_TUMBLESTONE))
@JvmField
val SMALL_BUDDING_TUMBLESTONE = blockItem("small_budding_tumblestone", CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE)
@@ -1413,7 +1436,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val RELIC_COIN = noSettingsItem("relic_coin")
@JvmField
val RELIC_COIN_POUCH = blockItem("relic_coin_pouch", CobblemonBlocks.RELIC_COIN_POUCH)
val RELIC_COIN_POUCH = itemNameBlockItem("relic_coin_pouch", CobblemonBlocks.RELIC_COIN_POUCH)
@JvmField
val RELIC_COIN_SACK = blockItem("relic_coin_sack", CobblemonBlocks.RELIC_COIN_SACK)
@@ -1457,13 +1480,13 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
//@JvmField
//val BINDING_SOIL = blockItem("binding_soil", CobblemonBlocks.BINDING_SOIL)
private fun blockItem(name: String, block: Block, rarity: Rarity = Rarity.COMMON): BlockItem = this.create(name, BlockItem(block, Item.Properties().rarity(rarity)))
private fun blockItem(name: String, block: Block, rarity: Rarity = Rarity.COMMON): BlockItem = this.create(name, BlockItem(block, Properties().rarity(rarity)))
private fun itemNameBlockItem(name: String, block: Block, rarity: Rarity = Rarity.COMMON): ItemNameBlockItem = this.create(name, ItemNameBlockItem(block, Item.Properties().rarity(rarity)))
private fun itemNameBlockItem(name: String, block: Block, rarity: Rarity = Rarity.COMMON): ItemNameBlockItem = this.create(name, ItemNameBlockItem(block, Properties().rarity(rarity)))
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Item.Properties()))
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Properties()))
private fun itemWithRarity(name: String, rarity: Rarity): CobblemonItem = this.create(name, CobblemonItem(Item.Properties().rarity(rarity)))
private fun itemWithRarity(name: String, rarity: Rarity): CobblemonItem = this.create(name, CobblemonItem(Properties().rarity(rarity)))
fun berries() = this.berries.toMap()
@@ -1479,7 +1502,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
private fun candyItem(name: String, rarity: Rarity = Rarity.COMMON, calculator: CandyItem.Calculator): CandyItem = this.create(name, CandyItem(rarity, calculator))
private fun pokerodItem(pokeRodId: ResourceLocation, rarity: Rarity = Rarity.COMMON): PokerodItem {
val settings = Item.Properties().stacksTo(1).durability(256).rarity(rarity)
val settings = Properties().stacksTo(1).durability(256).rarity(rarity)
val item = create(pokeRodId.path, PokerodItem(pokeRodId, settings))
pokeRods.add(item)
return item
@@ -1491,15 +1514,14 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
return item
}
private fun wearableItem(name: String, heldItemRemappedName: String? = null): CobblemonItem = create(
name,
WearableItem(name).also {
wearables.add(it)
if (heldItemRemappedName != null) {
CobblemonHeldItemManager.registerRemap(it, heldItemRemappedName)
}
}
)
private fun wearableItem(name: String, heldItemRemappedName: String? = null, block: Block = Blocks.AIR): WearableItem =
create(name,
WearableItem(name, block).also {
wearables.add(it)
if (heldItemRemappedName != null) {
CobblemonHeldItemManager.registerRemap(it, heldItemRemappedName)
}
})
private fun campfirePotItem(block: Block, color: CampfirePotColor): CampfirePotItem {
val item = create("campfire_pot_${color.suffix}", CampfirePotItem(block, color))
@@ -1538,7 +1560,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
foodPropertiesBuilder.usingConvertsTo(convertsToOnUse.item)
}
val properties = Item.Properties()
val properties = Properties()
.stacksTo(stacksTo)
.food(foodPropertiesBuilder.build())
@@ -1547,7 +1569,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
private fun heldItem(name: String, remappedName: String? = null): CobblemonItem = create(
name,
CobblemonItem(Item.Properties()).also {
CobblemonItem(Properties()).also {
if (remappedName != null) {
CobblemonHeldItemManager.registerRemap(it, remappedName)
}
@@ -1623,7 +1645,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
}
private fun compostableItem(name: String, item: Item? = null, increaseLevelChance: Float = .65f): Item {
val createdItem = this.create(name, item ?: CobblemonItem(Item.Properties()))
val createdItem = this.create(name, item ?: CobblemonItem(Properties()))
compostable(createdItem, increaseLevelChance)
return createdItem
}
@@ -1646,7 +1668,12 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
return createdItem
}
private fun potionItem(name: String, type: PotionType, block: Block): PotionItem {
val item = PotionItem(type, block)
return create(name, item)
}
private fun foodItem(nutrition: Int, saturationModifier: Float): Item {
return CobblemonItem(Item.Properties().food(FoodProperties.Builder().nutrition(nutrition).saturationModifier(saturationModifier).build()))
return CobblemonItem(Properties().food(FoodProperties.Builder().nutrition(nutrition).saturationModifier(saturationModifier).build()))
}
}
@@ -37,11 +37,10 @@ object CobblemonItemTags {
@JvmField val BLACK_TUMBLESTONE_BRICKS = create("black_tumblestone_bricks")
@JvmField val BLACK_TUMBLESTONES = create("black_tumblestones")
@JvmField val BOATS = create("boats")
/** This tag is used for Fossil Machine natural materials */
@JvmField val COOKED_MEAT = create("cooked_meat")
@JvmField val DAWN_STONE_ORES = create("dawn_stone_ores")
@JvmField val POTTERY_SHERDS = create("decorated_pot_sherds")
@JvmField val DEEP_SEAS = create("deep_seas")
@JvmField val DISPLAY_CASE_ITEMS = create("display_case_items")
@JvmField val DUSK_STONE_ORES = create("dusk_stone_ores")
@JvmField val ETHERS = create("ethers")
@JvmField val EVOLUTION_ITEMS = create("evolution_items")
@@ -57,6 +56,7 @@ object CobblemonItemTags {
@JvmField val HANGING_SIGNS = create("hanging_signs")
@JvmField val HERBS = create("herbs")
@JvmField val ICE_STONE_ORES = create("ice_stone_ores")
@JvmField val ITEM_BLOCKS = create("item_blocks")
@JvmField val LEAF_STONE_ORES = create("leaf_stone_ores")
@JvmField val MACHINES = create("machines")
@JvmField val MINT_LEAF = create("mint_leaf")
@@ -66,15 +66,13 @@ object CobblemonItemTags {
@JvmField val MOON_STONE_ORES = create("moon_stone_ores")
@JvmField val MUTATED_BERRIES = create("mutated_berries")
@JvmField val PLANTS = create("plants")
@JvmField val PLAQUES = create("plaques")
@JvmField val POKE_BALLS = create("poke_balls")
@JvmField val POKE_RODS = create("poke_rods")
@JvmField val POKEDEX = create("pokedex")
@JvmField val POKEDEX_SCREEN = create("pokedex_screen")
@JvmField val POKE_FOOD = create("poke_food")
@JvmField val POTIONS = create("potions")
@JvmField val PROTEIN_INGREDIENTS = create("protein_ingredients")
/** See [COOKED_MEAT] */
@JvmField val RAW_MEAT = create("raw_meat")
@JvmField val RED_TUMBLESTONE_BRICKS = create("red_tumblestone_bricks")
@JvmField val RED_TUMBLESTONES = create("red_tumblestones")
@JvmField val REMEDIES = create("remedies")
@@ -19,6 +19,7 @@ import net.minecraft.world.InteractionResult
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.BlockItem
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.BaseEntityBlock
@@ -110,6 +111,8 @@ class DisplayCaseBlock(settings: Properties) : BaseEntityBlock(settings) {
override fun getRenderShape(state: BlockState) = RenderShape.MODEL
override fun getShadeBrightness(state: BlockState, level: BlockGetter, pos: BlockPos): Float {return 0.75f}
override fun getAnalogOutputSignal(state: BlockState, world: Level, pos: BlockPos): Int {
val stack = (world.getBlockEntity(pos) as DisplayCaseBlockEntity).getStack()
@@ -0,0 +1,199 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
class DecorativeItemBlock(settings: Properties, val itemType: ItemType) : Block(settings), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(WATERLOGGED, false))
}
@Suppress("unused")
enum class ItemType : StringRepresentable {
TEAPOT,
TEACUP,
MOSS,
KNOT,
POUCH,
GENERIC_7x6,
GENERIC_8x,
GENERIC_8x4;
override fun getSerializedName(): String = this.name.lowercase()
companion object {
val CODEC = StringRepresentable.fromEnum(::values)
}
}
override fun codec(): MapCodec<DecorativeItemBlock> {
return CODEC
}
override fun getStateForPlacement(ctx: BlockPlaceContext): BlockState? {
var blockState = defaultBlockState()
.setValue(WATERLOGGED, ctx.level.getFluidState(ctx.clickedPos).type == Fluids.WATER)
val worldView = ctx.level
val blockPos = ctx.clickedPos
ctx.nearestLookingDirections.forEach { direction ->
if (direction.axis.isHorizontal) {
blockState = blockState.setValue(FACING, direction.opposite) as BlockState
if (blockState.canSurvive(worldView, blockPos)) {
return blockState
}
}
}
return null
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING)
builder.add(WATERLOGGED)
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
return when (itemType) {
ItemType.TEAPOT -> {
when (state.getValue(FACING)) {
Direction.SOUTH -> TEAPOT_SOUTH
Direction.WEST -> TEAPOT_WEST
Direction.EAST -> TEAPOT_EAST
else -> TEAPOT_NORTH
}
}
ItemType.KNOT -> {
when (state.getValue(FACING)) {
Direction.SOUTH -> KNOT_SOUTH
Direction.WEST -> KNOT_WEST
Direction.EAST -> KNOT_EAST
else -> KNOT_NORTH
}
}
ItemType.TEACUP -> TEACUP
ItemType.MOSS -> MOSS
ItemType.POUCH -> POUCH
ItemType.GENERIC_7x6 -> ITEM_7x6
ItemType.GENERIC_8x4 -> ITEM_8x4
else -> ITEM_8x
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (direction == state.getValue(FACING) && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(HORIZONTAL_FACING, rotation.rotate(state.getValue(HORIZONTAL_FACING)))
}
@Deprecated("Deprecated in Java")
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean {
return false
}
companion object {
val CODEC: MapCodec<DecorativeItemBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec(),
ItemType.CODEC.fieldOf("itemType").forGetter(DecorativeItemBlock::itemType)
).apply(it, ::DecorativeItemBlock) }
val ITEM_8x = Shapes.box(0.25, 0.0, 0.25, 0.75, 0.5, 0.75)
val ITEM_8x4 = Shapes.box(0.25, 0.0, 0.25, 0.75, 0.25, 0.75)
val ITEM_7x6 = Shapes.box(0.28125, 0.0, 0.28125, 0.71875, 0.375, 0.71875)
val POUCH = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.3125, 0.6875)
private val TEACUP = Shapes.or(
Shapes.box(0.375, 0.0, 0.375, 0.625, 0.0625, 0.625),
Shapes.box(0.3125, 0.0, 0.3125, 0.625, 0.25, 0.375),
Shapes.box(0.375, 0.0, 0.625, 0.6875, 0.25, 0.6875),
Shapes.box(0.625, 0.0, 0.3125, 0.6875, 0.25, 0.625),
Shapes.box(0.3125, 0.0, 0.375, 0.375, 0.25, 0.6875)
)
private val MOSS = Shapes.or(
Shapes.box(0.25, 0.0, 0.25, 0.75, 0.25, 0.75),
Shapes.box(0.3125, 0.25, 0.3125, 0.6875, 0.4375, 0.6875)
)
val KNOT_NORTH = Shapes.box(0.375, 0.0, 0.375, 0.75, 0.375, 0.75)
val KNOT_WEST = Shapes.box(0.375, 0.0, 0.25, 0.75, 0.375, 0.625)
val KNOT_SOUTH = Shapes.box(0.25, 0.0, 0.25, 0.625, 0.375, 0.625)
val KNOT_EAST = Shapes.box(0.25, 0.0, 0.375, 0.625, 0.375, 0.75)
private val TEAPOT_NORTH = Shapes.or(
Shapes.box(0.3125, 0.5, 0.3125, 0.6875, 0.625, 0.6875),
Shapes.box(0.4375, 0.625, 0.4375, 0.5625, 0.6875, 0.5625),
Shapes.box(0.25, 0.0625, 0.25, 0.75, 0.5, 0.75),
Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.0625, 0.6875),
Shapes.box(0.75, 0.125, 0.40625, 0.875, 0.375, 0.59375)
)
private val TEAPOT_EAST = Shapes.or(
Shapes.box(0.3125, 0.5, 0.3125, 0.6875, 0.625, 0.6875),
Shapes.box(0.4375, 0.625, 0.4375, 0.5625, 0.6875, 0.5625),
Shapes.box(0.25, 0.0625, 0.25, 0.75, 0.5, 0.75),
Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.0625, 0.6875),
Shapes.box(0.40625, 0.125, 0.75, 0.59375, 0.375, 0.875)
)
private val TEAPOT_SOUTH = Shapes.or(
Shapes.box(0.3125, 0.5, 0.3125, 0.6875, 0.625, 0.6875),
Shapes.box(0.4375, 0.625, 0.4375, 0.5625, 0.6875, 0.5625),
Shapes.box(0.25, 0.0625, 0.25, 0.75, 0.5, 0.75),
Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.0625, 0.6875),
Shapes.box(0.125, 0.125, 0.40625, 0.25, 0.375, 0.59375)
)
private val TEAPOT_WEST = Shapes.or(
Shapes.box(0.3125, 0.5, 0.3125, 0.6875, 0.625, 0.6875),
Shapes.box(0.4375, 0.625, 0.4375, 0.5625, 0.6875, 0.5625),
Shapes.box(0.25, 0.0625, 0.25, 0.75, 0.5, 0.75),
Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.0625, 0.6875),
Shapes.box(0.40625, 0.125, 0.125, 0.59375, 0.375, 0.25)
)
}
}
@@ -0,0 +1,301 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.server.level.ServerLevel
import net.minecraft.sounds.SoundEvent
import net.minecraft.sounds.SoundSource
import net.minecraft.util.RandomSource
import net.minecraft.world.InteractionResult
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.AttachFace
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.gameevent.GameEvent
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class EjectButtonBlock(properties : Properties) : FaceAttachedHorizontalDirectionalBlock(properties), SimpleWaterloggedBlock {
private val ticksToStayPressed: Int
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(FACE, AttachFace.FLOOR)
.setValue(POWERED, false)
.setValue(WATERLOGGED, false))
this.ticksToStayPressed = 20
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(FACE)
builder.add(POWERED)
builder.add(WATERLOGGED)
}
override fun codec(): MapCodec<EjectButtonBlock> {
return CODEC
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
}
//May need some clean up, ended up just copying this straight from the original class so I could inject the waterlogging stuff to make it properly work, but it does look a bit ugly
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val var2 = context.nearestLookingDirections
val var3 = var2.size
val fluidState = context.level.getFluidState(context.clickedPos)
for (var4 in 0 until var3) {
val direction = var2[var4]
var blockState = if (direction.axis === Direction.Axis.Y) {
defaultBlockState().setValue(
FACE,
if (direction == Direction.UP) AttachFace.CEILING else AttachFace.FLOOR
)
.setValue(FACING, context.horizontalDirection.opposite).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
} else {
(defaultBlockState().setValue(FACE, AttachFace.WALL) as BlockState).setValue(
FACING,
direction.opposite
).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
if (blockState.canSurvive(context.level, context.clickedPos)) {
return blockState
}
}
return null
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
val direction = state.getValue(FACING)
return when (state.getValue(FACE)) {
AttachFace.FLOOR -> return if (state.getValue(POWERED)) {FLOOR_POWERED} else {FLOOR_UNPOWERED}
AttachFace.WALL -> {
when (direction) {
Direction.EAST -> return if (state.getValue(POWERED)) {EAST_WALL_POWERED} else {EAST_WALL_UNPOWERED}
Direction.WEST -> return if (state.getValue(POWERED)) {WEST_WALL_POWERED} else {WEST_WALL_UNPOWERED}
Direction.SOUTH -> return if (state.getValue(POWERED)) {SOUTH_WALL_POWERED} else {SOUTH_WALL_UNPOWERED}
Direction.NORTH -> return if (state.getValue(POWERED)) {NORTH_WALL_POWERED} else {NORTH_WALL_UNPOWERED}
else -> {FLOOR_UNPOWERED}
}
}
AttachFace.CEILING -> return if (state.getValue(POWERED)) {CEILING_POWERED} else {CEILING_UNPOWERED}
}
}
override fun getCollisionShape(
state: BlockState,
level: BlockGetter,
pos: BlockPos,
context: CollisionContext
): VoxelShape {
val direction = state.getValue(FACING)
return when (state.getValue(FACE)) {
AttachFace.FLOOR -> {FLOOR_PANEL}
AttachFace.WALL -> {
when (direction) {
Direction.EAST -> {EAST_WALL_PANEL}
Direction.WEST -> {WEST_WALL_PANEL}
Direction.SOUTH -> {SOUTH_WALL_PANEL}
Direction.NORTH -> {NORTH_WALL_PANEL}
else -> {FLOOR_PANEL}
}
}
AttachFace.CEILING -> {CEILING_PANEL}
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (getConnectedDirection(state).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
//It does in fact override, and crashes if it isn't overriding. Don't trust this.
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState?, level: LevelReader?, pos: BlockPos): Boolean {
return when (state?.getValue(FACE)) {
AttachFace.CEILING -> {
level!!.getBlockState(pos.above()).isSolid
}
AttachFace.WALL -> {
level!!.getBlockState(pos.relative(state.getValue(FACING).opposite)).isSolid
}
AttachFace.FLOOR -> {
level!!.getBlockState(pos.below()).isSolid
}
else -> true
}
}
override fun useWithoutItem(
state: BlockState,
level: Level,
pos: BlockPos,
player: Player,
hitResult: BlockHitResult
): InteractionResult {
if (state.getValue(POWERED) as Boolean) {
return InteractionResult.CONSUME
} else {
this.press(state, level, pos, player)
return InteractionResult.sidedSuccess(level.isClientSide)
}
}
fun press(state: BlockState, level: Level, pos: BlockPos, player: Player?) {
level.setBlock(pos, state.setValue(POWERED, true) as BlockState, 3)
this.updateNeighbours(state, level, pos)
level.scheduleTick(pos, this, this.ticksToStayPressed)
//this.playSound(player, level, pos, true)
level.gameEvent(player, GameEvent.BLOCK_ACTIVATE, pos)
}
private fun updateNeighbours(state: BlockState, level: Level, pos: BlockPos) {
level.updateNeighborsAt(pos, this)
level.updateNeighborsAt(pos.relative(getConnectedDirection(state).getOpposite()), this)
}
override fun onRemove(
state: BlockState,
level: Level,
pos: BlockPos,
newState: BlockState,
movedByPiston: Boolean
) {
if (!movedByPiston && !state.`is`(newState.getBlock())) {
if (state.getValue(POWERED) as Boolean) {
this.updateNeighbours(state, level, pos)
}
super.onRemove(state, level, pos, newState, movedByPiston)
}
}
override fun getSignal(state: BlockState, level: BlockGetter, pos: BlockPos, direction: Direction): Int {
return if (state.getValue(POWERED) as Boolean) 15 else 0
}
override fun getDirectSignal(state: BlockState, level: BlockGetter, pos: BlockPos, direction: Direction): Int {
return if (state.getValue(POWERED) as Boolean && getConnectedDirection(state) == direction) 15 else 0
}
override fun isSignalSource(state: BlockState): Boolean {
return true
}
override fun tick(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
if (state.getValue(POWERED)) {
this.checkPressed(state, level, pos)
}
}
protected fun checkPressed(state: BlockState, level: Level, pos: BlockPos) {
val abstractArrow = null
val bl = false
val bl2 = state.getValue(POWERED) as Boolean
if (bl != bl2) {
level.setBlock(pos, state.setValue(POWERED, bl) as BlockState, 3)
this.updateNeighbours(state, level, pos)
//this.playSound(null as Player?, level, pos, bl)
level.gameEvent(abstractArrow, if (bl) GameEvent.BLOCK_ACTIVATE else GameEvent.BLOCK_DEACTIVATE, pos)
}
if (bl) {
level.scheduleTick(BlockPos(pos), this, this.ticksToStayPressed)
}
}
companion object {
val CODEC: MapCodec<EjectButtonBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec()
).apply(it, ::EjectButtonBlock) }
val POWERED = BooleanProperty.create("powered")
val FLOOR_UNPOWERED = Shapes.or(
Shapes.box(0.125, 0.0, 0.125, 0.875, 0.1875, 0.875),
Shapes.box(0.375, 0.1875, 0.375, 0.625, 0.3125, 0.625) )
val FLOOR_POWERED = Shapes.or(
Shapes.box(0.125, 0.0, 0.125, 0.875, 0.1875, 0.875),
Shapes.box(0.375, 0.1875, 0.375, 0.625, 0.25, 0.625) )
val FLOOR_PANEL = Shapes.box(0.125, 0.0, 0.125, 0.875, 0.1875, 0.875)
val CEILING_UNPOWERED = Shapes.or(
Shapes.box(0.125, 0.8125, 0.125, 0.875, 1.0, 0.875),
Shapes.box(0.375, 0.6875, 0.375, 0.625, 0.8125, 0.625) )
val CEILING_POWERED = Shapes.or(
Shapes.box(0.125, 0.8125, 0.125, 0.875, 1.0, 0.875),
Shapes.box(0.375, 0.75, 0.375, 0.625, 0.8125, 0.625) )
val CEILING_PANEL = Shapes.box(0.125, 0.8125, 0.125, 0.875, 1.0, 0.875)
val EAST_WALL_UNPOWERED = Shapes.or(
Shapes.box(0.0, 0.125, 0.125, 0.1875, 0.875, 0.875),
Shapes.box(0.1875, 0.375, 0.375, 0.3125, 0.625, 0.625) )
val EAST_WALL_POWERED = Shapes.or(
Shapes.box(0.0, 0.125, 0.125, 0.1875, 0.875, 0.875),
Shapes.box(0.1875, 0.375, 0.375, 0.25, 0.625, 0.625) )
val EAST_WALL_PANEL = Shapes.box(0.0, 0.125, 0.125, 0.1875, 0.875, 0.875)
val WEST_WALL_UNPOWERED = Shapes.or(
Shapes.box(0.8125, 0.125, 0.125, 1.0, 0.875, 0.875),
Shapes.box(0.6875, 0.375, 0.375, 0.8125, 0.625, 0.625) )
val WEST_WALL_POWERED = Shapes.or(
Shapes.box(0.8125, 0.125, 0.125, 1.0, 0.875, 0.875),
Shapes.box(0.75, 0.375, 0.375, 0.8125, 0.625, 0.625) )
val WEST_WALL_PANEL = Shapes.box(0.8125, 0.125, 0.125, 1.0, 0.875, 0.875)
val NORTH_WALL_UNPOWERED = Shapes.or(
Shapes.box(0.125, 0.125, 0.8125, 0.875, 0.875, 1.0),
Shapes.box(0.375, 0.375, 0.6875, 0.625, 0.625, 0.8125) )
val NORTH_WALL_POWERED = Shapes.or(
Shapes.box(0.125, 0.125, 0.8125, 0.875, 0.875, 1.0),
Shapes.box(0.375, 0.375, 0.75, 0.625, 0.625, 0.8125) )
val NORTH_WALL_PANEL = Shapes.box(0.125, 0.125, 0.8125, 0.875, 0.875, 1.0)
val SOUTH_WALL_UNPOWERED = Shapes.or(
Shapes.box(0.125, 0.125, 0.0, 0.875, 0.875, 0.1875),
Shapes.box(0.375, 0.375, 0.1875, 0.625, 0.625, 0.3125) )
val SOUTH_WALL_POWERED = Shapes.or(
Shapes.box(0.125, 0.125, 0.0, 0.875, 0.875, 0.1875),
Shapes.box(0.375, 0.375, 0.1875, 0.625, 0.625, 0.25) )
val SOUTH_WALL_PANEL = Shapes.box(0.125, 0.125, 0.0, 0.875, 0.875, 0.1875)
}
}
@@ -0,0 +1,155 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.cobblemon.mod.common.CobblemonBlocks
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.AttachFace
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class GalaricaWreathBlock(properties : Properties) : FaceAttachedHorizontalDirectionalBlock(properties), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(FACE, AttachFace.WALL)
.setValue(WATERLOGGED, false))
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(FACE)
builder.add(WATERLOGGED)
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
//May need some clean up, ended up just copying this straight from the original class so I could inject the waterlogging stuff to make it properly work, but it does look a bit ugly
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val var2 = context.nearestLookingDirections
val var3 = var2.size
val fluidState = context.level.getFluidState(context.clickedPos)
for (var4 in 0 until var3) {
val direction = var2[var4]
var blockState = if (direction.axis === Direction.Axis.Y) {
defaultBlockState().setValue(
FACE,
if (direction == Direction.UP) AttachFace.CEILING else AttachFace.FLOOR
)
.setValue(FACING, context.horizontalDirection.opposite).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
} else {
(defaultBlockState().setValue(FACE, AttachFace.WALL) as BlockState).setValue(
FACING,
direction.opposite
).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
if (blockState.canSurvive(context.level, context.clickedPos)) {
return blockState
}
}
return null
}
override fun codec(): MapCodec<GalaricaWreathBlock> {
return CODEC
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
val direction = state.getValue(FACING)
return when (state.getValue(FACE)) {
AttachFace.FLOOR -> {
FLOOR
}
AttachFace.WALL -> {
when (direction) {
Direction.EAST -> EAST_WALL
Direction.WEST -> WEST_WALL
Direction.SOUTH -> SOUTH_WALL
Direction.NORTH, Direction.UP, Direction.DOWN -> NORTH_WALL
}
}
AttachFace.CEILING -> return if (direction.axis === Direction.Axis.X) {
HANGING_NS
} else {
HANGING_EW
}
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (getConnectedDirection(state).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
//It does in fact override, and crashes if it isn't overriding. Don't trust this.
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState?, level: LevelReader?, pos: BlockPos): Boolean {
when (state?.getValue(FACE)) {
AttachFace.CEILING -> {
val direction = getConnectedDirection(state!!).opposite
return canSupportCenter(level!!, pos.relative(direction), direction.opposite)
}
AttachFace.WALL -> {
return level!!.getBlockState(pos.relative(state.getValue(FACING).opposite)).isSolid
}
else -> return true
}
}
companion object {
val CODEC: MapCodec<GalaricaWreathBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec()
).apply(it, ::GalaricaWreathBlock) }
val FLOOR = Shapes.box(0.171875, 0.0, 0.171875, 0.828125, 0.203125, 0.828125)
val EAST_WALL = Shapes.box(0.0, 0.171875, 0.171875, 0.203125, 0.828125, 0.828125)
val WEST_WALL = Shapes.box(0.796875, 0.171875, 0.171875, 1.0, 0.828125, 0.828125)
val NORTH_WALL = Shapes.box(0.171875, 0.171875, 0.796875, 0.828125, 0.828125, 1.0)
val SOUTH_WALL = Shapes.box(0.171875, 0.171875, 0.0, 0.828125, 0.828125, 0.203125)
val HANGING_EW = Shapes.box(0.171875, 0.171875, 0.390625, 0.828125, 0.828125, 0.609375)
val HANGING_NS = Shapes.box(0.390625, 0.171875, 0.171875, 0.609375, 0.828125, 0.828125)
}
}
@@ -0,0 +1,165 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.server.level.ServerLevel
import net.minecraft.sounds.SoundEvents
import net.minecraft.sounds.SoundSource
import net.minecraft.world.InteractionResult
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.gameevent.GameEvent
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
class MetronomeBlock(settings: Properties) : Block(settings), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(ACTIVE, false)
.setValue(WATERLOGGED, false)
)
}
override fun getStateForPlacement(ctx: BlockPlaceContext): BlockState? {
var blockState = defaultBlockState().setValue(ACTIVE, false)
.setValue(WATERLOGGED, ctx.level.getFluidState(ctx.clickedPos).type == Fluids.WATER)
val worldView = ctx.level
val blockPos = ctx.clickedPos
ctx.nearestLookingDirections.forEach { direction ->
if (direction.axis.isHorizontal) {
blockState = blockState.setValue(FACING, direction.opposite) as BlockState
if (blockState.canSurvive(worldView, blockPos)) {
return blockState
}
}
}
return null
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING)
builder.add(ACTIVE)
builder.add(WATERLOGGED)
}
override fun getShape(
state: BlockState,
world: BlockGetter,
pos: BlockPos,
context: CollisionContext
): VoxelShape {
return when (state.getValue(HorizontalDirectionalBlock.FACING)) {
Direction.NORTH -> NORTH_OUTLINE
Direction.EAST -> EAST_OUTLINE
Direction.WEST -> WEST_OUTLINE
else -> SOUTH_OUTLINE
}
}
override fun useWithoutItem(
state: BlockState,
level: Level,
pos: BlockPos,
player: Player,
hitResult: BlockHitResult
): InteractionResult {
if (level.isClientSide) {
level.setBlockAndUpdate(pos, state.cycle(ACTIVE))
return InteractionResult.SUCCESS
} else {
this.push(state, level, pos, null as Player?)
return InteractionResult.CONSUME
}
}
fun push(state: BlockState, level: Level, pos: BlockPos?, player: Player?) {
var state = state
state = state.cycle(ACTIVE)
level.setBlock(pos!!, state, 3)
level.gameEvent(player, if (state.getValue(ACTIVE)) GameEvent.BLOCK_ACTIVATE else GameEvent.BLOCK_DEACTIVATE, pos)
}
override fun hasAnalogOutputSignal(state: BlockState): Boolean {
return true
}
override fun getAnalogOutputSignal(state: BlockState, level: Level, pos: BlockPos): Int {
return if (level.getBlockState(pos).getValue(ACTIVE) as Boolean) 4 else 0
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(HORIZONTAL_FACING, rotation.rotate(state.getValue(HORIZONTAL_FACING)))
}
@Deprecated("Deprecated in Java")
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean {
return false
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (direction == state.getValue(FACING) && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
companion object {
val CODEC = simpleCodec(::MetronomeBlock)
val ACTIVE = BooleanProperty.create("active")
val NORTH_OUTLINE = Shapes.or(
Shapes.box(0.25, 0.0, 0.375, 0.75, 0.25, 0.5),
Shapes.box(0.25, 0.0, 0.5, 0.75, 0.8125, 0.75)
)
val SOUTH_OUTLINE = Shapes.or(
Shapes.box(0.25, 0.0, 0.5, 0.75, 0.25, 0.625),
Shapes.box(0.25, 0.0, 0.25, 0.75, 0.8125, 0.5)
)
val EAST_OUTLINE = Shapes.or(
Shapes.box(0.5, 0.0, 0.25, 0.625, 0.25, 0.75),
Shapes.box(0.25, 0.0, 0.25, 0.5, 0.8125, 0.75)
)
val WEST_OUTLINE = Shapes.or(
Shapes.box(0.375, 0.0, 0.25, 0.5, 0.25, 0.75),
Shapes.box(0.5, 0.0, 0.25, 0.75, 0.8125, 0.75)
)
}
}
@@ -0,0 +1,168 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.AttachFace
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class PlaqueBlock(properties : Properties) : FaceAttachedHorizontalDirectionalBlock(properties), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(FACE, AttachFace.WALL)
.setValue(WATERLOGGED, false))
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(FACE)
builder.add(WATERLOGGED)
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
//May need some clean up, ended up just copying this straight from the original class so I could inject the waterlogging stuff to make it properly work, but it does look a bit ugly
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val var2 = context.nearestLookingDirections
val var3 = var2.size
val fluidState = context.level.getFluidState(context.clickedPos)
for (var4 in 0 until var3) {
val direction = var2[var4]
var blockState = if (direction.axis === Direction.Axis.Y) {
defaultBlockState().setValue(
FACE,
if (direction == Direction.UP) AttachFace.CEILING else AttachFace.FLOOR
)
.setValue(FACING, context.horizontalDirection.opposite).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
} else {
(defaultBlockState().setValue(FACE, AttachFace.WALL) as BlockState).setValue(
FACING,
direction.opposite
).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
if (blockState.canSurvive(context.level, context.clickedPos)) {
return blockState
}
}
return null
}
override fun codec(): MapCodec<PlaqueBlock> {
return CODEC
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
val direction = state.getValue(FACING)
return when (state.getValue(FACE)) {
AttachFace.FLOOR -> return if (direction.axis === Direction.Axis.X) {
FLOOR_NS
} else {
FLOOR_EW
}
AttachFace.WALL -> {
when (direction) {
Direction.EAST -> EAST_WALL
Direction.WEST -> WEST_WALL
Direction.SOUTH -> SOUTH_WALL
Direction.NORTH, Direction.UP, Direction.DOWN -> NORTH_WALL
}
}
AttachFace.CEILING -> return if (direction.axis === Direction.Axis.X) {
HANGING_NS
} else {
HANGING_EW
}
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (getConnectedDirection(state).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
//It does in fact override, and crashes if it isn't overriding. Don't trust this.
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState?, level: LevelReader?, pos: BlockPos): Boolean {
when (state?.getValue(FACE)) {
AttachFace.CEILING -> {
val direction = getConnectedDirection(state!!).opposite
return canSupportCenter(level!!, pos.relative(direction), direction.opposite)
}
AttachFace.WALL -> {
return level!!.getBlockState(pos.relative(state.getValue(FACING).opposite)).isSolid
}
AttachFace.FLOOR -> {
return level!!.getBlockState(pos.below()).isSolid
}
else -> return true
}
}
companion object {
val CODEC: MapCodec<PlaqueBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec()
).apply(it, ::PlaqueBlock) }
val FLOOR_EW = Shapes.or(
Shapes.box(0.125, 0.0, 0.46875, 0.3125, 0.125, 0.53125),
Shapes.box(0.6875, 0.0, 0.46875, 0.875, 0.125, 0.53125),
Shapes.box(0.0625, 0.125, 0.4375, 0.9375, 0.875, 0.5625)
)
val FLOOR_NS = Shapes.or(
Shapes.box(0.46875, 0.0, 0.125, 0.53125, 0.125, 0.3125),
Shapes.box(0.46875, 0.0, 0.6875, 0.53125, 0.125, 0.875),
Shapes.box(0.4375, 0.125, 0.0625, 0.5625, 0.875, 0.9375)
)
val EAST_WALL = Shapes.box(0.0, 0.125, 0.0625, 0.0625, 0.875, 0.9375)
val WEST_WALL = Shapes.box(0.9375, 0.125, 0.0625, 1.0, 0.875, 0.9375)
val NORTH_WALL = Shapes.box(0.0625, 0.125, 0.9375, 0.9375, 0.875, 1.0)
val SOUTH_WALL = Shapes.box(0.0625, 0.125, 0.0, 0.9375, 0.875, 0.0625)
val HANGING_NS = Shapes.box(0.4375, 0.0, 0.0625, 0.5625, 0.75, 0.9375)
val HANGING_EW = Shapes.box(0.0625, 0.0, 0.4375, 0.9375, 0.75, 0.5625)
}
}
@@ -0,0 +1,247 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.cobblemon.mod.common.CobblemonBlocks
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.AttachFace
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class SixFaceDecorativeItemBlock(properties : Properties, val sixFaceItemType: SixFaceItemType) : FaceAttachedHorizontalDirectionalBlock(properties), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(FACE, AttachFace.FLOOR)
.setValue(WATERLOGGED, false))
}
@Suppress("unused")
enum class SixFaceItemType : StringRepresentable {
MAGNET,
GENERIC_8x;
override fun getSerializedName(): String = this.name.lowercase()
companion object {
val CODEC = StringRepresentable.fromEnum(::values)
}
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(FACE)
builder.add(WATERLOGGED)
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
//May need some clean up, ended up just copying this straight from the original class so I could inject the waterlogging stuff to make it properly work, but it does look a bit ugly
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val var2 = context.nearestLookingDirections
val var3 = var2.size
val fluidState = context.level.getFluidState(context.clickedPos)
for (var4 in 0 until var3) {
val direction = var2[var4]
var blockState = if (direction.axis === Direction.Axis.Y) {
defaultBlockState().setValue(
FACE,
if (direction == Direction.UP) AttachFace.CEILING else AttachFace.FLOOR
)
.setValue(FACING, context.horizontalDirection.opposite).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
} else {
(defaultBlockState().setValue(FACE, AttachFace.WALL) as BlockState).setValue(
FACING,
direction.opposite
).setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
if (blockState.canSurvive(context.level, context.clickedPos)) {
return blockState
}
}
return null
}
override fun codec(): MapCodec<SixFaceDecorativeItemBlock> {
return CODEC
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
val direction = state.getValue(FACING)
return when (sixFaceItemType) {
SixFaceItemType.MAGNET -> {
when (state.getValue(FACE)) {
AttachFace.FLOOR -> {
when (direction) {
Direction.EAST -> EAST_FLOOR_MAGNET
Direction.WEST -> WEST_FLOOR_MAGNET
Direction.SOUTH -> SOUTH_FLOOR_MAGNET
Direction.NORTH, Direction.UP, Direction.DOWN -> NORTH_FLOOR_MAGNET
}
}
AttachFace.WALL -> {
when (direction) {
Direction.EAST -> EAST_WALL_MAGNET
Direction.WEST -> WEST_WALL_MAGNET
Direction.SOUTH -> SOUTH_WALL_MAGNET
Direction.NORTH, Direction.UP, Direction.DOWN -> NORTH_WALL_MAGNET
}
}
AttachFace.CEILING -> {
when (direction) {
Direction.EAST -> EAST_CEILING_MAGNET
Direction.WEST -> WEST_CEILING_MAGNET
Direction.SOUTH -> SOUTH_CEILING_MAGNET
Direction.NORTH, Direction.UP, Direction.DOWN -> NORTH_CEILING_MAGNET
}
}
}
}
else -> {
when (state.getValue(FACE)) {
AttachFace.FLOOR -> {
FLOOR_8x
}
AttachFace.WALL -> {
when (direction) {
Direction.EAST -> EAST_WALL_8x
Direction.WEST -> WEST_WALL_8x
Direction.SOUTH -> SOUTH_WALL_8x
Direction.NORTH, Direction.UP, Direction.DOWN -> NORTH_WALL_8x
}
}
AttachFace.CEILING -> CEILING_8x
}
}
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (getConnectedDirection(state).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState?, level: LevelReader?, pos: BlockPos): Boolean {
return true
}
companion object {
val CODEC: MapCodec<SixFaceDecorativeItemBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec(),
SixFaceItemType.CODEC.fieldOf("sixFaceItemType").forGetter(SixFaceDecorativeItemBlock::sixFaceItemType)
).apply(it, ::SixFaceDecorativeItemBlock) }
val FLOOR_8x = Shapes.box(0.25, 0.0, 0.25, 0.75, 0.5, 0.75)
val EAST_WALL_8x = Shapes.box(0.0, 0.25, 0.25, 0.5, 0.75, 0.75)
val WEST_WALL_8x = Shapes.box(0.5, 0.25, 0.25, 1.0, 0.75, 0.75)
val NORTH_WALL_8x = Shapes.box(0.25, 0.25, 0.5, 0.75, 0.75, 1.0)
val SOUTH_WALL_8x = Shapes.box(0.25, 0.25, 0.0, 0.75, 0.75, 0.5)
val CEILING_8x = Shapes.box(0.25, 0.5, 0.25, 0.75, 1.0, 0.75)
val NORTH_FLOOR_MAGNET = Shapes.or(
Shapes.box(0.25, 0.0, 0.25, 0.4375, 0.1875, 0.5625),
Shapes.box(0.5625, 0.0, 0.25, 0.75, 0.1875, 0.5625),
Shapes.box(0.25, 0.0, 0.5625, 0.75, 0.1875, 0.75)
)
val EAST_FLOOR_MAGNET = Shapes.or(
Shapes.box(0.4375, 0.0, 0.25, 0.75, 0.1875, 0.4375),
Shapes.box(0.4375, 0.0, 0.5625, 0.75, 0.1875, 0.75),
Shapes.box(0.25, 0.0, 0.25, 0.4375, 0.1875, 0.75)
)
val SOUTH_FLOOR_MAGNET = Shapes.or(
Shapes.box(0.5625, 0.0, 0.4375, 0.75, 0.1875, 0.75),
Shapes.box(0.25, 0.0, 0.4375, 0.4375, 0.1875, 0.75),
Shapes.box(0.25, 0.0, 0.25, 0.75, 0.1875, 0.4375)
)
val WEST_FLOOR_MAGNET = Shapes.or(
Shapes.box(0.25, 0.0, 0.5625, 0.5625, 0.1875, 0.75),
Shapes.box(0.25, 0.0, 0.25, 0.5625, 0.1875, 0.4375),
Shapes.box(0.5625, 0.0, 0.25, 0.75, 0.1875, 0.75)
)
val NORTH_WALL_MAGNET = Shapes.or(
Shapes.box(0.25, 0.25, 0.8125, 0.4375, 0.5625, 1.0),
Shapes.box(0.5625, 0.25, 0.8125, 0.75, 0.5625, 1.0),
Shapes.box(0.25, 0.5625, 0.8125, 0.75, 0.75, 1.0)
)
val EAST_WALL_MAGNET = Shapes.or(
Shapes.box(0.0, 0.25, 0.25, 0.1875, 0.5625, 0.4375),
Shapes.box(0.0, 0.25, 0.5625, 0.1875, 0.5625, 0.75),
Shapes.box(0.0, 0.5625, 0.25, 0.1875, 0.75, 0.75)
)
val SOUTH_WALL_MAGNET = Shapes.or(
Shapes.box(0.5625, 0.25, 0.0, 0.75, 0.5625, 0.1875),
Shapes.box(0.25, 0.25, 0.0, 0.4375, 0.5625, 0.1875),
Shapes.box(0.25, 0.5625, 0.0, 0.75, 0.75, 0.1875)
)
val WEST_WALL_MAGNET = Shapes.or(
Shapes.box(0.8125, 0.25, 0.5625, 1.0, 0.5625, 0.75),
Shapes.box(0.8125, 0.25, 0.25, 1.0, 0.5625, 0.4375),
Shapes.box(0.8125, 0.5625, 0.25, 1.0, 0.75, 0.75)
)
val NORTH_CEILING_MAGNET = Shapes.or(
Shapes.box(0.25, 0.8125, 0.25, 0.4375, 1.0, 0.5625),
Shapes.box(0.5625, 0.8125, 0.25, 0.75, 1.0, 0.5625),
Shapes.box(0.25, 0.8125, 0.5625, 0.75, 1.0, 0.75)
)
val EAST_CEILING_MAGNET = Shapes.or(
Shapes.box(0.4375, 0.8125, 0.25, 0.75, 1.0, 0.4375),
Shapes.box(0.4375, 0.8125, 0.5625, 0.75, 1.0, 0.75),
Shapes.box(0.25, 0.8125, 0.25, 0.4375, 1.1875, 0.75)
)
val SOUTH_CEILING_MAGNET = Shapes.or(
Shapes.box(0.5625, 0.8125, 0.4375, 0.75, 1.0, 0.75),
Shapes.box(0.25, 0.8125, 0.4375, 0.4375, 1.0, 0.75),
Shapes.box(0.25, 0.8125, 0.25, 0.75, 1.0, 0.4375)
)
val WEST_CEILING_MAGNET = Shapes.or(
Shapes.box(0.25, 0.8125, 0.5625, 0.5625, 1.0, 0.75),
Shapes.box(0.25, 0.8125, 0.25, 0.5625, 1.0, 0.4375),
Shapes.box(0.5625, 0.8125, 0.25, 0.75, 1.0, 0.75)
)
}
}
@@ -0,0 +1,708 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.IntegerProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
import kotlin.math.min
class StackableItemBlock(settings: Properties, val stackableItemType: StackableItemType) : Block(settings), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(ITEMS, 1)
.setValue(WATERLOGGED, false))
}
@Suppress("unused")
enum class StackableItemType : StringRepresentable {
UPGRADE,
METAL_COAT,
POTION,
MAX_POTION,
RESTORE,
ETHER,
BATTLE_X,
VITAMIN,
GENERIC_8x;
override fun getSerializedName(): String = this.name.lowercase()
companion object {
val CODEC = StringRepresentable.fromEnum(::values)
}
}
override fun codec(): MapCodec<StackableItemBlock> {
return CODEC
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState {
val blockState = context.level.getBlockState(context.clickedPos)
return if (blockState.`is`(this)) blockState.setValue(
ITEMS,
min(MAX_ITEMS, (blockState.getValue(ITEMS) + 1))
) else defaultBlockState().setValue(FACING, context.horizontalDirection.opposite).setValue(WATERLOGGED, context.level.getFluidState(context.clickedPos).type == Fluids.WATER)
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING)
builder.add(ITEMS)
builder.add(WATERLOGGED)
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
return when (stackableItemType) {
StackableItemType.UPGRADE -> {
when (state.getValue(ITEMS)) {
2 -> UPGRADE_DOUBLE
3 -> UPGRADE_TRIPLE
4 -> UPGRADE_QUARTET
else -> UPGRADE_SINGLE
}
}
StackableItemType.METAL_COAT -> {
when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> METAL_DOUBLE_EW
else -> METAL_DOUBLE_NS
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> METAL_TRIPLE_S
Direction.WEST -> METAL_TRIPLE_W
Direction.EAST -> METAL_TRIPLE_E
else -> METAL_TRIPLE_N
}
4 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> METAL_QUARTET_EW
else -> METAL_QUARTET_NS
}
else -> METAL_SINGLE
}
}
StackableItemType.POTION -> {
when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> POTION_DOUBLE_EW
else -> POTION_DOUBLE_NS
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> POTION_TRIPLE_SOUTH
Direction.WEST -> POTION_TRIPLE_WEST
Direction.EAST -> POTION_TRIPLE_EAST
else -> POTION_TRIPLE_NORTH
}
4 -> when (state.getValue(FACING)) {
Direction.SOUTH -> POTION_QUARTET_SOUTH
Direction.WEST -> POTION_QUARTET_WEST
Direction.EAST -> POTION_QUARTET_EAST
else -> POTION_QUARTET_NORTH
}
else -> POTION_SINGLE
}
}
StackableItemType.MAX_POTION -> {
when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.SOUTH -> MAX_POTION_DOUBLE_SOUTH
Direction.WEST -> MAX_POTION_DOUBLE_WEST
Direction.EAST -> MAX_POTION_DOUBLE_EAST
else -> MAX_POTION_DOUBLE_NORTH
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> MAX_POTION_TRIPLE_SOUTH
Direction.WEST -> MAX_POTION_TRIPLE_WEST
Direction.EAST -> MAX_POTION_TRIPLE_EAST
else -> MAX_POTION_TRIPLE_NORTH
}
4 -> when (state.getValue(FACING)) {
Direction.SOUTH -> MAX_POTION_QUARTET_SOUTH
Direction.WEST -> MAX_POTION_QUARTET_WEST
Direction.EAST -> MAX_POTION_QUARTET_EAST
else -> MAX_POTION_QUARTET_NORTH
}
else -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> MAX_POTION_SINGLE_EW
else -> MAX_POTION_SINGLE_NS
}
}
}
StackableItemType.RESTORE -> {
when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> RESTORE_DOUBLE_EW
else -> RESTORE_DOUBLE_NS
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> RESTORE_TRIPLE_SOUTH
Direction.WEST -> RESTORE_TRIPLE_WEST
Direction.EAST -> RESTORE_TRIPLE_EAST
else -> RESTORE_TRIPLE_NORTH
}
4 -> when (state.getValue(FACING)) {
Direction.SOUTH -> RESTORE_QUARTET_SOUTH
Direction.WEST -> RESTORE_QUARTET_WEST
Direction.EAST -> RESTORE_QUARTET_EAST
else -> RESTORE_QUARTET_NORTH
}
else -> RESTORE_SINGLE
}
}
StackableItemType.ETHER -> {
when (state.getValue(ITEMS)) {
1 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> ETHER_SINGLE_EW
else -> ETHER_SINGLE_NS
}
2 -> when (state.getValue(FACING)) {
Direction.SOUTH -> ETHER_DOUBLE_SOUTH
Direction.WEST -> ETHER_DOUBLE_WEST
Direction.EAST -> ETHER_DOUBLE_EAST
else -> ETHER_DOUBLE_NORTH
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> ETHER_TRIPLE_SOUTH
Direction.WEST -> ETHER_TRIPLE_WEST
Direction.EAST -> ETHER_TRIPLE_EAST
else -> ETHER_TRIPLE_NORTH
}
4 -> when (state.getValue(FACING)) {
Direction.SOUTH -> ETHER_QUARTET_SOUTH
Direction.WEST -> ETHER_QUARTET_WEST
Direction.EAST -> ETHER_QUARTET_EAST
else -> ETHER_QUARTET_NORTH
}
else -> ETHER_SINGLE_NS
}
}
StackableItemType.BATTLE_X -> {
when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> BATTLE_DOUBLE_EW
else -> BATTLE_DOUBLE_NS
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> BATTLE_TRIPLE_S
Direction.WEST -> BATTLE_TRIPLE_W
Direction.EAST -> BATTLE_TRIPLE_E
else -> BATTLE_TRIPLE_N
}
4 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> BATTLE_QUARTET_EW
else -> BATTLE_QUARTET_NS
}
else -> BATTLE_SINGLE
}
}
StackableItemType.VITAMIN -> {
when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.WEST, Direction.EAST -> VITAMIN_DOUBLE_EW
else -> VITAMIN_DOUBLE_NS
}
3 -> when (state.getValue(FACING)) {
Direction.SOUTH -> VITAMIN_TRIPLE_SOUTH
Direction.WEST -> VITAMIN_TRIPLE_WEST
Direction.EAST -> VITAMIN_TRIPLE_EAST
else -> VITAMIN_TRIPLE_NORTH
}
4 -> when (state.getValue(FACING)) {
Direction.SOUTH -> VITAMIN_QUARTET_SOUTH
Direction.WEST -> VITAMIN_QUARTET_WEST
Direction.EAST -> VITAMIN_QUARTET_EAST
else -> VITAMIN_QUARTET_NORTH
}
else -> VITAMIN_SINGLE
}
}
else -> ITEM_8x
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (direction == state.getValue(FACING) && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
public override fun canBeReplaced(state: BlockState, useContext: BlockPlaceContext): Boolean {
return if (!useContext.isSecondaryUseActive && useContext.itemInHand.`is`(this.asItem()) && state.getValue(
ITEMS
) <= MAX_ITEMS
) true else super.canBeReplaced(state, useContext)
}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(HORIZONTAL_FACING, rotation.rotate(state.getValue(HORIZONTAL_FACING)))
}
@Deprecated("Deprecated in Java")
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean {
return false
}
companion object {
val CODEC: MapCodec<StackableItemBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec(),
StackableItemType.CODEC.fieldOf("stackableItemType").forGetter(StackableItemBlock::stackableItemType)
).apply(it, ::StackableItemBlock) }
val ITEMS = IntegerProperty.create("items", 1, 4)
const val MAX_ITEMS: Int = 4
//Non-Specific Hitbox Shapes
val ITEM_8x = Shapes.box(0.25, 0.0, 0.25, 0.75, 0.5, 0.75)
val ITEM_16xS = Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)
val ITEM_8x16 = Shapes.box(0.25, 0.0, 0.0, 0.75, 0.5, 1.0)
val ITEM_16x8 = Shapes.box(0.0, 0.0, 0.25, 1.0, 0.5, 0.75)
private val TRIANGLE_NORTH = Shapes.or(
Shapes.box(0.0, 0.0, 0.5, 1.0, 0.5, 1.0),
Shapes.box(0.25, 0.0, 0.0, 0.75, 0.5, 0.5)
)
private val TRIANGLE_EAST = Shapes.or(
Shapes.box(0.0, 0.0, 0.0, 0.5, 0.5, 1.0),
Shapes.box(0.5, 0.0, 0.25, 1.0, 0.5, 0.75)
)
private val TRIANGLE_SOUTH = Shapes.or(
Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 0.5),
Shapes.box(0.25, 0.0, 0.5, 0.75, 0.5, 1.0)
)
private val TRIANGLE_WEST = Shapes.or(
Shapes.box(0.5, 0.0, 0.0, 1.0, 0.5, 1.0),
Shapes.box(0.0, 0.0, 0.25, 0.5, 0.5, 0.75)
)
//Specific Hitbox Shapes
val UPGRADE_SINGLE = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.125, 0.6875)
val UPGRADE_DOUBLE = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.25, 0.6875)
val UPGRADE_TRIPLE = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.375, 0.6875)
val UPGRADE_QUARTET = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.5, 0.6875)
val METAL_SINGLE = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.375, 0.6875)
val METAL_DOUBLE_NS = Shapes.or(
Shapes.box(0.5, 0.0, 0.125, 0.875, 0.375, 0.5),
Shapes.box(0.125, 0.0, 0.5, 0.5, 0.375, 0.875)
)
val METAL_DOUBLE_EW = Shapes.or(
Shapes.box(0.5, 0.0, 0.5, 0.875, 0.375, 0.875),
Shapes.box(0.125, 0.0, 0.125, 0.5, 0.375, 0.5)
)
val METAL_TRIPLE_N = Shapes.or(
Shapes.box(0.3125, 0.0, 0.0625, 0.6875, 0.375, 0.4375),
Shapes.box(0.5625, 0.0, 0.5, 0.9375, 0.375, 0.875),
Shapes.box(0.125, 0.0, 0.5, 0.5, 0.375, 0.875)
)
val METAL_TRIPLE_E = Shapes.or(
Shapes.box(0.5625, 0.0, 0.3125, 0.9375, 0.375, 0.6875),
Shapes.box(0.125, 0.0, 0.5625, 0.5, 0.375, 0.9375),
Shapes.box(0.125, 0.0, 0.125, 0.5, 0.375, 0.5)
)
val METAL_TRIPLE_S = Shapes.or(
Shapes.box(0.3125, 0.0, 0.5625, 0.6875, 0.375, 0.9375),
Shapes.box(0.0625, 0.0, 0.125, 0.4375, 0.375, 0.5),
Shapes.box(0.5, 0.0, 0.125, 0.875, 0.375, 0.5)
)
val METAL_TRIPLE_W = Shapes.or(
Shapes.box(0.0625, 0.0, 0.3125, 0.4375, 0.375, 0.6875),
Shapes.box(0.5, 0.0, 0.0625, 0.875, 0.375, 0.4375),
Shapes.box(0.5, 0.0, 0.5, 0.875, 0.375, 0.875)
)
val METAL_QUARTET_NS = Shapes.or(
Shapes.box(0.5625, 0.0, 0.0625, 0.9375, 0.375, 0.4375),
Shapes.box(0.125, 0.0, 0.125, 0.5, 0.375, 0.5),
Shapes.box(0.5, 0.0, 0.5, 0.875, 0.375, 0.875),
Shapes.box(0.0625, 0.0, 0.5625, 0.4375, 0.375, 0.9375)
)
val METAL_QUARTET_EW = Shapes.or(
Shapes.box(0.5625, 0.0, 0.5625, 0.9375, 0.375, 0.9375),
Shapes.box(0.5, 0.0, 0.125, 0.875, 0.375, 0.5),
Shapes.box(0.125, 0.0, 0.5, 0.5, 0.375, 0.875),
Shapes.box(0.0625, 0.0, 0.0625, 0.4375, 0.375, 0.4375)
)
val POTION_SINGLE = Shapes.box(0.34375, 0.0, 0.34375, 0.65625, 0.625, 0.65625)
val POTION_DOUBLE_EW = Shapes.or(
Shapes.box(0.4375, 0.0, 0.5625, 0.75, 0.625, 0.875),
Shapes.box(0.25, 0.0, 0.125, 0.5625, 0.625, 0.4375)
)
val POTION_DOUBLE_NS = Shapes.or(
Shapes.box(0.5625, 0.0, 0.25, 0.875, 0.625, 0.5625),
Shapes.box(0.125, 0.0, 0.4375, 0.4375, 0.625, 0.75)
)
val POTION_TRIPLE_EAST = Shapes.or(
Shapes.box(0.5625, 0.0, 0.375, 0.875, 0.625, 0.6875),
Shapes.box(0.1875, 0.0, 0.125, 0.5, 0.625, 0.4375),
Shapes.box(0.0625, 0.0, 0.5625, 0.375, 0.625, 0.875)
)
val POTION_TRIPLE_WEST = Shapes.or(
Shapes.box(0.125, 0.0, 0.3125, 0.4375, 0.625, 0.625),
Shapes.box(0.5, 0.0, 0.5625, 0.8125, 0.625, 0.875),
Shapes.box(0.625, 0.0, 0.125, 0.9375, 0.625, 0.4375)
)
val POTION_TRIPLE_NORTH = Shapes.or(
Shapes.box(0.375, 0.0, 0.125, 0.6875, 0.625, 0.4375),
Shapes.box(0.125, 0.0, 0.5, 0.4375, 0.625, 0.8125),
Shapes.box(0.5625, 0.0, 0.625, 0.875, 0.625, 0.9375)
)
val POTION_TRIPLE_SOUTH = Shapes.or(
Shapes.box(0.3125, 0.0, 0.5625, 0.625, 0.625, 0.875),
Shapes.box(0.5625, 0.0, 0.1875, 0.875, 0.625, 0.5),
Shapes.box(0.125, 0.0, 0.0625, 0.4375, 0.625, 0.375)
)
val POTION_QUARTET_EAST = Shapes.or(
Shapes.box(0.5625, 0.0, 0.5, 0.875, 0.625, 0.8125),
Shapes.box(0.5, 0.0, 0.125, 0.8125, 0.625, 0.4375),
Shapes.box(0.0625, 0.0, 0.0625, 0.375, 0.625, 0.375),
Shapes.box(0.125, 0.0, 0.5625, 0.4375, 0.625, 0.875)
)
val POTION_QUARTET_WEST = Shapes.or(
Shapes.box(0.125, 0.0, 0.1875, 0.4375, 0.625, 0.5),
Shapes.box(0.1875, 0.0, 0.5625, 0.5, 0.625, 0.875),
Shapes.box(0.625, 0.0, 0.625, 0.9375, 0.625, 0.9375),
Shapes.box(0.5625, 0.0, 0.125, 0.875, 0.625, 0.4375)
)
val POTION_QUARTET_NORTH = Shapes.or(
Shapes.box(0.5, 0.0, 0.125, 0.8125, 0.625, 0.4375),
Shapes.box(0.125, 0.0, 0.1875, 0.4375, 0.625, 0.5),
Shapes.box(0.0625, 0.0, 0.625, 0.375, 0.625, 0.9375),
Shapes.box(0.5625, 0.0, 0.5625, 0.875, 0.625, 0.875)
)
val POTION_QUARTET_SOUTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.5625, 0.5, 0.625, 0.875),
Shapes.box(0.5625, 0.0, 0.5, 0.875, 0.625, 0.8125),
Shapes.box(0.625, 0.0, 0.0625, 0.9375, 0.625, 0.375),
Shapes.box(0.125, 0.0, 0.125, 0.4375, 0.625, 0.4375)
)
val MAX_POTION_SINGLE_NS = Shapes.box(0.34375, 0.0, 0.3125, 0.65625, 0.5, 0.6875)
val MAX_POTION_SINGLE_EW = Shapes.box(0.3125, 0.0, 0.34375, 0.6875, 0.5, 0.65625)
val MAX_POTION_DOUBLE_EAST = Shapes.or(
Shapes.box(0.3125, 0.0, 0.5, 0.6875, 0.5, 0.8125),
Shapes.box(0.25, 0.0, 0.125, 0.625, 0.5, 0.4375)
)
val MAX_POTION_DOUBLE_WEST = Shapes.or(
Shapes.box(0.3125, 0.0, 0.1875, 0.6875, 0.5, 0.5),
Shapes.box(0.375, 0.0, 0.5625, 0.75, 0.5, 0.875)
)
val MAX_POTION_DOUBLE_NORTH = Shapes.or(
Shapes.box(0.5, 0.0, 0.3125, 0.8125, 0.5, 0.6875),
Shapes.box(0.125, 0.0, 0.375, 0.4375, 0.5, 0.75)
)
val MAX_POTION_DOUBLE_SOUTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.3125, 0.5, 0.5, 0.6875),
Shapes.box(0.5625, 0.0, 0.25, 0.875, 0.5, 0.625)
)
val MAX_POTION_TRIPLE_EAST = Shapes.or(
Shapes.box(0.1875, 0.0, 0.625, 0.5625, 0.5, 0.9375),
Shapes.box(0.125, 0.0, 0.125, 0.5, 0.5, 0.4375),
Shapes.box(0.5625, 0.0, 0.3125, 0.9375, 0.5, 0.625)
)
val MAX_POTION_TRIPLE_WEST = Shapes.or(
Shapes.box(0.4375, 0.0, 0.0625, 0.8125, 0.5, 0.375),
Shapes.box(0.5, 0.0, 0.5625, 0.875, 0.5, 0.875),
Shapes.box(0.0625, 0.0, 0.375, 0.4375, 0.5, 0.6875)
)
val MAX_POTION_TRIPLE_NORTH = Shapes.or(
Shapes.box(0.625, 0.0, 0.4375, 0.9375, 0.5, 0.8125),
Shapes.box(0.125, 0.0, 0.5, 0.4375, 0.5, 0.875),
Shapes.box(0.3125, 0.0, 0.0625, 0.625, 0.5, 0.4375)
)
val MAX_POTION_TRIPLE_SOUTH = Shapes.or(
Shapes.box(0.0625, 0.0, 0.1875, 0.375, 0.5, 0.5625),
Shapes.box(0.5625, 0.0, 0.125, 0.875, 0.5, 0.5),
Shapes.box(0.375, 0.0, 0.5625, 0.6875, 0.5, 0.9375)
)
val MAX_POTION_QUARTET_EAST = Shapes.or(
Shapes.box(0.125, 0.0, 0.625, 0.5, 0.5, 0.9375),
Shapes.box(0.0625, 0.0, 0.125, 0.4375, 0.5, 0.4375),
Shapes.box(0.5625, 0.0, 0.5625, 0.9375, 0.5, 0.875),
Shapes.box(0.5, 0.0, 0.1875, 0.875, 0.5, 0.5)
)
val MAX_POTION_QUARTET_WEST = Shapes.or(
Shapes.box(0.5, 0.0, 0.0625, 0.875, 0.5, 0.375),
Shapes.box(0.5625, 0.0, 0.5625, 0.9375, 0.5, 0.875),
Shapes.box(0.0625, 0.0, 0.125, 0.4375, 0.5, 0.4375),
Shapes.box(0.125, 0.0, 0.5, 0.5, 0.5, 0.8125)
)
val MAX_POTION_QUARTET_NORTH = Shapes.or(
Shapes.box(0.625, 0.0, 0.5, 0.9375, 0.5, 0.875),
Shapes.box(0.125, 0.0, 0.5625, 0.4375, 0.5, 0.9375),
Shapes.box(0.5625, 0.0, 0.0625, 0.875, 0.5, 0.4375),
Shapes.box(0.1875, 0.0, 0.125, 0.5, 0.5, 0.5)
)
val MAX_POTION_QUARTET_SOUTH = Shapes.or(
Shapes.box(0.0625, 0.0, 0.125, 0.375, 0.5, 0.5),
Shapes.box(0.5625, 0.0, 0.0625, 0.875, 0.5, 0.4375),
Shapes.box(0.125, 0.0, 0.5625, 0.4375, 0.5, 0.9375),
Shapes.box(0.5, 0.0, 0.5, 0.8125, 0.5, 0.875)
)
val RESTORE_SINGLE = Shapes.box(0.375, 0.0, 0.375, 0.625, 0.5, 0.625)
val RESTORE_DOUBLE_EW = Shapes.or(
Shapes.box(0.375, 0.0, 0.1875, 0.625, 0.5, 0.4375),
Shapes.box(0.375, 0.0, 0.5625, 0.625, 0.5, 0.8125)
)
val RESTORE_DOUBLE_NS = Shapes.or(
Shapes.box(0.1875, 0.0, 0.375, 0.4375, 0.5, 0.625),
Shapes.box(0.5625, 0.0, 0.375, 0.8125, 0.5, 0.625)
)
val RESTORE_TRIPLE_EAST = Shapes.or(
Shapes.box(0.1875, 0.0, 0.1875, 0.4375, 0.5, 0.4375),
Shapes.box(0.25, 0.0, 0.5625, 0.5, 0.5, 0.8125),
Shapes.box(0.625, 0.0, 0.375, 0.875, 0.5, 0.625)
)
val RESTORE_TRIPLE_WEST = Shapes.or(
Shapes.box(0.5625, 0.0, 0.5625, 0.8125, 0.5, 0.8125),
Shapes.box(0.5, 0.0, 0.1875, 0.75, 0.5, 0.4375),
Shapes.box(0.125, 0.0, 0.375, 0.375, 0.5, 0.625)
)
val RESTORE_TRIPLE_NORTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.5625, 0.4375, 0.5, 0.8125),
Shapes.box(0.5625, 0.0, 0.5, 0.8125, 0.5, 0.75),
Shapes.box(0.375, 0.0, 0.125, 0.625, 0.5, 0.375)
)
val RESTORE_TRIPLE_SOUTH = Shapes.or(
Shapes.box(0.5625, 0.0, 0.1875, 0.8125, 0.5, 0.4375),
Shapes.box(0.1875, 0.0, 0.25, 0.4375, 0.5, 0.5),
Shapes.box(0.375, 0.0, 0.625, 0.625, 0.5, 0.875)
)
val RESTORE_QUARTET_EAST = Shapes.or(
Shapes.box(0.125, 0.0, 0.1875, 0.375, 0.5, 0.4375),
Shapes.box(0.1875, 0.0, 0.625, 0.4375, 0.5, 0.875),
Shapes.box(0.625, 0.0, 0.5, 0.875, 0.5, 0.75),
Shapes.box(0.625, 0.0, 0.125, 0.875, 0.5, 0.375)
)
val RESTORE_QUARTET_WEST = Shapes.or(
Shapes.box(0.625, 0.0, 0.5625, 0.875, 0.5, 0.8125),
Shapes.box(0.5625, 0.0, 0.125, 0.8125, 0.5, 0.375),
Shapes.box(0.125, 0.0, 0.25, 0.375, 0.5, 0.5),
Shapes.box(0.125, 0.0, 0.625, 0.375, 0.5, 0.875)
)
val RESTORE_QUARTET_NORTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.625, 0.4375, 0.5, 0.875),
Shapes.box(0.625, 0.0, 0.5625, 0.875, 0.5, 0.8125),
Shapes.box(0.5, 0.0, 0.125, 0.75, 0.5, 0.375),
Shapes.box(0.125, 0.0, 0.125, 0.375, 0.5, 0.375)
)
val RESTORE_QUARTET_SOUTH = Shapes.or(
Shapes.box(0.5625, 0.0, 0.125, 0.8125, 0.5, 0.375),
Shapes.box(0.125, 0.0, 0.1875, 0.375, 0.5, 0.4375),
Shapes.box(0.25, 0.0, 0.625, 0.5, 0.5, 0.875),
Shapes.box(0.625, 0.0, 0.625, 0.875, 0.5, 0.875)
)
val ETHER_SINGLE_EW = Shapes.box(0.34375, 0.0, 0.40625, 0.65625, 0.4375, 0.59375)
val ETHER_SINGLE_NS = Shapes.box(0.40625, 0.0, 0.34375, 0.59375, 0.4375, 0.65625)
val ETHER_DOUBLE_EAST = Shapes.or(
Shapes.box(0.375, 0.0, 0.5, 0.6875, 0.4375, 0.6875),
Shapes.box(0.25, 0.0, 0.25, 0.5625, 0.4375, 0.4375)
)
val ETHER_DOUBLE_WEST = Shapes.or(
Shapes.box(0.3125, 0.0, 0.3125, 0.625, 0.4375, 0.5),
Shapes.box(0.4375, 0.0, 0.5625, 0.75, 0.4375, 0.75)
)
val ETHER_DOUBLE_NORTH = Shapes.or(
Shapes.box(0.5, 0.0, 0.3125, 0.6875, 0.4375, 0.625),
Shapes.box(0.25, 0.0, 0.4375, 0.4375, 0.4375, 0.75)
)
val ETHER_DOUBLE_SOUTH = Shapes.or(
Shapes.box(0.3125, 0.0, 0.375, 0.5, 0.4375, 0.6875),
Shapes.box(0.5625, 0.0, 0.25, 0.75, 0.4375, 0.5625)
)
val ETHER_TRIPLE_EAST = Shapes.or(
Shapes.box(0.25, 0.0, 0.625, 0.5625, 0.4375, 0.8125),
Shapes.box(0.125, 0.0, 0.1875, 0.4375, 0.4375, 0.375),
Shapes.box(0.5, 0.0, 0.375, 0.8125, 0.4375, 0.5625)
)
val ETHER_TRIPLE_WEST = Shapes.or(
Shapes.box(0.4375, 0.0, 0.1875, 0.75, 0.4375, 0.375),
Shapes.box(0.5625, 0.0, 0.625, 0.875, 0.4375, 0.8125),
Shapes.box(0.1875, 0.0, 0.4375, 0.5, 0.4375, 0.625)
)
val ETHER_TRIPLE_NORTH = Shapes.or(
Shapes.box(0.625, 0.0, 0.4375, 0.8125, 0.4375, 0.75),
Shapes.box(0.1875, 0.0, 0.5625, 0.375, 0.4375, 0.875),
Shapes.box(0.375, 0.0, 0.1875, 0.5625, 0.4375, 0.5)
)
val ETHER_TRIPLE_SOUTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.25, 0.375, 0.4375, 0.5625),
Shapes.box(0.625, 0.0, 0.125, 0.8125, 0.4375, 0.4375),
Shapes.box(0.4375, 0.0, 0.5, 0.625, 0.4375, 0.8125)
)
val ETHER_QUARTET_EAST = Shapes.or(
Shapes.box(0.125, 0.0, 0.5625, 0.4375, 0.4375, 0.75),
Shapes.box(0.0625, 0.0, 0.1875, 0.375, 0.4375, 0.375),
Shapes.box(0.5625, 0.0, 0.625, 0.875, 0.4375, 0.8125),
Shapes.box(0.5, 0.0, 0.125, 0.8125, 0.4375, 0.3125)
)
val ETHER_QUARTET_WEST = Shapes.or(
Shapes.box(0.5625, 0.0, 0.25, 0.875, 0.4375, 0.4375),
Shapes.box(0.625, 0.0, 0.625, 0.9375, 0.4375, 0.8125),
Shapes.box(0.125, 0.0, 0.1875, 0.4375, 0.4375, 0.375),
Shapes.box(0.1875, 0.0, 0.6875, 0.5, 0.4375, 0.875)
)
val ETHER_QUARTET_NORTH = Shapes.or(
Shapes.box(0.5625, 0.0, 0.5625, 0.75, 0.4375, 0.875),
Shapes.box(0.1875, 0.0, 0.625, 0.375, 0.4375, 0.9375),
Shapes.box(0.625, 0.0, 0.125, 0.8125, 0.4375, 0.4375),
Shapes.box(0.125, 0.0, 0.1875, 0.3125, 0.4375, 0.5)
)
val ETHER_QUARTET_SOUTH = Shapes.or(
Shapes.box(0.25, 0.0, 0.125, 0.4375, 0.4375, 0.4375),
Shapes.box(0.625, 0.0, 0.0625, 0.8125, 0.4375, 0.375),
Shapes.box(0.1875, 0.0, 0.5625, 0.375, 0.4375, 0.875),
Shapes.box(0.6875, 0.0, 0.5, 0.875, 0.4375, 0.8125)
)
val BATTLE_SINGLE = Shapes.box(0.375, 0.0, 0.375, 0.625, 0.4375, 0.625)
val BATTLE_DOUBLE_NS = Shapes.or(
Shapes.box(0.5625, 0.0, 0.4375, 0.8125, 0.4375, 0.6875),
Shapes.box(0.1875, 0.0, 0.3125, 0.4375, 0.4375, 0.5625)
)
val BATTLE_DOUBLE_EW = Shapes.or(
Shapes.box(0.3125, 0.0, 0.5625, 0.5625, 0.4375, 0.8125),
Shapes.box(0.4375, 0.0, 0.1875, 0.6875, 0.4375, 0.4375)
)
val BATTLE_TRIPLE_N = Shapes.or(
Shapes.box(0.625, 0.0, 0.625, 0.875, 0.4375, 0.875),
Shapes.box(0.125, 0.0, 0.5, 0.375, 0.4375, 0.75),
Shapes.box(0.4375, 0.0, 0.125, 0.6875, 0.4375, 0.375)
)
val BATTLE_TRIPLE_E = Shapes.or(
Shapes.box(0.125, 0.0, 0.625, 0.375, 0.4375, 0.875),
Shapes.box(0.25, 0.0, 0.125, 0.5, 0.4375, 0.375),
Shapes.box(0.625, 0.0, 0.4375, 0.875, 0.4375, 0.6875)
)
val BATTLE_TRIPLE_S = Shapes.or(
Shapes.box(0.125, 0.0, 0.125, 0.375, 0.4375, 0.375),
Shapes.box(0.625, 0.0, 0.25, 0.875, 0.4375, 0.5),
Shapes.box(0.3125, 0.0, 0.625, 0.5625, 0.4375, 0.875)
)
val BATTLE_TRIPLE_W = Shapes.or(
Shapes.box(0.625, 0.0, 0.125, 0.875, 0.4375, 0.375),
Shapes.box(0.5, 0.0, 0.625, 0.75, 0.4375, 0.875),
Shapes.box(0.125, 0.0, 0.3125, 0.375, 0.4375, 0.5625)
)
val BATTLE_QUARTET_NS = Shapes.or(
Shapes.box(0.625, 0.0, 0.625, 0.875, 0.4375, 0.875),
Shapes.box(0.1875, 0.0, 0.5625, 0.4375, 0.4375, 0.8125),
Shapes.box(0.5625, 0.0, 0.1875, 0.8125, 0.4375, 0.4375),
Shapes.box(0.125, 0.0, 0.125, 0.375, 0.4375, 0.375)
)
val BATTLE_QUARTET_EW = Shapes.or(
Shapes.box(0.125, 0.0, 0.625, 0.375, 0.4375, 0.875),
Shapes.box(0.1875, 0.0, 0.1875, 0.4375, 0.4375, 0.4375),
Shapes.box(0.5625, 0.0, 0.5625, 0.8125, 0.4375, 0.8125),
Shapes.box(0.625, 0.0, 0.125, 0.875, 0.4375, 0.375)
)
val VITAMIN_SINGLE = Shapes.box(0.375, 0.0, 0.375, 0.625, 0.375, 0.625)
val VITAMIN_DOUBLE_EW = Shapes.or(
Shapes.box(0.3125, 0.0, 0.5625, 0.5625, 0.375, 0.8125),
Shapes.box(0.4375, 0.0, 0.1875, 0.6875, 0.375, 0.4375)
)
val VITAMIN_DOUBLE_NS = Shapes.or(
Shapes.box(0.5625, 0.0, 0.4375, 0.8125, 0.375, 0.6875),
Shapes.box(0.1875, 0.0, 0.3125, 0.4375, 0.375, 0.5625)
)
val VITAMIN_TRIPLE_EAST = Shapes.or(
Shapes.box(0.5, 0.0, 0.5625, 0.75, 0.375, 0.8125),
Shapes.box(0.5625, 0.0, 0.1875, 0.8125, 0.375, 0.4375),
Shapes.box(0.1875, 0.0, 0.375, 0.4375, 0.375, 0.625)
)
val VITAMIN_TRIPLE_WEST = Shapes.or(
Shapes.box(0.25, 0.0, 0.1875, 0.5, 0.375, 0.4375),
Shapes.box(0.1875, 0.0, 0.5625, 0.4375, 0.375, 0.8125),
Shapes.box(0.5625, 0.0, 0.375, 0.8125, 0.375, 0.625)
)
val VITAMIN_TRIPLE_NORTH = Shapes.or(
Shapes.box(0.5625, 0.0, 0.25, 0.8125, 0.375, 0.5),
Shapes.box(0.1875, 0.0, 0.1875, 0.4375, 0.375, 0.4375),
Shapes.box(0.375, 0.0, 0.5625, 0.625, 0.375, 0.8125)
)
val VITAMIN_TRIPLE_SOUTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.5, 0.4375, 0.375, 0.75),
Shapes.box(0.5625, 0.0, 0.5625, 0.8125, 0.375, 0.8125),
Shapes.box(0.375, 0.0, 0.1875, 0.625, 0.375, 0.4375)
)
val VITAMIN_QUARTET_EAST = Shapes.or(
Shapes.box(0.5625, 0.0, 0.5625, 0.8125, 0.375, 0.8125),
Shapes.box(0.625, 0.0, 0.1875, 0.875, 0.375, 0.4375),
Shapes.box(0.1875, 0.0, 0.125, 0.4375, 0.375, 0.375),
Shapes.box(0.125, 0.0, 0.625, 0.375, 0.375, 0.875)
)
val VITAMIN_QUARTET_WEST = Shapes.or(
Shapes.box(0.1875, 0.0, 0.1875, 0.4375, 0.375, 0.4375),
Shapes.box(0.125, 0.0, 0.5625, 0.375, 0.375, 0.8125),
Shapes.box(0.5625, 0.0, 0.625, 0.8125, 0.375, 0.875),
Shapes.box(0.625, 0.0, 0.125, 0.875, 0.375, 0.375)
)
val VITAMIN_QUARTET_NORTH = Shapes.or(
Shapes.box(0.5625, 0.0, 0.1875, 0.8125, 0.375, 0.4375),
Shapes.box(0.1875, 0.0, 0.125, 0.4375, 0.375, 0.375),
Shapes.box(0.125, 0.0, 0.5625, 0.375, 0.375, 0.8125),
Shapes.box(0.625, 0.0, 0.625, 0.875, 0.375, 0.875)
)
val VITAMIN_QUARTET_SOUTH = Shapes.or(
Shapes.box(0.1875, 0.0, 0.5625, 0.4375, 0.375, 0.8125),
Shapes.box(0.5625, 0.0, 0.625, 0.8125, 0.375, 0.875),
Shapes.box(0.625, 0.0, 0.1875, 0.875, 0.375, 0.4375),
Shapes.box(0.125, 0.0, 0.125, 0.375, 0.375, 0.375)
)
}
}
@@ -0,0 +1,170 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class WallAttachedDecorativeItemBlock(settings: Properties, val wallItemType: WallItemType) : Block(settings), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(WATERLOGGED, false))
}
@Suppress("unused")
enum class WallItemType : StringRepresentable {
GENERIC_PLANE,
POLICY,
GENERIC_8x;
override fun getSerializedName(): String = this.name.lowercase()
companion object {
val CODEC = StringRepresentable.fromEnum(::values)
}
}
override fun codec(): MapCodec<WallAttachedDecorativeItemBlock> {
return CODEC
}
override fun getStateForPlacement(ctx: BlockPlaceContext): BlockState? {
var blockState = defaultBlockState()
.setValue(WATERLOGGED, ctx.level.getFluidState(ctx.clickedPos).type == Fluids.WATER)
val worldView = ctx.level
val blockPos = ctx.clickedPos
ctx.nearestLookingDirections.forEach { direction ->
if (direction.axis.isHorizontal) {
blockState = blockState.setValue(FACING, direction.opposite) as BlockState
if (blockState.canSurvive(worldView, blockPos)) {
return blockState
}
}
}
return null
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(WATERLOGGED)
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
return when (wallItemType) {
WallItemType.GENERIC_PLANE -> {
when (state.getValue(FACING)) {
Direction.SOUTH -> FULL_PLANE_SOUTH
Direction.WEST -> FULL_PLANE_WEST
Direction.EAST -> FULL_PLANE_EAST
else -> FULL_PLANE_NORTH
}
}
WallItemType.POLICY -> {
when (state.getValue(FACING)) {
Direction.SOUTH -> POLICY_SOUTH
Direction.WEST -> POLICY_WEST
Direction.EAST -> POLICY_EAST
else -> POLICY_NORTH
}
}
else -> {
when (state.getValue(FACING)) {
Direction.SOUTH -> ITEM_8x_SOUTH
Direction.WEST -> ITEM_8x_WEST
Direction.EAST -> ITEM_8x_EAST
else -> ITEM_8x_NORTH
}
}
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (direction.opposite == state.getValue(FACING) && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)))
}
@Deprecated("Deprecated in Java")
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean {
return false
}
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState, level: LevelReader, pos: BlockPos): Boolean {
return level!!.getBlockState(pos.relative(state.getValue(FACING).opposite)).isSolid
}
companion object {
val CODEC: MapCodec<WallAttachedDecorativeItemBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec(),
WallItemType.CODEC.fieldOf("wallItemType").forGetter(WallAttachedDecorativeItemBlock::wallItemType)
).apply(it, ::WallAttachedDecorativeItemBlock) }
val ITEM_8x_NORTH = Shapes.box(0.25, 0.25, 0.5, 0.75, 0.75, 1.0)
val ITEM_8x_WEST = Shapes.box(0.5, 0.25, 0.25, 1.0, 0.75, 0.75)
val ITEM_8x_SOUTH = Shapes.box(0.25, 0.25, 0.0, 0.75, 0.75, 0.5)
val ITEM_8x_EAST = Shapes.box(0.0, 0.25, 0.25, 0.5, 0.75, 0.75)
val FULL_PLANE_NORTH = Shapes.box(0.0, 0.0, 0.925, 1.0, 1.0, 1.0)
val FULL_PLANE_WEST = Shapes.box(0.925, 0.0, 0.0, 1.0, 1.0, 1.0)
val FULL_PLANE_SOUTH = Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.075)
val FULL_PLANE_EAST = Shapes.box(0.0, 0.0, 0.0, 0.075, 1.0, 1.0)
val POLICY_NORTH = Shapes.box(0.0625, 0.125, 0.925, 1.0, 0.875, 0.9375)
val POLICY_WEST = Shapes.box(0.925, 0.125, 0.0625, 1.0, 0.875, 0.9375)
val POLICY_SOUTH = Shapes.box(0.0625, 0.125, 0.0, 0.9375, 0.875, 0.075)
val POLICY_EAST = Shapes.box(0.0, 0.125, 0.0625, 0.075, 0.875, 0.9375)
}
}
@@ -0,0 +1,213 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.cobblemon.mod.common.block.decor.StackableItemBlock.Companion
import com.cobblemon.mod.common.block.decor.StackableItemBlock.Companion.ITEMS
import com.cobblemon.mod.common.block.decor.StackableItemBlock.Companion.MAX_ITEMS
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.IntegerProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
import kotlin.math.min
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class WallAttachedStackableItemBlock(settings: Properties, val wallStackableItemType: WallStackableItemType) : Block(settings), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(ITEMS, 1)
.setValue(WATERLOGGED, false))
}
@Suppress("unused")
enum class WallStackableItemType : StringRepresentable {
TAG,
GENERIC_8x;
override fun getSerializedName(): String = this.name.lowercase()
companion object {
val CODEC = StringRepresentable.fromEnum(::values)
}
}
override fun codec(): MapCodec<WallAttachedStackableItemBlock> {
return CODEC
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val blockState = context.level.getBlockState(context.clickedPos)
return if (blockState.`is`(this)) blockState.setValue(
ITEMS,
min(MAX_ITEMS, (blockState.getValue(ITEMS) + 1))
) else {
var blockState = defaultBlockState()
.setValue(WATERLOGGED, context.level.getFluidState(context.clickedPos).type == Fluids.WATER)
val worldView = context.level
val blockPos = context.clickedPos
context.nearestLookingDirections.forEach { direction ->
if (direction.axis.isHorizontal) {
blockState = blockState.setValue(FACING, direction.opposite)
if (blockState.canSurvive(worldView, blockPos)) {
return blockState
}
}
}
return null
}
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState);
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(ITEMS)
builder.add(WATERLOGGED)
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
return when (wallStackableItemType) {
WallStackableItemType.TAG -> return when (state.getValue(ITEMS)) {
2 -> when (state.getValue(FACING)) {
Direction.SOUTH -> TAGS_SOUTH
Direction.WEST -> TAGS_WEST
Direction.EAST -> TAGS_EAST
else -> TAGS_NORTH
}
3, 4 -> when (state.getValue(FACING)) {
Direction.SOUTH -> TAGS_WIDE_SOUTH
Direction.WEST -> TAGS_WIDE_WEST
Direction.EAST -> TAGS_WIDE_EAST
else -> TAGS_WIDE_NORTH
}
5, 6, 7, 8 -> when (state.getValue(FACING)) {
Direction.SOUTH -> FULL_PLANE_SOUTH
Direction.WEST -> FULL_PLANE_WEST
Direction.EAST -> FULL_PLANE_EAST
else -> FULL_PLANE_NORTH
}
else -> when (state.getValue(FACING)) {
Direction.SOUTH -> TAG_SOUTH
Direction.WEST -> TAG_WEST
Direction.EAST -> TAG_EAST
else -> TAG_NORTH
}
}
else -> {
when (state.getValue(FACING)) {
Direction.SOUTH -> ITEM_8x_SOUTH
Direction.WEST -> ITEM_8x_WEST
Direction.EAST -> ITEM_8x_EAST
else -> ITEM_8x_NORTH
}
}
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (direction.opposite == state.getValue(FACING) && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
public override fun canBeReplaced(state: BlockState, useContext: BlockPlaceContext): Boolean {
return if (!useContext.isSecondaryUseActive && useContext.itemInHand.`is`(this.asItem()) && state.getValue(
ITEMS
) <= MAX_ITEMS
) true else super.canBeReplaced(state, useContext)
}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)))
}
@Deprecated("Deprecated in Java")
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean {
return false
}
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState, level: LevelReader, pos: BlockPos): Boolean {
return level!!.getBlockState(pos.relative(state.getValue(FACING).opposite)).isSolid
}
companion object {
val CODEC: MapCodec<WallAttachedStackableItemBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec(),
WallStackableItemType.CODEC.fieldOf("wallStackableItemType").forGetter(WallAttachedStackableItemBlock::wallStackableItemType)
).apply(it, ::WallAttachedStackableItemBlock) }
val ITEMS = IntegerProperty.create("items", 1, 8)
const val MAX_ITEMS: Int = 8
val ITEM_8x_NORTH = Shapes.box(0.25, 0.25, 0.5, 0.75, 0.75, 1.0)
val ITEM_8x_WEST = Shapes.box(0.5, 0.25, 0.25, 1.0, 0.75, 0.75)
val ITEM_8x_SOUTH = Shapes.box(0.25, 0.25, 0.0, 0.75, 0.75, 0.5)
val ITEM_8x_EAST = Shapes.box(0.0, 0.25, 0.25, 0.5, 0.75, 0.75)
val FULL_PLANE_NORTH = Shapes.box(0.0, 0.0, 0.925, 1.0, 1.0, 1.0)
val FULL_PLANE_WEST = Shapes.box(0.925, 0.0, 0.0, 1.0, 1.0, 1.0)
val FULL_PLANE_SOUTH = Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.075)
val FULL_PLANE_EAST = Shapes.box(0.0, 0.0, 0.0, 0.075, 1.0, 1.0)
//One Tag
val TAG_NORTH = Shapes.box(0.375, 0.25, 0.925, 0.625, 0.6875, 1.0)
val TAG_WEST = Shapes.box(0.925, 0.25, 0.375, 1.0, 0.6875, 0.625)
val TAG_SOUTH = Shapes.box(0.375, 0.25, 0.0, 0.625, 0.6875, 0.075)
val TAG_EAST = Shapes.box(0.0, 0.25, 0.375, 0.075, 0.6875, 0.625)
//Two Tags
val TAGS_NORTH = Shapes.box(0.375, 0.125, 0.925, 0.875, 0.6875, 1.0)
val TAGS_WEST = Shapes.box(0.925, 0.125, 0.125, 1.0, 0.6875, 0.625)
val TAGS_SOUTH = Shapes.box(0.125, 0.125, 0.0, 0.625, 0.6875, 0.075)
val TAGS_EAST = Shapes.box(0.0, 0.125, 0.375, 0.075, 0.6875, 0.875)
//Three and Four Tags
val TAGS_WIDE_NORTH = Shapes.box(0.125, 0.125, 0.925, 0.875, 0.875, 1.0)
val TAGS_WIDE_WEST = Shapes.box(0.925, 0.125, 0.125, 1.0, 0.875, 0.875)
val TAGS_WIDE_SOUTH = Shapes.box(0.125, 0.125, 0.0, 0.875, 0.875, 0.075)
val TAGS_WIDE_EAST = Shapes.box(0.0, 0.125, 0.125, 0.075, 0.875, 0.875)
}
}
@@ -0,0 +1,126 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.decor
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.Property
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
class WallAttachedTargetBlock(settings: Properties) : TargetBlock(settings), SimpleWaterloggedBlock {
init {
registerDefaultState(stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(WATERLOGGED, false)
.setValue(OUTPUT_POWER, 0))
}
override fun getStateForPlacement(ctx: BlockPlaceContext): BlockState? {
var blockState = defaultBlockState()
.setValue(WATERLOGGED, ctx.level.getFluidState(ctx.clickedPos).type == Fluids.WATER)
val worldView = ctx.level
val blockPos = ctx.clickedPos
ctx.nearestLookingDirections.forEach { direction ->
if (direction.axis.isHorizontal) {
blockState = blockState.setValue(FACING, direction.opposite) as BlockState
if (blockState.canSurvive(worldView, blockPos)) {
return blockState
}
}
}
return null
}
override fun getFluidState(blockState: BlockState): FluidState? {
return if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(WATERLOGGED)
builder.add(*arrayOf<Property<*>>(OUTPUT_POWER))
}
override fun getShape(
state: BlockState,
blockGetter: BlockGetter,
pos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
return when (state.getValue(FACING)) {
Direction.SOUTH -> FULL_PLANE_SOUTH
Direction.WEST -> FULL_PLANE_WEST
Direction.EAST -> FULL_PLANE_EAST
else -> FULL_PLANE_NORTH
}
}
@Deprecated("Deprecated in Java")
override fun updateShape(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: LevelAccessor,
pos: BlockPos,
neighborPos: BlockPos
): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (direction.opposite == state.getValue(FACING) && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)))
}
@Deprecated("Deprecated in Java")
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean {
return false
}
@Deprecated("Deprecated in Java")
override fun canSurvive(state: BlockState, level: LevelReader, pos: BlockPos): Boolean {
return level.getBlockState(pos.relative(state.getValue(FACING).opposite)).isSolid
}
companion object {
val CODEC: MapCodec<WallAttachedTargetBlock> = RecordCodecBuilder.mapCodec {
it.group(
propertiesCodec()
).apply(it, ::WallAttachedTargetBlock) }
val OUTPUT_POWER = BlockStateProperties.POWER;
val FULL_PLANE_NORTH = Shapes.box(0.0, 0.0, 0.925, 1.0, 1.0, 1.0)
val FULL_PLANE_WEST = Shapes.box(0.925, 0.0, 0.0, 1.0, 1.0, 1.0)
val FULL_PLANE_SOUTH = Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.075)
val FULL_PLANE_EAST = Shapes.box(0.0, 0.0, 0.0, 0.075, 1.0, 1.0)
}
}
@@ -0,0 +1,48 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.general
import com.mojang.serialization.MapCodec
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.AmethystClusterBlock
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.DirectionalBlock
import net.minecraft.world.level.block.Rotation
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.material.Fluids
class SixDirectionalBlock(properties: Properties) : DirectionalBlock(properties) {
init {registerDefaultState(stateDefinition.any().setValue(FACING, Direction.UP))}
companion object {
val CODEC = simpleCodec(::SixDirectionalBlock)}
public override fun codec(): MapCodec<SixDirectionalBlock> {
return CODEC
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {builder.add(FACING)}
@Deprecated("Deprecated in Java")
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)))
}
/* override fun mirror(state: BlockState, mirror: Mirror): BlockState {
return state.rotate(mirror.getRotation((state.getValue(FACING))!!))
}*/
override fun getStateForPlacement(context: BlockPlaceContext): BlockState {
return defaultBlockState().setValue(FACING, context.clickedFace)
}
}
@@ -235,6 +235,12 @@ object CobblemonClient {
CobblemonBlocks.POKE_CAKE
)
this.implementation.registerBlockRenderType(
RenderType.translucent(),
CobblemonBlocks.UPGRADE,
CobblemonBlocks.DUBIOUS_DISC
)
this.implementation.registerBlockRenderType(
RenderType.cutout(),
CobblemonBlocks.GILDED_CHEST,
@@ -319,7 +325,89 @@ object CobblemonClient {
CobblemonBlocks.PINK_CAMPFIRE_POT,
CobblemonBlocks.RED_CAMPFIRE_POT,
CobblemonBlocks.WHITE_CAMPFIRE_POT,
CobblemonBlocks.YELLOW_CAMPFIRE_POT
CobblemonBlocks.YELLOW_CAMPFIRE_POT,
CobblemonBlocks.KINGS_ROCK,
CobblemonBlocks.CHIPPED_POT,
CobblemonBlocks.CRACKED_POT,
CobblemonBlocks.MASTERPIECE_TEACUP,
CobblemonBlocks.UNREMARKABLE_TEACUP,
CobblemonBlocks.LUMINOUS_MOSS,
CobblemonBlocks.GALARICA_CUFF,
CobblemonBlocks.GALARICA_WREATH,
CobblemonBlocks.DESTINY_KNOT,
CobblemonBlocks.METRONOME,
CobblemonBlocks.DAMP_ROCK,
CobblemonBlocks.HEAT_ROCK,
CobblemonBlocks.ICY_ROCK,
CobblemonBlocks.SMOOTH_ROCK,
CobblemonBlocks.NEVER_MELT_ICE,
CobblemonBlocks.CLEANSE_TAG,
CobblemonBlocks.SPELL_TAG,
CobblemonBlocks.BLUNDER_POLICY,
CobblemonBlocks.WEAKNESS_POLICY,
CobblemonBlocks.RING_TARGET,
CobblemonBlocks.LIFE_ORB,
CobblemonBlocks.FLAME_ORB,
CobblemonBlocks.TOXIC_ORB,
CobblemonBlocks.LIGHT_BALL,
CobblemonBlocks.SMOKE_BALL,
CobblemonBlocks.EJECT_BUTTON,
CobblemonBlocks.METAL_COAT,
CobblemonBlocks.MAGNET,
CobblemonBlocks.RELIC_COIN_POUCH,
CobblemonBlocks.SACHET,
CobblemonBlocks.BRIGHT_POWDER,
CobblemonBlocks.METAL_POWDER,
CobblemonBlocks.QUICK_POWDER,
CobblemonBlocks.POTION,
CobblemonBlocks.SUPER_POTION,
CobblemonBlocks.HYPER_POTION,
CobblemonBlocks.MAX_POTION,
CobblemonBlocks.FULL_RESTORE,
CobblemonBlocks.ANTIDOTE,
CobblemonBlocks.AWAKENING,
CobblemonBlocks.BURN_HEAL,
CobblemonBlocks.ICE_HEAL,
CobblemonBlocks.PARALYZE_HEAL,
CobblemonBlocks.FULL_HEAL,
CobblemonBlocks.ETHER,
CobblemonBlocks.MAX_ETHER,
CobblemonBlocks.ELIXIR,
CobblemonBlocks.MAX_ELIXIR,
CobblemonBlocks.X_ACCURACY,
CobblemonBlocks.X_ATTACK,
CobblemonBlocks.X_DEFENCE,
CobblemonBlocks.X_SPECIAL_ATTACK,
CobblemonBlocks.X_SPECIAL_DEFENCE,
CobblemonBlocks.X_SPEED,
CobblemonBlocks.DIRE_HIT,
CobblemonBlocks.GUARD_SPEC,
CobblemonBlocks.HP_UP,
CobblemonBlocks.PROTEIN,
CobblemonBlocks.IRON,
CobblemonBlocks.CARBOS,
CobblemonBlocks.CALCIUM,
CobblemonBlocks.ZINC,
CobblemonBlocks.PP_UP,
CobblemonBlocks.PP_MAX,
CobblemonBlocks.WHITE_PLAQUE,
CobblemonBlocks.LIGHT_GRAY_PLAQUE,
CobblemonBlocks.GRAY_PLAQUE,
CobblemonBlocks.BLACK_PLAQUE,
CobblemonBlocks.BROWN_PLAQUE,
CobblemonBlocks.RED_PLAQUE,
CobblemonBlocks.ORANGE_PLAQUE,
CobblemonBlocks.YELLOW_PLAQUE,
CobblemonBlocks.LIME_PLAQUE,
CobblemonBlocks.GREEN_PLAQUE,
CobblemonBlocks.CYAN_PLAQUE,
CobblemonBlocks.LIGHT_BLUE_PLAQUE,
CobblemonBlocks.BLUE_PLAQUE,
CobblemonBlocks.PURPLE_PLAQUE,
CobblemonBlocks.MAGENTA_PLAQUE,
CobblemonBlocks.PINK_PLAQUE
)
this.createBoatModelLayers()
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.block.DisplayCaseBlock
import com.cobblemon.mod.common.block.entity.DisplayCaseBlockEntity
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
import com.cobblemon.mod.common.item.PokedexItem
import com.cobblemon.mod.common.item.WearableItem
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.math.Axis
import net.minecraft.client.Minecraft
@@ -31,9 +32,7 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
val context = RenderContext().also {
it.put(RenderContext.RENDER_STATE, RenderContext.RenderState.WORLD)
}
val coinPouchStack: ItemStack by lazy { ItemStack(
CobblemonItems.RELIC_COIN_POUCH
).also { it.set(DataComponents.CUSTOM_MODEL_DATA, CustomModelData(1)) } }
override fun render(
entity: DisplayCaseBlockEntity,
tickDelta: Float,
@@ -42,8 +41,8 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
light: Int,
overlay: Int
) {
val stack: ItemStack = if (entity.getStack().`is`(CobblemonItems.RELIC_COIN_POUCH)) {
coinPouchStack
val stack: ItemStack = if (entity.getStack().`is`(CobblemonItemTags.DISPLAY_CASE_ITEMS)) {
entity.getStack().copyWithCount(1).also { it.set(DataComponents.CUSTOM_MODEL_DATA, CustomModelData(1)) }
} else {
entity.getStack()
}
@@ -161,11 +160,13 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
stack.item is BannerItem -> PositioningType.BANNER
stack.`is`(CobblemonItemTags.POKE_BALLS) -> PositioningType.POKE_BALL
stack.item is PokedexItem -> PositioningType.POKEDEX
stack.item == CobblemonItems.RELIC_COIN_POUCH -> PositioningType.COIN_POUCH
stack.`is`(CobblemonItemTags.DISPLAY_CASE_ITEMS) -> PositioningType.ITEM_BLOCK
stack.item == CobblemonItems.PASTURE -> PositioningType.PASTURE
//stack.item == CobblemonItems.POKEMON_MODEL -> PositioningType.ITEM_MODEL
stack.item == Items.SHIELD -> PositioningType.SHIELD
stack.item == Items.DECORATED_POT -> PositioningType.MOB_HEAD
stack.item is WearableItem -> PositioningType.ITEM_MODEL
stack.`is`(CobblemonItemTags.PLAQUES) -> PositioningType.ITEM_MODEL
Minecraft.getInstance().itemRenderer.getModel(stack, world, null, 0).isGui3d -> PositioningType.BLOCK_MODEL
else -> PositioningType.ITEM_MODEL
}
@@ -185,6 +186,6 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
MOB_HEAD(1f, 1f, 1f, 0f, -0.025f, 0f, 180f),
SHIELD(1f, 1f, 1f, 0f, -0.045f, 0f, 180f),
PASTURE(1f, 1f, 1f, 0f, 0.0375f, 0f),
COIN_POUCH(1f, 1f, 1f, 0f, 0.415f, 0f)
ITEM_BLOCK(1f, 1f, 1f, 0f, 0.415f, 0f)
}
}
@@ -10,10 +10,20 @@ package com.cobblemon.mod.common.item
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.EquipmentSlot
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.Equipable
import net.minecraft.world.item.ItemNameBlockItem
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.state.BlockState
class WearableItem(val name: String): CobblemonItem(Properties()), Equipable {
class WearableItem(val name: String, block: Block = Blocks.AIR): ItemNameBlockItem(block, Properties()), Equipable {
companion object {
const val MODEL_PATH = "item/wearable"
}
@@ -22,4 +32,17 @@ class WearableItem(val name: String): CobblemonItem(Properties()), Equipable {
fun getModel2d(): ResourceLocation = cobblemonResource(this.name)
override fun getEquipmentSlot(): EquipmentSlot { return EquipmentSlot.HEAD }
override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder<ItemStack> {
return this.swapWithEquipmentSlot(this, level, player, usedHand)
}
override fun getDescriptionId(): String {
return if (block == Blocks.AIR) this.getOrCreateDescriptionId() else super.getDescriptionId()
}
override fun canPlace(context: BlockPlaceContext, state: BlockState): Boolean {
//not all wearable items are placeable, so we default it to AIR and prevent placement in that case
return if (state.block == Blocks.AIR) false else super.canPlace(context, state)
}
}
@@ -13,10 +13,11 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.item.CobblemonItem
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.item.*
import net.minecraft.world.level.block.Block
class DireHitItem : CobblemonItem(Properties()), SimpleBagItemLike {
class DireHitItem(block: Block) : ItemNameBlockItem(block, Properties()), SimpleBagItemLike {
override val bagItem = object : BagItem {
override val itemName = "item.cobblemon.dire_hit"
override val returnItem = Items.AIR
@@ -13,9 +13,10 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.item.CobblemonItem
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.item.*
import net.minecraft.world.level.block.Block
class GuardSpecItem : CobblemonItem(Properties()), SimpleBagItemLike {
class GuardSpecItem(block: Block) : ItemNameBlockItem(block, Properties()), SimpleBagItemLike {
override val bagItem = object : BagItem {
override val itemName = "item.cobblemon.guard_spec"
override val returnItem = Items.AIR
@@ -14,9 +14,10 @@ import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.item.CobblemonItem
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.item.*
import net.minecraft.world.level.block.Block
class XStatItem(val stat: Stat, stages: Int = 2) : CobblemonItem(Properties()), SimpleBagItemLike {
class XStatItem(val stat: Stat, stages: Int = 2, block: Block) : ItemNameBlockItem(block, Properties()), SimpleBagItemLike {
override val bagItem = object : BagItem {
override val itemName = "item.cobblemon.x_${stat.identifier.path}"
override val returnItem = Items.AIR
@@ -66,6 +66,7 @@ object CobblemonItemGroups {
@JvmStatic val EVOLUTION_ITEMS get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(EVOLUTION_ITEMS_KEY)
@JvmStatic val BUILDING_BLOCKS_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("building_blocks")), this::blocksInjections)
@JvmStatic val COLORED_BLOCKS_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("colored_blocks")), this::colorInjections)
@JvmStatic val FOOD_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("food_and_drinks")), this::foodInjections)
@JvmStatic val TOOLS_AND_UTILITIES_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("tools_and_utilities")), this::toolsAndUtilitiesInjections)
@JvmStatic val INGREDIENTS_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("ingredients")), this::ingredientsInjections)
@@ -319,6 +320,7 @@ object CobblemonItemGroups {
entries.accept(CobblemonItems.SMOOTH_TUMBLESTONE)
entries.accept(CobblemonItems.SMOOTH_TUMBLESTONE_STAIRS)
entries.accept(CobblemonItems.SMOOTH_TUMBLESTONE_SLAB)
entries.accept(CobblemonItems.POLISHED_BLACK_TUMBLESTONE)
entries.accept(CobblemonItems.POLISHED_BLACK_TUMBLESTONE_STAIRS)
entries.accept(CobblemonItems.POLISHED_BLACK_TUMBLESTONE_SLAB)
@@ -332,6 +334,7 @@ object CobblemonItemGroups {
entries.accept(CobblemonItems.SMOOTH_BLACK_TUMBLESTONE)
entries.accept(CobblemonItems.SMOOTH_BLACK_TUMBLESTONE_STAIRS)
entries.accept(CobblemonItems.SMOOTH_BLACK_TUMBLESTONE_SLAB)
entries.accept(CobblemonItems.POLISHED_SKY_TUMBLESTONE)
entries.accept(CobblemonItems.POLISHED_SKY_TUMBLESTONE_STAIRS)
entries.accept(CobblemonItems.POLISHED_SKY_TUMBLESTONE_SLAB)
@@ -381,7 +384,100 @@ object CobblemonItemGroups {
entries.accept(CobblemonItems.THUNDER_STONE_BLOCK)
entries.accept(CobblemonItems.WATER_STONE_BLOCK)
entries.accept(CobblemonItems.PEAT_BLOCK)
CobblemonItems.campfire_pots.forEach(entries::accept)
entries.accept(CobblemonItems.WHITE_PLAQUE)
entries.accept(CobblemonItems.LIGHT_GRAY_PLAQUE)
entries.accept(CobblemonItems.GRAY_PLAQUE)
entries.accept(CobblemonItems.BLACK_PLAQUE)
entries.accept(CobblemonItems.BROWN_PLAQUE)
entries.accept(CobblemonItems.RED_PLAQUE)
entries.accept(CobblemonItems.ORANGE_PLAQUE)
entries.accept(CobblemonItems.YELLOW_PLAQUE)
entries.accept(CobblemonItems.LIME_PLAQUE)
entries.accept(CobblemonItems.GREEN_PLAQUE)
entries.accept(CobblemonItems.CYAN_PLAQUE)
entries.accept(CobblemonItems.LIGHT_BLUE_PLAQUE)
entries.accept(CobblemonItems.BLUE_PLAQUE)
entries.accept(CobblemonItems.PURPLE_PLAQUE)
entries.accept(CobblemonItems.MAGENTA_PLAQUE)
entries.accept(CobblemonItems.PINK_PLAQUE)
//Decorative Items - Easy to move around if we later want down here
entries.accept(CobblemonItems.CHIPPED_POT)
entries.accept(CobblemonItems.CRACKED_POT)
entries.accept(CobblemonItems.MASTERPIECE_TEACUP)
entries.accept(CobblemonItems.UNREMARKABLE_TEACUP)
entries.accept(CobblemonItems.DESTINY_KNOT)
entries.accept(CobblemonItems.EJECT_BUTTON)
entries.accept(CobblemonItems.FLAME_ORB)
entries.accept(CobblemonItems.TOXIC_ORB)
entries.accept(CobblemonItems.LIFE_ORB)
entries.accept(CobblemonItems.LIGHT_BALL)
entries.accept(CobblemonItems.SMOKE_BALL)
entries.accept(CobblemonItems.IRON_BALL)
entries.accept(CobblemonItems.HARD_STONE)
entries.accept(CobblemonItems.DAMP_ROCK)
entries.accept(CobblemonItems.HEAT_ROCK)
entries.accept(CobblemonItems.ICY_ROCK)
entries.accept(CobblemonItems.SMOOTH_ROCK)
entries.accept(CobblemonItems.KINGS_ROCK)
entries.accept(CobblemonItems.NEVER_MELT_ICE)
entries.accept(CobblemonItems.GALARICA_CUFF)
entries.accept(CobblemonItems.GALARICA_WREATH)
entries.accept(CobblemonItems.LUMINOUS_MOSS)
entries.accept(CobblemonItems.MAGNET)
entries.accept(CobblemonItems.METRONOME)
entries.accept(CobblemonItems.RING_TARGET)
entries.accept(CobblemonItems.BRIGHT_POWDER)
entries.accept(CobblemonItems.METAL_POWDER)
entries.accept(CobblemonItems.QUICK_POWDER)
entries.accept(CobblemonItems.SACHET)
entries.accept(CobblemonItems.METAL_COAT)
entries.accept(CobblemonItems.UPGRADE)
entries.accept(CobblemonItems.DUBIOUS_DISC)
entries.accept(CobblemonItems.CLEANSE_TAG)
entries.accept(CobblemonItems.SPELL_TAG)
entries.accept(CobblemonItems.BLUNDER_POLICY)
entries.accept(CobblemonItems.WEAKNESS_POLICY)
entries.accept(CobblemonItems.POTION)
entries.accept(CobblemonItems.SUPER_POTION)
entries.accept(CobblemonItems.HYPER_POTION)
entries.accept(CobblemonItems.MAX_POTION)
entries.accept(CobblemonItems.FULL_RESTORE)
entries.accept(CobblemonItems.ANTIDOTE)
entries.accept(CobblemonItems.AWAKENING)
entries.accept(CobblemonItems.BURN_HEAL)
entries.accept(CobblemonItems.ICE_HEAL)
entries.accept(CobblemonItems.PARALYZE_HEAL)
entries.accept(CobblemonItems.FULL_HEAL)
entries.accept(CobblemonItems.ETHER)
entries.accept(CobblemonItems.MAX_ETHER)
entries.accept(CobblemonItems.ELIXIR)
entries.accept(CobblemonItems.MAX_ELIXIR)
entries.accept(CobblemonItems.X_ATTACK)
entries.accept(CobblemonItems.X_DEFENSE)
entries.accept(CobblemonItems.X_SP_ATK)
entries.accept(CobblemonItems.X_SP_DEF)
entries.accept(CobblemonItems.X_SPEED)
entries.accept(CobblemonItems.X_ACCURACY)
entries.accept(CobblemonItems.DIRE_HIT)
entries.accept(CobblemonItems.GUARD_SPEC)
entries.accept(CobblemonItems.HP_UP)
entries.accept(CobblemonItems.PROTEIN)
entries.accept(CobblemonItems.IRON)
entries.accept(CobblemonItems.CALCIUM)
entries.accept(CobblemonItems.ZINC)
entries.accept(CobblemonItems.CARBOS)
entries.accept(CobblemonItems.PP_UP)
entries.accept(CobblemonItems.PP_MAX)
}
private fun consumableEntries(displayContext: ItemDisplayParameters, entries: Output) {
@@ -590,8 +686,8 @@ object CobblemonItemGroups {
entries.accept(CobblemonItems.TART_APPLE)
entries.accept(CobblemonItems.SWEET_APPLE)
entries.accept(CobblemonItems.SYRUPY_APPLE)
entries.accept(CobblemonItems.CRACKED_POT)
entries.accept(CobblemonItems.CHIPPED_POT)
entries.accept(CobblemonItems.CRACKED_POT)
entries.accept(CobblemonItems.MASTERPIECE_TEACUP)
entries.accept(CobblemonItems.UNREMARKABLE_TEACUP)
entries.accept(CobblemonItems.STRAWBERRY_SWEET)
@@ -765,6 +861,25 @@ object CobblemonItemGroups {
}
}
private fun colorInjections(injector: Injector) {
injector.putLast(CobblemonItems.WHITE_PLAQUE)
injector.putAfter(CobblemonItems.LIGHT_GRAY_PLAQUE, CobblemonItems.WHITE_PLAQUE)
injector.putAfter(CobblemonItems.GRAY_PLAQUE, CobblemonItems.LIGHT_GRAY_PLAQUE)
injector.putAfter(CobblemonItems.BLACK_PLAQUE, CobblemonItems.GRAY_PLAQUE)
injector.putAfter(CobblemonItems.BROWN_PLAQUE, CobblemonItems.BLACK_PLAQUE)
injector.putAfter(CobblemonItems.RED_PLAQUE, CobblemonItems.BROWN_PLAQUE)
injector.putAfter(CobblemonItems.ORANGE_PLAQUE, CobblemonItems.RED_PLAQUE)
injector.putAfter(CobblemonItems.YELLOW_PLAQUE, CobblemonItems.ORANGE_PLAQUE)
injector.putAfter(CobblemonItems.LIME_PLAQUE, CobblemonItems.YELLOW_PLAQUE)
injector.putAfter(CobblemonItems.GREEN_PLAQUE, CobblemonItems.LIME_PLAQUE)
injector.putAfter(CobblemonItems.CYAN_PLAQUE, CobblemonItems.GREEN_PLAQUE)
injector.putAfter(CobblemonItems.LIGHT_BLUE_PLAQUE, CobblemonItems.CYAN_PLAQUE)
injector.putAfter(CobblemonItems.BLUE_PLAQUE, CobblemonItems.LIGHT_BLUE_PLAQUE)
injector.putAfter(CobblemonItems.PURPLE_PLAQUE, CobblemonItems.BLUE_PLAQUE)
injector.putAfter(CobblemonItems.MAGENTA_PLAQUE, CobblemonItems.PURPLE_PLAQUE)
injector.putAfter(CobblemonItems.PINK_PLAQUE, CobblemonItems.MAGENTA_PLAQUE)
}
private fun foodInjections(injector: Injector) {
injector.putAfter(CobblemonItems.TART_APPLE, Items.ENCHANTED_GOLDEN_APPLE)
injector.putAfter(CobblemonItems.SWEET_APPLE, CobblemonItems.TART_APPLE)
@@ -0,0 +1,58 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.item.interactive
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.pokemon.stats.ItemEvSource
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.pokemon.EVs
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.server.level.ServerPlayer
import net.minecraft.sounds.SoundEvent
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemNameBlockItem
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
abstract class EVIncreaseBlockItem(
val stat: Stat,
val evIncreaseAmount: Int, block: Block
) : ItemNameBlockItem(block, Properties()), PokemonSelectingItem {
override val bagItem = null
override fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon) = pokemon.evs.getOrDefault(stat) < EVs.MAX_STAT_VALUE &&
super.canUseOnPokemon(stack, pokemon)
abstract val sound: SoundEvent
override fun applyToPokemon(
player: ServerPlayer,
stack: ItemStack,
pokemon: Pokemon
): InteractionResultHolder<ItemStack> {
val evsGained = pokemon.evs.add(stat, evIncreaseAmount, ItemEvSource(player, stack, pokemon))
return if (evsGained > 0) {
pokemon.entity?.playSound(sound, 1F, 1F)
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.fail(stack)
}
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (user is ServerPlayer) {
return use(user, user.getItemInHand(hand))
}
return InteractionResultHolder.success(user.getItemInHand(hand))
}
}
@@ -13,9 +13,11 @@ import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.getBattleState
import com.cobblemon.mod.common.util.giveOrDropItemStack
import kotlin.math.min
import net.minecraft.world.entity.player.Player
@@ -24,9 +26,13 @@ import net.minecraft.world.item.Items
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.item.ItemNameBlockItem
import net.minecraft.world.item.Rarity
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
/**
* Items for recovering PP in all moves at once.
@@ -35,8 +41,8 @@ import net.minecraft.world.level.Level
* @since June 30th, 2023
*/
class ElixirItem(
val max: Boolean
) : CobblemonItem(Properties().apply {
val max: Boolean, block: Block
) : ItemNameBlockItem(block, Properties().apply {
if (max) rarity(Rarity.UNCOMMON)
}), PokemonSelectingItem {
override val bagItem = object : BagItem {
@@ -82,9 +88,8 @@ class ElixirItem(
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (world is ServerLevel && user is ServerPlayer) {
val stack = user.getItemInHand(hand)
return use(user, stack)
return use(user, user.getItemInHand(hand))
}
return InteractionResultHolder.success(user.getItemInHand(hand))
return super<ItemNameBlockItem>.use(world, user, hand)
}
}
@@ -14,9 +14,11 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.item.PokemonAndMoveSelectingItem
import com.cobblemon.mod.common.api.moves.Move
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.getBattleState
import com.cobblemon.mod.common.util.giveOrDropItemStack
import kotlin.math.min
import net.minecraft.world.entity.player.Player
@@ -25,9 +27,13 @@ import net.minecraft.world.item.Items
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.item.ItemNameBlockItem
import net.minecraft.world.item.Rarity
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
/**
* Item for recovering PP for a specific move in a Pokémon's move list. Opens a move selection GUI.
@@ -36,8 +42,8 @@ import net.minecraft.world.level.Level
* @since June 30th, 2023
*/
class EtherItem(
val max: Boolean
) : CobblemonItem(Properties().apply {
val max: Boolean, block: Block
) : ItemNameBlockItem(block, Properties().apply {
if (max) rarity(Rarity.UNCOMMON)
}), PokemonAndMoveSelectingItem {
override val bagItem = object : BagItem {
@@ -70,6 +76,6 @@ class EtherItem(
if (world is ServerLevel && user is ServerPlayer) {
return use(user, user.getItemInHand(hand)) ?: InteractionResultHolder.pass(user.getItemInHand(hand))
}
return InteractionResultHolder.success(user.getItemInHand(hand))
return super<ItemNameBlockItem>.use(world, user, hand)
}
}
@@ -18,12 +18,13 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.item.Rarity
import net.minecraft.world.item.*
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
class PPUpItem(
val amount: Int
) : CobblemonItem(Properties().apply {
val amount: Int, block: Block
) : ItemNameBlockItem(block, Properties().apply {
if (amount>1) rarity(Rarity.UNCOMMON)
}), PokemonAndMoveSelectingItem {
@@ -8,6 +8,7 @@
package com.cobblemon.mod.common.item.interactive
import com.cobblemon.mod.common.CobblemonBlocks
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
@@ -17,28 +18,37 @@ import com.cobblemon.mod.common.api.item.HealingSource
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.genericRuntime
import com.cobblemon.mod.common.util.getBattleState
import com.cobblemon.mod.common.util.giveOrDropItemStack
import com.cobblemon.mod.common.util.resolveInt
import net.minecraft.server.level.ServerLevel
import java.lang.Integer.min
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.item.Rarity
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.item.*
import net.minecraft.world.item.context.UseOnContext
import net.minecraft.world.level.ClipContext
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.HitResult
class PotionItem(
val type: PotionType
) : CobblemonItem(Properties().apply {
val type: PotionType,
block: Block
) : ItemNameBlockItem(block, Properties().apply {
when (type.name) {
PotionType.MAX_POTION.name -> rarity(Rarity.UNCOMMON)
PotionType.MAX_POTION.name,
PotionType.FULL_RESTORE.name -> rarity(Rarity.UNCOMMON)
}
}), PokemonSelectingItem, HealingSource {
@@ -46,10 +56,10 @@ class PotionItem(
override val bagItem = type
override fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon) = !pokemon.isFullHealth() && pokemon.currentHealth > 0
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (user is ServerPlayer) {
if (world is ServerLevel && user is ServerPlayer) {
return use(user, user.getItemInHand(hand))
}
return InteractionResultHolder.success(user.getItemInHand(hand))
return super<ItemNameBlockItem>.use(world, user, hand)
}
override fun applyToPokemon(
@@ -14,17 +14,24 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.pokemon.status.Status
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.getBattleState
import com.cobblemon.mod.common.util.giveOrDropItemStack
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.item.ItemNameBlockItem
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
/**
* An item that cures statuses. Based on the [status] parameter it can be either specific [Status]es or all statuses (none specified).
@@ -32,7 +39,7 @@ import net.minecraft.world.level.Level
* @author Hiroku
* @since June 30th, 2023
*/
class StatusCureItem(val itemName: String, vararg val status: Status) : CobblemonItem(Properties()), PokemonSelectingItem {
class StatusCureItem(val itemName: String, vararg val status: Status, block: Block) : ItemNameBlockItem(block, Properties()), PokemonSelectingItem {
override val bagItem = object : BagItem {
override val itemName = this@StatusCureItem.itemName
override val returnItem = Items.AIR
@@ -41,6 +48,13 @@ class StatusCureItem(val itemName: String, vararg val status: Status) : Cobblemo
}
override fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon) = pokemon.status?.let { it.status in status || status.isEmpty() } == true && pokemon.currentHealth > 0
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (world is ServerLevel && user is ServerPlayer) {
return use(user, user.getItemInHand(hand))
}
return super<ItemNameBlockItem>.use(world, user, hand)
}
override fun applyToPokemon(
player: ServerPlayer,
stack: ItemStack,
@@ -64,11 +78,4 @@ class StatusCureItem(val itemName: String, vararg val status: Status) : Cobblemo
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.entity?.playSound(CobblemonSounds.MEDICINE_SPRAY_USE, 1F, 1F)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (user is ServerPlayer) {
return use(user, user.getItemInHand(hand))
}
return InteractionResultHolder.success(user.getItemInHand(hand))
}
}
@@ -11,7 +11,8 @@ package com.cobblemon.mod.common.item.interactive
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import net.minecraft.sounds.SoundEvent
import net.minecraft.world.level.block.Block
class VitaminItem(stat: Stats) : EVIncreaseItem(stat, 10) {
class VitaminItem(stat: Stats, block: Block) : EVIncreaseBlockItem(stat, 10, block) {
override val sound: SoundEvent = CobblemonSounds.MEDICINE_PILLS_USE
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/antidote_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/antidote_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/antidote_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/antidote_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/antidote_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/antidote_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/antidote_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/antidote_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/antidote_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/antidote_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/antidote_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/antidote_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/antidote_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/antidote_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/antidote_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/antidote_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/awakening_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/awakening_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/awakening_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/awakening_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/awakening_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/awakening_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/awakening_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/awakening_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/awakening_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/awakening_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/awakening_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/awakening_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/awakening_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/awakening_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/awakening_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/awakening_four_items",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/black_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/black_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/black_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/black_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/black_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/black_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/black_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/black_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/black_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/black_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/black_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/black_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/blue_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/blue_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/blue_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/blue_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/blue_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/blue_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/blue_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/blue_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/blue_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/blue_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/blue_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/blue_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=north": {
"model": "cobblemon:block/blunder_policy"
},
"facing=east": {
"model": "cobblemon:block/blunder_policy",
"y": 90
},
"facing=south": {
"model": "cobblemon:block/blunder_policy",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/blunder_policy",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/bright_powder",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/bright_powder",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/bright_powder"
},
"facing=east": {
"model": "cobblemon:block/bright_powder",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/brown_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/brown_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/brown_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/brown_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/brown_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/brown_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/brown_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/brown_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/brown_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/brown_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/brown_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/brown_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/burn_heal_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/burn_heal_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/burn_heal_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/burn_heal_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/burn_heal_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/burn_heal_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/burn_heal_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/burn_heal_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/burn_heal_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/burn_heal_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/burn_heal_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/burn_heal_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/burn_heal_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/burn_heal_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/burn_heal_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/burn_heal_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/calcium_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/calcium_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/calcium_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/calcium_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/calcium_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/calcium_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/calcium_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/calcium_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/calcium_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/calcium_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/calcium_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/calcium_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/calcium_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/calcium_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/calcium_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/calcium_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/carbos_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/carbos_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/carbos_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/carbos_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/carbos_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/carbos_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/carbos_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/carbos_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/carbos_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/carbos_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/carbos_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/carbos_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/carbos_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/carbos_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/carbos_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/carbos_four_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/chipped_pot",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/chipped_pot",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/chipped_pot"
},
"facing=east": {
"model": "cobblemon:block/chipped_pot",
"y": 90
}
}
}
@@ -0,0 +1,124 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/cleanse_tag_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/cleanse_tag_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/cleanse_tag_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/cleanse_tag_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/cleanse_tag_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/cleanse_tag_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/cleanse_tag_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/cleanse_tag_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/cleanse_tag_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/cleanse_tag_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/cleanse_tag_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/cleanse_tag_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/cleanse_tag_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/cleanse_tag_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/cleanse_tag_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/cleanse_tag_four_items",
"y": 270
},
"items=5,facing=north": {
"model": "cobblemon:block/cleanse_tag_five_items"
},
"items=5,facing=east": {
"model": "cobblemon:block/cleanse_tag_five_items",
"y": 90
},
"items=5,facing=south": {
"model": "cobblemon:block/cleanse_tag_five_items",
"y": 180
},
"items=5,facing=west": {
"model": "cobblemon:block/cleanse_tag_five_items",
"y": 270
},
"items=6,facing=north": {
"model": "cobblemon:block/cleanse_tag_six_items"
},
"items=6,facing=east": {
"model": "cobblemon:block/cleanse_tag_six_items",
"y": 90
},
"items=6,facing=south": {
"model": "cobblemon:block/cleanse_tag_six_items",
"y": 180
},
"items=6,facing=west": {
"model": "cobblemon:block/cleanse_tag_six_items",
"y": 270
},
"items=7,facing=north": {
"model": "cobblemon:block/cleanse_tag_seven_items"
},
"items=7,facing=east": {
"model": "cobblemon:block/cleanse_tag_seven_items",
"y": 90
},
"items=7,facing=south": {
"model": "cobblemon:block/cleanse_tag_seven_items",
"y": 180
},
"items=7,facing=west": {
"model": "cobblemon:block/cleanse_tag_seven_items",
"y": 270
},
"items=8,facing=north": {
"model": "cobblemon:block/cleanse_tag_eight_items"
},
"items=8,facing=east": {
"model": "cobblemon:block/cleanse_tag_eight_items",
"y": 90
},
"items=8,facing=south": {
"model": "cobblemon:block/cleanse_tag_eight_items",
"y": 180
},
"items=8,facing=west": {
"model": "cobblemon:block/cleanse_tag_eight_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/cracked_pot",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/cracked_pot",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/cracked_pot"
},
"facing=east": {
"model": "cobblemon:block/cracked_pot",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/cyan_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/cyan_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/cyan_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/cyan_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/cyan_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/cyan_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/cyan_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/cyan_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/cyan_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/cyan_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/cyan_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/cyan_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/damp_rock",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/damp_rock",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/damp_rock"
},
"facing=east": {
"model": "cobblemon:block/damp_rock",
"y": 90
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/destiny_knot",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/destiny_knot",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/destiny_knot"
},
"facing=east": {
"model": "cobblemon:block/destiny_knot",
"y": 90
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/dire_hit_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/dire_hit_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/dire_hit_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/dire_hit_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/dire_hit_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/dire_hit_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/dire_hit_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/dire_hit_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/dire_hit_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/dire_hit_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/dire_hit_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/dire_hit_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/dire_hit_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/dire_hit_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/dire_hit_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/dire_hit_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/dubious_disc_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/dubious_disc_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/dubious_disc_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/dubious_disc_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/dubious_disc_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/dubious_disc_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/dubious_disc_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/dubious_disc_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/dubious_disc_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/dubious_disc_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/dubious_disc_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/dubious_disc_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/dubious_disc_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/dubious_disc_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/dubious_disc_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/dubious_disc_four_items",
"y": 270
}
}
}
@@ -0,0 +1,110 @@
{
"variants": {
"face=ceiling,facing=east,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 180,
"y": 270
},
"face=ceiling,facing=east,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 180,
"y": 270
},
"face=ceiling,facing=north,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 180,
"y": 180
},
"face=ceiling,facing=north,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 180,
"y": 180
},
"face=ceiling,facing=south,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 180
},
"face=ceiling,facing=south,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 180
},
"face=ceiling,facing=west,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 180,
"y": 90
},
"face=ceiling,facing=west,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 180,
"y": 90
},
"face=floor,facing=east,powered=false": {
"model": "cobblemon:block/eject_button",
"y": 90
},
"face=floor,facing=east,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"y": 90
},
"face=floor,facing=north,powered=false": {
"model": "cobblemon:block/eject_button"
},
"face=floor,facing=north,powered=true": {
"model": "cobblemon:block/eject_button_pressed"
},
"face=floor,facing=south,powered=false": {
"model": "cobblemon:block/eject_button",
"y": 180
},
"face=floor,facing=south,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"y": 180
},
"face=floor,facing=west,powered=false": {
"model": "cobblemon:block/eject_button",
"y": 270
},
"face=floor,facing=west,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"y": 270
},
"face=wall,facing=east,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 90,
"y": 90
},
"face=wall,facing=east,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 90,
"y": 90
},
"face=wall,facing=north,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 90
},
"face=wall,facing=north,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 90
},
"face=wall,facing=south,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 90,
"y": 180
},
"face=wall,facing=south,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 90,
"y": 180
},
"face=wall,facing=west,powered=false": {
"model": "cobblemon:block/eject_button",
"x": 90,
"y": 270
},
"face=wall,facing=west,powered=true": {
"model": "cobblemon:block/eject_button_pressed",
"x": 90,
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/elixir_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/elixir_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/elixir_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/elixir_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/elixir_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/elixir_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/elixir_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/elixir_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/elixir_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/elixir_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/elixir_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/elixir_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/elixir_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/elixir_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/elixir_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/elixir_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/ether_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/ether_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/ether_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/ether_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/ether_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/ether_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/ether_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/ether_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/ether_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/ether_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/ether_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/ether_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/ether_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/ether_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/ether_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/ether_four_items",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/flame_orb_ceiling",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/flame_orb_ceiling"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/flame_orb_ceiling",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/flame_orb_ceiling",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/flame_orb_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/flame_orb_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/flame_orb_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/flame_orb_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/flame_orb_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/flame_orb_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/flame_orb_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/flame_orb_wall",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/full_heal_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/full_heal_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/full_heal_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/full_heal_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/full_heal_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/full_heal_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/full_heal_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/full_heal_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/full_heal_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/full_heal_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/full_heal_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/full_heal_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/full_heal_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/full_heal_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/full_heal_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/full_heal_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/full_restore_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/full_restore_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/full_restore_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/full_restore_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/full_restore_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/full_restore_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/full_restore_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/full_restore_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/full_restore_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/full_restore_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/full_restore_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/full_restore_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/full_restore_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/full_restore_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/full_restore_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/full_restore_four_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/galarica_cuff",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/galarica_cuff",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/galarica_cuff"
},
"facing=east": {
"model": "cobblemon:block/galarica_cuff",
"y": 90
}
}
}
@@ -0,0 +1,129 @@
{
"multipart": [
{
"when": {
"face": "ceiling"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_chain"
}
},
{
"when": {
"face": "ceiling",
"facing": "east"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_ceiling",
"y": 90
}
},
{
"when": {
"face": "ceiling",
"facing": "north"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_ceiling"
}
},
{
"when": {
"face": "ceiling",
"facing": "south"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_ceiling",
"y": 180
}
},
{
"when": {
"face": "ceiling",
"facing": "west"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_ceiling",
"y": 270
}
},
{
"when": {
"face": "floor",
"facing": "east"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_floor",
"y": 90
}
},
{
"when": {
"face": "floor",
"facing": "north"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_floor"
}
},
{
"when": {
"face": "floor",
"facing": "south"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_floor",
"y": 180
}
},
{
"when": {
"face": "floor",
"facing": "west"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_floor",
"y": 270
}
},
{
"when": {
"face": "wall",
"facing": "east"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_wall",
"y": 90
}
},
{
"when": {
"face": "wall",
"facing": "north"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_wall"
}
},
{
"when": {
"face": "wall",
"facing": "south"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_wall",
"y": 180
}
},
{
"when": {
"face": "wall",
"facing": "west"
},
"apply": {
"model": "cobblemon:block/galarica_wreath_wall",
"y": 270
}
}
]
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/gray_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/gray_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/gray_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/gray_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/gray_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/gray_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/gray_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/gray_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/gray_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/gray_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/gray_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/gray_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/green_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/green_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/green_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/green_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/green_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/green_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/green_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/green_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/green_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/green_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/green_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/green_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/guard_spec_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/guard_spec_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/guard_spec_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/guard_spec_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/guard_spec_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/guard_spec_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/guard_spec_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/guard_spec_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/guard_spec_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/guard_spec_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/guard_spec_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/guard_spec_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/guard_spec_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/guard_spec_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/guard_spec_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/guard_spec_four_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/hard_stone",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/hard_stone",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/hard_stone"
},
"facing=east": {
"model": "cobblemon:block/hard_stone",
"y": 90
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/heat_rock",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/heat_rock",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/heat_rock"
},
"facing=east": {
"model": "cobblemon:block/heat_rock",
"y": 90
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/hp_up_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/hp_up_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/hp_up_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/hp_up_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/hp_up_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/hp_up_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/hp_up_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/hp_up_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/hp_up_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/hp_up_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/hp_up_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/hp_up_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/hp_up_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/hp_up_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/hp_up_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/hp_up_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/hyper_potion_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/hyper_potion_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/hyper_potion_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/hyper_potion_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/hyper_potion_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/hyper_potion_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/hyper_potion_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/hyper_potion_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/hyper_potion_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/hyper_potion_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/hyper_potion_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/hyper_potion_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/hyper_potion_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/hyper_potion_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/hyper_potion_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/hyper_potion_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/ice_heal_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/ice_heal_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/ice_heal_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/ice_heal_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/ice_heal_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/ice_heal_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/ice_heal_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/ice_heal_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/ice_heal_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/ice_heal_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/ice_heal_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/ice_heal_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/ice_heal_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/ice_heal_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/ice_heal_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/ice_heal_four_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/icy_rock",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/icy_rock",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/icy_rock"
},
"facing=east": {
"model": "cobblemon:block/icy_rock",
"y": 90
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/iron_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/iron_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/iron_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/iron_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/iron_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/iron_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/iron_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/iron_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/iron_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/iron_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/iron_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/iron_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/iron_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/iron_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/iron_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/iron_four_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/iron_ball",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/iron_ball",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/iron_ball"
},
"facing=east": {
"model": "cobblemon:block/iron_ball",
"y": 90
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/kings_rock",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/kings_rock",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/kings_rock"
},
"facing=east": {
"model": "cobblemon:block/kings_rock",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/life_orb_ceiling",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/life_orb_ceiling"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/life_orb_ceiling",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/life_orb_ceiling",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/life_orb_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/life_orb_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/life_orb_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/life_orb_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/life_orb_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/life_orb_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/life_orb_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/life_orb_wall",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/light_ball_ceiling",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/light_ball_ceiling"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/light_ball_ceiling",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/light_ball_ceiling",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/light_ball_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/light_ball_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/light_ball_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/light_ball_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/light_ball_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/light_ball_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/light_ball_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/light_ball_wall",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/light_blue_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/light_blue_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/light_blue_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/light_blue_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/light_blue_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/light_blue_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/light_blue_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/light_blue_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/light_blue_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/light_blue_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/light_blue_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/light_blue_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/light_gray_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/light_gray_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/light_gray_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/light_gray_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/light_gray_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/light_gray_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/light_gray_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/light_gray_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/light_gray_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/light_gray_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/light_gray_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/light_gray_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/lime_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/lime_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/lime_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/lime_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/lime_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/lime_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/lime_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/lime_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/lime_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/lime_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/lime_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/lime_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/luminous_moss",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/luminous_moss",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/luminous_moss"
},
"facing=east": {
"model": "cobblemon:block/luminous_moss",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/magenta_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/magenta_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/magenta_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/magenta_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/magenta_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/magenta_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/magenta_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/magenta_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/magenta_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/magenta_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/magenta_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/magenta_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,57 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/magnet",
"x": 180,
"y": 270
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/magnet",
"x": 180,
"y": 180
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/magnet",
"x": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/magnet",
"x": 180,
"y": 90
},
"face=floor,facing=east": {
"model": "cobblemon:block/magnet",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/magnet"
},
"face=floor,facing=south": {
"model": "cobblemon:block/magnet",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/magnet",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/magnet",
"x": 90,
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/magnet",
"x": 90
},
"face=wall,facing=south": {
"model": "cobblemon:block/magnet",
"x": 90,
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/magnet",
"x": 90,
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/masterpiece_teacup",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/masterpiece_teacup",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/masterpiece_teacup"
},
"facing=east": {
"model": "cobblemon:block/masterpiece_teacup",
"y": 90
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/max_elixir_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/max_elixir_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/max_elixir_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/max_elixir_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/max_elixir_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/max_elixir_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/max_elixir_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/max_elixir_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/max_elixir_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/max_elixir_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/max_elixir_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/max_elixir_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/max_elixir_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/max_elixir_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/max_elixir_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/max_elixir_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/max_ether_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/max_ether_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/max_ether_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/max_ether_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/max_ether_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/max_ether_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/max_ether_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/max_ether_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/max_ether_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/max_ether_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/max_ether_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/max_ether_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/max_ether_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/max_ether_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/max_ether_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/max_ether_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/max_potion_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/max_potion_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/max_potion_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/max_potion_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/max_potion_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/max_potion_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/max_potion_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/max_potion_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/max_potion_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/max_potion_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/max_potion_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/max_potion_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/max_potion_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/max_potion_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/max_potion_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/max_potion_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/metal_coat_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/metal_coat_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/metal_coat_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/metal_coat_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/metal_coat_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/metal_coat_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/metal_coat_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/metal_coat_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/metal_coat_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/metal_coat_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/metal_coat_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/metal_coat_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/metal_coat_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/metal_coat_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/metal_coat_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/metal_coat_four_items",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/metal_powder",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/metal_powder",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/metal_powder"
},
"facing=east": {
"model": "cobblemon:block/metal_powder",
"y": 90
}
}
}
@@ -0,0 +1,34 @@
{
"variants": {
"facing=east,active=false": {
"model": "cobblemon:block/metronome",
"y": 90
},
"facing=east,active=true": {
"model": "cobblemon:block/metronome_active",
"y": 90
},
"facing=north,active=false": {
"model": "cobblemon:block/metronome"
},
"facing=north,active=true": {
"model": "cobblemon:block/metronome_active"
},
"facing=south,active=false": {
"model": "cobblemon:block/metronome",
"y": 180
},
"facing=south,active=true": {
"model": "cobblemon:block/metronome_active",
"y": 180
},
"facing=west,active=false": {
"model": "cobblemon:block/metronome",
"y": 270
},
"facing=west,active=true": {
"model": "cobblemon:block/metronome_active",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/never_melt_ice",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/never_melt_ice",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/never_melt_ice"
},
"facing=east": {
"model": "cobblemon:block/never_melt_ice",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/orange_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/orange_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/orange_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/orange_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/orange_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/orange_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/orange_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/orange_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/orange_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/orange_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/orange_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/orange_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/paralyze_heal_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/paralyze_heal_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/paralyze_heal_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/paralyze_heal_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/paralyze_heal_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/paralyze_heal_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/paralyze_heal_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/paralyze_heal_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/paralyze_heal_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/paralyze_heal_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/paralyze_heal_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/paralyze_heal_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/paralyze_heal_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/paralyze_heal_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/paralyze_heal_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/paralyze_heal_four_items",
"y": 270
}
}
}
@@ -0,0 +1,34 @@
{
"variants": {
"facing=up": {
"model": "cobblemon:block/peat_block"
},
"facing=down": {
"model": "cobblemon:block/peat_block",
"x": 180,
"uvlock": false
},
"facing=south": {
"model": "cobblemon:block/peat_block",
"x": 270,
"uvlock": false
},
"facing=west": {
"model": "cobblemon:block/peat_block",
"x": 270,
"y": 90,
"uvlock": false
},
"facing=north": {
"model": "cobblemon:block/peat_block",
"x": 90,
"uvlock": false
},
"facing=east": {
"model": "cobblemon:block/peat_block",
"x": 90,
"y": 90,
"uvlock": false
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/pink_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/pink_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/pink_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/pink_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/pink_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/pink_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/pink_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/pink_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/pink_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/pink_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/pink_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/pink_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/potion_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/potion_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/potion_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/potion_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/potion_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/potion_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/potion_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/potion_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/potion_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/potion_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/potion_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/potion_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/potion_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/potion_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/potion_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/potion_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/pp_max_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/pp_max_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/pp_max_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/pp_max_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/pp_max_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/pp_max_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/pp_max_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/pp_max_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/pp_max_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/pp_max_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/pp_max_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/pp_max_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/pp_max_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/pp_max_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/pp_max_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/pp_max_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/pp_up_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/pp_up_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/pp_up_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/pp_up_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/pp_up_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/pp_up_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/pp_up_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/pp_up_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/pp_up_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/pp_up_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/pp_up_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/pp_up_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/pp_up_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/pp_up_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/pp_up_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/pp_up_four_items",
"y": 270
}
}
}
@@ -0,0 +1,64 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/protein_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/protein_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/protein_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/protein_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/protein_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/protein_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/protein_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/protein_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/protein_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/protein_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/protein_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/protein_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/protein_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/protein_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/protein_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/protein_four_items",
"y": 270
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/purple_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/purple_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/purple_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/purple_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/purple_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/purple_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/purple_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/purple_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/purple_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/purple_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/purple_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/purple_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/quick_powder",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/quick_powder",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/quick_powder"
},
"facing=east": {
"model": "cobblemon:block/quick_powder",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/red_plaque_hanging",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/red_plaque_hanging"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/red_plaque_hanging",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/red_plaque_hanging",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/red_plaque_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/red_plaque_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/red_plaque_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/red_plaque_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/red_plaque_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/red_plaque_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/red_plaque_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/red_plaque_wall",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=north": {
"model": "cobblemon:block/ring_target"
},
"facing=east": {
"model": "cobblemon:block/ring_target",
"y": 90
},
"facing=south": {
"model": "cobblemon:block/ring_target",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/ring_target",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/sachet",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/sachet",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/sachet"
},
"facing=east": {
"model": "cobblemon:block/sachet",
"y": 90
}
}
}
@@ -0,0 +1,49 @@
{
"variants": {
"face=ceiling,facing=east": {
"model": "cobblemon:block/smoke_ball_ceiling",
"y": 90
},
"face=ceiling,facing=north": {
"model": "cobblemon:block/smoke_ball_ceiling"
},
"face=ceiling,facing=south": {
"model": "cobblemon:block/smoke_ball_ceiling",
"y": 180
},
"face=ceiling,facing=west": {
"model": "cobblemon:block/smoke_ball_ceiling",
"y": 270
},
"face=floor,facing=east": {
"model": "cobblemon:block/smoke_ball_floor",
"y": 90
},
"face=floor,facing=north": {
"model": "cobblemon:block/smoke_ball_floor"
},
"face=floor,facing=south": {
"model": "cobblemon:block/smoke_ball_floor",
"y": 180
},
"face=floor,facing=west": {
"model": "cobblemon:block/smoke_ball_floor",
"y": 270
},
"face=wall,facing=east": {
"model": "cobblemon:block/smoke_ball_wall",
"y": 90
},
"face=wall,facing=north": {
"model": "cobblemon:block/smoke_ball_wall"
},
"face=wall,facing=south": {
"model": "cobblemon:block/smoke_ball_wall",
"y": 180
},
"face=wall,facing=west": {
"model": "cobblemon:block/smoke_ball_wall",
"y": 270
}
}
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/smooth_rock",
"y": 180
},
"facing=west": {
"model": "cobblemon:block/smooth_rock",
"y": 270
},
"facing=north": {
"model": "cobblemon:block/smooth_rock"
},
"facing=east": {
"model": "cobblemon:block/smooth_rock",
"y": 90
}
}
}
@@ -0,0 +1,124 @@
{
"variants": {
"items=1,facing=north": {
"model": "cobblemon:block/spell_tag_one_item"
},
"items=1,facing=east": {
"model": "cobblemon:block/spell_tag_one_item",
"y": 90
},
"items=1,facing=south": {
"model": "cobblemon:block/spell_tag_one_item",
"y": 180
},
"items=1,facing=west": {
"model": "cobblemon:block/spell_tag_one_item",
"y": 270
},
"items=2,facing=north": {
"model": "cobblemon:block/spell_tag_two_items"
},
"items=2,facing=east": {
"model": "cobblemon:block/spell_tag_two_items",
"y": 90
},
"items=2,facing=south": {
"model": "cobblemon:block/spell_tag_two_items",
"y": 180
},
"items=2,facing=west": {
"model": "cobblemon:block/spell_tag_two_items",
"y": 270
},
"items=3,facing=north": {
"model": "cobblemon:block/spell_tag_three_items"
},
"items=3,facing=east": {
"model": "cobblemon:block/spell_tag_three_items",
"y": 90
},
"items=3,facing=south": {
"model": "cobblemon:block/spell_tag_three_items",
"y": 180
},
"items=3,facing=west": {
"model": "cobblemon:block/spell_tag_three_items",
"y": 270
},
"items=4,facing=north": {
"model": "cobblemon:block/spell_tag_four_items"
},
"items=4,facing=east": {
"model": "cobblemon:block/spell_tag_four_items",
"y": 90
},
"items=4,facing=south": {
"model": "cobblemon:block/spell_tag_four_items",
"y": 180
},
"items=4,facing=west": {
"model": "cobblemon:block/spell_tag_four_items",
"y": 270
},
"items=5,facing=north": {
"model": "cobblemon:block/spell_tag_five_items"
},
"items=5,facing=east": {
"model": "cobblemon:block/spell_tag_five_items",
"y": 90
},
"items=5,facing=south": {
"model": "cobblemon:block/spell_tag_five_items",
"y": 180
},
"items=5,facing=west": {
"model": "cobblemon:block/spell_tag_five_items",
"y": 270
},
"items=6,facing=north": {
"model": "cobblemon:block/spell_tag_six_items"
},
"items=6,facing=east": {
"model": "cobblemon:block/spell_tag_six_items",
"y": 90
},
"items=6,facing=south": {
"model": "cobblemon:block/spell_tag_six_items",
"y": 180
},
"items=6,facing=west": {
"model": "cobblemon:block/spell_tag_six_items",
"y": 270
},
"items=7,facing=north": {
"model": "cobblemon:block/spell_tag_seven_items"
},
"items=7,facing=east": {
"model": "cobblemon:block/spell_tag_seven_items",
"y": 90
},
"items=7,facing=south": {
"model": "cobblemon:block/spell_tag_seven_items",
"y": 180
},
"items=7,facing=west": {
"model": "cobblemon:block/spell_tag_seven_items",
"y": 270
},
"items=8,facing=north": {
"model": "cobblemon:block/spell_tag_eight_items"
},
"items=8,facing=east": {
"model": "cobblemon:block/spell_tag_eight_items",
"y": 90
},
"items=8,facing=south": {
"model": "cobblemon:block/spell_tag_eight_items",
"y": 180
},
"items=8,facing=west": {
"model": "cobblemon:block/spell_tag_eight_items",
"y": 270
}
}
}

Some files were not shown because too many files have changed in this diff Show More