mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-11-12 11:18:52 -05:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69791200e9 | ||
|
|
1e7f70dc13 | ||
|
|
5612f09713 | ||
|
|
c197aeb9d8 | ||
|
|
2ce1b465d4 | ||
|
|
1e35b7c1ae | ||
|
|
d4f2070d1f | ||
|
|
dcc162fd98 | ||
|
|
2287c7718e |
No files matched your search
+269
-17
@@ -1,30 +1,282 @@
|
||||
# Changelog
|
||||
## [1.8.5 (MONTH xth, 2026)](#1-8-5)
|
||||
## [1.8.x (MONTH xth, 2026)](#1-8-x)
|
||||
|
||||
### Additions
|
||||
- Added the `healersSetSpawn` gamerule. When enabled, using a healing machine will set your spawnpoint.
|
||||
- A Pokémon holding a Power item now gains 1 point in the corresponding riding stat every two minutes while being ridden. The interval is configurable, and can be disabled with `-1`.
|
||||
- Added sounds to Gigaton Hammer and Pyro Ball
|
||||
- Added stepsounds to Venusaur, Blastoise, Dewgong, Rhydon, Rhyhorn, Parasect and Mr. Mime.
|
||||
- Added the Copper Oven, Copper Fridge, Copper Washer, Copper Fan, and Copper Mower.
|
||||
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
|
||||
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
|
||||
- Added trades for Saccharine Saplings, Hearty Grains, Chipped Pot, and Masterpiece Teacup to the Wandering Trader.
|
||||
- Added brewing recipe for Throat Spray.
|
||||
- Added mood particles! Pokémon now visually react to certain actions:
|
||||
- Angry particles when attacking a mob.
|
||||
- Annoyed particles when a player tries to feed them while they’re already full.
|
||||
- Sweat droplets when they run out of stamina while being ridden.
|
||||
- Added config options to award experience to fainted Pokémon for opponents they helped defeat (`awardExperienceToFaintedPokemon`) and to still award experience for defeated enemies even after battle loss/forfeit (`awardExperienceOnBattleLoss`)
|
||||
- Party Overlay Exp Gained Animation will now display the amount of EXP the Pokémon gained
|
||||
- Added a toast to notify players of how they can scroll through their party. Did you know you can hold R and scroll instead of using arrow keys??!
|
||||
- Added a new layer property that makes a layer scroll in a direction. "scrolling": {"speedU": 0.1, "speedV": 0.1}
|
||||
- Added missing crops to Botany Pots integration
|
||||
- Added a way to obtain Porygon by inserting the Upgrade or Dubious Disc into a data monitor
|
||||
- Added a new `cobblemon:structure`, which is a feature without any restrictions allowing the Builders to place certain structures in much more specific manner.
|
||||
- Added Configs for Infinite Use TMs and Unlocking all TMs
|
||||
- Added Type Gem blocks
|
||||
- Added Type Gem Clusters
|
||||
- Added TMs
|
||||
- Added TM Machine
|
||||
- Added Deepslate Core Block
|
||||
- Added /givetm Command
|
||||
- Added advancement triggers for learning TMs: `cobblemon:has_learn_specific_tm` (per-TM), `cobblemon:has_learn_all_tm` (all TMs learned), and `cobblemon:tms_learned` (count-based), backed by a new `totalTMLearnedCount` on player advancement data.
|
||||
- Added `cobblemon:catch_alpha_pokemon` advancement trigger and `totalAlphaCaptureCount` tracking for capturing Alpha Pokémon.
|
||||
- Added Move Dex to Pokédex
|
||||
- Added the Habitat Block, a spawner block for servers and adventure maps that controls spawning in an area.
|
||||
- Added Disk Rack for storing disks and being an audio sequencer for Noteblocks
|
||||
- Added intrinsic scaling to all Pokémon (+-5%). Some rendering cases, such as shoulder mounting, revert to 1.0 scaling to preserve animation accuracy.
|
||||
- Added scaling to "baby" Pokémon (smaller (-20%) at level 1 → normally sized at level 10)
|
||||
- Added conditional seats for riding. Seats can be gated by molang such as "is_alpha".
|
||||
- Added Alpha Pokémon
|
||||
- Added alpha scaling (alphas are larger than their normal counterparts)
|
||||
- Alphas will always lead herds and will spawn in herds
|
||||
- Alphas spawn with two random TM moves from their learnset
|
||||
- Alpha Pokémon will always defend themselves from players that attack them
|
||||
- Added alpha level matching and stat boost (based on level)
|
||||
- Added pitch-down and reverb to alpha cries
|
||||
- Added alpha Pokémon bait effect
|
||||
- Added alpha eye rendering including eye overlay, bloom, eye trail, and particles.
|
||||
- Added cobweb block slowness immunity for spider Pokémon
|
||||
- Added 49 new habitat structures. 34 as typical Minecraft structures and 15 as structures that get placed as biome features to allow for more natural placement in generation. Structures placed as biome features will not be able to be located with the `/locate structure` command.
|
||||
- Vanilla village house template pools have been adjusted to account for the new abandoned village structure habitat. Weights have changed within the JSON file for every piece to ensure too many habitats don't generate in a single village.
|
||||
- Added 10 new ruin structures.
|
||||
- rooted_arch_ruins & crumbling_arch_ruins have been transferred over to biome features, allowing for better placement in generation.
|
||||
- All ruin structures that did not generate with a gimmighoul/gilded chest before will now generate with one.
|
||||
- All ruin structures gilded chest loot tables have been updated to include a guaranteed TM not learned naturally by any Pokémon through their level-up moveset. Each ruin gets its own specific TM, so you can now go hunting ruins to complete your move dex!
|
||||
- All fossil structures have been transferred over to biome features, allowing for better placement in generation.
|
||||
- The prehistoric_underwater_fissure & prehistoric_submerged_impact fossil structures now use the biome tag `#cobblemon:is_temperate_ocean`.
|
||||
- Gimmighoul towers now generate at ground level rather than sinking one block into the ground.
|
||||
- A new shipwreck cove structure called the "magma_shipwreck_cove" has been added.
|
||||
- Shipwreck coves now generate slightly more frequently.
|
||||
- Added equipment loot tables for shipwreck cove enemies.
|
||||
- Maps from abandoned fishing boats leading to shipwreck coves now will skip explored chunks, allowing the player to find more shipwreck coves easier.
|
||||
- The lush shipwreck cove's phantom mob spawner has been replaced with breezes.
|
||||
- The lush shipwreck cove structure itself has been slightly cleaned up to be less noisy with the blocks it is built out of.
|
||||
- All shipwreck coves' spawners have been adjusted to give compatible mobs enchanted iron or diamond armour and weapons while in its ominous state. The armour given to the mobs will also use the automaton trim. We upped the difficulty because it was too easy now that your Pokémon can fight for you.
|
||||
- One TM of the elemental hyper beams has been added as guaranteed loot to the main treasure chest in every shipwreck cove. (Magma cove gets blast burn, lush cove gets frenzy plant, and submerged cove gets hydro cannon)
|
||||
- Added 7 new advancements
|
||||
- Pressing the inventory key now closes the Pokémon interact wheel GUI
|
||||
- Pokémon cries now play when clicking Pokémon in the summary screen.
|
||||
- Pressing the Summary key while either the starter selection or summary screen are open now closes those screens
|
||||
- Ice type Pokémon are now immune to Packed Snow
|
||||
- Held item visibility can now be controlled by the held_item_visible command argument.
|
||||
|
||||
### New rideable Pokémon
|
||||
- Crobat
|
||||
- Skarmory
|
||||
- Milotic
|
||||
- Archeops
|
||||
- Goodra
|
||||
- Goodra (Hisuian Form)
|
||||
- Drampa
|
||||
- Duraludon
|
||||
- Archaludon
|
||||
|
||||
### Pokémon Added
|
||||
#### Generation 3
|
||||
- Wurmple
|
||||
- Silcoon
|
||||
- Beautifly
|
||||
- Cascoon
|
||||
- Dustox
|
||||
- Skitty
|
||||
- Delcatty
|
||||
- Seviper
|
||||
- Zangoose
|
||||
|
||||
#### Generation 4
|
||||
- Cherubi
|
||||
- Cherrim
|
||||
- Stunky
|
||||
- Skuntank
|
||||
|
||||
#### Generation 5
|
||||
- Audino
|
||||
- Pawniard
|
||||
- Bisharp
|
||||
|
||||
#### Generation 6
|
||||
- Pancham (+ Cosmetic with Black Glasses)
|
||||
- Pangoro (+ Cosmetic with Black Glasses)
|
||||
|
||||
#### Generation 7
|
||||
- Rockruff
|
||||
- Lycanroc
|
||||
|
||||
#### Generation 8
|
||||
- Rolycoly
|
||||
- Carkol
|
||||
- Coalossal
|
||||
- Runerigus
|
||||
- Snom
|
||||
- Frosmoth
|
||||
- Indeedee
|
||||
- Duraludon
|
||||
- Applin
|
||||
- Flapple
|
||||
- Appletun
|
||||
|
||||
#### Generation 9
|
||||
|
||||
- Nymble
|
||||
- Lokix
|
||||
- Kingambit
|
||||
- Dipplin
|
||||
- Archaludon
|
||||
- Hydrapple
|
||||
|
||||
#### Regional Forms
|
||||
- Sandshrew (Alolan Form)
|
||||
- Sandslash (Alolan Form)
|
||||
- Yamask (Galarian Form)
|
||||
- Avalugg (Hisuian Form)
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
|
||||
- Sandshrew
|
||||
- Sandslash
|
||||
- Nidoking
|
||||
- Zubat
|
||||
- Golbat
|
||||
- Crobat
|
||||
- Ditto
|
||||
- Porygon
|
||||
- Porygon2
|
||||
- Porygon-Z
|
||||
- Skarmory
|
||||
- Smoochum
|
||||
- Jynx
|
||||
- Popplio
|
||||
- Brionne
|
||||
- Primarina
|
||||
- Fletchling
|
||||
- Fletchinder
|
||||
- Talonflame
|
||||
- Sableye
|
||||
- Mawile
|
||||
- Goomy
|
||||
- Sliggoo
|
||||
- Goodra
|
||||
- Nacli
|
||||
- Naclstack
|
||||
- Garganacl
|
||||
- Bidoof
|
||||
- Cranidos
|
||||
- Chatot
|
||||
- Yamask
|
||||
- Cofagrigus
|
||||
- Tyranitar
|
||||
- Turtonator
|
||||
- Golett
|
||||
- Corsola
|
||||
- Arbok (New Patterns: Angry, Cartoon, Clown, Comedic, Crow, Grin, Ink, Modern, Rain, Scribble, Silence, Sloth, Suspicious, Will)
|
||||
- ... and Substitute
|
||||
|
||||
#### Model changes to the regional bias resource pack:
|
||||
|
||||
- Added Mime Jr. (Galar Bias)
|
||||
- Added Bergmite (Hisui Bias)
|
||||
- Changed models for every existing regional bias
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
|
||||
- Kakuna
|
||||
- Grimer
|
||||
- Nidoran♀ (+ New shoulder mount)
|
||||
- Nidorina
|
||||
- Nidoran♂ (+ New shoulder mount)
|
||||
- Sandshrew
|
||||
- Diglett
|
||||
- Dugtrio
|
||||
- Graveler
|
||||
- Happiny
|
||||
- Chansey
|
||||
- Blissey
|
||||
- Poliwhirl
|
||||
- Poliwrath
|
||||
- Zubat
|
||||
- Vulpix
|
||||
- Drowzee
|
||||
- Hypno
|
||||
- Noctowl
|
||||
- Skarmory
|
||||
- Skitty
|
||||
- Flygon
|
||||
- Shellos
|
||||
- Riolu
|
||||
- Lucario
|
||||
- Purrloin
|
||||
- Liepard
|
||||
- Joltik
|
||||
- Galvantula
|
||||
- Nidoking
|
||||
- Fletchling
|
||||
- Fletchinder
|
||||
- Talonflame
|
||||
- Archeops
|
||||
- Drampa
|
||||
- Sewaddle
|
||||
- Swadloon
|
||||
- Leavanny
|
||||
- Goomy
|
||||
- Sliggoo
|
||||
- Goodra
|
||||
- Shedinja
|
||||
- Skwovet
|
||||
- Greedent
|
||||
- Bidoof
|
||||
- Cranidos
|
||||
- Chatot
|
||||
- Yamask
|
||||
- Cofagrigus
|
||||
- Luvdisc
|
||||
- Staryu
|
||||
- Starmie
|
||||
- Togetic
|
||||
- Rellor
|
||||
- Rabsca
|
||||
- Yungoos
|
||||
- Gumshoos
|
||||
- Cottonee
|
||||
- Whimsicott
|
||||
- Corsola
|
||||
|
||||
#### Added sounds to the following moves
|
||||
|
||||
- Absorb
|
||||
- Aurora Beam
|
||||
- Double Team
|
||||
- Draco Meteor
|
||||
- Fire Punch
|
||||
- Fire Spin
|
||||
- Flame Charge
|
||||
- Flame Wheel
|
||||
- Giga Drain
|
||||
- Ice Punch
|
||||
- Leech Life
|
||||
- Magical Leaf
|
||||
- Mega Drain
|
||||
- Minimize
|
||||
- Poison Gas
|
||||
- Rock Throw
|
||||
- Scary Face
|
||||
- Seed bomb
|
||||
- Smokescreen
|
||||
- String Shot
|
||||
- Tail Whip
|
||||
|
||||
### Changes
|
||||
- Amethyst now grows from Typegem core blocks like typegems do
|
||||
- Updated the recipe category for the Create compatibility EXP Candy recipe
|
||||
- Added No Man's Lands' Honeyed Apple to the Leaves Leftovers tag
|
||||
|
||||
### Fixes
|
||||
- Fixed Ponigiri food values for AppleSkin integration
|
||||
- Fixed errors emitted by typos in Parched Peat bog structure files
|
||||
|
||||
### Developer
|
||||
|
||||
### Molang & Datapacks
|
||||
- `q.is_standing_on_blocks` now properly checks for non-full blocks like slabs, Mud or Soul Sand
|
||||
- Added Molang functions to play footstep sounds based on the corresponding surface. These are intended to be used by Pokémon animations.
|
||||
- Pokémon can now have their Minecraft footstep sounds silenced in their poser. This doesn't affect emitting game events.
|
||||
|
||||
### Particles
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
- Updated translations for:
|
||||
@@ -1,2 +0,0 @@
|
||||
Spec Doc: https://docs.google.com/document/d/1hEKKrT4JEagJBykx-k9K2BoeNxiMGahUWXnf8YQ85xo/edit?tab=t.0
|
||||
Marshal: dhi_holo
|
||||
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.api.riding.RidingStyle;
|
||||
import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawner;
|
||||
import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawnerFactory;
|
||||
import com.cobblemon.mod.common.api.stats.CobblemonStats;
|
||||
import com.cobblemon.mod.common.block.HealingMachineBlock;
|
||||
import com.cobblemon.mod.common.duck.ServerLevelDuck;
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules;
|
||||
@@ -23,14 +22,10 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
@@ -38,9 +33,6 @@ import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Mixin(ServerPlayer.class)
|
||||
public abstract class ServerPlayerMixin implements PlayerSpawnerAccessor {
|
||||
@@ -150,17 +142,4 @@ public abstract class ServerPlayerMixin implements PlayerSpawnerAccessor {
|
||||
((ServerLevelDuck) this.serverLevel()).cobblemon$getLevelResourceLocation()
|
||||
);
|
||||
}
|
||||
|
||||
@Inject(
|
||||
method = "findRespawnAndUseSpawnBlock(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;FZZ)Ljava/util/Optional;",
|
||||
at = @At(value = "HEAD"),
|
||||
cancellable = true
|
||||
)
|
||||
private static void cobblemon$useHealthStationAsRespawn(ServerLevel level, BlockPos pos, float angle, boolean forced, boolean keepInventory, CallbackInfoReturnable<Optional<ServerPlayer.RespawnPosAngle>> cir) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
Block block = state.getBlock();
|
||||
if (block instanceof HealingMachineBlock && HealingMachineBlock.Companion.canSetSpawn(level)) {
|
||||
cir.setReturnValue(HealingMachineBlock.Companion.findStandUpPosition(EntityType.PLAYER, level, pos).map((vec3) -> ServerPlayer.RespawnPosAngle.of(vec3, pos)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,9 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common
|
||||
|
||||
import com.cobblemon.mod.common.block.appliances.CopperFridgeBlockEntity
|
||||
import com.cobblemon.mod.common.block.appliances.CopperMowerBlockEntity
|
||||
import com.cobblemon.mod.common.block.appliances.CopperWasherBlockEntity
|
||||
import com.cobblemon.mod.common.block.entity.*
|
||||
import com.cobblemon.mod.common.block.habitat.HabitatBlockEntity
|
||||
import com.cobblemon.mod.common.block.multiblock.FossilMultiblockBuilder
|
||||
@@ -129,49 +126,4 @@ object CobblemonBlockEntities : PlatformRegistry<Registry<BlockEntityType<*>>, R
|
||||
CobblemonBlocks.MISTLEAF
|
||||
).build(null)
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val COPPER_FRIDGE: BlockEntityType<CopperFridgeBlockEntity> = this.create(
|
||||
"copper_fridge",
|
||||
BlockEntityType.Builder.of(::CopperFridgeBlockEntity,
|
||||
CobblemonBlocks.COPPER_FRIDGE,
|
||||
CobblemonBlocks.EXPOSED_COPPER_FRIDGE,
|
||||
CobblemonBlocks.WEATHERED_COPPER_FRIDGE,
|
||||
CobblemonBlocks.OXIDIZED_COPPER_FRIDGE,
|
||||
CobblemonBlocks.WAXED_COPPER_FRIDGE,
|
||||
CobblemonBlocks.WAXED_EXPOSED_COPPER_FRIDGE,
|
||||
CobblemonBlocks.WAXED_WEATHERED_COPPER_FRIDGE,
|
||||
CobblemonBlocks.WAXED_OXIDIZED_COPPER_FRIDGE
|
||||
).build(null)
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val COPPER_WASHER: BlockEntityType<CopperWasherBlockEntity> = this.create(
|
||||
"copper_washer",
|
||||
BlockEntityType.Builder.of(::CopperWasherBlockEntity,
|
||||
CobblemonBlocks.COPPER_WASHER,
|
||||
CobblemonBlocks.EXPOSED_COPPER_WASHER,
|
||||
CobblemonBlocks.WEATHERED_COPPER_WASHER,
|
||||
CobblemonBlocks.OXIDIZED_COPPER_WASHER,
|
||||
CobblemonBlocks.WAXED_COPPER_WASHER,
|
||||
CobblemonBlocks.WAXED_EXPOSED_COPPER_WASHER,
|
||||
CobblemonBlocks.WAXED_WEATHERED_COPPER_WASHER,
|
||||
CobblemonBlocks.WAXED_OXIDIZED_COPPER_WASHER
|
||||
).build(null)
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val COPPER_MOWER: BlockEntityType<CopperMowerBlockEntity> = this.create(
|
||||
"copper_mower",
|
||||
BlockEntityType.Builder.of(::CopperMowerBlockEntity,
|
||||
CobblemonBlocks.COPPER_MOWER,
|
||||
CobblemonBlocks.EXPOSED_COPPER_MOWER,
|
||||
CobblemonBlocks.WEATHERED_COPPER_MOWER,
|
||||
CobblemonBlocks.OXIDIZED_COPPER_MOWER,
|
||||
CobblemonBlocks.WAXED_COPPER_MOWER,
|
||||
CobblemonBlocks.WAXED_EXPOSED_COPPER_MOWER,
|
||||
CobblemonBlocks.WAXED_WEATHERED_COPPER_MOWER,
|
||||
CobblemonBlocks.WAXED_OXIDIZED_COPPER_MOWER
|
||||
).build(null)
|
||||
)
|
||||
}
|
||||
@@ -12,7 +12,6 @@ import com.cobblemon.mod.common.api.apricorn.Apricorn
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.block.*
|
||||
import com.cobblemon.mod.common.block.LecternBlock
|
||||
import com.cobblemon.mod.common.block.appliances.*
|
||||
import com.cobblemon.mod.common.block.MintBlock.MintType
|
||||
import com.cobblemon.mod.common.block.campfirepot.CampfireBlock
|
||||
import com.cobblemon.mod.common.block.campfirepot.CampfirePotBlock
|
||||
@@ -29,7 +28,12 @@ import com.cobblemon.mod.common.block.sign.CobblemonWallHangingSignBlock
|
||||
import com.cobblemon.mod.common.block.sign.CobblemonWallSignBlock
|
||||
import com.cobblemon.mod.common.block.tmmachine.TMMachineBlock
|
||||
import com.cobblemon.mod.common.block.general.MintLitterBlock
|
||||
import com.cobblemon.mod.common.mixin.invoker.*
|
||||
import com.cobblemon.mod.common.mixin.invoker.BlocksInvoker
|
||||
import com.cobblemon.mod.common.mixin.invoker.DoorBlockInvoker
|
||||
import com.cobblemon.mod.common.mixin.invoker.FireBlockInvoker
|
||||
import com.cobblemon.mod.common.mixin.invoker.PressurePlateBlockInvoker
|
||||
import com.cobblemon.mod.common.mixin.invoker.StairsBlockInvoker
|
||||
import com.cobblemon.mod.common.mixin.invoker.TrapdoorBlockInvoker
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.BlockPos
|
||||
@@ -788,9 +792,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
||||
@JvmField
|
||||
val RESTORATION_TANK = create("restoration_tank", RestorationTankBlock(BlockBehaviour.Properties.of().mapColor(MapColor.METAL).sound(SoundType.GLASS).pushReaction(PushReaction.BLOCK).requiresCorrectToolForDrops().strength(5.0F, 6.0F).noOcclusion()))
|
||||
|
||||
@JvmField
|
||||
val ROTOM_MONITOR = create("rotom_data_monitor", RotomMonitorBlock(BlockBehaviour.Properties.ofFullCopy(MONITOR)))
|
||||
|
||||
@JvmField
|
||||
val HEALING_MACHINE = create("healing_machine", HealingMachineBlock(BlockBehaviour.Properties.of().mapColor(MapColor.METAL).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK).strength(2F).noOcclusion().lightLevel { if (it.getValue(HealingMachineBlock.CHARGE_LEVEL) >= HealingMachineBlock.MAX_CHARGE_LEVEL) 12 else 5 }))
|
||||
|
||||
@@ -820,94 +821,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
||||
@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()))
|
||||
|
||||
//Rotom Blocks
|
||||
//Oven
|
||||
@JvmField
|
||||
val COPPER_OVEN = create("copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(
|
||||
CobblemonSounds.APPLIANCE_BLOCK_SOUNDS).pushReaction(PushReaction.BLOCK)))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_OVEN = create("exposed_copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_OVEN = create("weathered_copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN).mapColor(MapColor.WARPED_STEM)))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_OVEN = create("oxidized_copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN).mapColor(MapColor.WARPED_NYLIUM)))
|
||||
@JvmField
|
||||
val WAXED_COPPER_OVEN = create("waxed_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN)))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_OVEN = create("waxed_exposed_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_OVEN)))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_OVEN = create("waxed_weathered_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_OVEN)))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_OVEN = create("waxed_oxidized_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_OVEN)))
|
||||
//Washer
|
||||
@JvmField
|
||||
val COPPER_WASHER = create("copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(CobblemonSounds.APPLIANCE_BLOCK_SOUNDS).pushReaction(PushReaction.BLOCK)))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_WASHER = create("exposed_copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_WASHER = create("weathered_copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER).mapColor(MapColor.WARPED_STEM)))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_WASHER = create("oxidized_copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER).mapColor(MapColor.WARPED_NYLIUM)))
|
||||
@JvmField
|
||||
val WAXED_COPPER_WASHER = create("waxed_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER)))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_WASHER = create("waxed_exposed_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_WASHER)))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_WASHER = create("waxed_weathered_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_WASHER)))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_WASHER = create("waxed_oxidized_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_WASHER)))
|
||||
//Fan
|
||||
@JvmField
|
||||
val COPPER_FAN = create("copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(CobblemonSounds.APPLIANCE_BLOCK_SOUNDS).pushReaction(PushReaction.DESTROY)))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_FAN = create("exposed_copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_FAN).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_FAN = create("weathered_copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_FAN).mapColor(MapColor.WARPED_STEM)))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_FAN = create("oxidized_copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_FAN).mapColor(MapColor.WARPED_NYLIUM)))
|
||||
@JvmField
|
||||
val WAXED_COPPER_FAN = create("waxed_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_FAN)))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_FAN = create("waxed_exposed_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_FAN)))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_FAN = create("waxed_weathered_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_FAN)))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_FAN = create("waxed_oxidized_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_FAN)))
|
||||
//Mower
|
||||
@JvmField
|
||||
val COPPER_MOWER = create("copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(CobblemonSounds.APPLIANCE_BLOCK_SOUNDS).pushReaction(PushReaction.NORMAL)))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_MOWER = create("exposed_copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_MOWER = create("weathered_copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER).mapColor(MapColor.WARPED_STEM)))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_MOWER = create("oxidized_copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER).mapColor(MapColor.WARPED_NYLIUM)))
|
||||
@JvmField
|
||||
val WAXED_COPPER_MOWER = create("waxed_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER)))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_MOWER = create("waxed_exposed_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_MOWER)))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_MOWER = create("waxed_weathered_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_MOWER)))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_MOWER = create("waxed_oxidized_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_MOWER)))
|
||||
//Fridge
|
||||
@JvmField
|
||||
val COPPER_FRIDGE = create("copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(CobblemonSounds.APPLIANCE_BLOCK_SOUNDS).pushReaction(PushReaction.BLOCK)))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_FRIDGE = create("exposed_copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_FRIDGE = create("weathered_copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE).mapColor(MapColor.WARPED_STEM)))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_FRIDGE = create("oxidized_copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE).mapColor(MapColor.WARPED_NYLIUM)))
|
||||
@JvmField
|
||||
val WAXED_COPPER_FRIDGE = create("waxed_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE)))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_FRIDGE = create("waxed_exposed_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_FRIDGE)))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_FRIDGE = create("waxed_weathered_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_FRIDGE)))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_FRIDGE = create("waxed_oxidized_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_FRIDGE)))
|
||||
|
||||
// TODO after 1.7
|
||||
// @JvmField
|
||||
// val INCENSE_SWEET = create("incense_sweet", SweetIncenseBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.DISPLAY_CASE_SOUNDS).noOcclusion().pushReaction(PushReaction.BLOCK).mapColor(MapColor.STONE).strength(0.3F)))
|
||||
@@ -936,6 +849,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
||||
@JvmField
|
||||
val GALARICA_NUT_BUSH = this.create("galarica_nut_bush", NutBushBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).randomTicks().noCollission().sound(SoundType.SWEET_BERRY_BUSH).pushReaction(PushReaction.DESTROY)))
|
||||
|
||||
|
||||
@JvmField
|
||||
val RED_MINT_LEAF_LITTER = this.mintLitter("red_mint_leaf_litter", MapColor.COLOR_RED)
|
||||
@JvmField
|
||||
@@ -1013,57 +927,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
||||
SACCHARINE_LOG to STRIPPED_SACCHARINE_LOG,
|
||||
SACCHARINE_LOG_SLATHERED to STRIPPED_SACCHARINE_LOG
|
||||
)
|
||||
/**Same idea as above, but for Copper Oxidation over time (or when inverted, scraping with an axe)*/
|
||||
fun oxidizingBlocks(): Map<Block, Block> = mapOf(
|
||||
//Ovens
|
||||
COPPER_OVEN to EXPOSED_COPPER_OVEN,
|
||||
EXPOSED_COPPER_OVEN to WEATHERED_COPPER_OVEN,
|
||||
WEATHERED_COPPER_OVEN to OXIDIZED_COPPER_OVEN,
|
||||
//Washers
|
||||
COPPER_WASHER to EXPOSED_COPPER_WASHER,
|
||||
EXPOSED_COPPER_WASHER to WEATHERED_COPPER_WASHER,
|
||||
WEATHERED_COPPER_WASHER to OXIDIZED_COPPER_WASHER,
|
||||
//Fans
|
||||
COPPER_FAN to EXPOSED_COPPER_FAN,
|
||||
EXPOSED_COPPER_FAN to WEATHERED_COPPER_FAN,
|
||||
WEATHERED_COPPER_FAN to OXIDIZED_COPPER_FAN,
|
||||
//Fridges
|
||||
COPPER_FRIDGE to EXPOSED_COPPER_FRIDGE,
|
||||
EXPOSED_COPPER_FRIDGE to WEATHERED_COPPER_FRIDGE,
|
||||
WEATHERED_COPPER_FRIDGE to OXIDIZED_COPPER_FRIDGE,
|
||||
//Mowers
|
||||
COPPER_MOWER to EXPOSED_COPPER_MOWER,
|
||||
EXPOSED_COPPER_MOWER to WEATHERED_COPPER_MOWER,
|
||||
WEATHERED_COPPER_MOWER to OXIDIZED_COPPER_MOWER
|
||||
)
|
||||
/**Same idea as above, but for waxing blocks with Honeycomb (or unwaxing them with an axe)*/
|
||||
fun waxingBlocks(): Map<Block, Block> = mapOf(
|
||||
//Ovens
|
||||
COPPER_OVEN to WAXED_COPPER_OVEN,
|
||||
EXPOSED_COPPER_OVEN to WAXED_EXPOSED_COPPER_OVEN,
|
||||
WEATHERED_COPPER_OVEN to WAXED_WEATHERED_COPPER_OVEN,
|
||||
OXIDIZED_COPPER_OVEN to WAXED_OXIDIZED_COPPER_OVEN,
|
||||
//Washers
|
||||
COPPER_WASHER to WAXED_COPPER_WASHER,
|
||||
EXPOSED_COPPER_WASHER to WAXED_EXPOSED_COPPER_WASHER,
|
||||
WEATHERED_COPPER_WASHER to WAXED_WEATHERED_COPPER_WASHER,
|
||||
OXIDIZED_COPPER_WASHER to WAXED_OXIDIZED_COPPER_WASHER,
|
||||
//Fans
|
||||
COPPER_FAN to WAXED_COPPER_FAN,
|
||||
EXPOSED_COPPER_FAN to WAXED_EXPOSED_COPPER_FAN,
|
||||
WEATHERED_COPPER_FAN to WAXED_WEATHERED_COPPER_FAN,
|
||||
OXIDIZED_COPPER_FAN to WAXED_OXIDIZED_COPPER_FAN,
|
||||
//Fridges
|
||||
COPPER_FRIDGE to WAXED_COPPER_FRIDGE,
|
||||
EXPOSED_COPPER_FRIDGE to WAXED_EXPOSED_COPPER_FRIDGE,
|
||||
WEATHERED_COPPER_FRIDGE to WAXED_WEATHERED_COPPER_FRIDGE,
|
||||
OXIDIZED_COPPER_FRIDGE to WAXED_OXIDIZED_COPPER_FRIDGE,
|
||||
//Mowers
|
||||
COPPER_MOWER to WAXED_COPPER_MOWER,
|
||||
EXPOSED_COPPER_MOWER to WAXED_EXPOSED_COPPER_MOWER,
|
||||
WEATHERED_COPPER_MOWER to WAXED_WEATHERED_COPPER_MOWER,
|
||||
OXIDIZED_COPPER_MOWER to WAXED_OXIDIZED_COPPER_MOWER
|
||||
)
|
||||
|
||||
private fun apricornBlock(name: String, apricorn: Apricorn): ApricornBlock = this.create(name, ApricornBlock(BlockBehaviour.Properties.of().mapColor(apricorn.mapColor()).randomTicks().strength(Blocks.OAK_LOG.defaultDestroyTime(), Blocks.OAK_LOG.explosionResistance).sound(SoundType.WOOD).noOcclusion(), apricorn))
|
||||
|
||||
|
||||
@@ -454,8 +454,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
@JvmField
|
||||
val DAMAGED_MONITOR = blockItem("damaged_monitor", CobblemonBlocks.DAMAGED_MONITOR)
|
||||
@JvmField
|
||||
val ROTOM_MONITOR = blockItem("rotom_data_monitor", CobblemonBlocks.ROTOM_MONITOR)
|
||||
@JvmField
|
||||
val HEALING_MACHINE = blockItem("healing_machine", CobblemonBlocks.HEALING_MACHINE, Rarity.UNCOMMON)
|
||||
@JvmField
|
||||
val PC = blockItem("pc", CobblemonBlocks.PC)
|
||||
@@ -1519,87 +1517,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
@JvmField
|
||||
val BLANK_TM = this.create("blank_tm", CobblemonItem(Item.Properties()))
|
||||
|
||||
@JvmField
|
||||
val COPPER_OVEN = this.create("copper_oven", BlockItem(CobblemonBlocks.COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_OVEN = this.create("exposed_copper_oven", BlockItem(CobblemonBlocks.EXPOSED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_OVEN = this.create("weathered_copper_oven", BlockItem(CobblemonBlocks.WEATHERED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_OVEN = this.create("oxidized_copper_oven", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_COPPER_OVEN = this.create("waxed_copper_oven", BlockItem(CobblemonBlocks.WAXED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_OVEN = this.create("waxed_exposed_copper_oven", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_OVEN = this.create("waxed_weathered_copper_oven", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_OVEN = this.create("waxed_oxidized_copper_oven", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_OVEN, Item.Properties()))
|
||||
@JvmField
|
||||
val COPPER_WASHER = this.create("copper_washer", BlockItem(CobblemonBlocks.COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_WASHER = this.create("exposed_copper_washer", BlockItem(CobblemonBlocks.EXPOSED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_WASHER = this.create("weathered_copper_washer", BlockItem(CobblemonBlocks.WEATHERED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_WASHER = this.create("oxidized_copper_washer", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_COPPER_WASHER = this.create("waxed_copper_washer", BlockItem(CobblemonBlocks.WAXED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_WASHER = this.create("waxed_exposed_copper_washer", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_WASHER = this.create("waxed_weathered_copper_washer", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_WASHER = this.create("waxed_oxidized_copper_washer", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_WASHER, Item.Properties()))
|
||||
@JvmField
|
||||
val COPPER_FAN = this.create("copper_fan", BlockItem(CobblemonBlocks.COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_FAN = this.create("exposed_copper_fan", BlockItem(CobblemonBlocks.EXPOSED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_FAN = this.create("weathered_copper_fan", BlockItem(CobblemonBlocks.WEATHERED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_FAN = this.create("oxidized_copper_fan", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_COPPER_FAN = this.create("waxed_copper_fan", BlockItem(CobblemonBlocks.WAXED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_FAN = this.create("waxed_exposed_copper_fan", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_FAN = this.create("waxed_weathered_copper_fan", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_FAN = this.create("waxed_oxidized_copper_fan", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_FAN, Item.Properties()))
|
||||
@JvmField
|
||||
val COPPER_MOWER = this.create("copper_mower", BlockItem(CobblemonBlocks.COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_MOWER = this.create("exposed_copper_mower", BlockItem(CobblemonBlocks.EXPOSED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_MOWER = this.create("weathered_copper_mower", BlockItem(CobblemonBlocks.WEATHERED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_MOWER = this.create("oxidized_copper_mower", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_COPPER_MOWER = this.create("waxed_copper_mower", BlockItem(CobblemonBlocks.WAXED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_MOWER = this.create("waxed_exposed_copper_mower", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_MOWER = this.create("waxed_weathered_copper_mower", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_MOWER = this.create("waxed_oxidized_copper_mower", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_MOWER, Item.Properties()))
|
||||
@JvmField
|
||||
val COPPER_FRIDGE = this.create("copper_fridge", BlockItem(CobblemonBlocks.COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val EXPOSED_COPPER_FRIDGE = this.create("exposed_copper_fridge", BlockItem(CobblemonBlocks.EXPOSED_COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val WEATHERED_COPPER_FRIDGE = this.create("weathered_copper_fridge", BlockItem(CobblemonBlocks.WEATHERED_COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val OXIDIZED_COPPER_FRIDGE = this.create("oxidized_copper_fridge", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_COPPER_FRIDGE = this.create("waxed_copper_fridge", BlockItem(CobblemonBlocks.WAXED_COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_EXPOSED_COPPER_FRIDGE = this.create("waxed_exposed_copper_fridge", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_WEATHERED_COPPER_FRIDGE = this.create("waxed_weathered_copper_fridge", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_FRIDGE, Item.Properties()))
|
||||
@JvmField
|
||||
val WAXED_OXIDIZED_COPPER_FRIDGE = this.create("waxed_oxidized_copper_fridge", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_FRIDGE, Item.Properties()))
|
||||
|
||||
// Type Gems
|
||||
@JvmField
|
||||
val NORMAL_GEM = this.create("normal_gem", GemItem(Item.Properties(), CobblemonBlocks.TYPE_GEM_CLUSTER_NORMAL))
|
||||
|
||||
@@ -12,7 +12,6 @@ package com.cobblemon.mod.common
|
||||
import com.cobblemon.mod.common.item.crafting.CookingPotRecipe
|
||||
import com.cobblemon.mod.common.item.crafting.CookingPotShapelessRecipe
|
||||
import com.cobblemon.mod.common.item.crafting.brewingstand.BrewingStandRecipe
|
||||
import com.cobblemon.mod.common.item.crafting.washer.WasherRecipe
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
@@ -27,9 +26,7 @@ object CobblemonRecipeSerializers : PlatformRegistry<Registry<RecipeSerializer<*
|
||||
val COOKING_POT_SHAPELESS: RecipeSerializer<*> = register("cobblemon:cooking_pot_shapeless", CookingPotShapelessRecipe.Serializer())
|
||||
|
||||
val BREWING_STAND: RecipeSerializer<*> = register("cobblemon:brewing_stand", BrewingStandRecipe.Serializer())
|
||||
|
||||
val WASHER: RecipeSerializer<*> = register("cobblemon:washer", WasherRecipe.Serializer())
|
||||
|
||||
|
||||
override val registry: Registry<RecipeSerializer<*>>
|
||||
get() = BuiltInRegistries.RECIPE_SERIALIZER
|
||||
override val resourceKey: ResourceKey<Registry<RecipeSerializer<*>>>
|
||||
|
||||
@@ -12,7 +12,6 @@ package com.cobblemon.mod.common
|
||||
import com.cobblemon.mod.common.item.crafting.CookingPotRecipe
|
||||
import com.cobblemon.mod.common.item.crafting.CookingPotShapelessRecipe
|
||||
import com.cobblemon.mod.common.item.crafting.brewingstand.BrewingStandRecipe
|
||||
import com.cobblemon.mod.common.item.crafting.washer.WasherRecipe
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
@@ -27,9 +26,7 @@ object CobblemonRecipeTypes : PlatformRegistry<Registry<RecipeType<*>>, Resource
|
||||
val COOKING_POT_SHAPELESS: RecipeType<CookingPotShapelessRecipe> = register("cobblemon:cooking_pot_shapeless")
|
||||
|
||||
val BREWING_STAND: RecipeType<BrewingStandRecipe> = register("cobblemon:brewing_stand")
|
||||
|
||||
val WASHER: RecipeType<WasherRecipe> = register("cobblemon:washer")
|
||||
|
||||
|
||||
override val registry: Registry<RecipeType<*>>
|
||||
get() = BuiltInRegistries.RECIPE_TYPE
|
||||
override val resourceKey: ResourceKey<Registry<RecipeType<*>>>
|
||||
|
||||
@@ -404,25 +404,6 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, ResourceKey<Regi
|
||||
@JvmField
|
||||
val IMPACT_WATER = this.create("impact.water")
|
||||
|
||||
@JvmField
|
||||
val APPLIANCE_STEP = this.create("block.appliance.roto_appliance_step")
|
||||
@JvmField
|
||||
val APPLIANCE_PLACE = this.create("block.appliance.roto_appliance_place")
|
||||
@JvmField
|
||||
val APPLIANCE_HIT = this.create("block.appliance.roto_appliance_hit")
|
||||
@JvmField
|
||||
val APPLIANCE_BREAK = this.create("block.appliance.roto_appliance_break")
|
||||
@JvmField
|
||||
val MOWER_CUT = this.create("block.appliance.roto_mower_cut")
|
||||
@JvmField
|
||||
val WASHER_WASH = this.create("block.appliance.roto_washer_wash")
|
||||
@JvmField
|
||||
val FAN_BLOW = this.create("block.appliance.roto_fan_blow")
|
||||
@JvmField
|
||||
val FAN_START = this.create("block.appliance.roto_fan_start")
|
||||
@JvmField
|
||||
val FAN_STOP = this.create("block.appliance.roto_fan_stop")
|
||||
|
||||
// Note to self or whoever's peeking, block sounds have to be at 1.1f pitch
|
||||
// For some reason, the game pitches them down and compensating for it here returns them to normal
|
||||
@JvmField
|
||||
@@ -443,15 +424,6 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, ResourceKey<Regi
|
||||
TUMBLESTONE_STEP
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val APPLIANCE_BLOCK_SOUNDS = SoundType(1f, 1.1f,
|
||||
APPLIANCE_BREAK,
|
||||
APPLIANCE_STEP,
|
||||
APPLIANCE_PLACE,
|
||||
APPLIANCE_HIT,
|
||||
APPLIANCE_STEP
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val TYPE_GEM_BLOCK_BREAK = this.create("block.type_gem_block.break")
|
||||
@JvmField
|
||||
|
||||
+7
-3
@@ -92,13 +92,17 @@ interface PokemonAndMoveSelectingItem {
|
||||
}
|
||||
|
||||
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
|
||||
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
|
||||
return !pokemon.isFull()
|
||||
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
|
||||
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
|
||||
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
|
||||
}
|
||||
|
||||
fun canUseOnMove(stack: ItemStack, pokemon: Pokemon, move: Move): Boolean = canUseOnMove(stack, move)
|
||||
fun canUseOnMove(stack: ItemStack, move: Move): Boolean
|
||||
|
||||
|
||||
@@ -107,13 +107,16 @@ interface PokemonSelectingItem {
|
||||
}
|
||||
|
||||
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
|
||||
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
|
||||
return !pokemon.isFull()
|
||||
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
|
||||
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
|
||||
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
|
||||
}
|
||||
|
||||
fun interactWithSpecificBattle(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon): InteractionResultHolder<ItemStack> {
|
||||
return if (canUseOnBattlePokemon(stack, battlePokemon)) {
|
||||
|
||||
+3
-2
@@ -55,8 +55,9 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
|
||||
}
|
||||
functions["feed_pokemon"] = { params ->
|
||||
val amount = params.getDouble(0)
|
||||
val playSound = params.getBooleanOrNull(1) ?: true
|
||||
pokemon.feedPokemon(amount.toInt(), playSound)
|
||||
val playSound = params.getBooleanOrNull(1) != false
|
||||
val playMoodParticles = params.getBooleanOrNull(2) != false
|
||||
DoubleValue(pokemon.feedPokemon(amount.toInt(), playSound, playMoodParticles))
|
||||
}
|
||||
functions["behaviour"] = { pokemon.form.behaviour.struct }
|
||||
functions["behavior"] = { pokemon.form.behaviour.struct } // Inferior
|
||||
|
||||
@@ -44,6 +44,7 @@ object ActionEffects : JsonDataRegistry<ActionEffectTimeline> {
|
||||
ActionEffectKeyframe.register<EntityMoLangActionEffectKeyframe>("entity_molang")
|
||||
ActionEffectKeyframe.register<MoLangActionEffectKeyframe>("molang")
|
||||
ActionEffectKeyframe.register<ParallelActionEffectKeyframe>("parallel")
|
||||
ActionEffectKeyframe.register<LoopActionEffectKeyframe>("loop")
|
||||
ActionEffectKeyframe.register<CanInterruptActionEffectKeyframe>("can_interrupt")
|
||||
ActionEffectKeyframe.register<CannotInterruptActionEffectKeyframe>("cannot_interrupt")
|
||||
ActionEffectKeyframe.register<RemoveHoldsActionEffectKeyframe>("remove_holds")
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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.api.moves.animations.keyframes
|
||||
|
||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class LoopActionEffectKeyframe(
|
||||
val keyframe: ActionEffectKeyframe = PauseActionEffectKeyframe()
|
||||
) : ConditionalActionEffectKeyframe() {
|
||||
override fun playWhenTrue(context: ActionEffectContext): CompletableFuture<Unit> {
|
||||
val future = CompletableFuture<Unit>()
|
||||
runIteration(context, future)
|
||||
return future
|
||||
}
|
||||
|
||||
private fun runIteration(context: ActionEffectContext, future: CompletableFuture<Unit>) {
|
||||
context.currentKeyframes.add(keyframe)
|
||||
keyframe.play(context)
|
||||
.thenRun { context.currentKeyframes.remove(keyframe) }
|
||||
.thenAccept {
|
||||
if (condition.resolveBoolean(context.runtime)) {
|
||||
runIteration(context, future)
|
||||
} else {
|
||||
future.complete(Unit)
|
||||
}
|
||||
}
|
||||
.exceptionally {
|
||||
future.completeExceptionally(it)
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,12 +9,9 @@
|
||||
package com.cobblemon.mod.common.api.riding.stats
|
||||
|
||||
import com.cobblemon.mod.common.api.cooking.Flavour
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.tags.TagKey
|
||||
import net.minecraft.world.item.Item
|
||||
|
||||
/**
|
||||
* A stat that is used for riding Pokémon. The exact implementation of each of these depends on the [com.cobblemon.mod.common.api.riding.controller.RideController].
|
||||
@@ -23,14 +20,13 @@ import net.minecraft.world.item.Item
|
||||
* @since February 17th, 2025
|
||||
*/
|
||||
enum class RidingStat(
|
||||
val flavour: Flavour,
|
||||
val powerItem: TagKey<Item>
|
||||
val flavour: Flavour
|
||||
) {
|
||||
ACCELERATION(Flavour.SPICY, CobblemonItemTags.POWER_BRACER),
|
||||
SKILL(Flavour.DRY, CobblemonItemTags.POWER_BELT),
|
||||
SPEED(Flavour.SWEET, CobblemonItemTags.POWER_ANKLET),
|
||||
STAMINA(Flavour.SOUR, CobblemonItemTags.POWER_WEIGHT),
|
||||
JUMP(Flavour.BITTER, CobblemonItemTags.POWER_BAND);
|
||||
ACCELERATION(Flavour.SPICY),
|
||||
SKILL(Flavour.DRY),
|
||||
SPEED(Flavour.SWEET),
|
||||
STAMINA(Flavour.SOUR),
|
||||
JUMP(Flavour.BITTER);
|
||||
|
||||
companion object {
|
||||
fun getByName(name: String) = RidingStat.entries.firstOrNull { it.name.equals(name, ignoreCase = true) }
|
||||
|
||||
@@ -24,7 +24,6 @@ import net.minecraft.network.chat.Component
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.entity.EntityType
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.Item
|
||||
@@ -32,9 +31,13 @@ import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.TooltipFlag
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.CollisionGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.*
|
||||
import net.minecraft.world.level.block.BaseEntityBlock
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.Mirror
|
||||
import net.minecraft.world.level.block.RenderShape
|
||||
import net.minecraft.world.level.block.Rotation
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
@@ -45,11 +48,9 @@ import net.minecraft.world.level.block.state.properties.IntegerProperty
|
||||
import net.minecraft.world.level.block.state.properties.Property
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
import java.util.Optional
|
||||
|
||||
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
|
||||
class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
@@ -78,14 +79,6 @@ class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
const val MAX_CHARGE_LEVEL = 5
|
||||
val CHARGE_LEVEL: IntegerProperty = IntegerProperty.create("charge", 0, MAX_CHARGE_LEVEL + 1)
|
||||
val NATURAL: BooleanProperty = BooleanProperty.create("natural")
|
||||
|
||||
fun canSetSpawn(level: Level): Boolean {
|
||||
return level.gameRules.getBoolean(CobblemonGameRules.HEALER_SET_SPAWN)
|
||||
}
|
||||
|
||||
fun findStandUpPosition(entityType: EntityType<*>, level: CollisionGetter, pos: BlockPos): Optional<Vec3> {
|
||||
return RespawnAnchorBlock.findStandUpPosition(entityType, level, pos) // Exists if we ever want to make something more custom, but anchor block logic should suffice
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
@@ -165,12 +158,7 @@ class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
}
|
||||
val party = serverPlayerEntity.party()
|
||||
val pc = serverPlayerEntity.pc()
|
||||
val healPC = player.level().gameRules.getBoolean(CobblemonGameRules.HEALERS_HEAL_PC)
|
||||
|
||||
// Do spawnpoint stuff
|
||||
if (canSetSpawn(world)) {
|
||||
player.setRespawnPosition(world.dimension(), blockPos, player.yRot, false, true)
|
||||
}
|
||||
val healPC = player.level().gameRules.getBoolean(CobblemonGameRules.HEALERS_HEAL_PC);
|
||||
|
||||
if (party.none() && (!healPC || pc.none())) {
|
||||
player.sendSystemMessage(lang("healingmachine.nopokemon").red(), true)
|
||||
@@ -195,7 +183,6 @@ class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
player.sendSystemMessage(lang("healingmachine.notenoughcharge", "${((neededCharge/party.count())*100f).toInt()}%").red(), true)
|
||||
}
|
||||
party.forEach { it.tryRecallWithAnimation() }
|
||||
|
||||
return InteractionResult.CONSUME
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
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.BooleanProperty
|
||||
import net.minecraft.world.level.block.state.properties.EnumProperty
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
@@ -47,10 +46,7 @@ class MonitorBlock(settings: Properties) : MultiblockBlock(settings) {
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HORIZONTAL_FACING, Direction.NORTH)
|
||||
.setValue(SCREEN, MonitorScreen.OFF)
|
||||
.setValue(NATURAL, false)
|
||||
)
|
||||
|
||||
.setValue(SCREEN, MonitorScreen.OFF))
|
||||
}
|
||||
|
||||
override fun createMultiBlockEntity(
|
||||
@@ -114,7 +110,6 @@ class MonitorBlock(settings: Properties) : MultiblockBlock(settings) {
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(HORIZONTAL_FACING)
|
||||
builder.add(SCREEN)
|
||||
builder.add(NATURAL)
|
||||
}
|
||||
|
||||
override fun hasAnalogOutputSignal(state: BlockState): Boolean {
|
||||
@@ -168,7 +163,6 @@ class MonitorBlock(settings: Properties) : MultiblockBlock(settings) {
|
||||
|
||||
//0 is off
|
||||
val SCREEN = EnumProperty.create("screen", MonitorScreen::class.java)
|
||||
val NATURAL = BooleanProperty.create("natural")
|
||||
val HITBOX_SOUTH = Shapes.or(
|
||||
Shapes.box(0.0625, 0.0, 0.0625, 0.9375, 0.375, 0.9375),
|
||||
Shapes.box(0.0625, 0.875, 0.0625, 0.9375, 1.0, 0.9375),
|
||||
|
||||
@@ -1,161 +0,0 @@
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.scheduling.afterOnServer
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.math.FloatRange
|
||||
import com.cobblemon.mod.common.util.party
|
||||
import com.cobblemon.mod.common.util.toVec3d
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.sounds.SoundEvent
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.Blocks
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
/**
|
||||
* A block that can transform into a [PokemonEntity].
|
||||
* Call [spawnPokemon] to spawn.
|
||||
*
|
||||
* @author whatsy
|
||||
*/
|
||||
interface PokemonDisguiseBlock {
|
||||
|
||||
private val facingToYaw: HashMap<Direction, Float>
|
||||
get() = hashMapOf(
|
||||
Direction.NORTH to -179.0F,
|
||||
Direction.WEST to 90.0F,
|
||||
Direction.SOUTH to 0.0F,
|
||||
Direction.EAST to -90.0F
|
||||
)
|
||||
|
||||
/**
|
||||
* An [IntRange] representing the possible level of the spawned Pokémon.
|
||||
*/
|
||||
val levelRange: IntRange
|
||||
|
||||
/**
|
||||
* A [String] representing the [PokemonProperties] of the spawned Pokémon.
|
||||
* Do not include level, scale, shiny, or alpha;
|
||||
* Those are defined using [levelRange], [scaleRange], [shinyRate] and [alphaRate] respectively.
|
||||
*/
|
||||
val pokemonArgs: String
|
||||
|
||||
/**
|
||||
* The chance of the spawned Pokémon being a shiny.
|
||||
* Leave null if impossible.
|
||||
* Defaults to [Cobblemon.config.shinyRate]
|
||||
*/
|
||||
val shinyRate: Float?
|
||||
get() = Cobblemon.config.shinyRate
|
||||
|
||||
/**
|
||||
* The chance of the spawned Pokémon being an Alpha.
|
||||
* Leave null if impossible.
|
||||
* Defaults to null
|
||||
*/
|
||||
val alphaRate: Float?
|
||||
get() = null
|
||||
|
||||
/**
|
||||
* The [BlockState] to replace the block with on interaction.
|
||||
* Defaults to [Blocks.AIR]
|
||||
* Leave null to leave the block unaltered.
|
||||
*
|
||||
* @param originalState The [BlockState] of the block being interacted with. Use to transfer properties to a new block.
|
||||
*/
|
||||
fun getReplacementBlock(originalState: BlockState): BlockState? = Blocks.AIR.defaultBlockState()
|
||||
|
||||
/**
|
||||
* Whether or not a battle should be initiated when the Pokémon spawns.
|
||||
* Defaults to true.
|
||||
* Does not affect players in creative mode.
|
||||
*/
|
||||
val shouldInitiateBattle: Boolean
|
||||
get() = true
|
||||
|
||||
/**
|
||||
* The [SoundEvent], if any, to play when the Pokémon spawns.
|
||||
* Defaults to null.
|
||||
*/
|
||||
val spawnSound: SoundEvent?
|
||||
get() = null
|
||||
|
||||
/**
|
||||
* A [FloatRange] representing the possible scale of the spawned Pokémon.
|
||||
* Defaults to config values.
|
||||
*/
|
||||
val scaleRange: FloatRange
|
||||
get() = FloatRange(Cobblemon.config.pokemonIntrinsicSizeMin, Cobblemon.config.pokemonIntrinsicSizeMax)
|
||||
|
||||
/**
|
||||
* Defines a [Vec3] offset for where the Pokémon will spawn.
|
||||
* Defaults to 0, 0, 0
|
||||
*/
|
||||
val offset: Vec3
|
||||
get() = Vec3(0.0, 0.0, 0.0)
|
||||
|
||||
/**
|
||||
* Returns the direction the Pokémon should be facing upon spawning.
|
||||
* Defaults to the
|
||||
*/
|
||||
fun getPokemonFacing(state: BlockState): Direction
|
||||
|
||||
/**
|
||||
* Spawn a Pokémon from this block.
|
||||
*
|
||||
* @param level The [Level] to spawn this Pokémon in.
|
||||
* @param pos The [BlockPos] to spawn this Pokémon at.
|
||||
* @param state The [BlockState] of the block at time of spawning.
|
||||
* @param player The [ServerPlayer] to initiate the battle against.
|
||||
*/
|
||||
fun spawnPokemon(level: Level, pos: BlockPos, state: BlockState, player: ServerPlayer): InteractionResult {
|
||||
val random = RandomSource.create()
|
||||
val isShiny = shinyRate?.let { random.nextInt(it.toInt()) == 0 } ?: false
|
||||
val isAlpha = alphaRate?.let { random.nextInt(it.toInt()) == 0 } ?: false
|
||||
val properties = "$pokemonArgs lvl=${levelRange.random()} scale_modifier=${scaleRange.random()} alpha=${isAlpha} shiny=${isShiny}"
|
||||
val pokemon = PokemonProperties.parse(properties)
|
||||
val entity = pokemon.createEntity(level)
|
||||
|
||||
// The yaw based on the block's facing direction
|
||||
val yaw = facingToYaw[getPokemonFacing(state)] ?: 0.0F
|
||||
|
||||
entity.entityData.set(PokemonEntity.SPAWN_DIRECTION, yaw)
|
||||
val offsetDir = state.getValue(HorizontalDirectionalBlock.FACING)
|
||||
val vec = pos.toVec3d()
|
||||
.add(offsetDir.stepX * 0.1 + 0.5, 0.0, offsetDir.stepZ * 0.1 + 0.5)
|
||||
.add(offset)
|
||||
entity.moveTo(vec.x, vec.y, vec.z, yaw, entity.xRot)
|
||||
entity.yBodyRot = yaw
|
||||
entity.yBodyRotO = yaw
|
||||
entity.yHeadRot = yaw
|
||||
entity.yHeadRotO = yaw
|
||||
level.addFreshEntity(entity)
|
||||
|
||||
if (getReplacementBlock(state) == Blocks.AIR) {
|
||||
level.removeBlock(pos, false)
|
||||
} else {
|
||||
getReplacementBlock(state)?.let {
|
||||
level.setBlockAndUpdate(pos, it)
|
||||
}
|
||||
}
|
||||
afterOnServer(seconds = 0.1F) {
|
||||
if (player !in player.level().players()) {
|
||||
return@afterOnServer
|
||||
}
|
||||
if (!player.isCreative && shouldInitiateBattle) {
|
||||
entity.forceBattle(player)
|
||||
} else {
|
||||
spawnSound?.let { level.playSound(null, pos, it, SoundSource.NEUTRAL) }
|
||||
}
|
||||
}
|
||||
return InteractionResult.SUCCESS
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlocks
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.block.DamagedMonitorBlock.BrokenMonitorScreen
|
||||
import com.cobblemon.mod.common.block.DamagedMonitorBlock.Companion.HITBOX_EAST
|
||||
import com.cobblemon.mod.common.block.DamagedMonitorBlock.Companion.HITBOX_NORTH
|
||||
import com.cobblemon.mod.common.block.DamagedMonitorBlock.Companion.HITBOX_SOUTH
|
||||
import com.cobblemon.mod.common.block.DamagedMonitorBlock.Companion.HITBOX_WEST
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
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.block.Block
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour
|
||||
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.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
class RotomMonitorBlock(settings: Properties) : Block(settings), PokemonDisguiseBlock {
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HorizontalDirectionalBlock.FACING, Direction.NORTH)
|
||||
.setValue(MonitorBlock.SCREEN, MonitorBlock.MonitorScreen.OFF)
|
||||
)
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
|
||||
return defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, context.horizontalDirection)
|
||||
}
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block?, BlockState?>) {
|
||||
builder.add(HorizontalDirectionalBlock.FACING)
|
||||
builder.add(MonitorBlock.SCREEN)
|
||||
}
|
||||
|
||||
override fun playerWillDestroy(level: Level, pos: BlockPos, state: BlockState, player: Player): BlockState? {
|
||||
if (!level.isClientSide) {
|
||||
spawnPokemon(level, pos, state, player as ServerPlayer)
|
||||
}
|
||||
return super.playerWillDestroy(level, pos, state, player)
|
||||
}
|
||||
|
||||
override fun getShape(
|
||||
state: BlockState,
|
||||
level: BlockGetter,
|
||||
pos: BlockPos,
|
||||
context: CollisionContext
|
||||
): VoxelShape {
|
||||
return when (state.getValue(HorizontalDirectionalBlock.FACING)) {
|
||||
Direction.WEST -> HITBOX_WEST
|
||||
Direction.EAST -> HITBOX_EAST
|
||||
Direction.SOUTH -> HITBOX_SOUTH
|
||||
else -> HITBOX_NORTH
|
||||
}
|
||||
}
|
||||
|
||||
override fun useWithoutItem(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
player: Player,
|
||||
hitResult: BlockHitResult
|
||||
): InteractionResult {
|
||||
return if (player is ServerPlayer) {
|
||||
spawnPokemon(level, pos, state, player)
|
||||
} else {
|
||||
InteractionResult.SUCCESS
|
||||
}
|
||||
}
|
||||
|
||||
override val levelRange = 35..60
|
||||
override val pokemonArgs = "rotom"
|
||||
override val spawnSound = CobblemonSounds.MONITOR_BREAK
|
||||
override val offset = Vec3(0.0, 1.0, 0.0)
|
||||
override fun getReplacementBlock(originalState: BlockState): BlockState =
|
||||
CobblemonBlocks.MONITOR.defaultBlockState()
|
||||
.setValue(HorizontalDirectionalBlock.FACING, originalState.getValue(HorizontalDirectionalBlock.FACING))
|
||||
.setValue(MonitorBlock.NATURAL, true)
|
||||
override fun getPokemonFacing(state: BlockState): Direction = state.getValue(HORIZONTAL_FACING).opposite
|
||||
}
|
||||
@@ -160,8 +160,8 @@ class TypeGemClusterBlock(
|
||||
&& state.getValue(STAGE) == 3) return false
|
||||
|
||||
val supportPos = pos.relative(state.getValue(FACING).opposite)
|
||||
val supportState = level.getBlockState(supportPos)
|
||||
return supportState.`is`(CobblemonBlockTags.TYPE_GEM_BLOCKS) || supportState.block == CobblemonBlocks.TYPE_GEM_CORE // Cannot grow if not on any gem blocks
|
||||
val supportBlock = level.getBlockState(supportPos).block
|
||||
return CobblemonBlocks.typeGemBlocks().containsValue(supportBlock) || (supportBlock == CobblemonBlocks.TYPE_GEM_CORE) // Cannot grow if not on any gem blocks
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -51,20 +51,10 @@ class TypeGemCoreBlock(properties: Properties) : Block(properties) {
|
||||
ResourceLocation.parse("cobblemon:dragon_gem_block") to CobblemonBlocks.TYPE_GEM_CLUSTER_DRAGON,
|
||||
ResourceLocation.parse("cobblemon:dark_gem_block") to CobblemonBlocks.TYPE_GEM_CLUSTER_DARK,
|
||||
ResourceLocation.parse("cobblemon:steel_gem_block") to CobblemonBlocks.TYPE_GEM_CLUSTER_STEEL,
|
||||
ResourceLocation.parse("cobblemon:fairy_gem_block") to CobblemonBlocks.TYPE_GEM_CLUSTER_FAIRY,
|
||||
ResourceLocation.parse("minecraft:amethyst_block") to Blocks.SMALL_AMETHYST_BUD
|
||||
ResourceLocation.parse("cobblemon:fairy_gem_block") to CobblemonBlocks.TYPE_GEM_CLUSTER_FAIRY
|
||||
)
|
||||
}
|
||||
|
||||
val AMETHYST_STAGES = listOf(
|
||||
Blocks.SMALL_AMETHYST_BUD,
|
||||
Blocks.MEDIUM_AMETHYST_BUD,
|
||||
Blocks.LARGE_AMETHYST_BUD,
|
||||
Blocks.AMETHYST_CLUSTER
|
||||
)
|
||||
|
||||
private fun isAmethystStage(block: Block) = block in AMETHYST_STAGES
|
||||
|
||||
fun getConnectedGemBlocks(level: BlockGetter, pos: BlockPos): List<Pair<BlockState, BlockPos>> {
|
||||
val connectedGems = mutableListOf<Pair<BlockState, BlockPos>>()
|
||||
val visited = mutableSetOf<BlockPos>()
|
||||
@@ -95,16 +85,12 @@ class TypeGemCoreBlock(properties: Properties) : Block(properties) {
|
||||
Direction.entries.forEach {
|
||||
if (random.nextFloat() < Cobblemon.config.typeGemGrowthChance) {
|
||||
val faceState = level.getBlockState(pos.relative(it))
|
||||
var newState = BLOCK_TO_CLUSTER[BuiltInRegistries.BLOCK.getKey(state.block)]?.defaultBlockState()
|
||||
val randomGrowthType = decideClusterGrowthType(level, pos)
|
||||
val newState = BLOCK_TO_CLUSTER[BuiltInRegistries.BLOCK.getKey(state.block)]?.defaultBlockState()
|
||||
?.setValue(DirectionalBlock.FACING, it)
|
||||
?.setValue(GROWTH_TYPE, randomGrowthType)
|
||||
?: return
|
||||
|
||||
if (newState.hasProperty(GROWTH_TYPE)) {
|
||||
newState = newState.setValue(GROWTH_TYPE, decideClusterGrowthType(level, pos))
|
||||
} else if (getConnectedGemBlocks(level, pos).size > Cobblemon.config.typeGemMaxConnected) {
|
||||
return@forEach
|
||||
}
|
||||
|
||||
if (faceState.`is`(Blocks.AIR)) {
|
||||
level.setBlock(pos.relative(it), newState, 3)
|
||||
}
|
||||
@@ -146,7 +132,7 @@ class TypeGemCoreBlock(properties: Properties) : Block(properties) {
|
||||
if (!visited.add(clusterPos)) continue
|
||||
|
||||
val clusterState = level.getBlockState(clusterPos)
|
||||
if (clusterState.block == expectedCluster && clusterState.hasProperty(GROWTH_TYPE)) {
|
||||
if (clusterState.block == expectedCluster) {
|
||||
clusters += clusterState to clusterPos
|
||||
}
|
||||
}
|
||||
@@ -192,41 +178,13 @@ class TypeGemCoreBlock(properties: Properties) : Block(properties) {
|
||||
Direction.entries.forEach { direction ->
|
||||
val relativePos = pos.relative(direction)
|
||||
val relativeState = level.getBlockState(relativePos)
|
||||
val matchesFace = relativeState.hasProperty(DirectionalBlock.FACING)
|
||||
&& relativeState.getValue(DirectionalBlock.FACING) == direction
|
||||
if (!(forceGrow || (matchesFace && random.nextFloat() < Cobblemon.config.typeGemGrowthChance))) {
|
||||
return@forEach
|
||||
val clusterBlock = relativeState.block as? TypeGemClusterBlock ?: return@forEach
|
||||
|
||||
if ((relativeState.getValue(DirectionalBlock.FACING) == direction &&
|
||||
random.nextFloat() < Cobblemon.config.typeGemGrowthChance) || forceGrow
|
||||
) {
|
||||
clusterBlock.advanceGrowth(relativeState, level, relativePos, random)
|
||||
}
|
||||
|
||||
val block = relativeState.block
|
||||
if (block is TypeGemClusterBlock) {
|
||||
block.advanceGrowth(relativeState, level, relativePos, random)
|
||||
} else if (isAmethystStage(block)) {
|
||||
advanceAmethyst(relativeState, level, relativePos)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun advanceAmethyst(state: BlockState, level: LevelAccessor, pos: BlockPos) {
|
||||
val facing = state.getValue(DirectionalBlock.FACING)
|
||||
val supportState = level.getBlockState(pos.relative(facing.opposite))
|
||||
if (!supportState.`is`(CobblemonBlockTags.TYPE_GEM_BLOCKS) && supportState.block != CobblemonBlocks.TYPE_GEM_CORE) {
|
||||
return
|
||||
}
|
||||
|
||||
if (state.block != Blocks.AMETHYST_CLUSTER) {
|
||||
val nextStage = AMETHYST_STAGES[AMETHYST_STAGES.indexOf(state.block) + 1]
|
||||
level.setBlock(pos, nextStage.defaultBlockState().setValue(DirectionalBlock.FACING, facing), 3)
|
||||
return
|
||||
}
|
||||
|
||||
// Fully grown clusters mature into amethyst blocks unless boxed in, mirroring stunted type gems
|
||||
val boxedIn = Direction.entries.any { direction ->
|
||||
direction != facing.opposite
|
||||
&& level.getBlockState(pos.relative(direction)).`is`(CobblemonBlockTags.TYPE_GEM_BLOCKS)
|
||||
}
|
||||
if (!boxedIn) {
|
||||
level.setBlock(pos, Blocks.AMETHYST_BLOCK.defaultBlockState(), 3)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,179 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.client.sound.BlockEntitySoundTracker
|
||||
import com.cobblemon.mod.common.client.sound.instances.CancellableSoundInstance
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
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.SoundEvents
|
||||
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.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.BlockStateProperties
|
||||
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.entity.EntityTypeTest
|
||||
import net.minecraft.world.level.material.FluidState
|
||||
import net.minecraft.world.level.material.Fluids
|
||||
import net.minecraft.world.phys.AABB
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
//TODO: All the Fan appliance stuff
|
||||
//TODO: Able to place the Fan on Walls, models and hitbox are there (blockstate would need edits to support it)
|
||||
open class CopperFanBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<CopperFanBlock> = RecordCodecBuilder.mapCodec {
|
||||
it.group(propertiesCodec()).apply(it, ::CopperFanBlock) }
|
||||
//val FACE = //TODO: Floor/Wall
|
||||
val POWER = BlockStateProperties.POWER;
|
||||
val PUSH = BooleanProperty.create("push")
|
||||
|
||||
val FLOOR_HITBOX = Shapes.or(
|
||||
Shapes.box(0.0625, 0.125, 0.4375, 0.9375, 1.0, 0.5625),
|
||||
Shapes.box(0.375, 0.0, 0.375, 0.625, 0.125, 0.625))
|
||||
val WALL_HITBOX = Shapes.box(0.0625, 0.0625, 0.875, 0.9375, 0.9375, 1.0)
|
||||
}
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HORIZONTAL_FACING, Direction.NORTH)
|
||||
.setValue(WATERLOGGED, false)
|
||||
//.setValue(FACE, AttachFace.FLOOR)
|
||||
.setValue(POWER, 0)
|
||||
.setValue(PUSH, true) //If True, fan pushes entities, If False, fan is cosmetic only
|
||||
)
|
||||
}
|
||||
|
||||
override fun useWithoutItem(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
player: Player,
|
||||
hitResult: BlockHitResult
|
||||
): InteractionResult {
|
||||
if (!level.isClientSide) {
|
||||
level.setBlockAndUpdate(pos, state.setValue(PUSH, !state.getValue(PUSH)))
|
||||
if (state.getValue(PUSH)) {
|
||||
level.playSound(null, pos, CobblemonSounds.FAN_START, SoundSource.BLOCKS)
|
||||
} else {
|
||||
level.playSound(null, pos, CobblemonSounds.FAN_STOP, SoundSource.BLOCKS)
|
||||
}
|
||||
}
|
||||
return InteractionResult.SUCCESS
|
||||
}
|
||||
|
||||
override fun codec(): MapCodec<CopperFanBlock> = CODEC
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(HORIZONTAL_FACING, WATERLOGGED, /*FACE,*/ POWER, PUSH)
|
||||
}
|
||||
|
||||
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
|
||||
|
||||
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 (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
|
||||
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return rotateShape(Direction.NORTH, direction, FLOOR_HITBOX)
|
||||
}
|
||||
|
||||
override fun neighborChanged(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
neighborBlock: Block,
|
||||
neighborPos: BlockPos,
|
||||
movedByPiston: Boolean
|
||||
) {
|
||||
val power = level.getBestNeighborSignal(pos)
|
||||
if (power != state.getValue(POWER)) {
|
||||
level.setBlock(pos, state.setValue(POWER, power), UPDATE_CLIENTS)
|
||||
if (power > 0) {
|
||||
level.scheduleTick(pos, this, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun tick(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
|
||||
val facing = state.getValue(HORIZONTAL_FACING)
|
||||
val power = state.getValue(POWER)
|
||||
|
||||
if (power == 0) {
|
||||
if (BlockEntitySoundTracker.isActive(pos, CobblemonSounds.FAN_BLOW.location)) {
|
||||
BlockEntitySoundTracker.stop(pos, CobblemonSounds.FAN_BLOW.location)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
val sound = CancellableSoundInstance(
|
||||
sound = CobblemonSounds.FAN_BLOW,
|
||||
pos = pos,
|
||||
repeat = true
|
||||
)
|
||||
|
||||
if (!BlockEntitySoundTracker.isActive(pos, CobblemonSounds.FAN_BLOW.location)) {
|
||||
BlockEntitySoundTracker.play(pos, sound)
|
||||
}
|
||||
|
||||
if (state.getValue(PUSH)) {
|
||||
val area = AABB(pos.relative(facing)).expandTowards(
|
||||
facing.stepX.toDouble() * (power - 1),
|
||||
0.0,
|
||||
facing.stepZ.toDouble() * (power - 1)
|
||||
)
|
||||
val entities = level.getEntities(null, area)
|
||||
val pushForce = 0.05
|
||||
entities.forEach { entity ->
|
||||
val motion = entity.deltaMovement
|
||||
entity.setDeltaMovement(
|
||||
motion.x + facing.stepX * pushForce,
|
||||
motion.y,
|
||||
motion.z + facing.stepZ * pushForce
|
||||
)
|
||||
entity.hurtMarked = true
|
||||
}
|
||||
}
|
||||
|
||||
level.scheduleTick(pos, this, 1)
|
||||
}
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return getCollisionShape(state, level, pos, context)
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
|
||||
val fluidState = context.level.getFluidState(context.clickedPos)
|
||||
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
|
||||
}
|
||||
}
|
||||
-283
@@ -1,283 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import com.cobblemon.mod.common.util.isServerSide
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
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.SoundEvents
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.InteractionHand
|
||||
import net.minecraft.world.ItemInteractionResult
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
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.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
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.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.block.state.properties.DoubleBlockHalf
|
||||
import net.minecraft.world.level.block.state.properties.EnumProperty
|
||||
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.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
//TODO: Oxidation/Waxing/Scraping not breaking the blocks
|
||||
//TODO: All the Fridge appliance stuff
|
||||
open class CopperFridgeBlock(settings: Properties) : BaseEntityBlock(settings), SimpleWaterloggedBlock {
|
||||
|
||||
fun getBlockEntity(level: ServerLevel, pos: BlockPos) = level.getBlockEntity(getBottomPos(level, pos)) as CopperFridgeBlockEntity
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<CopperFridgeBlock> = RecordCodecBuilder.mapCodec {
|
||||
it.group(propertiesCodec()).apply(it, ::CopperFridgeBlock) }
|
||||
val HALF: EnumProperty<DoubleBlockHalf> = BlockStateProperties.DOUBLE_BLOCK_HALF
|
||||
val POWERED = BooleanProperty.create("powered")
|
||||
val FACING = HorizontalDirectionalBlock.FACING
|
||||
|
||||
val LOWER_HITBOX = Shapes.or(
|
||||
Shapes.box(0.0625, 0.0, 0.125, 0.9375, 0.0625, 0.9375),
|
||||
Shapes.box(0.0, 0.0625, 0.0625, 1.0, 1.0, 1.0))
|
||||
val UPPER_HITBOX = Shapes.or(
|
||||
Shapes.box(0.0, 0.0, 0.0625, 1.0, 1.0, 1.0),
|
||||
Shapes.box(0.25, 0.125, 0.0, 0.375, 0.3125, 0.0625),
|
||||
Shapes.box(0.625, 0.125, 0.0, 0.75, 0.3125, 0.0625))
|
||||
val UPPER_COLLISSIONBOX = Shapes.box(0.0, 0.0, 0.0625, 1.0, 1.0, 1.0)
|
||||
//The handles get ignored by entity collission, because it feels nicer, but still count as part of the hitbox
|
||||
}
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HORIZONTAL_FACING, Direction.NORTH)
|
||||
.setValue(HALF, DoubleBlockHalf.LOWER)
|
||||
.setValue(WATERLOGGED, false)
|
||||
.setValue(POWERED, false)
|
||||
)
|
||||
}
|
||||
|
||||
override fun codec(): MapCodec<CopperFridgeBlock> = CODEC
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(HORIZONTAL_FACING, HALF, WATERLOGGED, POWERED)
|
||||
}
|
||||
|
||||
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
|
||||
|
||||
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))
|
||||
}
|
||||
|
||||
val isFridge = neighborState.block is CopperFridgeBlock
|
||||
val half = state.getValue(HALF)
|
||||
if (!isFridge && half == DoubleBlockHalf.UPPER && neighborPos == pos.below()) {
|
||||
return Blocks.AIR.defaultBlockState()
|
||||
} else if (!isFridge && half == DoubleBlockHalf.LOWER && neighborPos == pos.above()) {
|
||||
return Blocks.AIR.defaultBlockState()
|
||||
}
|
||||
return state
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return if (state.getValue(HALF) == DoubleBlockHalf.LOWER) {
|
||||
rotateShape(Direction.NORTH, direction, LOWER_HITBOX)
|
||||
} else {
|
||||
rotateShape(Direction.NORTH, direction, UPPER_COLLISSIONBOX)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return if (state.getValue(HALF) == DoubleBlockHalf.LOWER) {
|
||||
rotateShape(Direction.NORTH, direction, LOWER_HITBOX)
|
||||
} else {
|
||||
rotateShape(Direction.NORTH, direction, UPPER_HITBOX)
|
||||
}
|
||||
}
|
||||
|
||||
override fun setPlacedBy(world: Level, pos: BlockPos, state: BlockState, placer: LivingEntity?, itemStack: ItemStack) {
|
||||
world.setBlock(pos.above(),
|
||||
state
|
||||
.setValue(HALF, DoubleBlockHalf.UPPER)
|
||||
.setValue(WATERLOGGED, world.getFluidState((pos.above())).type == Fluids.WATER)
|
||||
, 3)
|
||||
world.blockUpdated(pos, Blocks.AIR)
|
||||
state.updateNeighbourShapes(world, pos, 3)
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(blockPlaceContext: BlockPlaceContext): BlockState? {
|
||||
val abovePosition = blockPlaceContext.clickedPos.above()
|
||||
val world = blockPlaceContext.level
|
||||
if (world.getBlockState(abovePosition).canBeReplaced(blockPlaceContext) && !world.isOutsideBuildHeight(abovePosition)) {
|
||||
return defaultBlockState()
|
||||
.setValue(FACING, blockPlaceContext.horizontalDirection.opposite)
|
||||
.setValue(HALF, DoubleBlockHalf.LOWER)
|
||||
.setValue(WATERLOGGED, blockPlaceContext.level.getFluidState(blockPlaceContext.clickedPos).type == Fluids.WATER)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
override fun getRenderShape(state: BlockState) = RenderShape.MODEL
|
||||
|
||||
override fun canSurvive(state: BlockState, world: LevelReader, pos: BlockPos): Boolean {
|
||||
val blockPos = pos.below()
|
||||
val blockState = world.getBlockState(blockPos)
|
||||
return if (state.getValue(HALF) == DoubleBlockHalf.LOWER) blockState.isFaceSturdy(world, blockPos, Direction.UP) else blockState.`is`(this)
|
||||
}
|
||||
|
||||
override fun playerWillDestroy(world: Level, pos: BlockPos, state: BlockState, player: Player): BlockState {
|
||||
if (!world.isClientSide && player.isCreative) {
|
||||
var blockPos: BlockPos = BlockPos.ZERO
|
||||
var blockState: BlockState = state
|
||||
val half = state.getValue(HALF)
|
||||
if (half == DoubleBlockHalf.UPPER && world.getBlockState(pos.below().also { blockPos = it }).also { blockState = it }.`is`(state.block) && blockState.getValue(
|
||||
HALF
|
||||
) == DoubleBlockHalf.LOWER) {
|
||||
val blockState2 = if (blockState.fluidState.`is`(Fluids.WATER)) Blocks.WATER.defaultBlockState() else Blocks.AIR.defaultBlockState()
|
||||
world.setBlock(blockPos, blockState2, UPDATE_ALL or UPDATE_SUPPRESS_DROPS)
|
||||
world.levelEvent(player, LevelEvent.PARTICLES_DESTROY_BLOCK, blockPos, getId(blockState))
|
||||
}
|
||||
}
|
||||
return super.playerWillDestroy(world, pos, state, player)
|
||||
}
|
||||
|
||||
override fun hasAnalogOutputSignal(state: BlockState) = true
|
||||
|
||||
override fun useItemOn(
|
||||
stack: ItemStack,
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
player: Player,
|
||||
hand: InteractionHand,
|
||||
hitResult: BlockHitResult
|
||||
): ItemInteractionResult {
|
||||
if (level.isServerSide()) {
|
||||
val handStack = player.getItemInHand(hand)
|
||||
val stack = getBlockEntity(level as ServerLevel, pos).theItem
|
||||
|
||||
when (stack.item) {
|
||||
Items.AIR -> {
|
||||
if (handStack.`is`(Items.WATER_BUCKET)) {
|
||||
if (!player.isCreative) player.setItemInHand(hand, Items.BUCKET.defaultInstance)
|
||||
getBlockEntity(level, pos).timer = 100
|
||||
getBlockEntity(level, pos).theItem = Items.WATER_BUCKET.defaultInstance
|
||||
level.playSound(null, pos, SoundEvents.BUCKET_EMPTY, SoundSource.BLOCKS, 1.0f, 1.0f)
|
||||
return ItemInteractionResult.SUCCESS
|
||||
} else {
|
||||
return ItemInteractionResult.FAIL
|
||||
}
|
||||
}
|
||||
|
||||
Items.WATER_BUCKET -> {
|
||||
if (handStack.`is`(Items.BUCKET)) {
|
||||
player.setItemInHand(hand, Items.WATER_BUCKET.defaultInstance)
|
||||
getBlockEntity(level, pos).theItem = Items.AIR.defaultInstance
|
||||
getBlockEntity(level, pos).timer = 0
|
||||
level.playSound(null, pos, SoundEvents.BUCKET_FILL, SoundSource.BLOCKS, 1.0f, 1.0f)
|
||||
return ItemInteractionResult.SUCCESS
|
||||
} else {
|
||||
return ItemInteractionResult.FAIL
|
||||
}
|
||||
}
|
||||
|
||||
Items.ICE -> {
|
||||
val facing = state.getValue(HORIZONTAL_FACING)
|
||||
val spawnPos = getBottomPos(level, pos)
|
||||
val itemEntity =
|
||||
ItemEntity(level, spawnPos.x + 0.5, spawnPos.y + 0.5, spawnPos.z + 0.5, Items.ICE.defaultInstance)
|
||||
itemEntity.deltaMovement = Vec3(facing.stepX.toDouble(), 0.0, facing.stepZ.toDouble()).scale(0.2)
|
||||
level.addFreshEntity(itemEntity)
|
||||
getBlockEntity(level, pos).theItem = Items.AIR.defaultInstance
|
||||
return ItemInteractionResult.SUCCESS
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return if (stack.`is`(Items.WATER_BUCKET)) ItemInteractionResult.SUCCESS
|
||||
else ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION
|
||||
}
|
||||
return ItemInteractionResult.SUCCESS // should not be reachable, but intellij doesnt like that its not there
|
||||
}
|
||||
|
||||
override fun getAnalogOutputSignal(state: BlockState, level: Level, pos: BlockPos): Int {
|
||||
if (level.isClientSide) return 0
|
||||
return when (getBlockEntity(level as ServerLevel, pos).theItem.item) {
|
||||
Items.WATER_BUCKET -> 1
|
||||
Items.ICE -> 2
|
||||
else -> 0
|
||||
}
|
||||
}
|
||||
|
||||
override fun tick(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
|
||||
(level.getBlockEntity(pos) as CopperFridgeBlockEntity).processTick()
|
||||
super.tick(state, level, pos, random)
|
||||
}
|
||||
|
||||
override fun newBlockEntity(pos: BlockPos, state: BlockState) = if (state.getValue(HALF) == DoubleBlockHalf.LOWER) CopperFridgeBlockEntity(pos, state) else null
|
||||
|
||||
override fun neighborChanged(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
neighborBlock: Block,
|
||||
neighborPos: BlockPos,
|
||||
movedByPiston: Boolean
|
||||
) {
|
||||
if (!level.isClientSide) {
|
||||
val otherPos = if (state.getValue(HALF) == DoubleBlockHalf.LOWER) pos.above() else pos.below()
|
||||
val powered = level.hasNeighborSignal(pos) || level.hasNeighborSignal(otherPos)
|
||||
|
||||
if (state.getValue(POWERED) != powered) {
|
||||
level.setBlock(pos, state.setValue(POWERED, powered), 3)
|
||||
}
|
||||
|
||||
val otherState = level.getBlockState(otherPos)
|
||||
if (otherState.`is`(this) && otherState.getValue(POWERED) != powered) {
|
||||
level.setBlock(otherPos, otherState.setValue(POWERED, powered), 3)
|
||||
}
|
||||
}
|
||||
super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston)
|
||||
}
|
||||
|
||||
override fun <T : BlockEntity> getTicker(
|
||||
level: Level,
|
||||
state: BlockState,
|
||||
blockEntityType: BlockEntityType<T>
|
||||
): BlockEntityTicker<T>? {
|
||||
return if (level.isClientSide)
|
||||
null
|
||||
else
|
||||
createTickerHelper(blockEntityType, CobblemonBlockEntities.COPPER_FRIDGE, CopperFridgeBlockEntity.TICKER::tick)
|
||||
}
|
||||
|
||||
fun getBottomPos(level: Level, pos: BlockPos) = if (level.getBlockState(pos).getValue(HALF) == DoubleBlockHalf.UPPER) pos.below() else pos
|
||||
}
|
||||
-81
@@ -1,81 +0,0 @@
|
||||
package com.cobblemon.mod.common.block.appliances
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.world.Container
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.ticks.ContainerSingleItem
|
||||
|
||||
class CopperFridgeBlockEntity(val pos: BlockPos, val state: BlockState) : BlockEntity(
|
||||
CobblemonBlockEntities.COPPER_FRIDGE, pos, state
|
||||
), ContainerSingleItem.BlockContainerSingleItem {
|
||||
|
||||
private var item: ItemStack = Items.AIR.defaultInstance
|
||||
private var spawnedReadyParticle = false
|
||||
var timer: Int = -1
|
||||
|
||||
fun processTick() {
|
||||
val serverLevel = level as? ServerLevel ?: return
|
||||
|
||||
if (item.`is`(Items.ICE) && !spawnedReadyParticle) {
|
||||
val facing = state.getValue(CopperFridgeBlock.FACING)
|
||||
val particlePosition = Vec3(
|
||||
pos.x + 0.5,
|
||||
pos.y + 1.5,
|
||||
pos.z + 0.5
|
||||
)
|
||||
val rotation = when (facing) {
|
||||
Direction.NORTH -> 180F
|
||||
Direction.EAST -> 90F
|
||||
Direction.SOUTH -> 0F
|
||||
Direction.WEST -> 270F
|
||||
else -> 0F
|
||||
}
|
||||
val packet = SpawnSnowstormParticlePacket(cobblemonResource("rotomfridge_doorready"), particlePosition, rotation)
|
||||
|
||||
serverLevel.players()
|
||||
.filter { it.distanceToSqr(particlePosition.x, particlePosition.y, particlePosition.z) <= 32.0 * 32.0 }
|
||||
.forEach { it.sendPacket(packet) }
|
||||
spawnedReadyParticle = true
|
||||
} else if (!item.`is`(Items.ICE)) {
|
||||
spawnedReadyParticle = false
|
||||
}
|
||||
|
||||
if (!serverLevel.getBlockState(pos).getValue(CopperFridgeBlock.POWERED)) return
|
||||
if (timer > 0) timer--
|
||||
if (timer == 0 && item.item == Items.WATER_BUCKET) {
|
||||
theItem = Items.ICE.defaultInstance
|
||||
timer = -1
|
||||
}
|
||||
}
|
||||
|
||||
override fun getContainerBlockEntity() = this
|
||||
override fun getTheItem() = item
|
||||
|
||||
override fun setTheItem(item: ItemStack) {
|
||||
this.item = item
|
||||
level?.updateNeighborsAt(pos, state.block)
|
||||
}
|
||||
|
||||
override fun canTakeItem(target: Container, slot: Int, stack: ItemStack): Boolean {
|
||||
return stack.item == Items.ICE
|
||||
}
|
||||
|
||||
companion object {
|
||||
internal val TICKER = BlockEntityTicker<CopperFridgeBlockEntity> { level, pos, state, entity ->
|
||||
if (!level.isClientSide) {
|
||||
entity.processTick()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import net.minecraft.world.item.BlockItem
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
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.entity.BlockEntity
|
||||
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.material.FluidState
|
||||
import net.minecraft.world.level.material.Fluids
|
||||
import net.minecraft.world.level.storage.loot.LootParams
|
||||
import net.minecraft.world.level.storage.loot.LootTable
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParam
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
//TODO: All the Mower appliance stuff
|
||||
open class CopperMowerBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<CopperMowerBlock> = RecordCodecBuilder.mapCodec {
|
||||
it.group(propertiesCodec()).apply(it, ::CopperMowerBlock) }
|
||||
val TRIGGERED = BooleanProperty.create("triggered")
|
||||
|
||||
val COLLISIONBOX = Shapes.or(
|
||||
Shapes.box(0.1875, 0.0, 0.0, 0.8125, 0.375, 0.625),
|
||||
Shapes.box(0.0625, 0.0, 0.625, 0.9375, 0.625, 1.0),
|
||||
Shapes.box(0.125, 0.0, 0.1875, 0.875, 0.3125, 0.5),
|
||||
//The next three lines are just so the handle does have collision, it feels awkward without it but it looks bad as hitbox
|
||||
Shapes.box(0.375, 0.375, 0.375, 0.625, 0.625, 0.5625),
|
||||
Shapes.box(0.4375, 0.5625, 0.5, 0.5625, 0.875, 0.625),
|
||||
Shapes.box(0.25, 0.875, 0.5625, 0.75, 1.0, 0.6875)
|
||||
)
|
||||
val HITBOX = Shapes.or(
|
||||
Shapes.box(0.1875, 0.0, 0.0, 0.8125, 0.375, 0.625),
|
||||
Shapes.box(0.0625, 0.0, 0.625, 0.9375, 0.625, 1.0),
|
||||
Shapes.box(0.125, 0.0, 0.1875, 0.875, 0.3125, 0.5)
|
||||
)
|
||||
}
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HORIZONTAL_FACING, Direction.NORTH)
|
||||
.setValue(WATERLOGGED, false)
|
||||
.setValue(TRIGGERED, false)
|
||||
)
|
||||
}
|
||||
|
||||
override fun neighborChanged(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
sourceBlock: Block,
|
||||
sourcePos: BlockPos,
|
||||
notify: Boolean
|
||||
) {
|
||||
val powered = level.hasNeighborSignal(pos) || level.hasNeighborSignal(pos.above())
|
||||
val triggered = state.getValue(TRIGGERED)
|
||||
|
||||
if (powered && !triggered) {
|
||||
level.setBlock(pos, state.setValue(TRIGGERED, true), UPDATE_CLIENTS)
|
||||
level.scheduleTick(pos, this, 1)
|
||||
} else if (!powered && triggered) {
|
||||
level.setBlock(pos, state.setValue(TRIGGERED, false), UPDATE_CLIENTS)
|
||||
}
|
||||
}
|
||||
|
||||
override fun hasAnalogOutputSignal(state: BlockState) = true
|
||||
|
||||
override fun tick(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
|
||||
val blockKey = BuiltInRegistries.BLOCK.getKey(level.getBlockState(pos.below()).block)
|
||||
val tableKey = ResourceKey.create(Registries.LOOT_TABLE, cobblemonResource("mower/${blockKey.path}"))
|
||||
val lootTable = level.server.reloadableRegistries().getLootTable(tableKey)
|
||||
if (lootTable == LootTable.EMPTY) return
|
||||
val params = LootParams.Builder(level)
|
||||
.withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(pos.below()))
|
||||
.withParameter(LootContextParams.BLOCK_STATE, level.getBlockState(pos.below()))
|
||||
.withParameter(LootContextParams.TOOL, ItemStack.EMPTY)
|
||||
.create(LootContextParamSets.BLOCK)
|
||||
|
||||
val result = lootTable.getRandomItems(params, random)
|
||||
val block = result.getOrNull(0)?.item as? BlockItem
|
||||
val item = result.getOrNull(1)
|
||||
|
||||
if (block == null || block == Blocks.AIR) {
|
||||
level.destroyBlock(pos.below(), false)
|
||||
} else {
|
||||
level.setBlockAndUpdate(pos.below(), block.block.defaultBlockState())
|
||||
}
|
||||
item?.let {
|
||||
val facing = state.getValue(HORIZONTAL_FACING).opposite
|
||||
val itemEntity =
|
||||
ItemEntity(level,
|
||||
pos.x + 0.5, pos.y + 0.5, pos.z + 0.5,
|
||||
it
|
||||
)
|
||||
itemEntity.deltaMovement = Vec3(facing.stepX.toDouble(), 0.0, facing.stepZ.toDouble()).scale(0.2)
|
||||
level.addFreshEntity(itemEntity)
|
||||
}
|
||||
level.playSound(null, pos, CobblemonSounds.MOWER_CUT, SoundSource.BLOCKS)
|
||||
}
|
||||
|
||||
override fun getRenderShape(state: BlockState) = RenderShape.MODEL
|
||||
|
||||
override fun codec(): MapCodec<CopperMowerBlock> = CODEC
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(HORIZONTAL_FACING, WATERLOGGED, TRIGGERED)
|
||||
}
|
||||
|
||||
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
|
||||
|
||||
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 (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
|
||||
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return rotateShape(Direction.NORTH, direction, COLLISIONBOX)
|
||||
}
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return rotateShape(Direction.NORTH, direction, HITBOX)
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
|
||||
val fluidState = context.level.getFluidState(context.clickedPos)
|
||||
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
|
||||
}
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
package com.cobblemon.mod.common.block.appliances
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
|
||||
class CopperMowerBlockEntity(val pos: BlockPos, val state: BlockState) : BlockEntity(
|
||||
CobblemonBlockEntities.COPPER_MOWER,
|
||||
pos, state
|
||||
) {
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
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.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.block.state.properties.EnumProperty
|
||||
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
|
||||
//TODO: All the Oven appliance stuff - Good Luck Coders
|
||||
open class CopperOvenBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<CopperOvenBlock> = RecordCodecBuilder.mapCodec {
|
||||
it.group(propertiesCodec()).apply(it, ::CopperOvenBlock) }
|
||||
val EJECTING = BooleanProperty.create("ejecting")
|
||||
val COOKING = EnumProperty.create("cooking", CookingState::class.java)
|
||||
|
||||
val HITBOX = Shapes.box(0.0625, 0.0, 0.3125, 0.9375, 0.625, 0.9375)
|
||||
}
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HORIZONTAL_FACING, Direction.NORTH)
|
||||
.setValue(WATERLOGGED, false)
|
||||
.setValue(COOKING, CookingState.CLOSED)
|
||||
.setValue(EJECTING, false)
|
||||
)
|
||||
}
|
||||
enum class CookingState : StringRepresentable {
|
||||
CLOSED, //Door is closed
|
||||
OPEN, //Door is open
|
||||
COOKING; //Door is locked closed and the light level is cranked up, as long as the block is powered by redstone. Acts as closed lid in the original Campfire Pot
|
||||
override fun getSerializedName(): String = this.name.lowercase()
|
||||
}
|
||||
|
||||
override fun codec(): MapCodec<CopperOvenBlock> = CODEC
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(HORIZONTAL_FACING, WATERLOGGED, COOKING, EJECTING)
|
||||
}
|
||||
|
||||
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
|
||||
|
||||
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 (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
|
||||
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return rotateShape(Direction.NORTH, direction, HITBOX)
|
||||
}
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return getCollisionShape(state, level, pos, context).singleEncompassing()
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
|
||||
val fluidState = context.level.getFluidState(context.clickedPos)
|
||||
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
|
||||
}
|
||||
}
|
||||
-133
@@ -1,133 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import com.cobblemon.mod.common.util.isServerSide
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.sounds.SoundEvents
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.world.InteractionHand
|
||||
import net.minecraft.world.ItemInteractionResult
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
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.entity.BlockEntity
|
||||
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.material.FluidState
|
||||
import net.minecraft.world.level.material.Fluids
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
open class CopperWasherBlock(settings: Properties) : BaseEntityBlock(settings), SimpleWaterloggedBlock {
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<CopperWasherBlock> = RecordCodecBuilder.mapCodec {
|
||||
it.group(propertiesCodec()).apply(it, ::CopperWasherBlock) }
|
||||
val POWERED = BooleanProperty.create("powered")
|
||||
|
||||
val HITBOX = Shapes.box(0.0625, 0.0, 0.125, 0.9375, 1.0, 1.0)
|
||||
}
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
.setValue(HORIZONTAL_FACING, Direction.NORTH)
|
||||
.setValue(WATERLOGGED, false)
|
||||
.setValue(POWERED, false)
|
||||
)
|
||||
}
|
||||
|
||||
override fun codec(): MapCodec<CopperWasherBlock> = CODEC
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(HORIZONTAL_FACING, WATERLOGGED, POWERED)
|
||||
}
|
||||
|
||||
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
|
||||
|
||||
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 (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
|
||||
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
return rotateShape(Direction.NORTH, direction, HITBOX)
|
||||
}
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return getCollisionShape(state, level, pos, context).singleEncompassing()
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
|
||||
val fluidState = context.level.getFluidState(context.clickedPos)
|
||||
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
|
||||
}
|
||||
|
||||
override fun newBlockEntity(pos: BlockPos, state: BlockState) = CopperWasherBlockEntity(pos, state)
|
||||
|
||||
override fun getRenderShape(state: BlockState) = RenderShape.MODEL
|
||||
|
||||
override fun hasAnalogOutputSignal(state: BlockState) = true
|
||||
|
||||
override fun getAnalogOutputSignal(state: BlockState, level: Level, pos: BlockPos): Int {
|
||||
return if ((level.getBlockEntity(pos) as CopperWasherBlockEntity).theItem != ItemStack.EMPTY) 1 else 0
|
||||
}
|
||||
|
||||
override fun useItemOn(
|
||||
stack: ItemStack,
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
player: Player,
|
||||
hand: InteractionHand,
|
||||
hitResult: BlockHitResult
|
||||
): ItemInteractionResult {
|
||||
val entity = level.getBlockEntity(pos) as CopperWasherBlockEntity
|
||||
val item = entity.theItem
|
||||
if (item == ItemStack.EMPTY) {
|
||||
if (level.isServerSide()) {
|
||||
entity.theItem = stack.copyWithCount(1)
|
||||
if (!player.isCreative) stack.shrink(1)
|
||||
entity.craft()
|
||||
}
|
||||
return ItemInteractionResult.SUCCESS
|
||||
} else {
|
||||
if (level.isServerSide()) {
|
||||
val facing = state.getValue(HORIZONTAL_FACING)
|
||||
val itemEntity =
|
||||
ItemEntity(level, pos.x + 0.5, pos.y + 0.5, pos.z + 0.5, entity.theItem)
|
||||
itemEntity.deltaMovement = Vec3(facing.stepX.toDouble(), 0.0, facing.stepZ.toDouble()).scale(0.2)
|
||||
level.addFreshEntity(itemEntity)
|
||||
entity.theItem = ItemStack.EMPTY
|
||||
level.playSound(null, pos, SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.BLOCKS)
|
||||
}
|
||||
return ItemInteractionResult.SUCCESS
|
||||
}
|
||||
}
|
||||
}
|
||||
-43
@@ -1,43 +0,0 @@
|
||||
package com.cobblemon.mod.common.block.appliances
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import com.cobblemon.mod.common.CobblemonRecipeTypes
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.item.crafting.washer.WasherInput
|
||||
import com.cobblemon.mod.common.util.isServerSide
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.ticks.ContainerSingleItem
|
||||
|
||||
class CopperWasherBlockEntity(val pos: BlockPos, val state: BlockState): BlockEntity(
|
||||
CobblemonBlockEntities.COPPER_WASHER,
|
||||
pos, state
|
||||
), ContainerSingleItem.BlockContainerSingleItem {
|
||||
|
||||
private var item: ItemStack = ItemStack.EMPTY
|
||||
|
||||
override fun getContainerBlockEntity() = this
|
||||
override fun getTheItem() = item
|
||||
override fun setTheItem(item: ItemStack) {
|
||||
this.item = item
|
||||
level?.updateNeighborsAt(pos, state.block)
|
||||
}
|
||||
|
||||
fun craft() {
|
||||
val level = level ?: return
|
||||
if (level.isClientSide || theItem.isEmpty) return
|
||||
|
||||
val input = WasherInput(theItem.copyWithCount(1))
|
||||
val recipe = level.recipeManager
|
||||
.getRecipeFor(CobblemonRecipeTypes.WASHER, input, level)
|
||||
.orElse(null) ?: return
|
||||
|
||||
theItem = recipe.value().assemble(input, level.registryAccess())
|
||||
setChanged()
|
||||
level.playSound(null, pos, CobblemonSounds.WASHER_WASH, SoundSource.BLOCKS)
|
||||
level.sendBlockUpdated(worldPosition, blockState, blockState, 3)
|
||||
}
|
||||
}
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.block.WeatheringCopper
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
|
||||
class WeatheringCopperFanBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
|
||||
CopperFanBlock(properties), WeatheringCopper {
|
||||
|
||||
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
|
||||
this.changeOverTime(state, level, pos, random)
|
||||
}
|
||||
|
||||
override fun isRandomlyTicking(state: BlockState): Boolean {
|
||||
return WeatheringCopper.getNext(state.getBlock()).isPresent()
|
||||
}
|
||||
|
||||
override fun getAge(): WeatheringCopper.WeatherState {
|
||||
return this.weatherState
|
||||
}
|
||||
}
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.WeatheringCopper
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties
|
||||
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
|
||||
|
||||
class WeatheringCopperFridgeBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
|
||||
CopperFridgeBlock(properties), WeatheringCopper {
|
||||
|
||||
override fun randomTick(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
|
||||
if (state.getValue(HALF) == DoubleBlockHalf.LOWER) {
|
||||
this.changeOverTime(state, level, pos, random)
|
||||
}
|
||||
}
|
||||
|
||||
override fun changeOverTime(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
|
||||
val upperPos = pos.above()
|
||||
val upperState = level.getBlockState(upperPos)
|
||||
if (upperState.block != this || upperState.getValue(HALF) != DoubleBlockHalf.UPPER) {
|
||||
return
|
||||
}
|
||||
|
||||
if (random.nextFloat() < 0.05688889F) {
|
||||
getNextState(state, level, pos, random).ifPresent { nextState ->
|
||||
val nextLowerState = nextState.setValue(HALF, DoubleBlockHalf.LOWER)
|
||||
val nextUpperState = nextState
|
||||
.setValue(HALF, DoubleBlockHalf.UPPER)
|
||||
.setValue(FACING, upperState.getValue(FACING))
|
||||
.setValue(BlockStateProperties.WATERLOGGED, upperState.getValue(BlockStateProperties.WATERLOGGED))
|
||||
.setValue(POWERED, upperState.getValue(POWERED))
|
||||
|
||||
level.setBlock(pos, nextLowerState, UPDATE_CLIENTS)
|
||||
level.setBlock(upperPos, nextUpperState, UPDATE_ALL)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun isRandomlyTicking(state: BlockState): Boolean {
|
||||
return WeatheringCopper.getNext(state.block).isPresent
|
||||
}
|
||||
|
||||
override fun getAge(): WeatheringCopper.WeatherState {
|
||||
return this.weatherState
|
||||
}
|
||||
}
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.block.WeatheringCopper
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
|
||||
class WeatheringCopperMowerBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
|
||||
CopperMowerBlock(properties), WeatheringCopper {
|
||||
|
||||
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
|
||||
this.changeOverTime(state, level, pos, random)
|
||||
}
|
||||
|
||||
override fun isRandomlyTicking(state: BlockState): Boolean {
|
||||
return WeatheringCopper.getNext(state.getBlock()).isPresent()
|
||||
}
|
||||
|
||||
override fun getAge(): WeatheringCopper.WeatherState {
|
||||
return this.weatherState
|
||||
}
|
||||
}
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.block.WeatheringCopper
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
|
||||
class WeatheringCopperOvenBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
|
||||
CopperOvenBlock(properties), WeatheringCopper {
|
||||
|
||||
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
|
||||
this.changeOverTime(state, level, pos, random)
|
||||
}
|
||||
|
||||
override fun isRandomlyTicking(state: BlockState): Boolean {
|
||||
return WeatheringCopper.getNext(state.getBlock()).isPresent()
|
||||
}
|
||||
|
||||
override fun getAge(): WeatheringCopper.WeatherState {
|
||||
return this.weatherState
|
||||
}
|
||||
}
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* 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.appliances
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.block.WeatheringCopper
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
|
||||
class WeatheringCopperWasherBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
|
||||
CopperWasherBlock(properties), WeatheringCopper {
|
||||
|
||||
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
|
||||
this.changeOverTime(state, level, pos, random)
|
||||
}
|
||||
|
||||
override fun isRandomlyTicking(state: BlockState): Boolean {
|
||||
return WeatheringCopper.getNext(state.getBlock()).isPresent()
|
||||
}
|
||||
|
||||
override fun getAge(): WeatheringCopper.WeatherState {
|
||||
return this.weatherState
|
||||
}
|
||||
}
|
||||
@@ -11,11 +11,9 @@ package com.cobblemon.mod.common.block.chest
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.scheduling.afterOnServer
|
||||
import com.cobblemon.mod.common.block.PokemonDisguiseBlock
|
||||
import com.cobblemon.mod.common.block.entity.GildedChestBlockEntity
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.math.FloatRange
|
||||
import com.cobblemon.mod.common.util.party
|
||||
import com.cobblemon.mod.common.util.toVec3d
|
||||
import com.mojang.serialization.MapCodec
|
||||
@@ -27,7 +25,6 @@ import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.sounds.SoundEvent
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.util.StringRepresentable
|
||||
@@ -57,7 +54,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
class GildedChestBlock(settings: Properties, val type: Type = Type.RED) : BaseEntityBlock(settings),
|
||||
SimpleWaterloggedBlock, PokemonDisguiseBlock {
|
||||
SimpleWaterloggedBlock {
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any()
|
||||
@@ -73,6 +70,9 @@ class GildedChestBlock(settings: Properties, val type: Type = Type.RED) : BaseEn
|
||||
).apply(it, ::GildedChestBlock)
|
||||
}
|
||||
|
||||
val POKEMON_ARGS = "gimmighoul"
|
||||
val LEVEL_RANGE = 5..30
|
||||
|
||||
val SOUTH_OUTLINE = Shapes.or(
|
||||
Shapes.box(0.0, 0.0, 0.25, 1.0, 1.0, 0.9375)
|
||||
)
|
||||
@@ -127,6 +127,13 @@ class GildedChestBlock(settings: Properties, val type: Type = Type.RED) : BaseEn
|
||||
builder.add(WATERLOGGED)
|
||||
}
|
||||
|
||||
private val facingToYaw: HashMap<Direction, Float> = hashMapOf(
|
||||
Direction.NORTH to -179.0F,
|
||||
Direction.WEST to 90.0F,
|
||||
Direction.SOUTH to 0.0F,
|
||||
Direction.EAST to -90.0F
|
||||
)
|
||||
|
||||
override fun getName(): MutableComponent {
|
||||
return if (isFake()) Component.translatable("block.cobblemon.gilded_chest") else super.getName()
|
||||
}
|
||||
@@ -142,6 +149,35 @@ class GildedChestBlock(settings: Properties, val type: Type = Type.RED) : BaseEn
|
||||
return super.playerWillDestroy(world, pos, state, player)
|
||||
}
|
||||
|
||||
private fun spawnPokemon(world: Level, pos: BlockPos, state: BlockState, player: ServerPlayer): InteractionResult {
|
||||
val properties = "$POKEMON_ARGS lvl=${LEVEL_RANGE.random()}"
|
||||
val pokemon = PokemonProperties.parse(properties)
|
||||
val entity = pokemon.createEntity(world)
|
||||
|
||||
// The yaw based on the block's facing direction
|
||||
val yaw = facingToYaw[state.getValue(HorizontalDirectionalBlock.FACING)] ?: 0.0F
|
||||
|
||||
entity.entityData.set(PokemonEntity.SPAWN_DIRECTION, yaw)
|
||||
val offsetDir = state.getValue(HorizontalDirectionalBlock.FACING)
|
||||
val vec = pos.toVec3d().add(offsetDir.stepX * 0.1 + 0.5, 0.0, offsetDir.stepZ * 0.1 + 0.5)
|
||||
entity.moveTo(vec.x, vec.y, vec.z, yaw, entity.xRot)
|
||||
world.addFreshEntity(entity)
|
||||
|
||||
world.removeBlock(pos, false)
|
||||
afterOnServer(seconds = 0.1F) {
|
||||
if (player !in player.level().players()) {
|
||||
return@afterOnServer
|
||||
}
|
||||
val party = player.party()
|
||||
if (!player.isCreative) {
|
||||
entity.forceBattle(player)
|
||||
} else {
|
||||
world.playSound(null, pos, CobblemonSounds.GIMMIGHOUL_REVEAL, SoundSource.NEUTRAL)
|
||||
}
|
||||
}
|
||||
return InteractionResult.SUCCESS
|
||||
}
|
||||
|
||||
override fun useWithoutItem(
|
||||
state: BlockState,
|
||||
world: Level,
|
||||
@@ -254,10 +290,4 @@ class GildedChestBlock(settings: Properties, val type: Type = Type.RED) : BaseEn
|
||||
blockEntity.tick()
|
||||
}
|
||||
|
||||
override val levelRange = 5..30
|
||||
override val pokemonArgs = "gimmighoul"
|
||||
override val spawnSound = CobblemonSounds.GIMMIGHOUL_REVEAL
|
||||
override val scaleRange = FloatRange(1f, 1f)
|
||||
override fun getPokemonFacing(state: BlockState): Direction = state.getValue(HORIZONTAL_FACING)
|
||||
override val shinyRate = null
|
||||
}
|
||||
-28
@@ -11,11 +11,8 @@ package com.cobblemon.mod.common.block.dispenser
|
||||
import com.cobblemon.mod.common.block.SaccharineLeafBlock
|
||||
import com.cobblemon.mod.common.block.SaccharineLogBlock
|
||||
import com.cobblemon.mod.common.block.SaccharineLogSlatheredBlock
|
||||
import com.cobblemon.mod.common.block.appliances.CopperFridgeBlock
|
||||
import com.cobblemon.mod.common.mixin.accessor.DispenserBlockAccessor
|
||||
import net.minecraft.core.dispenser.DispenseItemBehavior
|
||||
import net.minecraft.sounds.SoundEvents
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.item.alchemy.PotionContents
|
||||
@@ -89,30 +86,5 @@ object DispenserBehaviorRegistry {
|
||||
).item
|
||||
)
|
||||
)
|
||||
register(
|
||||
{ dispenseWaterBucketIntoFridge() },
|
||||
items = listOf(Items.WATER_BUCKET)
|
||||
)
|
||||
}
|
||||
|
||||
private fun dispenseWaterBucketIntoFridge(): DispenseItemBehavior =
|
||||
DispenseItemBehavior { source, stack ->
|
||||
val level = source.level
|
||||
val pos = source.pos.relative(source.state.getValue(DispenserBlock.FACING))
|
||||
val fridge = level.getBlockState(pos).block as? CopperFridgeBlock
|
||||
|
||||
if (fridge == null) {
|
||||
stack
|
||||
} else {
|
||||
val fridgeEntity = fridge.getBlockEntity(level, pos)
|
||||
if (!fridgeEntity.theItem.isEmpty) {
|
||||
stack
|
||||
} else {
|
||||
fridgeEntity.theItem = Items.WATER_BUCKET.defaultInstance
|
||||
fridgeEntity.timer = 100
|
||||
level.playSound(null, pos, SoundEvents.BUCKET_EMPTY, SoundSource.BLOCKS, 1.0f, 1.0f)
|
||||
Items.BUCKET.defaultInstance
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-32
@@ -41,7 +41,6 @@ import net.minecraft.world.Containers
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.ItemInteractionResult
|
||||
import net.minecraft.world.InteractionHand
|
||||
import net.minecraft.world.entity.LightningBolt
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.Pose
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
@@ -618,14 +617,11 @@ open class FossilMultiblockEntity(
|
||||
}
|
||||
|
||||
companion object {
|
||||
val TICKER = BlockEntityTicker<FossilMultiblockEntity> { level, _, _, blockEntity ->
|
||||
val serverLevel = level as? ServerLevel ?: return@BlockEntityTicker
|
||||
|
||||
if (blockEntity.checkLightning(serverLevel)) return@BlockEntityTicker
|
||||
val TICKER = BlockEntityTicker<FossilMultiblockEntity> {level, _, _, blockEntity ->
|
||||
if (blockEntity.multiblockStructure != null) return@BlockEntityTicker
|
||||
if (blockEntity.porygonProcess == PorygonProcessType.INACTIVE) return@BlockEntityTicker
|
||||
if(blockEntity.porygonProcess == PorygonProcessType.INACTIVE) return@BlockEntityTicker
|
||||
|
||||
blockEntity.tickPorygon(serverLevel)
|
||||
blockEntity.tickPorygon(level)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -701,29 +697,4 @@ open class FossilMultiblockEntity(
|
||||
//Fallback: If no safe location is found, just spawn it directly in front of the monitor
|
||||
return origin.relative(facing)
|
||||
}
|
||||
|
||||
private var lastLightningBolt: UUID? = null
|
||||
|
||||
fun checkLightning(level: ServerLevel): Boolean {
|
||||
val bolt = level.getEntitiesOfClass(
|
||||
LightningBolt::class.java,
|
||||
AABB.ofSize(blockPos.center, 1.0, 4.0, 1.0)
|
||||
).firstOrNull {
|
||||
(it.blockPosition() == blockPos || it.blockPosition().below() == blockPos) &&
|
||||
it.uuid != lastLightningBolt
|
||||
} ?: return false
|
||||
|
||||
lastLightningBolt = bolt.uuid
|
||||
|
||||
level.setBlockAndUpdate(
|
||||
blockPos,
|
||||
CobblemonBlocks.ROTOM_MONITOR.defaultBlockState()
|
||||
.setValue(
|
||||
HorizontalDirectionalBlock.FACING,
|
||||
level.getBlockState(blockPos).getValue(HorizontalDirectionalBlock.FACING)
|
||||
)
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
}
|
||||
@@ -391,7 +391,7 @@ object CobblemonClient {
|
||||
CobblemonBlocks.X_SP_ATK,
|
||||
CobblemonBlocks.X_SP_DEF,
|
||||
CobblemonBlocks.X_SPEED,
|
||||
CobblemonBlocks.TM_MACHINE,
|
||||
CobblemonBlocks.TM_MACHINE,
|
||||
|
||||
CobblemonBlocks.GALARICA_CUFF,
|
||||
CobblemonBlocks.GALARICA_WREATH,
|
||||
@@ -419,7 +419,7 @@ object CobblemonClient {
|
||||
CobblemonBlocks.MOOMOO_MILK,
|
||||
CobblemonBlocks.MEDICINAL_BREW,
|
||||
CobblemonBlocks.TERRAIN_EXTENDER,
|
||||
|
||||
|
||||
CobblemonBlocks.RED_MINT_LEAF_LITTER,
|
||||
CobblemonBlocks.POTTED_RED_MINT,
|
||||
CobblemonBlocks.BLUE_MINT_LEAF_LITTER,
|
||||
@@ -516,17 +516,7 @@ object CobblemonClient {
|
||||
CobblemonBlocks.POTTED_WATMEL_BERRY,
|
||||
CobblemonBlocks.POTTED_WEPEAR_BERRY,
|
||||
CobblemonBlocks.POTTED_WIKI_BERRY,
|
||||
CobblemonBlocks.POTTED_YACHE_BERRY,
|
||||
CobblemonBlocks.SCOPE_LENS,
|
||||
|
||||
CobblemonBlocks.COPPER_FAN,
|
||||
CobblemonBlocks.EXPOSED_COPPER_FAN,
|
||||
CobblemonBlocks.WEATHERED_COPPER_FAN,
|
||||
CobblemonBlocks.OXIDIZED_COPPER_FAN,
|
||||
CobblemonBlocks.WAXED_COPPER_FAN,
|
||||
CobblemonBlocks.WAXED_EXPOSED_COPPER_FAN,
|
||||
CobblemonBlocks.WAXED_WEATHERED_COPPER_FAN,
|
||||
CobblemonBlocks.WAXED_OXIDIZED_COPPER_FAN
|
||||
CobblemonBlocks.POTTED_YACHE_BERRY
|
||||
)
|
||||
|
||||
this.createBoatModelLayers()
|
||||
|
||||
-2
@@ -13,7 +13,6 @@ import com.cobblemon.mod.common.client.particle.BedrockParticleOptionsRepository
|
||||
import com.cobblemon.mod.common.client.particle.ParticleStorm
|
||||
import com.cobblemon.mod.common.client.render.MatrixWrapper
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
||||
import com.mojang.math.Axis
|
||||
import net.minecraft.client.Minecraft
|
||||
import com.mojang.blaze3d.vertex.PoseStack
|
||||
|
||||
@@ -21,7 +20,6 @@ object SpawnSnowstormParticleHandler : ClientNetworkPacketHandler<SpawnSnowstorm
|
||||
override fun handle(packet: SpawnSnowstormParticlePacket, client: Minecraft) {
|
||||
val wrapper = MatrixWrapper()
|
||||
val matrix = PoseStack()
|
||||
matrix.mulPose(Axis.YP.rotationDegrees(packet.rotation))
|
||||
wrapper.updateMatrix(matrix.last().pose())
|
||||
wrapper.updatePosition(packet.position)
|
||||
val world = Minecraft.getInstance().level ?: return
|
||||
|
||||
@@ -47,10 +47,6 @@ class CobblemonConfig {
|
||||
@IntConstraint(min = 0, max = 1000)
|
||||
var maxPokemonFriendship = 255
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "power_item_ride_stat_gain_interval_seconds", SERVER)
|
||||
@IntConstraint(min = -1, max = Int.MAX_VALUE)
|
||||
var powerItemRideStatGainIntervalSeconds = 120
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "announce_drop_items", SERVER)
|
||||
var announceDropItems = true
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "default_drop_item_method", SERVER)
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
package com.cobblemon.mod.common.entity.ai
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.CobblemonMemories
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.getMemorySafely
|
||||
import com.cobblemon.mod.common.util.mainThreadRuntime
|
||||
import com.cobblemon.mod.common.util.resolveInt
|
||||
import com.cobblemon.mod.common.util.withQueryValue
|
||||
@@ -29,12 +32,23 @@ object FleeFromAttackerTask {
|
||||
Trigger { _, entity, _ ->
|
||||
val hurtByEntity = it.get(hurtByEntity)
|
||||
val avoidTarget = it.tryGet(avoidTarget).orElse(null)
|
||||
if (avoidTarget != null && avoidTarget == hurtByEntity.uuid) {
|
||||
|
||||
if (avoidTarget != null && avoidTarget == hurtByEntity) {
|
||||
return@Trigger false
|
||||
}
|
||||
|
||||
mainThreadRuntime.withQueryValue("entity", entity.asMostSpecificMoLangValue())
|
||||
val avoidDurationTicks = mainThreadRuntime.resolveInt(avoidDurationTicks)
|
||||
|
||||
val pokemonEntity = entity as? PokemonEntity
|
||||
pokemonEntity?.let {
|
||||
it.after(1.0f) {
|
||||
it.playMoodParticle("mood_stress")
|
||||
}
|
||||
}
|
||||
|
||||
entity.brain.setMemoryWithExpiry(MemoryModuleType.AVOID_TARGET, hurtByEntity, avoidDurationTicks.toLong())
|
||||
|
||||
return@Trigger true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.entity.ai
|
||||
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.ai.behavior.OneShot
|
||||
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
|
||||
@@ -24,10 +25,16 @@ object GetAngryAtAttackerTask {
|
||||
Trigger { _, entity, _ ->
|
||||
val hurtByEntity = it.get(hurtByEntity)
|
||||
val angryAt = it.tryGet(angryAt).orElse(null)
|
||||
|
||||
if (angryAt != null && angryAt == hurtByEntity.uuid) {
|
||||
return@Trigger false
|
||||
}
|
||||
|
||||
val becomingAngry = angryAt == null
|
||||
entity.brain.setMemory(MemoryModuleType.ANGRY_AT, hurtByEntity.uuid)
|
||||
if (becomingAngry) {
|
||||
(entity as PokemonEntity?)?.playMoodParticle("mood_anger_steam")
|
||||
}
|
||||
return@Trigger true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,9 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.addPokemonFunctions
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||
import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
||||
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
|
||||
import com.cobblemon.mod.common.api.net.serializers.PlatformTypeDataSerializer
|
||||
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
|
||||
import com.cobblemon.mod.common.api.net.serializers.RideBoostsDataSerializer
|
||||
@@ -425,6 +428,9 @@ open class PokemonEntity(
|
||||
|
||||
var occupiedSeats = mutableMapOf<Seat, Entity>()
|
||||
|
||||
var moodParticleLock = false
|
||||
var playedZeroStaminaParticle = false
|
||||
|
||||
init {
|
||||
delegate.initialize(this)
|
||||
delegate.changePokemon(pokemon)
|
||||
@@ -904,6 +910,27 @@ open class PokemonEntity(
|
||||
return future
|
||||
}
|
||||
|
||||
fun playMoodParticle(particleName: String) {
|
||||
if (moodParticleLock) return
|
||||
|
||||
val actionEffect = ActionEffects.actionEffects[cobblemonResource(particleName)] ?: return
|
||||
|
||||
cry()
|
||||
|
||||
val context = ActionEffectContext(
|
||||
actionEffect = actionEffect,
|
||||
providers = mutableListOf(UsersProvider(this)),
|
||||
runtime = runtime,
|
||||
level = level()
|
||||
)
|
||||
actionEffect.run(context)
|
||||
|
||||
moodParticleLock = true
|
||||
after(5.0f) {
|
||||
moodParticleLock = false
|
||||
}
|
||||
}
|
||||
|
||||
override fun saveWithoutId(nbt: CompoundTag): CompoundTag {
|
||||
val tethering = this.tethering
|
||||
if (tethering != null) {
|
||||
@@ -2315,6 +2342,8 @@ open class PokemonEntity(
|
||||
ifRidingAvailable { _, _, state ->
|
||||
state.stamina.set(entityData.get(RIDE_STAMINA))
|
||||
}
|
||||
|
||||
playedZeroStaminaParticle = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2343,12 +2372,26 @@ open class PokemonEntity(
|
||||
|
||||
override fun tickRidden(driver: Player, movementInput: Vec3) {
|
||||
super.tickRidden(driver, movementInput)
|
||||
|
||||
ifRidingAvailable { behaviour, settings, state ->
|
||||
behaviour.tick(settings, state, this, driver, movementInput)
|
||||
if (entityData.get(RIDE_STAMINA) == -1F) {
|
||||
state.stamina.set(1F, forced = true)
|
||||
}
|
||||
|
||||
if (!level().isClientSide) {
|
||||
val stamina = state.stamina.get()
|
||||
|
||||
if (stamina <= 0f) {
|
||||
if (!playedZeroStaminaParticle) {
|
||||
playMoodParticle("mood_stress")
|
||||
playedZeroStaminaParticle = true
|
||||
}
|
||||
} else {
|
||||
playedZeroStaminaParticle = false
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.level().isClientSide) {
|
||||
val pose = behaviour.pose(settings, state, this)
|
||||
if (pose != this.entityData.get(POSE_TYPE)) {
|
||||
@@ -2744,9 +2787,4 @@ open class PokemonEntity(
|
||||
}
|
||||
|
||||
fun hasRider() = this.passengers.any { it is LivingEntity }
|
||||
|
||||
override fun playStepSound(pos: BlockPos, state: BlockState) {
|
||||
if (this.pokemon.species.silenceStepSounds) return
|
||||
super.playStepSound(pos, state)
|
||||
}
|
||||
}
|
||||
}
|
||||
-27
@@ -22,7 +22,6 @@ import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.feature.TickingSpeciesFeature
|
||||
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||
import com.cobblemon.mod.common.api.spawning.fishing.FishingSpawnCause.Companion.DROPS_REROLL_ASPECT
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
@@ -47,15 +46,10 @@ import kotlin.math.*
|
||||
|
||||
/** Handles purely server logic for a Pokémon */
|
||||
class PokemonServerDelegate : PokemonSideDelegate {
|
||||
companion object {
|
||||
private const val RIDE_STAT_GAIN_AMOUNT = 1F
|
||||
}
|
||||
|
||||
lateinit var entity: PokemonEntity
|
||||
var acknowledgedHPValue = -1
|
||||
var acknowledgedLevel = -1
|
||||
val passengerOffsets = mutableMapOf<Int, Vec3>()
|
||||
private var rideStatGainAnchor: Vec3? = null
|
||||
|
||||
/** Mocked properties exposed to the client [PokemonEntity]. */
|
||||
private val mock: PokemonProperties?
|
||||
@@ -361,30 +355,9 @@ class PokemonServerDelegate : PokemonSideDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
val rideStatGainIntervalSeconds = Cobblemon.config.powerItemRideStatGainIntervalSeconds
|
||||
if (rideStatGainIntervalSeconds > 0) {
|
||||
val rideStatGainIntervalTicks = rideStatGainIntervalSeconds * 20L
|
||||
if (entity.level().gameTime % rideStatGainIntervalTicks == 0L) {
|
||||
trainRideStats()
|
||||
}
|
||||
}
|
||||
|
||||
updateTrackedValues()
|
||||
}
|
||||
|
||||
private fun trainRideStats() {
|
||||
val position = entity.position()
|
||||
val anchor = rideStatGainAnchor
|
||||
rideStatGainAnchor = position
|
||||
if (anchor == null || anchor == position || entity.passengers.isEmpty()) return
|
||||
|
||||
val heldItem = entity.pokemon.heldItemNoCopy()
|
||||
if (heldItem.isEmpty) return
|
||||
|
||||
val stat = RidingStat.entries.firstOrNull { heldItem.`is`(it.powerItem) } ?: return
|
||||
entity.pokemon.addRideBoost(stat, RIDE_STAT_GAIN_AMOUNT)
|
||||
}
|
||||
|
||||
fun updateShownItem() {
|
||||
val trackedShownItem = when {
|
||||
// Show Hand Item if Held item is hidden
|
||||
|
||||
+5
@@ -44,6 +44,11 @@ class DefendOwnerSensor : Sensor<PokemonEntity>(10) {
|
||||
return@findClosest false
|
||||
}.map { mob -> mob as LivingEntity }
|
||||
|
||||
val previousAttacker = entity.brain.getMemorySafely(CobblemonMemories.NEAREST_VISIBLE_ATTACKER)
|
||||
val isNewAttacker = nearestAttacker.isPresent && previousAttacker.isEmpty
|
||||
entity.brain.setMemory(CobblemonMemories.NEAREST_VISIBLE_ATTACKER, nearestAttacker)
|
||||
if (isNewAttacker) {
|
||||
entity.playMoodParticle("mood_anger_steam")
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.entity.pokemon.ai.tasks
|
||||
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.getMemorySafely
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.Mob
|
||||
import net.minecraft.world.entity.ai.behavior.OneShot
|
||||
@@ -60,7 +61,12 @@ object AttackHostileMobsTask {
|
||||
}
|
||||
|
||||
if (hostile != null) {
|
||||
val isNewTarget = currentTarget == null
|
||||
entity.brain.setMemory(MemoryModuleType.ATTACK_TARGET, hostile)
|
||||
if (isNewTarget) {
|
||||
(entity as? PokemonEntity)?.playMoodParticle("mood_anger_steam")
|
||||
}
|
||||
|
||||
true
|
||||
} else {
|
||||
false
|
||||
|
||||
+1
-1
@@ -91,7 +91,7 @@ class EatHeldItemTask(entity: PokemonEntity) : Behavior<PokemonEntity>(
|
||||
}
|
||||
this.timelastEaten = time
|
||||
if (itemConfig != null && itemConfig.fullnessValue > 0) {
|
||||
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false)
|
||||
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false, false)
|
||||
}
|
||||
// Check if the result item is something that should be dropped
|
||||
resultItemStack = entity.pokemon.heldItem()
|
||||
|
||||
@@ -13,7 +13,9 @@ import com.cobblemon.mod.common.api.apricorn.Apricorn
|
||||
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||
import com.cobblemon.mod.common.client.pot.CookingQuality
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
@@ -92,7 +94,9 @@ class AprijuiceItem(val type: Apricorn): CobblemonItem(Properties().stacksTo(16)
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.feedPokemon(1)
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
val boosts = getBoosts(stack)
|
||||
pokemon.addRideBoosts(boosts.mapValues { it.value.toFloat() })
|
||||
|
||||
@@ -96,8 +96,9 @@ class PokePuffItem : Item(Properties().stacksTo(64)), PokemonSelectingItem {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
// Feed the Pokémon 4 fullness points
|
||||
pokemon.feedPokemon(4)
|
||||
if (!pokemon.feedPokemon(4)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
val friendshipChange = PokePuffUtils.calculateFriendshipChange(stack, pokemon.nature)
|
||||
|
||||
|
||||
+9
-7
@@ -54,14 +54,16 @@ class FriendshipRaisingBerryItem(block: BerryBlock, val stat: Stat) : BerryItem(
|
||||
val evLowerAmount = max(genericRuntime.resolveInt(CobblemonMechanics.berries.evLowerAmount), 0)
|
||||
val decreasedEVs = pokemon.evs.add(stat, -evLowerAmount, ItemEvSource(player, stack, pokemon)) != 0
|
||||
|
||||
return if (increasedFriendship || decreasedEVs) {
|
||||
pokemon.feedPokemon(1)
|
||||
|
||||
stack.consume(1, player)
|
||||
InteractionResultHolder.success(stack)
|
||||
} else {
|
||||
InteractionResultHolder.pass(stack)
|
||||
if (!increasedFriendship && !decreasedEVs) {
|
||||
return InteractionResultHolder.pass(stack)
|
||||
}
|
||||
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
stack.consume(1, player)
|
||||
return InteractionResultHolder.success(stack)
|
||||
}
|
||||
|
||||
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
|
||||
|
||||
@@ -54,7 +54,10 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.feedPokemon(1)
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.currentHealth = Integer.min(pokemon.currentHealth + genericRuntime.resolveInt(amount(), pokemon), pokemon.maxHealth)
|
||||
stack.consume(1, player)
|
||||
return InteractionResultHolder.success(stack)
|
||||
@@ -62,7 +65,7 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
|
||||
|
||||
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
|
||||
super.applyToBattlePokemon(player, stack, battlePokemon)
|
||||
battlePokemon.originalPokemon.feedPokemon(1)
|
||||
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
|
||||
}
|
||||
|
||||
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
|
||||
|
||||
@@ -48,21 +48,26 @@ class PPRestoringBerryItem(block: BerryBlock, val amount: () -> ExpressionLike):
|
||||
&& super.canUseOnPokemon(stack, pokemon)
|
||||
|
||||
override fun applyToPokemon(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon, move: Move) {
|
||||
if (canUseOnPokemon(stack, pokemon) && canUseOnMove(stack, move)) {
|
||||
pokemon.feedPokemon(1)
|
||||
val moveToRecover = pokemon.moveSet.find { it.template == move.template }
|
||||
if (moveToRecover != null && moveToRecover.currentPp < moveToRecover.maxPp) {
|
||||
moveToRecover.currentPp =
|
||||
min(moveToRecover.maxPp, moveToRecover.currentPp + genericRuntime.resolveInt(amount(), pokemon))
|
||||
if (!canUseOnPokemon(stack, pokemon) && canUseOnMove(stack, move)) {
|
||||
return
|
||||
}
|
||||
|
||||
stack.consume(1, player)
|
||||
}
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return
|
||||
}
|
||||
|
||||
val moveToRecover = pokemon.moveSet.find { it.template == move.template }
|
||||
if (moveToRecover != null && moveToRecover.currentPp < moveToRecover.maxPp) {
|
||||
moveToRecover.currentPp =
|
||||
min(moveToRecover.maxPp, moveToRecover.currentPp + genericRuntime.resolveInt(amount(), pokemon))
|
||||
|
||||
stack.consume(1, player)
|
||||
}
|
||||
}
|
||||
|
||||
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon, move: Move) {
|
||||
super.applyToBattlePokemon(player, stack, battlePokemon, move)
|
||||
battlePokemon.originalPokemon.feedPokemon(1)
|
||||
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
|
||||
}
|
||||
|
||||
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
|
||||
|
||||
+4
-2
@@ -59,7 +59,9 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
|
||||
}
|
||||
|
||||
// count these berries as multiple feedings due to the amount they heal
|
||||
pokemon.feedPokemon(5)
|
||||
if (!pokemon.feedPokemon(5)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
var amount = Integer.min(pokemon.currentHealth + (genericRuntime.resolveFloat(portion(), pokemon) * pokemon.maxHealth).toInt(), pokemon.maxHealth)
|
||||
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
|
||||
@@ -73,7 +75,7 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
|
||||
|
||||
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
|
||||
super.applyToBattlePokemon(player, stack, battlePokemon)
|
||||
battlePokemon.originalPokemon.feedPokemon(5)
|
||||
battlePokemon.originalPokemon.feedPokemon(5, playMoodParticle = false)
|
||||
}
|
||||
|
||||
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
|
||||
|
||||
+12
-8
@@ -58,19 +58,23 @@ class StatusCuringBerryItem(block: BerryBlock, vararg val status: Status): Berry
|
||||
stack: ItemStack,
|
||||
pokemon: Pokemon
|
||||
): InteractionResultHolder<ItemStack>? {
|
||||
return if (canUseOnPokemon(stack, pokemon)) {
|
||||
pokemon.feedPokemon(1)
|
||||
pokemon.status = null
|
||||
stack.consume(1, player)
|
||||
InteractionResultHolder.success(stack)
|
||||
} else {
|
||||
InteractionResultHolder.fail(stack)
|
||||
if (!canUseOnPokemon(stack, pokemon)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.status = null
|
||||
stack.consume(1, player)
|
||||
|
||||
return InteractionResultHolder.success(stack)
|
||||
}
|
||||
|
||||
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
|
||||
super.applyToBattlePokemon(player, stack, battlePokemon)
|
||||
battlePokemon.originalPokemon.feedPokemon(1)
|
||||
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
|
||||
}
|
||||
|
||||
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.cobblemon.mod.common.item.crafting.washer
|
||||
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.crafting.Ingredient
|
||||
import net.minecraft.world.item.crafting.RecipeInput
|
||||
|
||||
class WasherInput(
|
||||
val item: ItemStack = ItemStack.EMPTY
|
||||
) : RecipeInput {
|
||||
|
||||
override fun getItem(index: Int): ItemStack? {
|
||||
return if (index == 0) item else null
|
||||
}
|
||||
|
||||
override fun size() = 1
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
package com.cobblemon.mod.common.item.crafting.washer
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonRecipeSerializers
|
||||
import com.cobblemon.mod.common.CobblemonRecipeTypes
|
||||
import com.mojang.serialization.Codec
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.core.component.DataComponents
|
||||
import net.minecraft.core.HolderLookup
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.network.codec.StreamCodec
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.crafting.Ingredient
|
||||
import net.minecraft.world.item.crafting.Recipe
|
||||
import net.minecraft.world.item.crafting.RecipeSerializer
|
||||
import net.minecraft.world.level.Level
|
||||
|
||||
class WasherRecipe(
|
||||
val input: Ingredient,
|
||||
val result: ItemStack,
|
||||
val preserveInputComponents: Boolean = false,
|
||||
val removeDyedColor: Boolean = false
|
||||
) : Recipe<WasherInput> {
|
||||
|
||||
override fun getType() = CobblemonRecipeTypes.WASHER
|
||||
override fun canCraftInDimensions(width: Int, height: Int) = true
|
||||
override fun assemble(input: WasherInput, registries: HolderLookup.Provider): ItemStack {
|
||||
val output = if (preserveInputComponents) {
|
||||
input.item.transmuteCopy(result.item, result.count)
|
||||
} else {
|
||||
result.copy()
|
||||
}
|
||||
if (removeDyedColor) {
|
||||
output.remove(DataComponents.DYED_COLOR)
|
||||
}
|
||||
return output
|
||||
}
|
||||
override fun getSerializer() = CobblemonRecipeSerializers.WASHER
|
||||
override fun getResultItem(registries: HolderLookup.Provider): ItemStack = result.copy()
|
||||
override fun matches(input: WasherInput, level: Level) =
|
||||
this.input.test(input.item) && (!removeDyedColor || input.item.has(DataComponents.DYED_COLOR))
|
||||
|
||||
class Serializer : RecipeSerializer<WasherRecipe> {
|
||||
companion object {
|
||||
val CODEC: MapCodec<WasherRecipe> = RecordCodecBuilder.mapCodec { instance ->
|
||||
instance.group(
|
||||
Ingredient.CODEC.fieldOf("input").forGetter { recipe -> recipe.input },
|
||||
ItemStack.STRICT_CODEC.fieldOf("result").forGetter { recipe -> recipe.result },
|
||||
Codec.BOOL.optionalFieldOf("preserve_input_components", false)
|
||||
.forGetter { recipe -> recipe.preserveInputComponents },
|
||||
Codec.BOOL.optionalFieldOf("remove_dyed_color", false)
|
||||
.forGetter { recipe -> recipe.removeDyedColor }
|
||||
).apply(instance, ::WasherRecipe)
|
||||
}
|
||||
}
|
||||
|
||||
val STREAM_CODEC: StreamCodec<RegistryFriendlyByteBuf, WasherRecipe> =
|
||||
StreamCodec.of(::toNetwork, ::fromNetwork)
|
||||
|
||||
private fun fromNetwork(buffer: RegistryFriendlyByteBuf): WasherRecipe {
|
||||
val input = Ingredient.CONTENTS_STREAM_CODEC.decode(buffer)
|
||||
val result = ItemStack.STREAM_CODEC.decode(buffer)
|
||||
val preserveInputComponents = buffer.readBoolean()
|
||||
val removeDyedColor = buffer.readBoolean()
|
||||
return WasherRecipe(input, result, preserveInputComponents, removeDyedColor)
|
||||
}
|
||||
|
||||
private fun toNetwork(buffer: RegistryFriendlyByteBuf, recipe: WasherRecipe) {
|
||||
Ingredient.CONTENTS_STREAM_CODEC.encode(buffer, recipe.input)
|
||||
ItemStack.STREAM_CODEC.encode(buffer, recipe.result)
|
||||
buffer.writeBoolean(recipe.preserveInputComponents)
|
||||
buffer.writeBoolean(recipe.removeDyedColor)
|
||||
}
|
||||
|
||||
override fun codec() = CODEC
|
||||
override fun streamCodec() = STREAM_CODEC
|
||||
}
|
||||
|
||||
}
|
||||
@@ -394,7 +394,6 @@ object CobblemonItemGroups {
|
||||
entries.accept(CobblemonItems.FOSSIL_ANALYZER)
|
||||
entries.accept(CobblemonItems.MONITOR)
|
||||
entries.accept(CobblemonItems.DAMAGED_MONITOR)
|
||||
entries.accept(CobblemonItems.ROTOM_MONITOR)
|
||||
entries.accept(CobblemonItems.PC)
|
||||
entries.accept(CobblemonItems.HEALING_MACHINE)
|
||||
entries.accept(CobblemonItems.PASTURE)
|
||||
@@ -571,47 +570,6 @@ object CobblemonItemGroups {
|
||||
entries.accept(CobblemonItems.PINK_PLAQUE)
|
||||
|
||||
CobblemonItems.campfire_pots.forEach(entries::accept)
|
||||
|
||||
entries.accept(CobblemonItems.COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.COPPER_FAN)
|
||||
entries.accept(CobblemonItems.COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.EXPOSED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.EXPOSED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.EXPOSED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.EXPOSED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.EXPOSED_COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.WEATHERED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.WEATHERED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.WEATHERED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.WEATHERED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.WEATHERED_COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.OXIDIZED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.OXIDIZED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.OXIDIZED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.OXIDIZED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.OXIDIZED_COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.WAXED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.WAXED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.WAXED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.WAXED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.WAXED_COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_FRIDGE)
|
||||
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_OVEN)
|
||||
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_WASHER)
|
||||
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_FAN)
|
||||
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_MOWER)
|
||||
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_FRIDGE)
|
||||
}
|
||||
|
||||
private fun consumableEntries(displayContext: ItemDisplayParameters, entries: Output) {
|
||||
|
||||
@@ -53,7 +53,10 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
|
||||
if (!canUseOnPokemon(stack, pokemon)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
pokemon.feedPokemon(1)
|
||||
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
var amount = Integer.min(pokemon.currentHealth + 20, pokemon.maxHealth)
|
||||
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
|
||||
@@ -74,7 +77,9 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
|
||||
|
||||
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
|
||||
super.applyToBattlePokemon(player, stack, battlePokemon)
|
||||
battlePokemon.originalPokemon.feedPokemon(1)
|
||||
|
||||
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
|
||||
|
||||
if (!player.hasInfiniteMaterials()) {
|
||||
val woodenBowlItemStack = ItemStack(Items.BOWL)
|
||||
if (!player.inventory.add(woodenBowlItemStack)) {
|
||||
|
||||
+3
-1
@@ -33,7 +33,9 @@ class FreshStartMochiItem : CobblemonItem(Properties()), PokemonSelectingItem {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.feedPokemon(1)
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.evs.forEach {
|
||||
pokemon.setEV(it.key, 0)
|
||||
|
||||
@@ -27,7 +27,9 @@ class MochiItem(override val stat: Stat): CobblemonItem(Properties()), EVIncreas
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
pokemon.feedPokemon(1)
|
||||
if (!pokemon.feedPokemon(1)) {
|
||||
return InteractionResultHolder.fail(stack)
|
||||
}
|
||||
|
||||
return super.applyToPokemon(player, stack, pokemon)
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
package com.cobblemon.mod.common.item.interactive
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonItemComponents
|
||||
import com.cobblemon.mod.common.item.components.FoodComponent
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.sounds.SoundEvent
|
||||
import net.minecraft.sounds.SoundEvents
|
||||
@@ -24,15 +23,10 @@ import net.minecraft.world.level.Level
|
||||
class PonigiriItem : Item(
|
||||
Properties().stacksTo(64)
|
||||
.food(FoodProperties.Builder()
|
||||
.nutrition(NUTRITION)
|
||||
.saturationModifier(SATURATION_MODIFIER)
|
||||
.nutrition(2)
|
||||
.saturationModifier(0.55f)
|
||||
.build())
|
||||
) {
|
||||
companion object {
|
||||
const val NUTRITION = 2
|
||||
const val SATURATION_MODIFIER = 0.55f
|
||||
}
|
||||
|
||||
override fun getName(stack: ItemStack): Component {
|
||||
|
||||
val ingredients = stack.get(CobblemonItemComponents.INGREDIENT)
|
||||
@@ -65,9 +59,4 @@ class PonigiriItem : Item(
|
||||
override fun getEatingSound(): SoundEvent {
|
||||
return SoundEvents.GENERIC_EAT
|
||||
}
|
||||
|
||||
fun getFoodValues(stack: ItemStack): Pair<Int, Float> {
|
||||
val (hunger, saturation) = stack.getOrDefault(CobblemonItemComponents.FOOD, FoodComponent(NUTRITION, SATURATION_MODIFIER))
|
||||
return hunger to saturation
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-4
@@ -28,7 +28,6 @@ import net.minecraft.world.phys.Vec3
|
||||
class SpawnSnowstormParticlePacket(
|
||||
val effectId: ResourceLocation,
|
||||
val position: Vec3,
|
||||
val rotation: Float = 0F,
|
||||
) : NetworkPacket<SpawnSnowstormParticlePacket> {
|
||||
override val id = ID
|
||||
companion object {
|
||||
@@ -40,8 +39,7 @@ class SpawnSnowstormParticlePacket(
|
||||
buffer.readDouble(),
|
||||
buffer.readDouble(),
|
||||
buffer.readDouble()
|
||||
),
|
||||
rotation = buffer.readFloat()
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -50,6 +48,5 @@ class SpawnSnowstormParticlePacket(
|
||||
buffer.writeDouble(position.x)
|
||||
buffer.writeDouble(position.y)
|
||||
buffer.writeDouble(position.z)
|
||||
buffer.writeFloat(rotation)
|
||||
}
|
||||
}
|
||||
@@ -991,6 +991,10 @@ open class Pokemon : ShowdownIdentifiable {
|
||||
this.recall()
|
||||
}
|
||||
|
||||
fun playMoodParticle(particleName: String) {
|
||||
entity?.playMoodParticle(particleName)
|
||||
}
|
||||
|
||||
fun heal() {
|
||||
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(this)) { event ->
|
||||
this.currentHealth = maxHealth
|
||||
@@ -1062,23 +1066,13 @@ open class Pokemon : ShowdownIdentifiable {
|
||||
else -> 0 // For weights less than 0.1
|
||||
}
|
||||
|
||||
fun feedPokemon(feedCount: Int, playSound: Boolean = true) {
|
||||
// play sounds from the entity first (itemstack is consumed outside of this function)
|
||||
if (this.entity != null && playSound) {
|
||||
val fullnessPercent = ((this.currentFullness).toFloat() / (this.getMaxFullness()).toFloat()) * (.5f)
|
||||
|
||||
if (this.currentFullness >= this.getMaxFullness()) {
|
||||
this.entity?.playSound(CobblemonSounds.BERRY_EAT_FULL, 1F, 1F)
|
||||
}
|
||||
else {
|
||||
this.entity?.playSound(CobblemonSounds.BERRY_EAT, 1F, 1F + fullnessPercent)
|
||||
}
|
||||
}
|
||||
fun feedPokemon(feedCount: Int, playSound: Boolean = true, playMoodParticle: Boolean = true): Boolean {
|
||||
playFullnessEffects(playSound, playMoodParticle)
|
||||
|
||||
// if it is already full we don't need to do anything
|
||||
// TODO this can happen when feeding in battle since we are temporarily ignoring fullness checks for pp/hp/status berries
|
||||
if (isFull()) {
|
||||
return
|
||||
return false
|
||||
}
|
||||
|
||||
this.currentFullness = (this.currentFullness + feedCount).coerceIn(0, this.getMaxFullness())
|
||||
@@ -1087,6 +1081,31 @@ open class Pokemon : ShowdownIdentifiable {
|
||||
if (this.currentFullness == 1) {
|
||||
this.resetMetabolismCycle()
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun playFullnessEffects(playSound: Boolean = true, playMoodParticle: Boolean = true) {
|
||||
if (!playSound && !playMoodParticle) return
|
||||
|
||||
val pokemonEntity = entity ?: return
|
||||
val fullnessPercent = ((this.currentFullness).toFloat() / (this.getMaxFullness()).toFloat()) * (.5f)
|
||||
|
||||
if (!isFull()) {
|
||||
if (playSound) {
|
||||
pokemonEntity.playSound(CobblemonSounds.BERRY_EAT, 1F, 1F + fullnessPercent)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if (playSound) {
|
||||
pokemonEntity.playSound(CobblemonSounds.BERRY_EAT_FULL, 1F, 1F)
|
||||
|
||||
if (playMoodParticle) {
|
||||
pokemonEntity.playMoodParticle("mood_annoyed")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// decrease a pokemon's Fullness value by a certain amount
|
||||
|
||||
@@ -173,7 +173,6 @@ class Species : ShowdownIdentifiable {
|
||||
.addStandardFunctions()
|
||||
.addSpeciesFunctions(this)
|
||||
|
||||
var silenceStepSounds = false
|
||||
|
||||
fun initialize() {
|
||||
Cobblemon.statProvider.provide(this)
|
||||
@@ -257,7 +256,6 @@ class Species : ShowdownIdentifiable {
|
||||
}
|
||||
|
||||
this.riding.encode(buffer)
|
||||
buffer.writeBoolean(this.silenceStepSounds)
|
||||
}
|
||||
|
||||
fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
@@ -301,7 +299,6 @@ class Species : ShowdownIdentifiable {
|
||||
}
|
||||
}
|
||||
this.riding = RidingProperties.decode(buffer)
|
||||
this.silenceStepSounds = buffer.readBoolean()
|
||||
this.initialize()
|
||||
}
|
||||
|
||||
|
||||
@@ -234,11 +234,11 @@ fun Entity.isDusk(): Boolean {
|
||||
}
|
||||
|
||||
fun Entity.isStandingOn(blocks: Set<String>, depth: Int = 2): Boolean {
|
||||
for (currentDepth in 0..depth) {
|
||||
val bellowBlockPos = blockPosBelowThatAffectsMyMovement.below(currentDepth)
|
||||
for (currentDepth in 1..depth) {
|
||||
val bellowBlockPos = blockPosition().below(currentDepth)
|
||||
val blockState = level().getBlockState(bellowBlockPos)
|
||||
|
||||
if (blockState.isAir) continue
|
||||
if (blockState.isAir || !blockState.isCollisionShapeFullBlock(level(), bellowBlockPos)) continue
|
||||
|
||||
val elementOrTags = ExtraCodecs.TAG_OR_ELEMENT_ID.listOf().decode(JavaOps.INSTANCE, blocks.toList()).result().get().first
|
||||
elementOrTags.forEach {
|
||||
|
||||
@@ -95,8 +95,6 @@ class FloatRange(override val start: Float, override val endInclusive: Float) :
|
||||
override fun hashCode(): Int = 31 * start.hashCode() + endInclusive.hashCode()
|
||||
|
||||
override fun toString(): String = "$start..$endInclusive"
|
||||
fun random() = Random.nextFloat() * (endInclusive - start) + start
|
||||
|
||||
}
|
||||
|
||||
class DoubleRange(override val start: Double, override val endInclusive: Double) : ClosedFloatingPointRange<Double> {
|
||||
|
||||
@@ -27,7 +27,5 @@ object CobblemonGameRules {
|
||||
@JvmField
|
||||
val HEALERS_HEAL_PC: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("healersHealPC", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false))
|
||||
@JvmField
|
||||
val HEALER_SET_SPAWN: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("healersSetSpawn", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false))
|
||||
@JvmField
|
||||
val DO_POKEMON_PREDATION: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("doPokemonPredation", GameRules.Category.MOBS, BooleanRuleInvoker.`cobblemon$create`(true))
|
||||
}
|
||||
-67
@@ -1,67 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:rotomfridge_doorready",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_blend",
|
||||
"texture": "textures/particles/vanilla/generic"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.debrissize": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [0, 1, 0.96, 0.86, 0.7, 0.47, 0]
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.05
|
||||
},
|
||||
"minecraft:emitter_shape_box": {
|
||||
"offset": [0, -1, 0.5],
|
||||
"half_dimensions": [0.5, 0.75, 0],
|
||||
"surface_only": true,
|
||||
"direction": "outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": "math.random(1.2,2)"
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(2.5,3.5)*0.1",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, 0.1, 0],
|
||||
"linear_drag_coefficient": 1
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.25*v.debrissize", "0.25*v.debrissize"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 64,
|
||||
"texture_height": 8,
|
||||
"flipbook": {
|
||||
"base_UV": [56, 0],
|
||||
"size_UV": [8, 8],
|
||||
"step_UV": [-8, 0],
|
||||
"frames_per_second": 6,
|
||||
"max_frame": 8
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_motion_collision": {
|
||||
"collision_radius": 0.01
|
||||
},
|
||||
"minecraft:particle_appearance_lighting": {},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": [0.7098, 0.95294, 1, 0.74902]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:mood_anger_steam",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/mood/steam_center_double"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_point": {
|
||||
"offset": [0, "math.clamp((v.entity_radius*1.2),0.48,0.96)*0.75", 0]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": 0,
|
||||
"minecraft:particle_motion_dynamic": {},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["math.clamp((v.entity_radius*1.5),0.9,2.4)", "math.clamp((v.entity_radius*0.5),0.3,0.8)"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 48,
|
||||
"texture_height": 176,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [48, 16],
|
||||
"step_UV": [0, 16],
|
||||
"max_frame": 11,
|
||||
"stretch_to_lifetime": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:mood_anger_veins",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/mood/vein_red"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.particle_size = math.clamp((v.entity_radius*0.75),0.15,0.4);"
|
||||
},
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_point": {
|
||||
"direction": ["math.random(-1,1)", 1.5, "math.random(-1,1)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1.25
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(-1,2)*90"
|
||||
},
|
||||
"minecraft:particle_initial_speed": "v.particle_size*13",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, 0.75, 0],
|
||||
"linear_drag_coefficient": "v.particle_size*15"
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["math.clamp((v.entity_radius*0.75),0.15,0.3)", "math.clamp((v.entity_radius*0.75),0.15,0.3)"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 22,
|
||||
"texture_height": 11,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [11, 11],
|
||||
"step_UV": [11, 0],
|
||||
"frames_per_second": 6,
|
||||
"max_frame": 2,
|
||||
"loop": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_motion_collision": {},
|
||||
"minecraft:particle_appearance_lighting": {},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age/v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.86": "#ffffffff",
|
||||
"1.0": "#FF000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:mood_annoyed",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/mood/scribble_purple"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.particle_size = math.clamp((v.entity_radius*0.75),0.2,0.5);"
|
||||
},
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 2
|
||||
},
|
||||
"minecraft:emitter_shape_point": {
|
||||
"direction": [0, 1, 0]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "v.particle_size*10",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 3
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["math.clamp((v.entity_radius*0.75),0.2,0.5)", "math.clamp((v.entity_radius*0.75),0.2,0.5)"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 168,
|
||||
"texture_height": 14,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [14, 14],
|
||||
"step_UV": [14, 0],
|
||||
"frames_per_second": 10,
|
||||
"max_frame": 12
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_lighting": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:mood_stress",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/mood/sweat_blue"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.particle_height = math.clamp((v.entity_radius*1.2),0.48,0.96);"
|
||||
},
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_looping": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_point": {
|
||||
"offset": [0, "math.clamp((v.entity_radius*1.2),0.48,0.96)*0.75", 0]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 0.45
|
||||
},
|
||||
"minecraft:particle_initial_speed": 0,
|
||||
"minecraft:particle_motion_dynamic": {},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["math.clamp((v.entity_radius*1.2),0.48,0.96)", "math.clamp((v.entity_radius*0.65),0.26,0.52)"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 216,
|
||||
"texture_height": 13,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [24, 13],
|
||||
"step_UV": [24, 0],
|
||||
"max_frame": 9,
|
||||
"stretch_to_lifetime": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_lighting": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
+649
-837
File diff suppressed because it is too large.
Load diff
-6
@@ -456,12 +456,6 @@
|
||||
"cannon_left": {
|
||||
"position": [0, 0, 3]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.25": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.25": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"2.25": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"3.25": "q.run_molang('cobblemon:stepsound_standard_large');"
|
||||
}
|
||||
},
|
||||
"animation.blastoise.ground_run": {
|
||||
|
||||
-12
@@ -1815,12 +1815,6 @@
|
||||
"wings_open": {
|
||||
"scale": 0
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_claw_medium');",
|
||||
"0.5": "q.run_molang('cobblemon:stepsound_claw_medium');",
|
||||
"1.0": "q.run_molang('cobblemon:stepsound_claw_medium');",
|
||||
"1.5": "q.run_molang('cobblemon:stepsound_claw_medium');"
|
||||
}
|
||||
},
|
||||
"animation.pidgeot.mount_ground_idle": {
|
||||
@@ -3637,12 +3631,6 @@
|
||||
"wings_open": {
|
||||
"scale": 0
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_claw_medium');",
|
||||
"0.5": "q.run_molang('cobblemon:stepsound_claw_medium');",
|
||||
"1.0": "q.run_molang('cobblemon:stepsound_claw_medium');",
|
||||
"1.5": "q.run_molang('cobblemon:stepsound_claw_medium');"
|
||||
}
|
||||
},
|
||||
"animation.pidgeot.ride_ground_walk": {
|
||||
|
||||
-11
@@ -83,7 +83,6 @@
|
||||
},
|
||||
"animation.parasect.ground_walk": {
|
||||
"loop": true,
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [0, 0, 0],
|
||||
@@ -135,12 +134,6 @@
|
||||
"locator_seat_1": {
|
||||
"rotation": [7.5, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_minecraft');",
|
||||
"0.25": "q.run_molang('cobblemon:stepsound_minecraft');",
|
||||
"0.5": "q.run_molang('cobblemon:stepsound_minecraft');",
|
||||
"0.75": "q.run_molang('cobblemon:stepsound_minecraft');"
|
||||
}
|
||||
},
|
||||
"animation.parasect.ground_run": {
|
||||
@@ -265,10 +258,6 @@
|
||||
"rotation": ["5+Math.cos((query.anim_time) * 90 * 16 - 90) * 2", 0, 0],
|
||||
"position": [0, "0+Math.cos((query.anim_time) * 90 * 32) * -0.2", -0.25]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_minecraft');",
|
||||
"0.125": "q.run_molang('cobblemon:stepsound_minecraft');"
|
||||
}
|
||||
},
|
||||
"animation.parasect.ride_ground_run": {
|
||||
|
||||
+74
-308
@@ -1682,12 +1682,6 @@
|
||||
"1.3333": [10, 9, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"0.4583": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"0.6667": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"1.125": "q.run_molang('cobblemon:stepsound_standard_medium');"
|
||||
}
|
||||
},
|
||||
"animation.arcanine.ride_ground_walk": {
|
||||
@@ -2645,12 +2639,6 @@
|
||||
"chest_fluff_right": {
|
||||
"rotation": [5, "-22.5+math.cos(q.anim_time*90*8-120)*15", "-math.sin(q.anim_time*90*8-120)*3"]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.125": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"0.2083": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"0.2917": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"0.375": "q.run_molang('cobblemon:stepsound_standard_medium');"
|
||||
}
|
||||
},
|
||||
"animation.arcanine.ride_ground_run": {
|
||||
@@ -4173,101 +4161,41 @@
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, 0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, 0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
|
||||
"0.5": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
|
||||
"1.6667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, 0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, 0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
|
||||
"0.5": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
|
||||
"1.6667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"0.5": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"0.5": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -4895,101 +4823,41 @@
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, 0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, 0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
|
||||
"0.5": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
|
||||
"1.6667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, 0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, 0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
|
||||
"0.5": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
|
||||
"1.6667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"0.5": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"1.6667": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"0.5": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -5419,20 +5287,14 @@
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0.1],
|
||||
"0.125": [-0.1, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0.1],
|
||||
"0.125": [0.1, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5629,95 +5491,47 @@
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [-0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [-0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left_hurt": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"0.3333": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right_hurt": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"0.3333": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -6424,95 +6238,47 @@
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [-0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [-0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.2, 0, 0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.2, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0.1]},
|
||||
"0.3333": {"pre": [0.2, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left_hurt": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"0.3333": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right_hurt": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"0.3333": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
|
||||
-4
@@ -391,10 +391,6 @@
|
||||
"0.7083": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0833": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"0.2917": "q.run_molang('cobblemon:stepsound_standard_medium');"
|
||||
}
|
||||
},
|
||||
"animation.dewgong.water_idle": {
|
||||
|
||||
-20
@@ -1071,16 +1071,6 @@
|
||||
"head": {
|
||||
"rotation": ["-0.8*math.cos(q.anim_time*90*8-120)", 0, "3*math.sin(q.anim_time*90*4+70)"]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"0.5": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.5": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"2.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"2.5": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"3.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"3.5": "q.run_molang('cobblemon:stepsound_standard_large');"
|
||||
}
|
||||
},
|
||||
"animation.rhyhorn.ride_ground_walk": {
|
||||
@@ -1927,16 +1917,6 @@
|
||||
],
|
||||
"position": [0, "0.4+0.6*math.cos(q.anim_time*90*8-120)", 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"0.375": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"0.5": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"0.875": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"1.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.375": "q.run_molang('cobblemon:stepsound_standard_medium');",
|
||||
"1.5": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.875": "q.run_molang('cobblemon:stepsound_standard_medium');"
|
||||
}
|
||||
},
|
||||
"animation.rhyhorn.ride_ground_run": {
|
||||
|
||||
-12
@@ -329,12 +329,6 @@
|
||||
"locator_seat_1": {
|
||||
"rotation": [-15, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"2.0": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"3.0": "q.run_molang('cobblemon:stepsound_standard_large');"
|
||||
}
|
||||
},
|
||||
"animation.rhydon.ride_ground_walk": {
|
||||
@@ -813,12 +807,6 @@
|
||||
"locator_seat_1": {
|
||||
"rotation": [-15, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.3333": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"0.8333": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.3333": "q.run_molang('cobblemon:stepsound_standard_large');",
|
||||
"1.8333": "q.run_molang('cobblemon:stepsound_standard_large');"
|
||||
}
|
||||
},
|
||||
"animation.rhydon.ride_ground_run": {
|
||||
|
||||
-4
@@ -391,10 +391,6 @@
|
||||
"1.0": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.0833": "q.run_molang('cobblemon:stepsound_minecraft');",
|
||||
"0.5833": "q.run_molang('cobblemon:stepsound_minecraft');"
|
||||
}
|
||||
},
|
||||
"animation.mr_mime.ground_run": {
|
||||
|
||||
-8
@@ -3150,10 +3150,6 @@
|
||||
"locator_seat_2": {
|
||||
"rotation": [45, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.5": "q.run_molang('cobblemon:stepsound_claw_large');",
|
||||
"1.5": "q.run_molang('cobblemon:stepsound_claw_large');"
|
||||
}
|
||||
},
|
||||
"animation.corviknight.ground_run": {
|
||||
@@ -4477,10 +4473,6 @@
|
||||
"locator_seat_2": {
|
||||
"rotation": [25, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.3333": "q.run_molang('cobblemon:stepsound_claw_large');",
|
||||
"0.8333": "q.run_molang('cobblemon:stepsound_claw_large');"
|
||||
}
|
||||
},
|
||||
"animation.corviknight.air_idle": {
|
||||
|
||||
+10
-56
@@ -566,12 +566,6 @@
|
||||
"1.5": [0, 0.2, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.5417": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"0.7083": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"1.2917": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"1.4583": "q.run_molang('cobblemon:stepsound_hoof_medium');"
|
||||
}
|
||||
},
|
||||
"animation.wyrdeer.sleep": {
|
||||
@@ -786,27 +780,15 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.25": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"0.5": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"0.5": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"ear_right": {
|
||||
@@ -1204,36 +1186,18 @@
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.5833": [-0.1, 0, -0.1],
|
||||
"1.6667": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"3.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"3.125": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"3.0": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
|
||||
"3.125": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.5833": [0.1, 0, -0.1],
|
||||
"1.6667": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"3.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"3.125": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
|
||||
"3.0": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
|
||||
"3.125": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"tail": {
|
||||
@@ -2240,16 +2204,6 @@
|
||||
"1.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.2083": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"0.2917": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"0.375": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"0.4583": "q.run_molang('cobblemon:stepsound_hoof_large');",
|
||||
"0.7917": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"0.875": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"0.9583": "q.run_molang('cobblemon:stepsound_hoof_medium');",
|
||||
"1.0417": "q.run_molang('cobblemon:stepsound_hoof_large');"
|
||||
}
|
||||
},
|
||||
"animation.wyrdeer.ride_jump": {
|
||||
|
||||
@@ -1,469 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered"
|
||||
},
|
||||
"facing=south,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,half=lower": {
|
||||
"model": "cobblemon:block/copper_fridge_bottom",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,half=lower": {
|
||||
"model": "cobblemon:block/copper_fridge_bottom"
|
||||
},
|
||||
"facing=south,half=lower": {
|
||||
"model": "cobblemon:block/copper_fridge_bottom",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=lower": {
|
||||
"model": "cobblemon:block/copper_fridge_bottom",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=upper": {
|
||||
"model": "cobblemon:block/copper_fridge_top",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,half=upper": {
|
||||
"model": "cobblemon:block/copper_fridge_top"
|
||||
},
|
||||
"facing=south,half=upper": {
|
||||
"model": "cobblemon:block/copper_fridge_top",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=upper": {
|
||||
"model": "cobblemon:block/copper_fridge_top",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/copper_mower",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/copper_mower"
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/copper_mower",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/copper_mower",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed"
|
||||
},
|
||||
"facing=south,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_open",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_open"
|
||||
},
|
||||
"facing=south,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_open",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_open",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed"
|
||||
},
|
||||
"facing=south,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/copper_oven_closed",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,ejecting=true": {
|
||||
"model": "cobblemon:block/copper_oven_open",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,ejecting=true": {
|
||||
"model": "cobblemon:block/copper_oven_open"
|
||||
},
|
||||
"facing=south,ejecting=true": {
|
||||
"model": "cobblemon:block/copper_oven_open",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,ejecting=true": {
|
||||
"model": "cobblemon:block/copper_oven_open",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/copper_washer",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/copper_washer"
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/copper_washer",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/copper_washer",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,469 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,power=0": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_unpowered",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=0": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_unpowered"
|
||||
},
|
||||
"facing=south,power=0": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_unpowered",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=0": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_unpowered",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=1,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=1,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=2,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=2,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=3,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=3,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=4,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=4,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=5,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=5,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=6,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=6,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=7,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=7,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=8,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=8,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=9,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=9,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=10,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=10,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=11,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=11,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=12,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=12,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=13,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=13,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=14,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=14,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=15,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=false": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=15,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=true": {
|
||||
"model": "cobblemon:block/exposed_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,half=lower": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_bottom",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,half=lower": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_bottom"
|
||||
},
|
||||
"facing=south,half=lower": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_bottom",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=lower": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_bottom",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=upper": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_top",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,half=upper": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_top"
|
||||
},
|
||||
"facing=south,half=upper": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_top",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=upper": {
|
||||
"model": "cobblemon:block/exposed_copper_fridge_top",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/exposed_copper_mower",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/exposed_copper_mower"
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/exposed_copper_mower",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/exposed_copper_mower",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed"
|
||||
},
|
||||
"facing=south,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open"
|
||||
},
|
||||
"facing=south,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed"
|
||||
},
|
||||
"facing=south,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_closed",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,ejecting=true": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,ejecting=true": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open"
|
||||
},
|
||||
"facing=south,ejecting=true": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,ejecting=true": {
|
||||
"model": "cobblemon:block/exposed_copper_oven_open",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/exposed_copper_washer",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/exposed_copper_washer"
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/exposed_copper_washer",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/exposed_copper_washer",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,469 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,power=0": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_unpowered",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=0": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_unpowered"
|
||||
},
|
||||
"facing=south,power=0": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_unpowered",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=0": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_unpowered",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=1,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=1,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=2,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=2,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=3,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=3,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=4,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=4,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=5,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=5,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=6,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=6,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=7,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=7,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=8,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=8,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=9,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=9,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=10,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=10,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=11,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=11,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=12,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=12,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=13,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=13,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=14,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=14,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=15,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=15,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,half=lower": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_bottom",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,half=lower": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_bottom"
|
||||
},
|
||||
"facing=south,half=lower": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_bottom",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=lower": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_bottom",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=upper": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_top",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,half=upper": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_top"
|
||||
},
|
||||
"facing=south,half=upper": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_top",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=upper": {
|
||||
"model": "cobblemon:block/oxidized_copper_fridge_top",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/oxidized_copper_mower",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/oxidized_copper_mower"
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/oxidized_copper_mower",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/oxidized_copper_mower",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed"
|
||||
},
|
||||
"facing=south,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=closed,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open"
|
||||
},
|
||||
"facing=south,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=open,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed"
|
||||
},
|
||||
"facing=south,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,cooking=cooking,ejecting=false": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_closed",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,ejecting=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,ejecting=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open"
|
||||
},
|
||||
"facing=south,ejecting=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,ejecting=true": {
|
||||
"model": "cobblemon:block/oxidized_copper_oven_open",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/oxidized_copper_washer",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/oxidized_copper_washer"
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/oxidized_copper_washer",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/oxidized_copper_washer",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,484 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,screen=off": {
|
||||
"model": "cobblemon:block/monitor"
|
||||
},
|
||||
"facing=west,screen=off": {
|
||||
"model": "cobblemon:block/monitor",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=off": {
|
||||
"model": "cobblemon:block/monitor",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=off": {
|
||||
"model": "cobblemon:block/monitor",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_1": {
|
||||
"model": "cobblemon:block/monitor_scanning_0"
|
||||
},
|
||||
"facing=west,screen=blue_progress_1": {
|
||||
"model": "cobblemon:block/monitor_scanning_0",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_1": {
|
||||
"model": "cobblemon:block/monitor_scanning_0",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_1": {
|
||||
"model": "cobblemon:block/monitor_scanning_0",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_2": {
|
||||
"model": "cobblemon:block/monitor_scanning_1"
|
||||
},
|
||||
"facing=west,screen=blue_progress_2": {
|
||||
"model": "cobblemon:block/monitor_scanning_1",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_2": {
|
||||
"model": "cobblemon:block/monitor_scanning_1",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_2": {
|
||||
"model": "cobblemon:block/monitor_scanning_1",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_3": {
|
||||
"model": "cobblemon:block/monitor_scanning_2"
|
||||
},
|
||||
"facing=west,screen=blue_progress_3": {
|
||||
"model": "cobblemon:block/monitor_scanning_2",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_3": {
|
||||
"model": "cobblemon:block/monitor_scanning_2",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_3": {
|
||||
"model": "cobblemon:block/monitor_scanning_2",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_4": {
|
||||
"model": "cobblemon:block/monitor_scanning_3"
|
||||
},
|
||||
"facing=west,screen=blue_progress_4": {
|
||||
"model": "cobblemon:block/monitor_scanning_3",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_4": {
|
||||
"model": "cobblemon:block/monitor_scanning_3",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_4": {
|
||||
"model": "cobblemon:block/monitor_scanning_3",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_5": {
|
||||
"model": "cobblemon:block/monitor_scanning_4"
|
||||
},
|
||||
"facing=west,screen=blue_progress_5": {
|
||||
"model": "cobblemon:block/monitor_scanning_4",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_5": {
|
||||
"model": "cobblemon:block/monitor_scanning_4",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_5": {
|
||||
"model": "cobblemon:block/monitor_scanning_4",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_6": {
|
||||
"model": "cobblemon:block/monitor_scanning_5"
|
||||
},
|
||||
"facing=west,screen=blue_progress_6": {
|
||||
"model": "cobblemon:block/monitor_scanning_5",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_6": {
|
||||
"model": "cobblemon:block/monitor_scanning_5",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_6": {
|
||||
"model": "cobblemon:block/monitor_scanning_5",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_7": {
|
||||
"model": "cobblemon:block/monitor_scanning_6"
|
||||
},
|
||||
"facing=west,screen=blue_progress_7": {
|
||||
"model": "cobblemon:block/monitor_scanning_6",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_7": {
|
||||
"model": "cobblemon:block/monitor_scanning_6",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_7": {
|
||||
"model": "cobblemon:block/monitor_scanning_6",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_8": {
|
||||
"model": "cobblemon:block/monitor_scanning_7"
|
||||
},
|
||||
"facing=west,screen=blue_progress_8": {
|
||||
"model": "cobblemon:block/monitor_scanning_7",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_8": {
|
||||
"model": "cobblemon:block/monitor_scanning_7",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_8": {
|
||||
"model": "cobblemon:block/monitor_scanning_7",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=blue_progress_9": {
|
||||
"model": "cobblemon:block/monitor_scanning_8"
|
||||
},
|
||||
"facing=west,screen=blue_progress_9": {
|
||||
"model": "cobblemon:block/monitor_scanning_8",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=blue_progress_9": {
|
||||
"model": "cobblemon:block/monitor_scanning_8",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=blue_progress_9": {
|
||||
"model": "cobblemon:block/monitor_scanning_8",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=green_progress_9": {
|
||||
"model": "cobblemon:block/monitor_locked"
|
||||
},
|
||||
"facing=west,screen=green_progress_9": {
|
||||
"model": "cobblemon:block/monitor_locked",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=green_progress_9": {
|
||||
"model": "cobblemon:block/monitor_locked",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=green_progress_9": {
|
||||
"model": "cobblemon:block/monitor_locked",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_normal": {
|
||||
"model": "cobblemon:block/monitor_tm_normal"
|
||||
},
|
||||
"facing=west,screen=tm_normal": {
|
||||
"model": "cobblemon:block/monitor_tm_normal",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_normal": {
|
||||
"model": "cobblemon:block/monitor_tm_normal",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_normal": {
|
||||
"model": "cobblemon:block/monitor_tm_normal",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_fire": {
|
||||
"model": "cobblemon:block/monitor_tm_fire"
|
||||
},
|
||||
"facing=west,screen=tm_fire": {
|
||||
"model": "cobblemon:block/monitor_tm_fire",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_fire": {
|
||||
"model": "cobblemon:block/monitor_tm_fire",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_fire": {
|
||||
"model": "cobblemon:block/monitor_tm_fire",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_water": {
|
||||
"model": "cobblemon:block/monitor_tm_water"
|
||||
},
|
||||
"facing=west,screen=tm_water": {
|
||||
"model": "cobblemon:block/monitor_tm_water",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_water": {
|
||||
"model": "cobblemon:block/monitor_tm_water",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_water": {
|
||||
"model": "cobblemon:block/monitor_tm_water",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_grass": {
|
||||
"model": "cobblemon:block/monitor_tm_grass"
|
||||
},
|
||||
"facing=west,screen=tm_grass": {
|
||||
"model": "cobblemon:block/monitor_tm_grass",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_grass": {
|
||||
"model": "cobblemon:block/monitor_tm_grass",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_grass": {
|
||||
"model": "cobblemon:block/monitor_tm_grass",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_electric": {
|
||||
"model": "cobblemon:block/monitor_tm_electric"
|
||||
},
|
||||
"facing=west,screen=tm_electric": {
|
||||
"model": "cobblemon:block/monitor_tm_electric",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_electric": {
|
||||
"model": "cobblemon:block/monitor_tm_electric",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_electric": {
|
||||
"model": "cobblemon:block/monitor_tm_electric",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_ice": {
|
||||
"model": "cobblemon:block/monitor_tm_ice"
|
||||
},
|
||||
"facing=west,screen=tm_ice": {
|
||||
"model": "cobblemon:block/monitor_tm_ice",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_ice": {
|
||||
"model": "cobblemon:block/monitor_tm_ice",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_ice": {
|
||||
"model": "cobblemon:block/monitor_tm_ice",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_fighting": {
|
||||
"model": "cobblemon:block/monitor_tm_fighting"
|
||||
},
|
||||
"facing=west,screen=tm_fighting": {
|
||||
"model": "cobblemon:block/monitor_tm_fighting",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_fighting": {
|
||||
"model": "cobblemon:block/monitor_tm_fighting",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_fighting": {
|
||||
"model": "cobblemon:block/monitor_tm_fighting",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_poison": {
|
||||
"model": "cobblemon:block/monitor_tm_poison"
|
||||
},
|
||||
"facing=west,screen=tm_poison": {
|
||||
"model": "cobblemon:block/monitor_tm_poison",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_poison": {
|
||||
"model": "cobblemon:block/monitor_tm_poison",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_poison": {
|
||||
"model": "cobblemon:block/monitor_tm_poison",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_ground": {
|
||||
"model": "cobblemon:block/monitor_tm_ground"
|
||||
},
|
||||
"facing=west,screen=tm_ground": {
|
||||
"model": "cobblemon:block/monitor_tm_ground",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_ground": {
|
||||
"model": "cobblemon:block/monitor_tm_ground",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_ground": {
|
||||
"model": "cobblemon:block/monitor_tm_ground",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_flying": {
|
||||
"model": "cobblemon:block/monitor_tm_flying"
|
||||
},
|
||||
"facing=west,screen=tm_flying": {
|
||||
"model": "cobblemon:block/monitor_tm_flying",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_flying": {
|
||||
"model": "cobblemon:block/monitor_tm_flying",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_flying": {
|
||||
"model": "cobblemon:block/monitor_tm_flying",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_psychic": {
|
||||
"model": "cobblemon:block/monitor_tm_psychic"
|
||||
},
|
||||
"facing=west,screen=tm_psychic": {
|
||||
"model": "cobblemon:block/monitor_tm_psychic",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_psychic": {
|
||||
"model": "cobblemon:block/monitor_tm_psychic",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_psychic": {
|
||||
"model": "cobblemon:block/monitor_tm_psychic",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_bug": {
|
||||
"model": "cobblemon:block/monitor_tm_bug"
|
||||
},
|
||||
"facing=west,screen=tm_bug": {
|
||||
"model": "cobblemon:block/monitor_tm_bug",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_bug": {
|
||||
"model": "cobblemon:block/monitor_tm_bug",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_bug": {
|
||||
"model": "cobblemon:block/monitor_tm_bug",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_rock": {
|
||||
"model": "cobblemon:block/monitor_tm_rock"
|
||||
},
|
||||
"facing=west,screen=tm_rock": {
|
||||
"model": "cobblemon:block/monitor_tm_rock",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_rock": {
|
||||
"model": "cobblemon:block/monitor_tm_rock",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_rock": {
|
||||
"model": "cobblemon:block/monitor_tm_rock",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_ghost": {
|
||||
"model": "cobblemon:block/monitor_tm_ghost"
|
||||
},
|
||||
"facing=west,screen=tm_ghost": {
|
||||
"model": "cobblemon:block/monitor_tm_ghost",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_ghost": {
|
||||
"model": "cobblemon:block/monitor_tm_ghost",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_ghost": {
|
||||
"model": "cobblemon:block/monitor_tm_ghost",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_dragon": {
|
||||
"model": "cobblemon:block/monitor_tm_dragon"
|
||||
},
|
||||
"facing=west,screen=tm_dragon": {
|
||||
"model": "cobblemon:block/monitor_tm_dragon",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_dragon": {
|
||||
"model": "cobblemon:block/monitor_tm_dragon",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_dragon": {
|
||||
"model": "cobblemon:block/monitor_tm_dragon",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_dark": {
|
||||
"model": "cobblemon:block/monitor_tm_dark"
|
||||
},
|
||||
"facing=west,screen=tm_dark": {
|
||||
"model": "cobblemon:block/monitor_tm_dark",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_dark": {
|
||||
"model": "cobblemon:block/monitor_tm_dark",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_dark": {
|
||||
"model": "cobblemon:block/monitor_tm_dark",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_steel": {
|
||||
"model": "cobblemon:block/monitor_tm_steel"
|
||||
},
|
||||
"facing=west,screen=tm_steel": {
|
||||
"model": "cobblemon:block/monitor_tm_steel",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_steel": {
|
||||
"model": "cobblemon:block/monitor_tm_steel",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_steel": {
|
||||
"model": "cobblemon:block/monitor_tm_steel",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=tm_fairy": {
|
||||
"model": "cobblemon:block/monitor_tm_fairy"
|
||||
},
|
||||
"facing=west,screen=tm_fairy": {
|
||||
"model": "cobblemon:block/monitor_tm_fairy",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=tm_fairy": {
|
||||
"model": "cobblemon:block/monitor_tm_fairy",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=tm_fairy": {
|
||||
"model": "cobblemon:block/monitor_tm_fairy",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=music": {
|
||||
"model": "cobblemon:block/monitor_music"
|
||||
},
|
||||
"facing=west,screen=music": {
|
||||
"model": "cobblemon:block/monitor_music",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=music": {
|
||||
"model": "cobblemon:block/monitor_music",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=music": {
|
||||
"model": "cobblemon:block/monitor_music",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=porygon_grid": {
|
||||
"model": "cobblemon:block/monitor_grid"
|
||||
},
|
||||
"facing=west,screen=porygon_grid": {
|
||||
"model": "cobblemon:block/monitor_grid",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=porygon_grid": {
|
||||
"model": "cobblemon:block/monitor_grid",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=porygon_grid": {
|
||||
"model": "cobblemon:block/monitor_grid",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,screen=porygon_glitching": {
|
||||
"model": "cobblemon:block/monitor_glitching"
|
||||
},
|
||||
"facing=west,screen=porygon_glitching": {
|
||||
"model": "cobblemon:block/monitor_glitching",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,screen=porygon_glitching": {
|
||||
"model": "cobblemon:block/monitor_glitching",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,screen=porygon_glitching": {
|
||||
"model": "cobblemon:block/monitor_glitching",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,469 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered"
|
||||
},
|
||||
"facing=south,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=0": {
|
||||
"model": "cobblemon:block/copper_fan_unpowered",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=1,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=2,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=3,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=4,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=5,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=6,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative"
|
||||
},
|
||||
"facing=south,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing"
|
||||
},
|
||||
"facing=south,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=7,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=8,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=9,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=10,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=11,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=12,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=13,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=14,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong"
|
||||
},
|
||||
"facing=south,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=false": {
|
||||
"model": "cobblemon:block/copper_fan_decorative_strong",
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong"
|
||||
},
|
||||
"facing=south,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,power=15,push=true": {
|
||||
"model": "cobblemon:block/copper_fan_pushing_strong",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
Loaded 100 of 937 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user