Compare commits

...
20 Commits
Author SHA1 Message Date
Guilherme Pereira 96079065b6 more armors 2025-12-05 11:38:38 -03:00
Guilherme Pereira 86f91ed77a add malicious armor armor material 2025-12-03 20:41:32 -03:00
Polymeta c43b3bbb4d Merge branch 'fix-can-drop-held-item' into 'main'
Fix can drop held item function

See merge request cable-mc/cobblemon!2069
2025-12-03 08:17:38 +00:00
lionandPolymeta d826aeeb07 Fix can drop held item function 2025-12-03 08:17:35 +00:00
Polymeta f90c6967ce Merge branch 'FixHoneyedLeavesInteraction' into 'main'
FixHoneyedLeavesInteraction

Closes #1832

See merge request cable-mc/cobblemon!2067
2025-12-03 08:15:26 +00:00
JazzMcNade b9cf18adbd Changelog 2025-12-02 20:16:56 -06:00
JazzMcNade 30650e1f9f Code simplication 2025-12-02 20:12:37 -06:00
JazzMcNade eaa558a7c8 Check for creative on using empty bottle 2025-12-02 00:36:53 -06:00
JazzMcNade 0dc725e513 Can only receive honey at max age. Adds result to hand if possible. Checks for creative and server/client 2025-12-02 00:28:23 -06:00
Hiroku 7d4e5892ba Merge branch 'main' into 'main'
Orientation after crash fix

See merge request cable-mc/cobblemon!2061
2025-12-01 00:23:40 +00:00
KhvrramandHiroku f9de415020 Orientation after crash fix 2025-12-01 00:23:39 +00:00
Polymeta 54dc2e7f6f tidy up changelog [skip-ci] 2025-11-29 12:57:24 +00:00
Polymeta 1d60ba093f Merge branch 'convention-tags-not-being-consistent-grrrrrrrr' into 'main'
Why

See merge request cable-mc/cobblemon!2060
2025-11-29 11:53:50 +00:00
Hiroku 0fef74dce7 Edit OneToOneFileStoreAdapter.kt 2025-11-29 09:46:27 +00:00
Hiroku b08647bb32 Revert "Merge branch 'main' into 'main'"
This reverts merge request !2062
2025-11-29 04:26:57 +00:00
Hiroku de9e89f040 Merge branch 'main' into 'main'
Editar en_us.json

See merge request cable-mc/cobblemon!2062
2025-11-29 04:25:10 +00:00
Ezequiel Neri Ferreira 84a29ebc2a Editar en_us.json 2025-11-29 04:22:49 +00:00
Paul 37b13ae959 Unsnaps your shot 2025-11-29 12:44:40 +10:00
dhi_holo 1cacbe8306 Why
It's called Shears, that's the item name, why does NeoForge use a Shear tag instead
Atleast Fabric has that tag as well so it's not a hard fix
2025-11-29 12:30:45 +10:00
Paul 12d224d15a Reinforce switchForm for crashes 2025-11-29 11:25:58 +10:00
24 changed files with 462 additions and 96 deletions
+7 -46
View File
@@ -1,61 +1,22 @@
# Changelog
## [1.7.1 (November 29th, 2025)](#1-7-1)
## [1.7.2 (MONTH Xth, YEAR)](#1-7-2)
### Additions
- Added trades for Saccharine Saplings, Hearty Grains, Chipped Pot, and Masterpiece Teacup to the Wandering Trader.
- Added brewing recipe for Throat Spray.
- Added vanilla sprinting's field of view change to Pokémon land mounts.
- Added a customizable keybind for the riding freelook button.
- Added double tap to sprint on land mounts.
### Changes
- Made Jet pitch turning 1.5x faster across all Pokémon.
- Party Pokémon now attack only mobs that are attacking their owner, instead of randomly targeting unrelated mobs and getting themselves hurt.
- Reduced the cost of the Vivichoke Seed trade with the Wandering Trader.
### Fixes
- Fixed incorrect camera pivot on Bird, Jet, and Dolphin mounts, leading to some disorienting riding.
- Fixed players suffocating while on vanilla mounts.
- Fixed a graphics crash that could occur on some machines when campfire pots were nearby.
- Fixed ride controls overlay being displayed to passengers. The passengers probably don't need to know about those.
- Fixed mount jumping so that it doesn't switch back to ground animations.
- Fixed ridden Pokémon land collision and some issues around stepping up blocks. Land mounts are smoother overall now.
- Fixed Furfrou's pink and magenta trims being swapped. Only a man could make that mistake.
- Fixed friendship being reset to the default value when evolving a Pokémon.
- Fixed Combees not depositing honey upon leaving a hive if they entered it with nectar.
- Fixed pastured Combees not moving during the night or in rain.
- Fixed a case in which a Combee might try to path to a flower that no longer exists.
- Fixed Combees attempting to enter a full hive.
- Fixed a crash involving Combees and hives. 500 bee bugs. Bugged bees? We can be bees. Mark, this is good news.
- Fixed a crash related to NPC navigation.
- Fixed a crash when opening a PC box with certain wallpapers while using *VulkanMod*.
- Fixed a crash when you place a block in the way of hearty grains 2nd block.
- Fixed passengers hearing the shiny noise of a ridden shiny Pokémon.
- Ponigiri can no longer be eaten at full hunger.
- Fixed Poké Snack spawning sounds not coming from the block.
- Medicinal Brew's Campfire Pot recipe now correctly displays that it can be made using an empty glass bottle or a filled bottle.
- Fixed glass bottle not being returned when slathering honey on a saccharine leaf block.
- Fixed saccharine hanging signs sometimes dropping their oak wood counterpart when being broken.
- Fixed a bunch of incompatibilities with NeoForge mods.
- Fixed a bug where wind charges hitting pasture blocks would recall all Pokémon in it.
- Fixed the Home on the Range advancement triggering when opening the Pokémon interaction wheel.
- Fixed recipes that use concrete not working on NeoForge.
- Fixed Boltund's model.
- Fixed Cyclizar's textures.
- Fixed orientation not getting reset after crashing while flying and getting back on the Pokémon.
- Fixed Furfrou not being trimmable on NeoForge.
- Fixed honey from Saccharine Leaves being harvestable at less than the max age.
- Items given from interacting with Saccharine Leaves are placed in the active hotbar slot if possible.
- Fix all Pokémon being saved to chunks and never despawning.
### Developer
### Molang & Datapacks
- Removed automatic generation of PC wallpaper screen glow if no asset is provided; it is now optional.
- This is because there's no practical way to do this without blowing up things like *VulkanMod*.
### Particles
### Localization
- Updated translations for:
- French
- Japanese
- Korean
- Brazilian Portuguese
- Simplified Chinese
- Traditional Chinese
- Updated translations for:
+61
View File
@@ -0,0 +1,61 @@
# Changelog
## [1.7.1 (November 29th, 2025)](#1-7-1)
### Additions
- Added trades for Saccharine Saplings, Hearty Grains, Chipped Pot, and Masterpiece Teacup to the Wandering Trader.
- Added brewing recipe for Throat Spray.
- Added vanilla sprinting's field of view change to Pokémon land mounts.
- Added a customizable keybind for the riding freelook button.
- Added double tap to sprint on land mounts.
### Changes
- Made Jet pitch turning 1.5x faster across all Pokémon.
- Party Pokémon now attack only mobs that are attacking their owner, instead of randomly targeting unrelated mobs and getting themselves hurt.
- Reduced the cost of the Vivichoke Seed trade with the Wandering Trader.
### Fixes
- Fixed incorrect camera pivot on Bird, Jet, and Dolphin mounts, leading to some disorienting riding.
- Fixed players suffocating while on vanilla mounts.
- Fixed a graphics crash that could occur on some machines when campfire pots were nearby.
- Fixed ride controls overlay being displayed to passengers. The passengers probably don't need to know about those.
- Fixed mount jumping so that it doesn't switch back to ground animations.
- Fixed ridden Pokémon land collision and some issues around stepping up blocks. Land mounts are smoother overall now.
- Fixed Furfrou's pink and magenta trims being swapped. Only a man could make that mistake.
- Fixed friendship being reset to the default value when evolving a Pokémon.
- Fixed Combees not depositing honey upon leaving a hive if they entered it with nectar.
- Fixed pastured Combees not moving during the night or in rain.
- Fixed a case in which a Combee might try to path to a flower that no longer exists.
- Fixed Combees attempting to enter a full hive.
- Fixed a crash involving Combees and hives. 500 bee bugs. Bugged bees? We can be bees. Mark, this is good news.
- Fixed a crash related to NPC navigation.
- Fixed a crash when opening a PC box with certain wallpapers while using *VulkanMod*.
- Fixed a crash when you place a block in the way of hearty grains 2nd block.
- Fixed passengers hearing the shiny noise of a ridden shiny Pokémon.
- Ponigiri can no longer be eaten at full hunger.
- Fixed Poké Snack spawning sounds not coming from the block.
- Medicinal Brew's Campfire Pot recipe now correctly displays that it can be made using an empty glass bottle or a filled bottle.
- Fixed glass bottle not being returned when slathering honey on a saccharine leaf block.
- Fixed saccharine hanging signs sometimes dropping their oak wood counterpart when being broken.
- Fixed a bunch of incompatibilities with NeoForge mods.
- Fixed a bug where wind charges hitting pasture blocks would recall all Pokémon in it.
- Fixed the Home on the Range advancement triggering when opening the Pokémon interaction wheel.
- Fixed recipes that use concrete not working on NeoForge.
- Fixed Boltund's model.
- Fixed Cyclizar's textures.
### Developer
### Molang & Datapacks
- Removed automatic generation of PC wallpaper screen glow if no asset is provided; it is now optional.
- This is because there's no practical way to do this without blowing up things like *VulkanMod*.
### Particles
### Localization
- Updated translations for:
- French
- Japanese
- Korean
- Brazilian Portuguese
- Simplified Chinese
- Traditional Chinese
@@ -194,6 +194,7 @@ object Cobblemon {
implementation.registerSoundEvents()
implementation.registerDataComponents()
implementation.registerBlocks()
implementation.registerArmorMaterials()
implementation.registerItems()
implementation.registerEntityTypes()
implementation.registerEntityAttributes()
@@ -0,0 +1,53 @@
package com.cobblemon.mod.common
import com.cobblemon.mod.common.platform.PlatformRegistry
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.Registry
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries
import net.minecraft.resources.ResourceKey
import net.minecraft.sounds.SoundEvents
import net.minecraft.world.item.ArmorItem
import net.minecraft.world.item.ArmorMaterial
import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient
@Suppress("unused")
object CobblemonArmorMaterials :
PlatformRegistry<Registry<ArmorMaterial>, ResourceKey<Registry<ArmorMaterial>>, ArmorMaterial>() {
override val registry: Registry<ArmorMaterial> = BuiltInRegistries.ARMOR_MATERIAL
override val resourceKey: ResourceKey<Registry<ArmorMaterial>> = Registries.ARMOR_MATERIAL
@JvmField
val MALICIOUS_ARMOR = cosmeticMaterial("malicious_armor")
@JvmField
val HEAVY_DUTY_BOOTS = cosmeticMaterial("heavy_duty_boots")
@JvmField
val PROTECTIVE_PADS = cosmeticMaterial("protective_pads")
@JvmField
val ASSAULT_VEST = cosmeticMaterial("assault_vest")
@JvmField
val MYSTIC_WATER = cosmeticMaterial("mystic_water")
@JvmField
val BLACK_BELT = cosmeticMaterial("black_belt")
private fun cosmeticMaterial(name: String): ArmorMaterial {
val armorMaterial = ArmorMaterial(
mapOf(
ArmorItem.Type.HELMET to 0,
ArmorItem.Type.CHESTPLATE to 0,
ArmorItem.Type.LEGGINGS to 0,
ArmorItem.Type.BOOTS to 0,
),
0,
SoundEvents.ARMOR_EQUIP_GENERIC,
{ Ingredient.EMPTY },
listOf(ArmorMaterial.Layer(cobblemonResource(name), "", true)),
0.0f,
0.0f,
)
return create(name, armorMaterial)
}
}
@@ -64,6 +64,8 @@ interface CobblemonImplementation {
fun registerEntityDataSerializers()
fun registerArmorMaterials()
/**
* TODO
*
@@ -44,16 +44,21 @@ import com.cobblemon.mod.common.pokeball.PokeBall
import com.cobblemon.mod.common.pokemon.IVs
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.Holder
import net.minecraft.core.Registry
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
import net.minecraft.sounds.SoundEvents
import net.minecraft.world.effect.MobEffectInstance
import net.minecraft.world.effect.MobEffects
import net.minecraft.world.entity.EquipmentSlot
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.food.FoodProperties
import net.minecraft.world.item.ArmorItem
import net.minecraft.world.item.ArmorMaterial
import net.minecraft.world.item.BlockItem
import net.minecraft.world.item.HangingSignItem
import net.minecraft.world.item.Item
@@ -501,8 +506,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField val RAZOR_CLAW = noSettingsItem("razor_claw")
@JvmField val RAZOR_FANG = noSettingsItem("razor_fang")
@JvmField val AUSPICIOUS_ARMOR = heldItem("auspicious_armor")
@JvmField val MALICIOUS_ARMOR = heldItem("malicious_armor")
@JvmField val SHELL_HELMET = heldItem("shell_helmet")
@JvmField val METAL_ALLOY = noSettingsItem("metal_alloy")
@JvmField val SCROLL_OF_DARKNESS = noSettingsItem("scroll_of_darkness")
@JvmField val SCROLL_OF_WATERS = noSettingsItem("scroll_of_waters")
@@ -892,7 +895,8 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
val WATER_STONE = noSettingsItem("water_stone")
val wearables = mutableListOf<WearableItem>()
//Wearable items (these items should have a corresponding 3D model)
// Wearable items (these items should have a corresponding 3D model)
@JvmField val BLACK_GLASSES = wearableItem("black_glasses")
@JvmField val CHOICE_BAND = wearableItem("choice_band")
@JvmField val CHOICE_SPECS = wearableItem("choice_specs")
@@ -903,6 +907,20 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField val ROCKY_HELMET = wearableItem("rocky_helmet")
@JvmField val SAFETY_GOGGLES = wearableItem("safety_goggles")
@JvmField val WISE_GLASSES = wearableItem("wise_glasses")
@JvmField val SHELL_HELMET = wearableItem("shell_helmet")
@JvmField
val MALICIOUS_ARMOR = armorItem("malicious_armor", CobblemonArmorMaterials.MALICIOUS_ARMOR, ArmorItem.Type.CHESTPLATE)
@JvmField
val HEAVY_DUTY_BOOTS = armorItem("heavy_duty_boots", CobblemonArmorMaterials.HEAVY_DUTY_BOOTS, ArmorItem.Type.BOOTS)
@JvmField
val PROTECTIVE_PADS = armorItem("protective_pads", CobblemonArmorMaterials.PROTECTIVE_PADS, ArmorItem.Type.CHESTPLATE)
@JvmField
val ASSAULT_VEST = armorItem("assault_vest", CobblemonArmorMaterials.ASSAULT_VEST, ArmorItem.Type.CHESTPLATE)
@JvmField
val MYSTIC_WATER = armorItem("mystic_water", CobblemonArmorMaterials.MYSTIC_WATER, ArmorItem.Type.CHESTPLATE)
@JvmField
val BLACK_BELT = armorItem("black_belt", CobblemonArmorMaterials.BLACK_BELT, ArmorItem.Type.CHESTPLATE)
// Held Items
@JvmField
@@ -912,14 +930,10 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val AIR_BALLOON = heldItem("air_balloon")
@JvmField
val ASSAULT_VEST = heldItem("assault_vest")
@JvmField
val BIG_ROOT = compostableBlockItem("big_root", CobblemonBlocks.BIG_ROOT, 0.30f)
@JvmField
val BINDING_BAND = heldItem("binding_band")
@JvmField
val BLACK_BELT = heldItem("black_belt")
@JvmField
val BLACK_SLUDGE = heldItem("black_sludge")
@JvmField
val BLUNDER_POLICY = heldItem("blunder_policy")
@@ -966,8 +980,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val HARD_STONE = heldItem("hard_stone")
@JvmField
val HEAVY_DUTY_BOOTS = heldItem("heavy_duty_boots")
@JvmField
val IRON_BALL = heldItem("iron_ball")
@JvmField
val LAGGING_TAIL = heldItem("lagging_tail")
@@ -992,8 +1004,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val MIRACLE_SEED = heldItem("miracle_seed")
@JvmField
val MYSTIC_WATER = heldItem("mystic_water")
@JvmField
val NEVER_MELT_ICE = heldItem("never_melt_ice")
@JvmField
val POISON_BARB = heldItem("poison_barb")
@@ -1012,8 +1022,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val PSYCHIC_SEED = heldItem("psychic_seed")
@JvmField
val PROTECTIVE_PADS = heldItem("protective_pads")
@JvmField
val PUNCHING_GLOVE = heldItem("punching_glove")
@JvmField
val QUICK_CLAW = heldItem("quick_claw")
@@ -1491,9 +1499,13 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
return item
}
private fun wearableItem(name: String, heldItemRemappedName: String? = null): CobblemonItem = create(
private fun wearableItem(
name: String,
heldItemRemappedName: String? = null,
equipmentSlot: EquipmentSlot = EquipmentSlot.HEAD,
): CobblemonItem = create(
name,
WearableItem(name).also {
WearableItem(name, equipmentSlot).also {
wearables.add(it)
if (heldItemRemappedName != null) {
CobblemonHeldItemManager.registerRemap(it, heldItemRemappedName)
@@ -1501,6 +1513,21 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
}
)
private fun armorItem(
name: String,
armorMaterial: ArmorMaterial,
armorType: ArmorItem.Type,
durability: Int? = null,
): ArmorItem {
var properties = Properties()
if (durability != null) properties = properties.durability(durability)
val armorMaterialHolder = BuiltInRegistries.ARMOR_MATERIAL.wrapAsHolder(armorMaterial)
val armorItem = ArmorItem(armorMaterialHolder, armorType, properties)
return create(name, armorItem)
}
private fun campfirePotItem(block: Block, color: CampfirePotColor): CampfirePotItem {
val item = create("campfire_pot_${color.suffix}", CampfirePotItem(block, color))
campfire_pots.add(item)
@@ -88,7 +88,6 @@ abstract class OneToOneFileStoreAdapter<S>(
result
}
else {
storeClass.getConstructor(UUID::class.java).newInstance(uuid)
var result = storeClass.getConstructor(UUID::class.java).newInstance(uuid)
save(storeClass, uuid, serialize(result, registryAccess))
oldFile.delete()
@@ -10,6 +10,7 @@ package com.cobblemon.mod.common.block
import com.bedrockk.molang.runtime.value.DoubleValue
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
import com.cobblemon.mod.common.util.isServerSide
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.core.dispenser.DispenseItemBehavior
@@ -263,21 +264,36 @@ class SaccharineLeafBlock(settings: Properties) : LeavesBlock(settings) {
val isGlassBottle = itemStack.`is`(Items.GLASS_BOTTLE)
val isHoneyBottle = itemStack.`is`(Items.HONEY_BOTTLE)
if (isGlassBottle && !isAtMinAge(state)) {
if (isGlassBottle && isAtMaxAge(state)) {
if (level.isClientSide) return ItemInteractionResult.SUCCESS
// Decrement stack if not in creative mode
itemStack.consume(1, player)
// Give player honey bottle for now
player.addItem(Items.HONEY_BOTTLE.defaultInstance)
// Give player a honey bottle
if (stack.isEmpty) {
// Replace the consumed empty bottle with a honey bottle
player.setItemInHand(hand, ItemStack(Items.HONEY_BOTTLE));
} else {
player.addItem(Items.HONEY_BOTTLE.defaultInstance)
}
level.playSound(null, pos, SoundEvents.BOTTLE_FILL, SoundSource.BLOCKS)
level.setBlock(pos, state.setValue(AGE, 0), UPDATE_CLIENTS)
level.gameEvent(null, GameEvent.BLOCK_CHANGE, pos)
return ItemInteractionResult.SUCCESS
} else if (isHoneyBottle && !isAtMaxAge(state)) {
if (level.isClientSide) return ItemInteractionResult.SUCCESS
// Decrement stack if not in creative mode
itemStack.consume(1, player)
player.addItem(Items.GLASS_BOTTLE.defaultInstance)
if (!player.isCreative) {
itemStack.consume(1, player)
if (stack.isEmpty) {
// Replace the consumed honey bottle with an empty bottle
player.setItemInHand(hand, ItemStack(Items.GLASS_BOTTLE));
} else {
player.addItem(Items.GLASS_BOTTLE.defaultInstance)
}
}
level.playSound(null, pos, SoundEvents.HONEY_BLOCK_PLACE, SoundSource.BLOCKS)
level.setBlock(pos, state.setValue(AGE, 2), UPDATE_CLIENTS)
@@ -592,6 +592,10 @@ class PokemonInfoWidget(val pX: Int, val pY: Int, val updateForm: (PokedexForm)
}
private fun switchForm(nextIndex: Boolean) {
if (visibleForms.isEmpty() || currentEntry == null) {
return
}
selectedPoseIndex = 0
if (nextIndex) {
@@ -602,6 +606,8 @@ class PokemonInfoWidget(val pX: Int, val pY: Int, val updateForm: (PokedexForm)
else selectedFormIndex = visibleForms.lastIndex
}
selectedFormIndex = selectedFormIndex.coerceIn(0, visibleForms.lastIndex)
setupButtons(currentEntry!!, visibleForms[selectedFormIndex])
updateAspects()
}
@@ -547,6 +547,11 @@ open class PokemonEntity(
ifRidingAvailable { _, _, state -> pokemon.rideStamina = state.stamina.get() }
ridingController?.context?.state?.reset()
ridingAnimationData.clear()
// reset riding orientation
if (this is OrientationControllable) {
this.orientationController.reset()
}
}
}
@@ -13,7 +13,10 @@ import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.EquipmentSlot
import net.minecraft.world.item.Equipable
class WearableItem(val name: String): CobblemonItem(Properties()), Equipable {
class WearableItem(
val name: String,
val armorEquipmentSlot: EquipmentSlot = EquipmentSlot.HEAD,
): CobblemonItem(Properties()), Equipable {
companion object {
const val MODEL_PATH = "item/wearable"
}
@@ -21,5 +24,7 @@ class WearableItem(val name: String): CobblemonItem(Properties()), Equipable {
fun getModel3d(): ResourceLocation = cobblemonResource("${MODEL_PATH}/${this.name}")
fun getModel2d(): ResourceLocation = cobblemonResource(this.name)
override fun getEquipmentSlot(): EquipmentSlot { return EquipmentSlot.HEAD }
override fun getEquipmentSlot(): EquipmentSlot {
return armorEquipmentSlot
}
}
@@ -673,7 +673,7 @@ open class Pokemon : ShowdownIdentifiable {
* Whether this Pokémon's held item can be dropped by its AI.
*/
internal var canDropHeldItem: Boolean = false
get() = field || heldItem.isEmpty
get() = field && !heldItem.isEmpty
val riding: RidingProperties
get() = this.form.riding
@@ -0,0 +1,235 @@
{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"texture_size": [64, 24],
"textures": {
"0": "cobblemon:item/wearable/shell_helmet",
"particle": "cobblemon:item/wearable/shell_helmet"
},
"elements": [
{
"from": [4, 1, 7],
"to": [12, 4, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 12]},
"faces": {
"north": {"uv": [4, 0, 6, 2], "texture": "#0"},
"east": {"uv": [4, 2, 4.75, 4], "texture": "#0"},
"south": {"uv": [1.75, 12.66667, 3.75, 14.66667], "texture": "#0"},
"west": {"uv": [4.75, 2, 5.5, 4], "texture": "#0"},
"up": {"uv": [4, 2, 2, 0], "texture": "#0"},
"down": {"uv": [4, 2, 2, 4.66667], "texture": "#0"}
}
},
{
"from": [11, 0, 7],
"to": [12, 1, 7],
"rotation": {"angle": 0, "axis": "y", "origin": [7, -3, 9]},
"faces": {
"north": {"uv": [5.5, 3.33333, 5.75, 4], "texture": "#0"},
"east": {"uv": [0, 0, 0, 0.66667], "texture": "#0"},
"south": {"uv": [5.75, 3.33333, 6, 4], "texture": "#0"},
"west": {"uv": [0, 0, 0, 0.66667], "texture": "#0"},
"up": {"uv": [0.25, 0, 0, 0], "texture": "#0"},
"down": {"uv": [0.25, 0, 0, 0], "texture": "#0"}
}
},
{
"from": [4, 0, 7],
"to": [5, 1, 7],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -3, 9]},
"faces": {
"north": {"uv": [4, 4, 4.25, 4.66667], "texture": "#0"},
"east": {"uv": [0, 0, 0, 0.66667], "texture": "#0"},
"south": {"uv": [3.75, 12.66667, 4, 13.33333], "texture": "#0"},
"west": {"uv": [0, 0, 0, 0.66667], "texture": "#0"},
"up": {"uv": [0.25, 0, 0, 0], "texture": "#0"},
"down": {"uv": [0.25, 0, 0, 0], "texture": "#0"}
}
},
{
"from": [12, -1, 7],
"to": [12, 1, 9],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 11]},
"faces": {
"north": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"east": {"uv": [4.25, 6.66667, 4.75, 8], "texture": "#0"},
"south": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"west": {"uv": [5.5, 2, 6, 3.33333], "texture": "#0"},
"up": {"uv": [0, 3.33333, 0, 0], "texture": "#0"},
"down": {"uv": [0, 0, 0, 3.33333], "texture": "#0"}
}
},
{
"from": [4, -1, 7],
"to": [4, 1, 9],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 11]},
"faces": {
"north": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"east": {"uv": [4, 10, 4.5, 11.33333], "texture": "#0"},
"south": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"west": {"uv": [4.75, 6.66667, 5.25, 8], "texture": "#0"},
"up": {"uv": [0, 3.33333, 0, 0], "texture": "#0"},
"down": {"uv": [0, 0, 0, 3.33333], "texture": "#0"}
}
},
{
"from": [5, 2, 4],
"to": [11, 4, 7],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 12]},
"faces": {
"north": {"uv": [4.25, 4, 5.75, 5.33333], "texture": "#0"},
"east": {"uv": [6, 2.66667, 6.75, 4], "texture": "#0"},
"south": {"uv": [4.25, 5.33333, 5.75, 6.66667], "texture": "#0"},
"west": {"uv": [5.75, 4, 6.5, 5.33333], "texture": "#0"},
"up": {"uv": [5.5, 13.33333, 4, 11.33333], "texture": "#0"},
"down": {"uv": [5.25, 13.33333, 3.75, 15.33333], "texture": "#0"}
}
},
{
"from": [5, 2, 7],
"to": [11, 2, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 12]},
"faces": {
"north": {"uv": [4.25, 4, 5.75, 5.33333], "texture": "#0"},
"east": {"uv": [6, 2.66667, 6.75, 4], "texture": "#0"},
"south": {"uv": [4.25, 5.33333, 5.75, 6.66667], "texture": "#0"},
"west": {"uv": [5.75, 4, 6.5, 5.33333], "texture": "#0"},
"up": {"uv": [5.5, 13.33333, 4, 11.33333], "texture": "#0"},
"down": {"uv": [3.75, 15.33333, 5.25, 13.33333], "texture": "#0"}
}
},
{
"from": [11, 0, 4],
"to": [11, 2, 7],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 12]},
"faces": {
"north": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"east": {"uv": [5.75, 5.33333, 6.5, 6.66667], "texture": "#0"},
"south": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"west": {"uv": [6, 1.33333, 6.75, 2.66667], "texture": "#0"},
"up": {"uv": [0, 2, 0, 0], "texture": "#0"},
"down": {"uv": [0, 0, 0, 2], "texture": "#0"}
}
},
{
"from": [5, 0, 4],
"to": [5, 2, 7],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 2, 12]},
"faces": {
"north": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"east": {"uv": [6, 0, 6.75, 1.33333], "texture": "#0"},
"south": {"uv": [0, 0, 0, 1.33333], "texture": "#0"},
"west": {"uv": [5.25, 6.66667, 6, 8], "texture": "#0"},
"up": {"uv": [0, 2, 0, 0], "texture": "#0"},
"down": {"uv": [0, 0, 0, 2], "texture": "#0"}
}
},
{
"from": [4, 1, 10],
"to": [12, 4, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 0, 12]},
"faces": {
"north": {"uv": [0, 10.66667, 1.75, 14], "texture": "#0"},
"east": {"uv": [3.25, 8, 4.5, 10], "texture": "#0"},
"south": {"uv": [1.75, 10.66667, 4, 12.66667], "texture": "#0"},
"west": {"uv": [2, 8, 3.25, 10], "texture": "#0"},
"up": {"uv": [6.5, 11.33333, 4.5, 8], "texture": "#0"},
"down": {"uv": [4.25, 4.66667, 2, 8], "texture": "#0"}
}
},
{
"from": [4, -4, 9],
"to": [12, 1, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [4, -3, 13]},
"faces": {
"north": {"uv": [10.75, 3.33333, 12.75, 6.66667], "texture": "#0"},
"east": {"uv": [12.75, 0, 14.25, 3.33333], "texture": "#0"},
"south": {"uv": [10.75, 0, 12.75, 3.33333], "texture": "#0"},
"west": {"uv": [14.25, 0, 15.75, 3.33333], "texture": "#0"},
"up": {"uv": [8.75, 4, 10.75, 8], "texture": "#0"},
"down": {"uv": [8.75, 0, 10.75, 4], "texture": "#0"}
}
},
{
"from": [6, -1.3, 10.5],
"to": [10, 6.7, 18.5],
"rotation": {"angle": 45, "axis": "x", "origin": [7.5, 1.65, 13.5]},
"faces": {
"north": {"uv": [12.75, 3.33333, 13.75, 8.66667], "texture": "#0"},
"east": {"uv": [2, 0, 0, 5.33333], "texture": "#0"},
"south": {"uv": [13.75, 3.33333, 14.75, 8.66667], "texture": "#0"},
"west": {"uv": [0, 0, 2, 5.33333], "texture": "#0"},
"up": {"uv": [12.75, 8.66667, 13.75, 14], "texture": "#0"},
"down": {"uv": [13.75, 8.66667, 14.75, 14], "texture": "#0"}
}
},
{
"from": [4, -1.4, 7.4],
"to": [12, -1.4, 18.4],
"rotation": {"angle": 45, "axis": "x", "origin": [7.5, 1.65, 13.5]},
"faces": {
"north": {"uv": [12.75, 3.33333, 13.75, 8.66667], "texture": "#0"},
"east": {"uv": [0, 5.33333, 2, 10.66667], "texture": "#0"},
"south": {"uv": [13.75, 3.33333, 14.75, 8.66667], "texture": "#0"},
"west": {"uv": [0, 0, 2, 5.33333], "texture": "#0"},
"up": {"uv": [12.75, 8.66667, 13.75, 14], "texture": "#0"},
"down": {"uv": [6.75, 0, 8.75, 6.66667], "texture": "#0"}
}
},
{
"from": [4.01, -4, 7],
"to": [4.01, 4, 15],
"faces": {
"north": {"uv": [0, 0, 0, 5.33333], "texture": "#0"},
"east": {"uv": [8.75, 8, 10.75, 13.33333], "texture": "#0"},
"south": {"uv": [0, 0, 0, 5.33333], "texture": "#0"},
"west": {"uv": [6.5, 6.66667, 8.5, 12], "texture": "#0"},
"up": {"uv": [0, 0, 0, 5.33333], "texture": "#0"},
"down": {"uv": [0, 0, 0, 5.33333], "texture": "#0"}
}
},
{
"from": [11.99, -4, 7],
"to": [11.99, 4, 15],
"faces": {
"north": {"uv": [0, 0, 0, 5.33333], "texture": "#0"},
"east": {"uv": [6.5, 6.66667, 8.5, 12], "texture": "#0"},
"south": {"uv": [0, 0, 0, 5.33333], "texture": "#0"},
"west": {"uv": [10.75, 9.33333, 12.75, 14.66667], "texture": "#0"},
"up": {"uv": [0, 0, 0, 5.33333], "texture": "#0"},
"down": {"uv": [0, 0, 0, 5.33333], "texture": "#0"}
}
},
{
"from": [4, 0, 7.01],
"to": [12, 4, 7.01],
"rotation": {"angle": 0, "axis": "y", "origin": [7, -3, 9]},
"faces": {
"north": {"uv": [10.75, 3.33333, 12.75, 6.66667], "texture": "#0"},
"east": {"uv": [0, 0, 0, 0.66667], "texture": "#0"},
"south": {"uv": [10.75, 6.66667, 12.75, 9.33333], "texture": "#0"},
"west": {"uv": [0, 0, 0, 0.66667], "texture": "#0"},
"up": {"uv": [0.25, 0, 0, 0], "texture": "#0"},
"down": {"uv": [0.25, 0, 0, 0], "texture": "#0"}
}
},
{
"from": [4, -3.99, 12],
"to": [12, -3.99, 15],
"faces": {
"north": {"uv": [0, 0, 2, 0], "texture": "#0"},
"east": {"uv": [0, 0, 0.75, 0], "texture": "#0"},
"south": {"uv": [0, 0, 2, 0], "texture": "#0"},
"west": {"uv": [0, 0, 0.75, 0], "texture": "#0"},
"up": {"uv": [10.75, 8.66667, 12.75, 6.66667], "texture": "#0"},
"down": {"uv": [10.75, 4.66667, 12.75, 6.66667], "texture": "#0"}
}
}
],
"display": {
"head": {
"translation": [0, 15.25, -6],
"scale": [1.9, 1.9, 1.9]
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 863 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

@@ -12,7 +12,7 @@
"requirements": [
{
"variant": "owner_held_item",
"itemCondition": "#c:tools/shears"
"itemCondition": "#c:tools/shear"
}
],
"effects": [
@@ -250,6 +250,10 @@ object CobblemonFabric : CobblemonImplementation {
EntityDataSerializers.registerSerializer(RideBoostsDataSerializer)
}
override fun registerArmorMaterials() {
CobblemonArmorMaterials.register { identifier, armorMaterial -> Registry.register(CobblemonArmorMaterials.registry, identifier, armorMaterial) }
}
override fun registerItems() {
CobblemonItems.register { identifier, item -> Registry.register(CobblemonItems.registry, identifier, item) }
CobblemonItemGroups.register { provider ->
+2 -2
View File
@@ -13,7 +13,7 @@ parchment_version = 2024.07.28@zip
java_version = 21
mod_id=cobblemon
mod_version=1.7.1
snapshot=false
mod_version=1.7.2
snapshot=true
fabric.loom.multiProjectOptimisation=false
@@ -9,21 +9,10 @@
package com.cobblemon.mod.neoforge
import com.cobblemon.mod.common.*
import com.cobblemon.mod.common.CobblemonRecipeCategories.COOKING_POT_COMPLEX_DISHES
import com.cobblemon.mod.common.CobblemonRecipeCategories.COOKING_POT_FOODS
import com.cobblemon.mod.common.CobblemonRecipeCategories.COOKING_POT_MEDICINES
import com.cobblemon.mod.common.CobblemonRecipeCategories.COOKING_POT_MISC
import com.cobblemon.mod.common.CobblemonRecipeCategories.COOKING_POT_SEARCH
import com.cobblemon.mod.common.CobblemonRecipeCategories.*
import com.cobblemon.mod.common.advancement.CobblemonCriteria
import com.cobblemon.mod.common.advancement.predicate.CobblemonEntitySubPredicates
import com.cobblemon.mod.common.api.net.serializers.IdentifierDataSerializer
import com.cobblemon.mod.common.api.net.serializers.NPCPlayerTextureSerializer
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
import com.cobblemon.mod.common.api.net.serializers.StringSetDataSerializer
import com.cobblemon.mod.common.api.net.serializers.UUIDSetDataSerializer
import com.cobblemon.mod.common.api.net.serializers.Vec3DataSerializer
import com.cobblemon.mod.common.api.net.serializers.*
import com.cobblemon.mod.common.item.group.CobblemonItemGroups
import com.cobblemon.mod.common.loot.LootInjector
import com.cobblemon.mod.common.particle.CobblemonParticles
@@ -42,13 +31,9 @@ import com.cobblemon.mod.neoforge.net.CobblemonNeoForgeNetworkManager
import com.cobblemon.mod.neoforge.permission.ForgePermissionValidator
import com.cobblemon.mod.neoforge.worldgen.CobblemonBiomeModifiers
import com.mojang.brigadier.arguments.ArgumentType
import java.util.Optional
import java.util.UUID
import net.minecraft.commands.synchronization.ArgumentTypeInfo
import net.minecraft.commands.synchronization.ArgumentTypeInfos
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.MinecraftServer
@@ -83,12 +68,7 @@ import net.neoforged.neoforge.client.event.RegisterRecipeBookCategoriesEvent
import net.neoforged.neoforge.common.ItemAbilities
import net.neoforged.neoforge.common.NeoForge
import net.neoforged.neoforge.common.NeoForgeMod
import net.neoforged.neoforge.event.AddPackFindersEvent
import net.neoforged.neoforge.event.AddReloadListenerEvent
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent
import net.neoforged.neoforge.event.LootTableLoadEvent
import net.neoforged.neoforge.event.OnDatapackSyncEvent
import net.neoforged.neoforge.event.RegisterCommandsEvent
import net.neoforged.neoforge.event.*
import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent
import net.neoforged.neoforge.event.entity.player.PlayerEvent
import net.neoforged.neoforge.event.entity.player.PlayerWakeUpEvent
@@ -101,6 +81,7 @@ import net.neoforged.neoforge.registries.NeoForgeRegistries
import net.neoforged.neoforge.registries.RegisterEvent
import net.neoforged.neoforge.server.ServerLifecycleHooks
import thedarkcolour.kotlinforforge.neoforge.forge.MOD_BUS
import java.util.*
import kotlin.reflect.KClass
@Mod(Cobblemon.MODID)
@@ -331,6 +312,16 @@ class CobblemonNeoForge : CobblemonImplementation {
}
}
override fun registerArmorMaterials() {
with(MOD_BUS) {
addListener<RegisterEvent> { event ->
event.register(CobblemonArmorMaterials.resourceKey) { helper ->
CobblemonArmorMaterials.register { identifier, armorMaterial -> helper.register(identifier, armorMaterial) }
}
}
}
}
override fun registerItems() {
with(MOD_BUS) {
addListener<RegisterEvent> { event ->