Compare commits

..
1 Commits
31 changed files with 345 additions and 292 deletions
+42 -32
View File
@@ -1,53 +1,63 @@
# Changelog
## [1.7.1 (November 29th, 2025)](#1-7-1)
## [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.
- 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.
- 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 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.
- 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. 500 bee bugs. Bugged bees? We can be bees. Mark, this is good news.
- Fixed a crash related to NPC navigation.
- 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 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 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.
- This is because there's no practical way to do this without blowing up things like *VulkanMod*.
### Particles
@@ -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
}
}
}
}
@@ -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)
@@ -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}"
}
@@ -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,6 +543,9 @@ 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() }
@@ -2168,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()
@@ -2262,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> {
@@ -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)
}
}
}
@@ -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,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"
]
}
]
@@ -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"
]
}
},
{
+1 -1
View File
@@ -14,6 +14,6 @@ java_version = 21
mod_id=cobblemon
mod_version=1.7.1
snapshot=false
snapshot=true
fabric.loom.multiProjectOptimisation=false