Compare commits

..
52 changed files with 407 additions and 720 deletions
+56 -7
View File
@@ -1,22 +1,71 @@
# Changelog
## [1.7.2 (MONTH Xth, YEAR)](#1-7-2)
## [1.7.1 (MONTH xth, 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.
### Changes
- Converted the riding freelook button to a configurable keybinding.
- Reduced the cost of the Vivichoke Seed trade with the Wandering Trader.
- Convert the riding freelook button to a configurable keybinding
- Reduced cost of the Vivichoke Seed trade with the Wandering Trader
- Add double tap to sprint on land mounts
- Add vanilla sprinting fov to pokemon land mounts
### Fixes
- 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.
- Prevent displaying ride controls overlay to passengers.
- Fixed player suffocation on vanilla mounts experienced on some worlds.
- Fixed Poké Snack spawning sounds not coming from the block.
- Fix player suffocation on vanilla mounts experienced on some worlds.
- Stop passengers from hearing the shiny noise of a ridden shiny Pokémon.
- Fixed incorrect camera pivot on Bird, Jet, and Dolphin mounts.
- Fixed Poké Snack spawning sound positioning.
- Ponigiri can no longer be eaten at full hunger.
- Medicinal Brew's Campfire Pot recipe now correctly displays that it can be made using an empty glass bottle or a filled bottle.
- Fixed a crash when you place a block in the way of hearty grains 2nd block
- Fixed a graphics crash that could occur on some machines when campfires were nearby.
- Fixed glass bottle not being returned when honey-ing a saccharine leaf block
- Fixed Combees not depositing honey upon leaving a hive if they entered with nectar.
- Fixed pastured Combees not moving in night or 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.
- Fixed crashing and rendering issues when opening a PC box with certain wallpapers.
- Fixed a crash when opening a PC box with certain wallpapers while using *VulkanMod*.
- Fixed a glitch where friendship would reset to the default value when evolving a Pokémon.
- Fixed a crashed related to NPC navigation.
- Fix player suffocation on vanilla mounts experienced on some worlds.
- Stop passengers from hearing the shiny noise of a ridden shiny Pokémon.
- Fixed friendship resetting to the default value when evolving a Pokémon.
- Fixed a bunch of incompatibilities with NeoForge mods
- Fixed a bug where wind charges hitting pasture blocks would recall all pokémon in it.
- Home on the Range advancement shouldn't trigger when opening the Pokemon Menu (shift interact one, mr changelog guy)
- Recipes using concrete should now work on NeoForge
- Fixed saccharine hanging signs sometimes dropping their oak wood counterpart when being broken
- Fix player suffocation on vanilla mounts experienced on some worlds
- Stop passengers from hearing the shiny noise of a ridden shiny pokemon
- Ponigiri can no longer be eaten at full hunger
- Medicinal Brew's Campfire Pot recipe now correctly displays that it can be made using an empty glass bottle or a filled bottle
- Fix incorrect camera pivot on Bird, Jet, and Dolphin mounts.
- Fix mount jumping so it doesn't switch back to ground animations
- Fix ridden pokemon land collision and weird step up issues. Land mounts are smoother overall now.
- Fixed Boltund's model
- Fixed Cyclizar's textures
- Fixed Furfrou's pink and magenta trims being swapped
### Developer
### Molang & Datapacks
- Removed automatic generation of PC wallpaper screen glow if no asset is provided; it is now optional.
### Particles
### Localization
- Updated translations for:
- Updated translations for:
- French
- Japanese
- Korean
- Brazilian Portuguese
- Simplified Chinese
- Traditional Chinese
-61
View File
@@ -1,61 +0,0 @@
# 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
@@ -19,6 +19,7 @@ import com.cobblemon.mod.common.mixin.accessor.TrackedEntityAccessor;
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateDriverInputPacket;
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateOrientationPacket;
import com.cobblemon.mod.common.net.messages.client.pokemon.update.ClientboundUpdateRidingStatePacket;
import com.cobblemon.mod.common.net.messages.client.riding.ClientboundGrabEntityPacket;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.network.protocol.Packet;
import net.minecraft.server.level.ChunkMap;
@@ -43,22 +44,27 @@ import java.util.function.Consumer;
@Mixin(ServerEntity.class)
public abstract class ServerEntityMixin {
@Shadow
@Final
private Consumer<Packet<?>> broadcast;
@Shadow
@Final
private Entity entity;
@Unique
private Matrix3f cobblemon$lastSentOrientation;
@Unique
private boolean cobblemon$lastSentActive;
@Shadow @Final private Consumer<Packet<?>> broadcast;
@Shadow @Final private Entity entity;
@Unique private Matrix3f cobblemon$lastSentOrientation;
@Unique private boolean cobblemon$lastSentActive;
@Unique private Entity cobblemon$lastSentGrabbedEntity;
@Inject(method = "sendChanges", at = @At("TAIL"))
private void cobblemon$sendChanges(CallbackInfo ci) {
cobblemon$sendOrientationChanges();
cobblemon$sendRidingStateChanges();
cobblemon$sendDriverInput();
cobblemon$sendGrabbedEntityChanges();
}
private void cobblemon$sendGrabbedEntityChanges() {
if (!(this.entity instanceof PokemonEntity pokemonEntity)) return;
if (pokemonEntity.getEntityHook() != cobblemon$lastSentGrabbedEntity) {
var entityId = pokemonEntity.getEntityHook() == null ? null : pokemonEntity.getEntityHook().getId();
cobblemon$broadcast(new ClientboundGrabEntityPacket(pokemonEntity.getId(), entityId));
cobblemon$lastSentGrabbedEntity = pokemonEntity.getEntityHook();
}
}
private void cobblemon$sendRidingStateChanges() {
@@ -22,10 +22,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(LivingEntityRenderer.class)
public class LivingEntityRendererMixin<T extends LivingEntity, M extends EntityModel<T>> {
@Inject(
method = "setupRotations",
at = @At("HEAD")
)
@Inject(method = "setupRotations", at = @At("HEAD"))
private void cobblemon$modifyRoll(LivingEntity entity, PoseStack poseStack, float bob, float yBodyRot, float partialTick, float scale, CallbackInfo ci) {
if (entity.isPassenger()) {
var vehicle = entity.getVehicle();
@@ -34,4 +31,5 @@ public class LivingEntityRendererMixin<T extends LivingEntity, M extends EntityM
}
}
}
}
@@ -194,7 +194,6 @@ object Cobblemon {
implementation.registerSoundEvents()
implementation.registerDataComponents()
implementation.registerBlocks()
implementation.registerArmorMaterials()
implementation.registerItems()
implementation.registerEntityTypes()
implementation.registerEntityAttributes()
@@ -1,53 +0,0 @@
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,8 +64,6 @@ interface CobblemonImplementation {
fun registerEntityDataSerializers()
fun registerArmorMaterials()
/**
* TODO
*
@@ -44,21 +44,16 @@ 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
@@ -506,6 +501,8 @@ 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")
@@ -895,8 +892,7 @@ 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")
@@ -907,20 +903,6 @@ 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
@@ -930,10 +912,14 @@ 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")
@@ -980,6 +966,8 @@ 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")
@@ -1004,6 +992,8 @@ 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")
@@ -1022,6 +1012,8 @@ 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")
@@ -1499,13 +1491,9 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
return item
}
private fun wearableItem(
name: String,
heldItemRemappedName: String? = null,
equipmentSlot: EquipmentSlot = EquipmentSlot.HEAD,
): CobblemonItem = create(
private fun wearableItem(name: String, heldItemRemappedName: String? = null): CobblemonItem = create(
name,
WearableItem(name, equipmentSlot).also {
WearableItem(name).also {
wearables.add(it)
if (heldItemRemappedName != null) {
CobblemonHeldItemManager.registerRemap(it, heldItemRemappedName)
@@ -1513,21 +1501,6 @@ 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)
@@ -45,6 +45,7 @@ import com.cobblemon.mod.common.client.net.pasture.UpdatePastureConflictFlagHand
import com.cobblemon.mod.common.client.net.pokedex.ServerConfirmedRegisterHandler
import com.cobblemon.mod.common.client.net.pokemon.update.ClientboundUpdateRidingStateHandler
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
import com.cobblemon.mod.common.client.net.riding.ClientboundGrabEntityHandler
import com.cobblemon.mod.common.client.net.riding.ClientboundUpdateDriverInputHandler
import com.cobblemon.mod.common.client.net.settings.OpenCobblemonConfigEditorHandler
import com.cobblemon.mod.common.client.net.settings.ServerSettingsPacketHandler
@@ -102,6 +103,7 @@ import com.cobblemon.mod.common.net.messages.client.pokemon.update.*
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.AddEvolutionPacket
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClearEvolutionsPacket
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.RemoveEvolutionPacket
import com.cobblemon.mod.common.net.messages.client.riding.ClientboundGrabEntityPacket
import com.cobblemon.mod.common.net.messages.client.settings.OpenCobblemonConfigScreenPacket
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2CPacket
@@ -184,6 +186,7 @@ import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetMarkingsPa
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.evolution.AcceptEvolutionPacket
import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket
import com.cobblemon.mod.common.net.messages.server.riding.GrabEntityPacket
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateDriverInputPacket
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateRiderRotationPacket
import com.cobblemon.mod.common.net.messages.server.starter.RequestStarterScreenPacket
@@ -239,6 +242,7 @@ import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetMarkingsHan
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetNicknameHandler
import com.cobblemon.mod.common.net.serverhandling.riding.DismountPokemonPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.DriverInputPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.GrabEntityPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.ServerboundUpdateRiderRotationHandler
import com.cobblemon.mod.common.net.serverhandling.starter.RequestStarterScreenHandler
import com.cobblemon.mod.common.net.serverhandling.starter.SelectStarterPacketHandler
@@ -490,6 +494,7 @@ object CobblemonNetwork {
// Riding
list.add(PacketRegisterInfo(ClientboundUpdateRidingStatePacket.ID, ClientboundUpdateRidingStatePacket::decode, ClientboundUpdateRidingStateHandler))
list.add(PacketRegisterInfo(ClientboundUpdateDriverInputPacket.ID, ClientboundUpdateDriverInputPacket::decode, ClientboundUpdateDriverInputHandler))
list.add(PacketRegisterInfo(ClientboundGrabEntityPacket.ID, ClientboundGrabEntityPacket::decode, ClientboundGrabEntityHandler))
// Debug
list.add(PacketRegisterInfo(OpenRidingStatsDebugGUIPacket.ID, OpenRidingStatsDebugGUIPacket::decode, OpenRidingStatsDebugGUIHandler))
@@ -600,6 +605,7 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(ServerboundUpdateRidingStatRangePacket.ID, ServerboundUpdateRidingStatRangePacket::decode, ServerboundUpdateRidingStatRangeHandler))
list.add(PacketRegisterInfo(ServerboundUpdateRidingSettingsPacket.ID, ServerboundUpdateRidingSettingsPacket::decode, ServerboundUpdateRidingSettingsHandler))
list.add(PacketRegisterInfo(DismountPokemonPacket.ID, DismountPokemonPacket::decode, DismountPokemonPacketHandler))
list.add(PacketRegisterInfo(GrabEntityPacket.ID, GrabEntityPacket::decode, GrabEntityPacketHandler))
list.add(PacketRegisterInfo(ServerboundUpdateDriverInputPacket.ID, ServerboundUpdateDriverInputPacket::decode, DriverInputPacketHandler))
list.add(PacketRegisterInfo(ServerboundUpdateRiderRotationPacket.ID, ServerboundUpdateRiderRotationPacket::decode, ServerboundUpdateRiderRotationHandler))
@@ -1,44 +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.api.ai.config.task
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
import com.cobblemon.mod.common.api.ai.WrapperLivingEntityTask
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.DefendOwnerTask
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.behavior.BehaviorControl
import net.minecraft.world.entity.ai.memory.MemoryModuleType
class DefendOwnerTaskConfig : SingleTaskConfig {
override fun getVariables(
entity: LivingEntity,
behaviourConfigurationContext: BehaviourConfigurationContext
): List<MoLangConfigVariable> {
return emptyList()
}
override fun createTask(
entity: LivingEntity,
behaviourConfigurationContext: BehaviourConfigurationContext
): BehaviorControl<in LivingEntity>? {
behaviourConfigurationContext.addMemories(
MemoryModuleType.ATTACK_TARGET,
CobblemonMemories.NEAREST_VISIBLE_ATTACKER,
)
return WrapperLivingEntityTask(
DefendOwnerTask.create(),
PokemonEntity::class.java
)
}
}
@@ -105,7 +105,6 @@ interface TaskConfig {
cobblemonResource("go_to_land") to GoToLandTaskConfig::class.java,
cobblemonResource("manage_flight_in_battle") to ManageFlightInBattleTaskConfig::class.java,
cobblemonResource("attack_hostile_mobs") to AttackHostileMobsTaskConfig::class.java,
cobblemonResource("defend_owner") to DefendOwnerTaskConfig::class.java,
cobblemonResource("move_to_sweet_berry_bush") to MoveToSweetBerryBushTaskConfig::class.java,
cobblemonResource("stop_moving_to_sweet_berry_bush") to StopTryingToReachSweetBerryBushTaskConfig::class.java,
cobblemonResource("harvest_sweet_berry_bush") to HarvestSweetBerryBushTaskConfig::class.java,
@@ -322,7 +322,7 @@ class JetBehaviour : RidingBehaviour<JetSettings, JetState> {
val pitchRot = handling * state.currMouseYForce.get()
// Roll
val rollRot = handling * state.currMouseXForce.get()
val rollRot = handling * 1.5 * state.currMouseXForce.get()
val mouseRotation = Vec3(0.0, pitchRot, rollRot)
@@ -88,6 +88,7 @@ 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,7 +10,6 @@ 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
@@ -264,36 +263,21 @@ class SaccharineLeafBlock(settings: Properties) : LeavesBlock(settings) {
val isGlassBottle = itemStack.`is`(Items.GLASS_BOTTLE)
val isHoneyBottle = itemStack.`is`(Items.HONEY_BOTTLE)
if (isGlassBottle && isAtMaxAge(state)) {
if (level.isClientSide) return ItemInteractionResult.SUCCESS
if (isGlassBottle && !isAtMinAge(state)) {
// Decrement stack if not in creative mode
itemStack.consume(1, player)
// 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)
}
// Give player honey bottle for now
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
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)
}
}
itemStack.consume(1, player)
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)
@@ -500,8 +500,11 @@ class PokemonClientDelegate : PosableState(), PokemonSideDelegate {
}
fun getSeatLocator(passenger: Entity): String {
if (this.getEntity().entityHook == passenger) {
return "entity_hook"
}
val seatIndex = this.getEntity().occupiedSeats.indexOf(passenger)
if (seatIndex == -1) throw IllegalArgumentException("Entity is not currently riding a seat")
if (seatIndex == -1) return "entity_hook"
return this.getEntity().rideProp.seats[seatIndex].locator ?: "seat_${seatIndex + 1}"
}
@@ -592,10 +592,6 @@ 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) {
@@ -606,8 +602,6 @@ 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()
}
@@ -39,6 +39,7 @@ object CobblemonKeyBinds {
val PARTY_OVERLAY_UP = this.queue(UpShiftPartyBinding)
val SEND_OUT_POKEMON = this.queue(PartySendBinding)
val RIDING_FREELOOK = this.queue(RidingFreelookBinding)
val GRAB_ENTITY = this.queue(GrabEntityBinding)
fun register(registrar: (KeyMapping) -> Unit) {
this.keyBinds.forEach(registrar::invoke)
@@ -0,0 +1,18 @@
package com.cobblemon.mod.common.client.keybind.keybinds
import com.cobblemon.mod.common.CobblemonNetwork
import com.cobblemon.mod.common.client.keybind.CobblemonBlockingKeyBinding
import com.cobblemon.mod.common.client.keybind.KeybindCategories
import com.cobblemon.mod.common.net.messages.server.riding.GrabEntityPacket
import com.mojang.blaze3d.platform.InputConstants
object GrabEntityBinding : CobblemonBlockingKeyBinding(
"key.cobblemon.grabentity",
InputConstants.Type.KEYSYM,
InputConstants.KEY_V,
KeybindCategories.COBBLEMON_CATEGORY
) {
override fun onPress() {
CobblemonNetwork.sendToServer(GrabEntityPacket())
}
}
@@ -0,0 +1,29 @@
package com.cobblemon.mod.common.client.net.riding
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateDriverInputPacket
import com.cobblemon.mod.common.net.messages.client.riding.ClientboundGrabEntityPacket
import net.minecraft.client.Minecraft
import net.minecraft.client.player.RemotePlayer
object ClientboundGrabEntityHandler : ClientNetworkPacketHandler<ClientboundGrabEntityPacket> {
override fun handle(packet: ClientboundGrabEntityPacket, client: Minecraft) {
client.executeIfPossible {
val level = client.level ?: return@executeIfPossible
val vehicle = level.getEntity(packet.vehicle) ?: return@executeIfPossible
val entity = packet.entity?.let { level.getEntity(it) }
val pokemon = vehicle as? PokemonEntity ?: return@executeIfPossible
if (entity == null) {
pokemon.entityHook?.stopRiding()
pokemon.entityHook = null
}
else {
pokemon.entityHook?.stopRiding()
entity.startRiding(pokemon, true)
pokemon.entityHook = entity
}
}
}
}
@@ -418,6 +418,7 @@ open class PokemonEntity(
var tickSpawned = 0
var occupiedSeats = arrayOfNulls<Entity>(seats.size)
var entityHook: Entity? = null
init {
delegate.initialize(this)
@@ -542,16 +543,14 @@ open class PokemonEntity(
if (level().isClientSide) {
MountedCameraTypeHandler.handleDismount(passenger, this)
}
if (entityHook == passenger) {
entityHook = null
}
super.removePassenger(passenger)
if (passengers.isEmpty()) {
ifRidingAvailable { _, _, state -> pokemon.rideStamina = state.stamina.get() }
ridingController?.context?.state?.reset()
ridingAnimationData.clear()
// reset riding orientation
if (this is OrientationControllable) {
this.orientationController.reset()
}
}
}
@@ -2173,10 +2172,15 @@ open class PokemonEntity(
}
override fun canAddPassenger(passenger: Entity): Boolean {
return passengers.size < seats.size
return entityHook == passenger || passengers.size < seats.size
}
public override fun addPassenger(passenger: Entity) {
if (entityHook == passenger) {
super.addPassenger(passenger)
return
}
if (passenger is ServerPlayer) {
// Recall all the rest of the player's party pokes
passenger.party()
@@ -2267,6 +2271,10 @@ open class PokemonEntity(
this.yBodyRot = this.yRot
this.passengers.filterIsInstance<LivingEntity>()
if (behaviour.key != cobblemonResource("air/bird") && entityHook != null) {
entityHook!!.stopRiding()
}
if (behaviour.isActive(settings, state, this) && behaviour.canJump(settings, state, this, driver)) {
if (this.jumpInputStrength > 0) {
//this.jump(this.jumpStrength, movementInput)
@@ -10,11 +10,8 @@ package com.cobblemon.mod.common.entity.pokemon.ai.sensors
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.getMemorySafely
import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.Mob
import net.minecraft.world.entity.ai.memory.MemoryModuleType
import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities
import net.minecraft.world.entity.ai.sensing.Sensor
@@ -31,17 +28,8 @@ class DefendOwnerSensor : Sensor<PokemonEntity>(10) {
}
private fun setNearestAttacker(entity: PokemonEntity, visibleMobs: NearestVisibleLivingEntities, owner: LivingEntity) {
val nearestAttacker = visibleMobs.findClosest { livingEntity ->
// Prevents Pokémons from attacking players as owned Pokémons are currently invulnerable
if (livingEntity is ServerPlayer) return@findClosest false
if (livingEntity.lastHurtMob == owner) return@findClosest true
if (livingEntity is Mob && livingEntity.target == owner) return@findClosest true
val mobAttackTarget = livingEntity.brain.getMemorySafely(MemoryModuleType.ATTACK_TARGET)
if (mobAttackTarget.isPresent && mobAttackTarget.get() == owner) return@findClosest true
return@findClosest false
val nearestAttacker = visibleMobs.findClosest { mob ->
mob.lastHurtMob == owner
}.map { mob -> mob as LivingEntity }
entity.brain.setMemory(CobblemonMemories.NEAREST_VISIBLE_ATTACKER, nearestAttacker)
@@ -10,10 +10,18 @@ package com.cobblemon.mod.common.entity.pokemon.ai.tasks
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.google.common.collect.ImmutableMap
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.entity.ai.behavior.Behavior
import net.minecraft.world.entity.ai.behavior.OneShot
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
import net.minecraft.world.entity.ai.behavior.declarative.Trigger
import net.minecraft.world.entity.ai.memory.MemoryModuleType
import net.minecraft.world.entity.ai.memory.MemoryStatus
import net.minecraft.world.entity.ai.memory.WalkTarget
import net.minecraft.world.entity.ai.targeting.TargetingConditions
object DefendOwnerTask {
fun create(): OneShot<PokemonEntity> {
@@ -13,10 +13,7 @@ import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.EquipmentSlot
import net.minecraft.world.item.Equipable
class WearableItem(
val name: String,
val armorEquipmentSlot: EquipmentSlot = EquipmentSlot.HEAD,
): CobblemonItem(Properties()), Equipable {
class WearableItem(val name: String): CobblemonItem(Properties()), Equipable {
companion object {
const val MODEL_PATH = "item/wearable"
}
@@ -24,7 +21,5 @@ class WearableItem(
fun getModel3d(): ResourceLocation = cobblemonResource("${MODEL_PATH}/${this.name}")
fun getModel2d(): ResourceLocation = cobblemonResource(this.name)
override fun getEquipmentSlot(): EquipmentSlot {
return armorEquipmentSlot
}
override fun getEquipmentSlot(): EquipmentSlot { return EquipmentSlot.HEAD }
}
@@ -0,0 +1,25 @@
package com.cobblemon.mod.common.net.messages.client.riding
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class ClientboundGrabEntityPacket internal constructor(
val vehicle: Int,
val entity: Int?
) : NetworkPacket<ClientboundGrabEntityPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeVarInt(vehicle)
buffer.writeNullable(entity) { _, v -> buffer.writeVarInt(v) }
}
companion object {
val ID = cobblemonResource("clientbound_grab_entity")
fun decode(buffer: RegistryFriendlyByteBuf): ClientboundGrabEntityPacket {
val vehicle = buffer.readVarInt()
val entity = buffer.readNullable { buffer.readVarInt() }
return ClientboundGrabEntityPacket(vehicle, entity)
}
}
}
@@ -0,0 +1,16 @@
package com.cobblemon.mod.common.net.messages.server.riding
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class GrabEntityPacket : NetworkPacket<GrabEntityPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {}
companion object {
val ID = cobblemonResource("grab_entity")
fun decode(buffer: RegistryFriendlyByteBuf) = GrabEntityPacket()
}
}
@@ -0,0 +1,55 @@
package com.cobblemon.mod.common.net.serverhandling.riding
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
import com.cobblemon.mod.common.client.MountedCameraTypeHandler
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.net.messages.server.riding.GrabEntityPacket
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.party
import net.minecraft.server.MinecraftServer
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.LivingEntity
object GrabEntityPacketHandler : ServerNetworkPacketHandler<GrabEntityPacket> {
override fun handle(
packet: GrabEntityPacket,
server: MinecraftServer,
player: ServerPlayer
) {
if (!(player.isPassenger && player.vehicle is PokemonEntity)) return
val pokemon = player.vehicle as PokemonEntity
if (pokemon.controllingPassenger == player) {
pokemon.ifRidingAvailable { behaviour, _, _ ->
if (behaviour.key == cobblemonResource("air/bird") && pokemon.entityHook == null) {
pokemon.level().getEntities(pokemon, pokemon.boundingBox.inflate(1.0, 1.0, 1.0)) { it is LivingEntity && it !is PokemonEntity && !pokemon.passengers.contains(it) }
.minByOrNull { it.distanceToSqr(pokemon) }
?.let { passenger ->
if (passenger is ServerPlayer) {
passenger.party()
.mapNotNull { it.entity }
.filter { it != this }
.forEach { it.recallWithAnimation() }
}
else if (pokemon.level().isClientSide) {
MountedCameraTypeHandler.handleMount(passenger, pokemon)
}
pokemon.entityHook = passenger
passenger.startRiding(pokemon)
}
}
else if (pokemon.entityHook != null) {
pokemon.entityHook!!.stopRiding()
}
}
}
}
private fun canPlayerStopRidingPokemon(pokemon: PokemonEntity, player: ServerPlayer): Boolean {
return pokemon.ifRidingAvailableSupply(false) { behaviour, settings, state ->
behaviour.canStopRiding(settings, state, pokemon, player)
}
}
}
@@ -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
@@ -1296,7 +1296,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
"3.4583": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1304,13 +1304,13 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.875": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.0833": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.0833": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"2.4167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"2.4167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"3.75": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"3.75": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1318,7 +1318,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"3.4583": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1326,7 +1326,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
"3.4583": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1334,13 +1334,13 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.875": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.0833": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.0833": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"2.4167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"2.4167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"3.75": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"3.75": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1348,7 +1348,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"3.4583": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1539,7 +1539,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
"3.4583": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1547,13 +1547,13 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.875": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.0833": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.0833": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"2.4167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"2.4167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"3.75": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"3.75": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1561,7 +1561,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"3.4583": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1578,7 +1578,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
"3.4583": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1586,13 +1586,13 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.875": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.0833": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.0833": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"2.4167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"2.4167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"3.75": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"3.75": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -1600,7 +1600,7 @@
"position": {
"0.0": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"3.4583": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"3.4583": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"4.25": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2241,7 +2241,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0.2]},
"0.875": {"pre": [0.2, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [-0.2, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2249,7 +2249,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0.2]},
"0.875": {"pre": [-0.2, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [0.2, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2257,7 +2257,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0]},
"0.4583": {"pre": [0.2, 0, 0], "post": [0, 0, 0]},
"0.4583": {"pre": [-0.2, 0, 0], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
@@ -2267,7 +2267,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.2]},
"1.0833": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2275,7 +2275,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.2]},
"1.0833": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2283,7 +2283,7 @@
"position": {
"0.0": [0, 0, 0],
"0.4583": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2291,9 +2291,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.4583": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.4583": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.2]},
"1.0833": {"pre": [-0.1, 0, -0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [0.1, 0, -0.2], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2302,7 +2302,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0]},
"0.4583": {"pre": [-0.2, 0, 0], "post": [0, 0, 0]},
"0.4583": {"pre": [0.2, 0, 0], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.0833": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
@@ -2313,9 +2313,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, 0.2]},
"0.4583": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"0.4583": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [0.1, 0, 0.2]},
"0.875": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"1.2083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2324,7 +2324,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, 0.2]},
"1.0833": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2332,7 +2332,7 @@
"position": {
"0.0": [0, 0, 0],
"0.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2340,9 +2340,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.4583": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.4583": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.2]},
"1.0833": {"pre": [0.1, 0, -0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [-0.1, 0, -0.2], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2630,7 +2630,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.2, 0, 0.2]},
"0.875": {"pre": [0.2, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [-0.2, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2638,7 +2638,7 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.2, 0, 0.2]},
"0.875": {"pre": [-0.2, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [0.2, 0, 0.2], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2646,7 +2646,7 @@
"position": {
"0.0": [0, 0, 0],
"0.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.1]},
"0.6667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2654,9 +2654,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.2]},
"0.4583": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"0.4583": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [-0.1, 0, 0.2]},
"0.875": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"1.2083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2665,7 +2665,7 @@
"position": {
"0.0": [0, 0, 0],
"0.4583": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2673,9 +2673,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, -0.2]},
"0.4583": {"pre": [-0.1, 0, -0.2], "post": [0, 0, 0]},
"0.4583": {"pre": [0.1, 0, -0.2], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.2]},
"1.0833": {"pre": [-0.1, 0, -0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [0.1, 0, -0.2], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2684,7 +2684,7 @@
"position": {
"0.0": [0, 0, 0],
"0.4583": {"pre": [0, 0, 0], "post": [0.1, 0, 0.1]},
"0.6667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2692,9 +2692,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, 0.2]},
"0.4583": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"0.4583": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [0.1, 0, 0.2]},
"0.875": {"pre": [-0.1, 0, 0.2], "post": [0, 0, 0]},
"0.875": {"pre": [0.1, 0, 0.2], "post": [0, 0, 0]},
"1.2083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2703,7 +2703,7 @@
"position": {
"0.0": [0, 0, 0],
"0.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -2711,9 +2711,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.2]},
"0.4583": {"pre": [0.1, 0, -0.2], "post": [0, 0, 0]},
"0.4583": {"pre": [-0.1, 0, -0.2], "post": [0, 0, 0]},
"0.6667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.2]},
"1.0833": {"pre": [0.1, 0, -0.2], "post": [0, 0, 0]},
"1.0833": {"pre": [-0.1, 0, -0.2], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -2997,9 +2997,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.9167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -3007,7 +3007,7 @@
"position": {
"0.0": [0, 0, 0],
"0.7083": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -3016,9 +3016,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.9167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -3026,7 +3026,7 @@
"position": {
"0.0": [0, 0, 0],
"0.7083": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -9026,6 +9026,12 @@
},
"finger_ground_outer_right2": {
"rotation": [40, 0, 0]
},
"entity_hook": {
"position": {
"0.0": [0, 0, 0],
"1.1667": [0, 4, 8]
}
}
}
},
@@ -11861,6 +11867,12 @@
"0.0": [0, 0, 0],
"2.2917": [0, 0, 0]
}
},
"entity_hook": {
"position": {
"0.0": [0, -2, 2],
"1.1667": [0, -1, 4]
}
}
}
},
@@ -12286,6 +12298,13 @@
},
"membrane_air_right4": {
"rotation": ["0-math.cos(q.anim_time*90*25)*0.75", 0, 0]
},
"entity_hook": {
"position": {
"0.0": [2, 0, 2],
"1.1667": [2, -2.14, 3],
"2.0417": [2, -2, 2]
}
}
}
},
@@ -12477,9 +12496,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.9167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -12487,7 +12506,7 @@
"position": {
"0.0": [0, 0, 0],
"0.7083": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -12496,9 +12515,9 @@
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"0.2917": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"0.2917": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.9167": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
@@ -12506,7 +12525,7 @@
"position": {
"0.0": [0, 0, 0],
"0.7083": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.6667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]},
"1.6667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]},
"1.9167": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.75": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
@@ -13030,13 +13049,13 @@
"eyelid_left": {
"position": {
"0.0": [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]}
}
},
"eyelid_right": {
"position": {
"0.0": [-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]}
}
}
}
@@ -299,14 +299,6 @@
"rotation": [0, 0, 15]
}
}
},
"animation.eelektrik.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.eelektrik.cry"
}
}
}
}
}
@@ -869,14 +869,6 @@
"position": [-0.1, 0, 0]
}
}
},
"animation.eelektross.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.eelektross.cry"
}
}
}
}
}
@@ -6,7 +6,7 @@
"identifier": "geometry.aerodactyl",
"texture_width": 256,
"texture_height": 256,
"visible_bounds_width": 12,
"visible_bounds_width": 13,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
@@ -1161,6 +1161,17 @@
{"origin": [6.5, -3.6, 5.25], "size": [1, 1, 1], "inflate": 0.25, "uv": [112, 82]}
]
},
{
"name": "entity_hook",
"parent": "left_upper_leg",
"pivot": [7, 14.65, 0],
"locators": {
"entity_hook": {
"offset": [3, -1, 8],
"rotation": [0, 45, -90]
}
}
},
{
"name": "right_upper_leg",
"parent": "body",
@@ -486,7 +486,7 @@
"parent": "eye_left",
"pivot": [4.2, 34.1, -10.53],
"cubes": [
{"origin": [4.98, 34.01, -10.53], "size": [3, 1, 1], "inflate": 0.01, "uv": [132, 116]}
{"origin": [4.98, 34, -10.53], "size": [3, 1, 1], "inflate": 0.01, "uv": [132, 116]}
]
},
{
@@ -782,7 +782,7 @@
"parent": "eye_right",
"pivot": [-4.2, 34.1, -10.53],
"cubes": [
{"origin": [-7.98, 34.01, -10.53], "size": [3, 1, 1], "inflate": 0.01, "uv": [140, 116]}
{"origin": [-7.98, 34, -10.53], "size": [3, 1, 1], "inflate": 0.01, "uv": [140, 116]}
]
},
{
@@ -8,7 +8,7 @@
"seat_1": [0, 0.45, 0]
},
"thirdPersonCameraOffset": {
"seat_1": [0, 0.35, 0],
"seat_1": [0, 0.35, 5],
"seat_1_reverse": [0, 0.35, 0]
},
"thirdPersonCameraOffsetNoViewBobbing": {
@@ -3847,9 +3847,6 @@
"cobblemon.behaviour.attack_hostile_mobs.name": "Attacks Hostile Mobs",
"cobblemon.behaviour.attack_hostile_mobs.desc": "Attacks hostile mobs that are nearby, even if unprovoked.",
"cobblemon.behaviour.defend_owner.name": "Defend Owner",
"cobblemon.behaviour.defend_owner.desc": "Defends its owner when they are attacked.",
"cobblemon.behaviour.pokemon_bee.name": "Pollinates Flowers",
"cobblemon.behaviour.pokemon_bee.desc": "Pollinates flowers and adds honey to hives and Saccharine tree leaves.",
@@ -1,235 +0,0 @@
{
"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.

Before

Width:  |  Height:  |  Size: 863 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 847 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 B

@@ -1,33 +0,0 @@
{
"name": "cobblemon.behaviour.defend_owner.name",
"description": "cobblemon.behaviour.defend_owner.desc",
"configurations": [
{
"type": "add_tasks_to_activity",
"activity": "core",
"tasksByPriority": {
"0": [
"defend_owner"
]
}
},
{
"type": "add_tasks_to_activity",
"activity": "idle",
"tasksByPriority": {
"1": [
"switch_to_fight"
]
}
},
{
"type": "add_tasks_to_activity",
"activity": "fight",
"tasksByPriority": {
"3": [
"switch_from_fight"
]
}
}
]
}
@@ -17,26 +17,10 @@
},
{
"type": "apply_behaviours",
"condition": "!q.entity.is_wild && (q.entity.is_pastured && q.entity.pasture_conflict_enabled == 1)",
"condition": "!q.entity.is_wild && (q.entity.is_pastured && q.entity.pasture_conflict_enabled == 1) || (q.entity.is_in_party && q.entity.behaviour.combat.will_defend_owner)",
"behaviours": [
"cobblemon:attack_hostile_mobs"
]
},
{
"type": "apply_behaviours",
"condition": "!q.entity.is_wild && q.entity.is_in_party && q.entity.behaviour.combat.will_defend_owner",
"behaviours": [
"cobblemon:defend_owner"
]
},
{
"type": "add_memories_and_sensors",
"condition": "!q.entity.is_wild && q.entity.is_in_party && q.entity.behaviour.combat.will_defend_owner",
"memories": [
"cobblemon:nearest_visible_attacker"
],
"sensors": [
"cobblemon:pokemon_owner_under_attack"
"cobblemon:attack_hostile_mobs",
"cobblemon:fights_melee"
]
}
]
@@ -12,7 +12,7 @@
"requirements": [
{
"variant": "owner_held_item",
"itemCondition": "#c:tools/shear"
"itemCondition": "#c:tools/shears"
}
],
"effects": [
@@ -4,7 +4,7 @@
"deccelRate": "0.005",
"minSpeedFactor": "0.50",
"handlingYawExpr": "q.get_ride_stats('SKILL', 'AIR', 50.0, 25.0)",
"handlingExpr": "q.get_ride_stats('SKILL', 'AIR', 120.0, 15.0)",
"handlingExpr": "q.get_ride_stats('SKILL', 'AIR', 80.0, 10.0)",
"speedExpr": "q.get_ride_stats('SPEED', 'AIR', 24.0, 4.0)",
"accelerationExpr": "q.get_ride_stats('ACCELERATION', 'AIR', 2.0, 8.0)",
"jumpExpr": "q.get_ride_stats('JUMP', 'AIR', 2.0, 1.0)",
@@ -21,11 +21,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -46,11 +41,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -88,11 +78,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -21,11 +21,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -46,11 +41,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -88,11 +78,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -24,11 +24,6 @@
"neededNearbyBlocks": [
"minecraft:water"
]
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -86,11 +81,6 @@
"#cobblemon:is_overworld"
],
"maxY": 32
},
"anticondition": {
"biomes": [
"#cobblemon:is_deep_dark"
]
}
},
{
@@ -250,10 +250,6 @@ 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 ->
+1 -1
View File
@@ -13,7 +13,7 @@ parchment_version = 2024.07.28@zip
java_version = 21
mod_id=cobblemon
mod_version=1.7.2
mod_version=1.7.1
snapshot=true
fabric.loom.multiProjectOptimisation=false
@@ -9,10 +9,21 @@
package com.cobblemon.mod.neoforge
import com.cobblemon.mod.common.*
import com.cobblemon.mod.common.CobblemonRecipeCategories.*
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.advancement.CobblemonCriteria
import com.cobblemon.mod.common.advancement.predicate.CobblemonEntitySubPredicates
import com.cobblemon.mod.common.api.net.serializers.*
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.item.group.CobblemonItemGroups
import com.cobblemon.mod.common.loot.LootInjector
import com.cobblemon.mod.common.particle.CobblemonParticles
@@ -31,9 +42,13 @@ 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
@@ -68,7 +83,12 @@ 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.*
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.entity.EntityAttributeCreationEvent
import net.neoforged.neoforge.event.entity.player.PlayerEvent
import net.neoforged.neoforge.event.entity.player.PlayerWakeUpEvent
@@ -81,7 +101,6 @@ 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)
@@ -312,16 +331,6 @@ 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 ->