Compare commits

...
14 changed files with 285 additions and 85 deletions
@@ -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))
@@ -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)
@@ -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]}
}
}
}
@@ -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",
@@ -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": {