Compare commits

..
50 Commits
Author SHA1 Message Date
Plastered_Crab a1dcede488 Fix bug with spawn files 2024-11-14 12:43:10 -08:00
Plastered_Crab aaec9ea397 Merge remote-tracking branch 'origin/1.6-spawns' into 1.6-Release-Testing 2024-11-14 09:31:33 -08:00
Veraxiel 5011607415 Updated submerged and fishing spawns to work under overhangs. 2024-11-14 06:29:10 -05:00
Veraxiel 580b0f2ccf Updated spawn files. Edited ocean_monument preset. Edited is_lush, is_ocean, and is_shrubland tags. Fixed revival_herbs feature tag. Updated spawn writer. 2024-11-14 05:15:14 -05:00
Hiroku fcd3951815 Merge branch 'More-structure-adjustments' into 'main'
Making more changes to structures

See merge request cable-mc/cobblemon!1291
2024-11-14 09:02:25 +00:00
Hiroku 5caa6d5950 Merge branch 'ihatebugtypes' into 'main'
faint (kill) all bug types

Closes #1153 and #1157

See merge request cable-mc/cobblemon!1276
2024-11-14 08:57:42 +00:00
Segfault Guy 352ac4e15d faint (kill) all bug types 2024-11-14 08:57:42 +00:00
Hiroku e6d35e709e Merge branch 'Myslippy-main-patch-53217' into 'main'
Update CHANGELOG.md

See merge request cable-mc/cobblemon!1292
2024-11-14 08:56:04 +00:00
Myslippy 83cfcdce43 Update CHANGELOG.md 2024-11-14 05:25:44 +00:00
Slippy 96ae28ea91 Making more changes to structures 2024-11-13 23:14:12 -06:00
Landon 062fd2451a Merge branch 'Cynthia-Test-NPC-Change' into 'main'
Cynthia NPC team update

See merge request cable-mc/cobblemon!1289
2024-11-14 02:27:44 +00:00
Landon 235de329ee Merge branch 'main' into 'main'
Switch tooltip rendering to check Hide Additional instead

See merge request cable-mc/cobblemon!1279
2024-11-14 02:27:03 +00:00
Landon aede012933 Merge branch 'Fishing_Bait_Changes' into 'main'
New Bait Effects + Karp jump aspect name fixes

See merge request cable-mc/cobblemon!1287
2024-11-14 02:24:19 +00:00
Landon 1613cd281d Merge branch 'Swappable_Rod_Bobbers' into 'main'
Pokerods can Swap bobbers now

See merge request cable-mc/cobblemon!1288
2024-11-14 02:22:20 +00:00
Landon 706fcc8ca4 Merge branch 'init-events' into 'main'
Add Initialisation Events for Sidemod Devs

See merge request cable-mc/cobblemon!1290
2024-11-14 02:21:18 +00:00
Xander Forrest 5568bb6a95 add two new initialisation events for sidemod devs to hook into
- pokemon properties initialised event
so people can register their CustomPokemonProperty(s) at the right time so they can take effect in things like NPCs - previously not an issue because PokemonProperties were only really parsed post server start

- cobblemon initialised event
generic event because we got rid of the Cobblemon server started event. nice for sidemods to hook into so they know when they can init stuff that depends on cobblemon stuff being initialised (for instance: grab species/load mons from config files)
2024-11-14 00:17:48 +00:00
Plastered_Crab d5f22e7394 Test Cynthia NPC has lvl 100 mons now with updated Spiritomb 2024-11-13 15:37:57 -08:00
Test 0dc8456623 fix symbols 2024-11-13 23:30:39 +00:00
Plastered_Crab f5228db99f - Fix Tooltips for bait
- Add lang-able Egg Group tooltips
- Updated Egg Group bait logic
2024-11-13 15:19:33 -08:00
Plastered_Crab de8ebc9fcb - Fix Tooltips for bait
- Add lang-able Egg Group tooltips
- Updated Egg Group bait logic
2024-11-13 11:06:54 -08:00
Apion 093e0f2811 Merge branch 'more-dfu-sad' into 'main'
Fixes for JSON Pokemon store

See merge request cable-mc/cobblemon!1285
2024-11-13 16:07:10 +00:00
Apion 1a782e4185 Fixes for JSON Pokemon store 2024-11-13 16:07:10 +00:00
Apion 2e054dd5e1 Merge branch 'lang-updates' into 'main'
Weblate translations

See merge request cable-mc/cobblemon!1286
2024-11-13 16:07:02 +00:00
Apion 5e47102c10 Weblate translations 2024-11-13 16:07:02 +00:00
Apion e56a7d5325 Merge branch 'move-effects' into 'main'
Added particles for some moves.

See merge request cable-mc/cobblemon!1283
2024-11-13 16:00:39 +00:00
Tyzillion 9b8261d23b Added particles for some moves. 2024-11-13 16:00:39 +00:00
Apion e1705056f2 Merge branch 'shiny-shimmering-splendid' into 'main'
🍋‍🟩 API Feature: Shiny chance event and player context

See merge request cable-mc/cobblemon!1274
2024-11-13 15:48:16 +00:00
Briar 76db87d9a5 🍋‍🟩 API Feature: Shiny chance event and player context 2024-11-13 15:48:15 +00:00
plastered_crab 780d9ece59 - Add bait for luring ElementalType and Egg Group
- Fix names for Jump Karps
- Alter langs and tooltips for new bait
2024-11-13 01:14:14 -08:00
Stampede 4b55783785 Switch tooltip rendering to check Hide Additional instead 2024-11-11 12:15:16 -06:00
Paul e3fca67d52 Fixed NPCs and other stuff not rendering 2024-11-11 11:09:16 +10:00
Hiroku 932cdaaad3 Merge branch 'updated-tags' into 'main'
More Tag Changes, but this time with Edits!

See merge request cable-mc/cobblemon!1273
2024-11-10 23:41:15 +00:00
Paul e3f9937e78 Merge remote-tracking branch 'origin/main' 2024-11-11 09:40:49 +10:00
Paul 5b46d04c27 Reduce impact of repeatedly searching for a pokemon in a PC 2024-11-11 09:40:39 +10:00
dhi_holo c23aeaba78 Merge branch 'main' into updated-tags 2024-11-11 09:16:01 +10:00
Hiroku ecff621084 Merge branch 'DexScannerXrayVisionBegone' into 'main'
DexScannerXrayVisionBegone

See merge request cable-mc/cobblemon!1275
2024-11-10 22:08:53 +00:00
JazzMcNade 83ce63325d Dex scanner now checks for block collision. 2024-11-10 13:34:30 -06:00
dhi_holo 4f33612bbb Merge branch 'main' into updated-tags 2024-11-10 20:49:23 +10:00
dhi_holo 4624faf63e More Tag Changes, but this time with Edits!
Noticed a couple structures weren't in their tags yet, very fast fixing (don't you love it when you get a branch merged to immediately notice something else that could've been in the MR? I sure do)
2024-11-10 20:46:31 +10:00
Hiroku 187674afb6 Merge branch 'implement_pokemon' into 'main'
Latest implement fixes/changes/additions

Closes #1137

See merge request cable-mc/cobblemon!1271
2024-11-10 10:39:29 +00:00
Carmendar fe5cf5a7d8 Latest implement fixes/changes/additions 2024-11-10 10:39:28 +00:00
Hiroku 3b3219ba69 Merge branch 'one-tag' into 'main'
Create fishing_boat.json

See merge request cable-mc/cobblemon!1272
2024-11-10 10:38:44 +00:00
dhi_holo 0e98b07b7b Create fishing_boat.json
I spent too damn long messing up the structure ids for this
2024-11-10 20:19:33 +10:00
Apion 57d380e18f Merge branch 'HiddenAbilityEvolutionFix' into 'main'
Hidden Ability Evolution Fix

Closes #1149

See merge request cable-mc/cobblemon!1270
2024-11-10 04:21:33 +00:00
JazzMcNade 086cdcdbd1 Hidden Ability Evolution Fix 2024-11-10 04:21:32 +00:00
Apion 2b796f7e4c Merge branch 'npc-fixo' into 'main'
Allow simple NPC parties to be static, added autoHealParty property to NPC...

See merge request cable-mc/cobblemon!1266
2024-11-10 03:58:09 +00:00
Hiroku b7d1f9bb2d Allow simple NPC parties to be static, added autoHealParty property to NPC... 2024-11-10 03:58:09 +00:00
Hiroku ba0f0657b2 Merge branch 'particle-hotfix' into 'main'
Fix default behavior of EntityParticlesActionEffectKeyframe to prioritize the...

See merge request cable-mc/cobblemon!1263
2024-11-10 02:48:22 +00:00
apion 8f59ec871f Fixed compile issue 2024-11-09 21:21:40 -05:00
apion b3d4306165 Remove backward compat with old locator field in EntityParticlesActionEffectKeyframe 2024-11-09 21:17:46 -05:00
753 changed files with 30754 additions and 2865 deletions

No files matched your search

+10 -1
View File
@@ -18,6 +18,7 @@
- Moves impacted by the abilities Pixelate, Refrigerate, Aerilate, Galvanize, and Normalize now display as their altered typing.
- Added Polished Tumblestone and Tumblestone Brick block sets from Tumblestone, Black Tumblestone, and Sky Tumblestone.
- Added Metronome, Protective Pads, Punching Glove, Room Service, Scope Lens, Shed Shell, Terrain Extender, Throat Spray, Utility Umbrella, Wide Lens, and Zoom Lens held items
- Added particles for moves: Watersport, Mud Sport, and Psychic.
- Added Fire, Water, Thunder, Leaf, Ice, Sun, Moon, Shiny, Dawn, and Dusk Stone storage blocks.
- Added Eject Pack, Metronome, Protective Pads, Punching Glove, Room Service, Scope Lens, Shed Shell, Terrain Extender, Throat Spray, Utility Umbrella, Wide Lens, and Zoom Lens held items
- Added `stonjourner_henge_ruins`, `luna_henge_ruins`, and `sol_henge_ruins` structures.
@@ -31,10 +32,14 @@
- New config setting `displayEntityNameLabel` and `displayEntityLabelsWhenCrouchingOnly` to control what and when is displayed for the pokemon label
- `/freezepokemon` command to pause a Pokémon's animation at a specific point in time.
- Added `no_ai` and `freeze_frame` options to the `/spawnpokemon` command.
- Added `moves` option to Pokémon properties, allowing you to set the moves of a Pokémon in commands and spawn files using comma-separated move names.
- Added shiny Pokémon effects.
- Added effects for the burn status effect.
- Added effects for the moves: Psychic, Water Sport, and Mud Sport.
- Added a new universal locator called "top".
- Added `moves` option to Pokémon properties, allowing you to set the moves of a Pokémon in commands and spawn files using comma-separated move names.
- Added shiny Pokémon effects.
- Added effects for the burn status effect.
- Added effects for the moves: Seismic Toss, Withdraw, Bite, Crunch, Super Fang, Hyper Fang, Pursuit, Mist, Haze, Lick, Kinesis, Psychic, Water Sport, and Mud Sport.
- Added a new universal locator called `top`.
- Added shiny Pokémon particles with sound effects.
- Added animation for trading.
@@ -42,6 +47,8 @@
- Added `/spawnnpc` and `/spawnnpcat` commands.
- Pokémon are now animated when seen in any GUI that isn't the party GUI.
- Quirk animations can now occur for Pokémon that are shoulder mounted.
- Added `fishing boat` structures that contain a map to a shipwreck cove and a pokerod smithing template.
- Added `submerged_shipwreck_cove` and `lush_shipwreck_cove` structures.
### Pokémon Added
#### Gen 1
@@ -394,6 +401,7 @@
- Fixed text row selection highlight in battle log.
- Fixed top black border rendering in scroll interfaces in summary UI.
- Fixed aspect tracking for Advancements.
- Fixed illusion not copying aspects or caught ball.
### Developer
- `SpawnCause` is now an implementation of `SpawningInfluence`.
@@ -424,6 +432,7 @@
- Pokémon Heal (with context)
- Added HealingSource, an interface applied to all sources of healing from player actions, for easier tracking of healing sources.
- Move Change
- Shiny Chance Calculation Event (with player context)
- Rebuilt large swaths of the model animation code to simplify it.
- Renamed a bunch of things from %Poseable% to %Posable% because spelling.
- Renamed StatelessAnimation to PoseAnimation.
@@ -286,6 +286,8 @@ object Cobblemon {
CustomPokemonProperty.register(FreezeFrameProperty)
CustomPokemonProperty.register(NoAIProperty)
CobblemonEvents.POKEMON_PROPERTY_INITIALISED.emit()
ifDedicatedServer {
isDedicatedServer = true
}
@@ -386,6 +388,9 @@ object Cobblemon {
}
registerEventHandlers()
CobblemonEvents.COBBLEMON_INITIALISED.emit()
}
fun registerEventHandlers() {
@@ -26,7 +26,7 @@ import net.minecraft.nbt.NbtOps
* @author Qu
* @since January 9th, 2022
*/
open class Ability internal constructor(var template: AbilityTemplate, forced: Boolean) {
open class Ability internal constructor(var template: AbilityTemplate, forced: Boolean, priority: Priority) {
val name: String
get() = template.name
@@ -57,7 +57,7 @@ open class Ability internal constructor(var template: AbilityTemplate, forced: B
*
* @see [Pokemon.updateAbility].
*/
var priority = Priority.LOWEST
var priority = priority
internal set
@Deprecated("Please use the Codec instead", ReplaceWith("Ability.CODEC"))
@@ -111,7 +111,7 @@ open class Ability internal constructor(var template: AbilityTemplate, forced: B
Codec.BOOL.optionalFieldOf(DataKeys.POKEMON_ABILITY_FORCED, false).forGetter(Ability::forced),
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ABILITY_INDEX, -1).forGetter(Ability::index),
Priority.CODEC.optionalFieldOf(DataKeys.POKEMON_ABILITY_PRIORITY, Priority.LOWEST).forGetter(Ability::priority)
).apply(it) { template, forced, index, priority -> Ability(template, forced).apply {
).apply(it) { template, forced, index, priority -> Ability(template, forced, priority).apply {
this.index = index
this.priority = priority
} }
@@ -8,6 +8,7 @@
package com.cobblemon.mod.common.api.abilities
import com.cobblemon.mod.common.api.Priority
import com.cobblemon.mod.common.util.codec.CodecUtils
import com.google.gson.JsonObject
import com.mojang.serialization.Codec
@@ -21,14 +22,14 @@ import net.minecraft.nbt.CompoundTag
*/
class AbilityTemplate(
val name: String = "",
var builder: (AbilityTemplate, forced: Boolean) -> Ability = { template, forced -> Ability(template, forced) },
var builder: (AbilityTemplate, forced: Boolean, priority: Priority) -> Ability = { template, forced, priority -> Ability(template, forced, priority) },
val displayName: String = "cobblemon.ability.$name",
val description: String = "cobblemon.ability.$name.desc"
) {
/**
* Returns the Ability or if applicable the extension connected to this template
*/
fun create(forced: Boolean = false) = builder(this, forced)
fun create(forced: Boolean = false, priority: Priority = Priority.LOWEST) = builder(this, forced, priority)
/**
* Returns the Ability and loads the given NBT Tag into it.
@@ -0,0 +1,19 @@
/*
* 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.battles.interpreter
import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
/**
* An exception thrown when properties from a [BattleMessage] cannot be interpreted for an [InterpreterInstruction].
*
* @author Segfault Guy
* @since November 10th, 2024
*/
class InvalidInstructionException(battleMessage: BattleMessage) : Exception("Failed to interpret ${battleMessage.rawMessage}")
@@ -8,11 +8,13 @@
package com.cobblemon.mod.common.api.entity.pokemon
import com.cobblemon.mod.common.api.pokeball.PokeBalls
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.entity.pokemon.effects.IllusionEffect
import com.cobblemon.mod.common.entity.pokemon.effects.TransformEffect
import com.cobblemon.mod.common.pokeball.PokeBall
import com.cobblemon.mod.common.pokemon.FormData
import com.cobblemon.mod.common.pokemon.Species
import com.cobblemon.mod.common.util.DataKeys
@@ -95,4 +97,7 @@ interface MocKEffect : PhysicalEffect {
get() = this.mock.form?.let {
formID -> this.exposedSpecies?.forms?.firstOrNull { it.formOnlyShowdownId().equals(formID, true) } }
?: this.exposedSpecies?.standardForm
val exposedBall: PokeBall?
get() = this.mock.pokeball?.let { PokeBalls.getPokeBall(it.asIdentifierDefaultingNamespace()) }
}
@@ -54,6 +54,10 @@ import net.minecraft.server.level.ServerPlayer
@Suppress("unused")
object CobblemonEvents {
@JvmField
val POKEMON_PROPERTY_INITIALISED = SimpleObservable<Unit>()
@JvmField
val COBBLEMON_INITIALISED = SimpleObservable<Unit>()
@JvmField
val DATA_SYNCHRONIZED = SimpleObservable<ServerPlayer>()
@JvmField
@@ -129,6 +133,8 @@ object CobblemonEvents {
val POKEMON_ENTITY_SAVE_TO_WORLD = CancelableObservable<PokemonEntitySaveToWorldEvent>()
@JvmField
val ENTITY_SPAWN = CancelableObservable<SpawnEvent<*>>()
@JvmField
val SHINY_CHANCE_CALCULATION = EventObservable<ShinyChanceCalculationEvent>()
@JvmField
val POKEMON_ENTITY_SPAWN = ENTITY_SPAWN
@@ -0,0 +1,57 @@
/*
* 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.events.pokemon
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.server.level.ServerPlayer
/**
* An event to modify the shiny chance of a Pokémon.
*/
class ShinyChanceCalculationEvent(
val baseChance: Float,
val pokemon: Pokemon
) {
val chance: Float = baseChance
var isShiny: Boolean = false
private val modifiers = mutableListOf<Float>()
private val modificationFunctions = mutableListOf<(Float, ServerPlayer?, Pokemon) -> Float>()
/**
* Adds a modifier to the shiny chance.
*/
fun addModifier(modifier: Float) {
modifiers.add(modifier)
}
/**
* Adds a function to modify the shiny chance.
*/
fun addModificationFunction(function: (Float, ServerPlayer?, Pokemon) -> Float) {
modificationFunctions.add(function)
}
/**
* Calculates the shiny chance of a Pokémon.
*/
fun calculate(player: ServerPlayer?): Float {
var result = baseChance
for (modifier in modifiers) {
result += modifier
}
for (function in modificationFunctions) {
result = function(result, player, pokemon)
}
return result
}
fun isShiny(player: ServerPlayer?): Boolean {
return calculate(player) >= chance || isShiny
}
}
@@ -16,6 +16,7 @@ import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.Registry
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.ListTag
import net.minecraft.nbt.StringTag
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.Entity
import net.minecraft.world.item.Item
@@ -87,7 +88,8 @@ data class FishingBait(
val BITE_TIME = cobblemonResource("bite_time")
val GENDER_CHANCE = cobblemonResource("gender_chance")
val LEVEL_RAISE = cobblemonResource("level_raise")
val TERA = cobblemonResource("tera")
val TYPING = cobblemonResource("typing")
val EGG_GROUP = cobblemonResource("egg_group")
val SHINY_REROLL = cobblemonResource("shiny_reroll")
val HIDDEN_ABILITY_CHANCE = cobblemonResource("ha_chance")
val POKEMON_CHANCE = cobblemonResource("pokemon_chance")
@@ -108,7 +110,6 @@ data class FishingBait(
EFFECT_FUNCTIONS[SHINY_REROLL] = { entity, effect -> FishingSpawnCause.shinyReroll(entity, effect) }
EFFECT_FUNCTIONS[GENDER_CHANCE] = { entity, effect -> FishingSpawnCause.alterGenderAttempt(entity, effect) }
EFFECT_FUNCTIONS[LEVEL_RAISE] = { entity, effect -> FishingSpawnCause.alterLevelAttempt(entity, effect) }
EFFECT_FUNCTIONS[TERA] = { entity, effect -> FishingSpawnCause.alterTeraAttempt(entity, effect) }
EFFECT_FUNCTIONS[HIDDEN_ABILITY_CHANCE] = { entity, _ -> FishingSpawnCause.alterHAAttempt(entity) }
EFFECT_FUNCTIONS[FRIENDSHIP] = { entity, effect -> FishingSpawnCause.alterFriendshipAttempt(entity, effect) }
CobblemonEvents.BAIT_EFFECT_REGISTRATION.post(BaitEffectFunctionRegistryEvent()) { event ->
@@ -11,12 +11,14 @@ package com.cobblemon.mod.common.api.moves.animations.keyframes
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.api.moves.animations.EntityProvider
import com.cobblemon.mod.common.api.moves.animations.TargetsProvider
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
import com.cobblemon.mod.common.api.scheduling.delayedFuture
import com.cobblemon.mod.common.entity.PosableEntity
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import net.minecraft.commands.arguments.EntityArgument.getPlayers
import java.util.concurrent.CompletableFuture
import net.minecraft.server.level.ServerLevel
@@ -29,9 +31,7 @@ import net.minecraft.server.level.ServerLevel
class EntityParticlesActionEffectKeyframe : ConditionalActionEffectKeyframe(), EntityConditionalActionEffectKeyframe {
override val entityCondition = "q.entity.is_user".asExpressionLike()
var effect: String? = null
@Deprecated("Use the locators property instead", ReplaceWith("locators"))
var locator: String = "root"
var locators: Set<String> = setOf("root")
var locators: List<String> = listOf("target")
val delay: ExpressionLike = "0".asExpressionLike()
val visibilityRange = 200
@@ -48,7 +48,7 @@ class EntityParticlesActionEffectKeyframe : ConditionalActionEffectKeyframe(), E
}?.asIdentifierDefaultingNamespace() ?: return skip()
entities.filter { it is PosableEntity }.forEach { entity ->
val packet = SpawnSnowstormEntityParticlePacket(effectIdentifier, entity.id, (locators + locator).toList())
val packet = SpawnSnowstormEntityParticlePacket(effectIdentifier, entity.id, (locators).toList())
val players = (entity.level() as ServerLevel).getPlayers { it.distanceTo(entity) <= visibilityRange }
packet.sendToPlayers(players)
}
@@ -47,6 +47,7 @@ class NPCClass {
var variables = mutableMapOf<String, MoValue>() // Questionable whether this should be here.
var party: NPCPartyProvider? = null
var skill: Int = 0
var autoHealParty: Boolean = false
var battleTheme: ResourceLocation? = null
var ai: MutableList<BrainConfig> = mutableListOf()
@@ -77,6 +78,7 @@ class NPCClass {
buffer.writeString(v.defaultValue)
}
buffer.writeInt(skill)
buffer.writeBoolean(autoHealParty)
buffer.writeMapK(size = IntSize.U_BYTE, map = variables) { (key, value) ->
buffer.writeString(key)
buffer.writeString(value.asString())
@@ -116,6 +118,7 @@ class NPCClass {
NPCConfigVariable(variableName, displayName, description, type, defaultValue)
}.toMutableList()
skill = buffer.readInt()
autoHealParty = buffer.readBoolean()
buffer.readMapK(size = IntSize.U_BYTE, map = variables) {
val key = buffer.readString()
val value = buffer.readString()
@@ -29,6 +29,7 @@ class NPCPreset {
var hitbox: EntityDimensions? = null
var ai: List<BrainConfig>? = null
var skill: Int? = null
var autoHealParty: Boolean? = null
var battleTheme: ResourceLocation? = null
fun applyTo(npcClass: NPCClass) {
@@ -47,6 +48,7 @@ class NPCPreset {
names?.let { npcClass.names.addAll(it) }
hitbox?.let { npcClass.hitbox = it }
skill?.let { npcClass.skill = it }
autoHealParty?.let { npcClass.autoHealParty = it }
battleTheme?.let { npcClass.battleTheme = it }
ai?.let { npcClass.ai.addAll(it) }
}
@@ -8,15 +8,15 @@
package com.cobblemon.mod.common.api.npc.configuration
import com.cobblemon.mod.common.api.npc.NPCPartyProvider
import com.cobblemon.mod.common.util.DataKeys
import net.minecraft.nbt.CompoundTag
import net.minecraft.network.RegistryFriendlyByteBuf
class NPCBattleConfiguration {
var canChallenge = false
var party: NPCPartyProvider? = null
@Deprecated("This is not likely to get used")
var simultaneousBattles = false
@Deprecated("This is not likely to get used")
var healAfterwards = true
fun encode(buffer: RegistryFriendlyByteBuf) {
@@ -16,7 +16,7 @@ import com.cobblemon.mod.common.util.toProperties
import com.google.gson.JsonElement
/**
* A basic party provider that just produces a [StaticNPCParty] based on a list of [PokemonProperties].
* A basic party provider that just produces a [NPCPartyStore] based on a simple list of [PokemonProperties].
*
* @author Hiroku
* @since August 19th, 2023
@@ -28,12 +28,15 @@ class SimplePartyProvider : NPCPartyProvider {
@Transient
override val type = TYPE
@Transient
override val isStatic = true
override var isStatic = true
val pokemon = mutableListOf<PokemonProperties>()
override fun loadFromJSON(json: JsonElement) {
val isStatic = json.asJsonObject.get("isStatic")?.asBoolean
if (isStatic != null) {
this.isStatic = isStatic
}
val pokemonList = json.asJsonObject.getAsJsonArray("pokemon")
pokemonList.forEach {
val pokemon = if (it.isJsonPrimitive) {
@@ -14,6 +14,8 @@ import com.bedrockk.molang.runtime.value.StringValue
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.abilities.Abilities
import com.cobblemon.mod.common.api.abilities.Ability
import com.cobblemon.mod.common.api.events.CobblemonEvents
import com.cobblemon.mod.common.api.events.pokemon.ShinyChanceCalculationEvent
import com.cobblemon.mod.common.api.moves.Moves
import com.cobblemon.mod.common.api.pokeball.PokeBalls
import com.cobblemon.mod.common.api.pokemon.aspect.AspectProvider
@@ -56,6 +58,8 @@ import net.minecraft.nbt.Tag
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
@@ -573,18 +577,24 @@ open class PokemonProperties {
return true
}
fun create(): Pokemon {
@JvmOverloads
fun create(player: ServerPlayer? = null): Pokemon {
val pokemon = Pokemon()
apply(pokemon)
pokemon.initialize()
roll(pokemon)
roll(pokemon, player)
return pokemon
}
// TEST YOUR LUCK!
fun roll(pokemon: Pokemon) {
@JvmOverloads
fun roll(pokemon: Pokemon, player: ServerPlayer? = null) {
val baseTypes = pokemon.form.types.toList()
if (this.shiny == null) pokemon.shiny = Cobblemon.config.shinyRate.checkRate()
var shinyRate = Cobblemon.config.shinyRate
CobblemonEvents.SHINY_CHANCE_CALCULATION.post(ShinyChanceCalculationEvent(shinyRate, pokemon)) { event ->
shinyRate = event.calculate(player)
}
if (this.shiny == null) pokemon.shiny = shinyRate.checkRate()
if (this.teraType == null) pokemon.teraType =
if (Cobblemon.config.teraTypeRate.checkRate()) {
var picked = TeraTypes.random(true)
@@ -596,8 +606,9 @@ open class PokemonProperties {
else TeraTypes.forElementalType(baseTypes.random())
}
fun createEntity(world: Level): PokemonEntity {
return PokemonEntity(world, create()).also { applyCustomProperties(it) }
@JvmOverloads
fun createEntity(world: Level, player: ServerPlayer? = null): PokemonEntity {
return PokemonEntity(world, create(player)).also { applyCustomProperties(it) }
}
// TODO Codecs at some point
@@ -783,7 +794,7 @@ open class PokemonProperties {
}
// If the config value is at least 1, then do 1/x and use that as the property chance
private fun Float.checkRate(): Boolean = this >= 1 && (Random.Default.nextFloat() < 1 / this)
private fun Float.checkRate(): Boolean = if (this >= 1) (Random.Default.nextFloat() < 1 / this) else Random.Default.nextFloat() < this
/**
* Attempts to find an ability by ID and resolve if it should be forced or if it's legal for the given form.
@@ -53,7 +53,7 @@ fun interface PokemonPropertyExtractor {
val EVS = add { pokemon, properties -> properties.evs = pokemon.evs }
@JvmField
val ILLUSION = mutableListOf(SPECIES, FORM, ASPECTS, GENDER, NICKNAME, SHINY)
val ILLUSION = mutableListOf(SPECIES, FORM, ASPECTS, GENDER, NICKNAME, SHINY, POKEBALL)
@JvmField
val TRANSFORM = mutableListOf(SPECIES, FORM, ASPECTS, GENDER)
@@ -15,7 +15,7 @@ package com.cobblemon.mod.common.api.pokemon.egg
*
* @property showdownID used for data synchronization with Showdown data format.
*/
enum class EggGroup(internal val showdownID: String) {
enum class EggGroup(val showdownID: String) {
MONSTER("Monster"),
WATER_1("Water 1"),
@@ -31,6 +31,16 @@ enum class EggGroup(internal val showdownID: String) {
WATER_2("Water 2"),
DITTO("Ditto"),
DRAGON("Dragon"),
UNDISCOVERED("Undiscovered")
UNDISCOVERED("Undiscovered");
companion object {
private val identifierMap: Map<String, EggGroup> = entries.associateBy {
it.showdownID.lowercase().replace(" ", "_").replace("-", "_")
}
fun fromIdentifier(identifier: String): EggGroup? {
val key = identifier.lowercase().replace(" ", "_").replace("-", "_")
return identifierMap[key]
}
}
}
@@ -10,6 +10,8 @@ package com.cobblemon.mod.common.api.scheduling
import java.util.concurrent.CompletableFuture
import com.cobblemon.mod.common.util.runOnServer
import net.minecraft.world.TickRateManager
import net.minecraft.world.level.Level
@Deprecated("Use afterOnServer or afterOnClient; ambiguous side is not good for your health")
@JvmOverloads
@@ -33,9 +35,13 @@ fun delayedFuture(ticks: Int = 0, seconds: Float = 0F, serverThread: Boolean = f
* being completed after the delay does things like entity removal or other thread-unsafe actions.
*/
@JvmOverloads
fun afterOnServer(ticks: Int = 0, seconds: Float = 0F, action: () -> Unit) = ServerTaskTracker.after(seconds + ticks / 20F, action) // TODO this won't work with recent tickmanager changes
fun afterOnServer(seconds: Float, action: () -> Unit) = ServerTaskTracker.after(seconds, action)
@JvmOverloads
fun afterOnClient(ticks: Int = 0, seconds: Float, action: () -> Unit) = ClientTaskTracker.after(seconds + ticks / 20F, action) // TODO this won't work with recent tickmanager changes
fun afterOnServer(ticks: Int, level: Level, action: () -> Unit) = ServerTaskTracker.after(ticks / level.tickRateManager().tickrate(), action)
@JvmOverloads
fun afterOnClient(seconds: Float, action: () -> Unit) = ClientTaskTracker.after(seconds, action)
@JvmOverloads
fun afterOnClient(ticks: Int, level: Level, action: () -> Unit) = ClientTaskTracker.after(ticks / level.tickRateManager().tickrate(), action)
@Deprecated("Use lerpOnServer or lerpOnClient, side-ambiguity causes problems now")
fun lerp(seconds: Float = 0F, serverThread: Boolean = false, action: (Float) -> Unit) = (if (serverThread) ServerTaskTracker else ClientTaskTracker).lerp(seconds, action = action)
@@ -15,6 +15,8 @@ import com.cobblemon.mod.common.api.spawning.context.SpawningContext
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.pokemon.feature.SeasonFeatureHandler
import com.cobblemon.mod.common.util.weightedSelection
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.player.Player
/**
* A [SpawnAction] that will spawn a single [PokemonEntity].
@@ -44,7 +46,8 @@ class PokemonSpawnAction(
} else {
null
}?.createStack(ctx)
val entity = props.createEntity(ctx.world)
val sourcePlayer = ctx.cause.entity as? ServerPlayer
val entity = props.createEntity(ctx.world, sourcePlayer)
entity.spawnCause = ctx.cause
SeasonFeatureHandler.updateSeason(entity.pokemon, Cobblemon.seasonResolver(ctx.world, ctx.position))
if (heldItem != null) {
@@ -17,6 +17,8 @@ import com.cobblemon.mod.common.api.events.fishing.BobberSpawnPokemonEvent
import com.cobblemon.mod.common.api.fishing.FishingBait
import com.cobblemon.mod.common.api.pokemon.Natures
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
import com.cobblemon.mod.common.api.pokemon.egg.EggGroup
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.api.spawning.SpawnBucket
import com.cobblemon.mod.common.api.spawning.SpawnCause
@@ -24,6 +26,7 @@ import com.cobblemon.mod.common.api.spawning.context.SpawningContext
import com.cobblemon.mod.common.api.spawning.detail.PokemonSpawnDetail
import com.cobblemon.mod.common.api.spawning.detail.SpawnDetail
import com.cobblemon.mod.common.api.spawning.spawner.Spawner
import com.cobblemon.mod.common.api.types.ElementalTypes
import com.cobblemon.mod.common.api.types.tera.TeraTypes
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.item.interactive.PokerodItem
@@ -101,13 +104,6 @@ class FishingSpawnCause(
pokemonEntity.pokemon.level = level
}
fun alterTeraAttempt(pokemonEntity: PokemonEntity, effect: FishingBait.Effect) {
if (pokemonEntity.pokemon.teraType == effect.subcategory?.let { TeraTypes.get(it.path) } ||
TeraTypes.get(effect.subcategory!!.path) == null) return
pokemonEntity.pokemon.teraType = TeraTypes.get(effect.subcategory.path)!!
}
fun alterHAAttempt(pokemonEntity: PokemonEntity) {
//val species = pokemonEntity.pokemon.species.let { PokemonSpecies.getByName(it.name) } ?: return
//val ability = species.abilities.mapping[Priority.LOW]?.first()?.template?.name ?: return
@@ -122,7 +118,7 @@ class FishingSpawnCause(
.randomOrNull ()
?.let { ability ->
// No need to force, this is legal
pokemonEntity.pokemon.ability = ability.template.create(false)
pokemonEntity.pokemon.ability = ability.template.create(false, ability.priority)
return
}
}
@@ -179,6 +175,49 @@ class FishingSpawnCause(
}
}
}
// if bait exists and any effects are related to Typing
if (bait != null && bait.effects.any{ it.type == FishingBait.Effects.TYPING }){
if (detail is PokemonSpawnDetail) {
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
val baitEffect = bait.effects.firstOrNull { it.type == FishingBait.Effects.TYPING }
val baitTypingEffect = baitEffect?.subcategory?.path?.let { ElementalTypes.get(it) }
if (detailSpecies != null && baitTypingEffect != null) {
val isMatchingType = detailSpecies.types.contains(baitTypingEffect)
return when {
isMatchingType -> super.affectWeight(detail, ctx, weight * baitEffect.value.toFloat()) // multiply weight by multiplier of bait effect if typing is found
else -> super.affectWeight(detail, ctx, weight) // use base spawn weight if typing is not same as bait
}
}
}
}
// if bait exists and any effects are related to Egg Groups
if (bait != null && bait.effects.any { it.type == FishingBait.Effects.EGG_GROUP }) {
if (detail is PokemonSpawnDetail) {
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
if (detailSpecies != null) {
// Collect all the egg group effects
val eggGroupEffects = bait.effects.filter { it.type == FishingBait.Effects.EGG_GROUP }
// Check if any of the egg group effects match the species' egg groups
val matchingEffect = eggGroupEffects.firstOrNull { effect ->
val effectEggGroupKey = effect.subcategory?.path ?: return@firstOrNull false
val eggGroup = EggGroup.fromIdentifier(effectEggGroupKey)
if (eggGroup == null) {
LOGGER.warn("Unknown egg group identifier: $effectEggGroupKey")
return@firstOrNull false
}
detailSpecies.eggGroups.contains(eggGroup)
}
if (matchingEffect != null) {
val multiplier = matchingEffect.value
return super.affectWeight(detail, ctx, (weight * multiplier).toFloat())
}
}
}
}
return super.affectWeight(detail, ctx, weight)
}
@@ -134,12 +134,12 @@ class Toast(
}
/**
* Invokes [expire] after the specified [ticks].
* Invokes [expire] after the specified [seconds].
*
* @param ticks The number of ticks before the lifecycle of this toast ends.
* @param seconds The number of seconds before the lifecycle of this toast ends.
*/
fun expireAfter(ticks: Int) {
afterOnServer(ticks = ticks) {
fun expireAfter(seconds: Float) {
afterOnServer(seconds = seconds) {
this.expire()
}
}
@@ -334,12 +334,12 @@ object BattleBuilder {
return errors
}
val npcActor = NPCBattleActor(npcEntity, npcParty, npcEntity.skill ?: 0)
val npcActor = NPCBattleActor(npcEntity, npcParty, npcEntity.skill ?: npcEntity.npc.skill)
// if (npcEntity.battleIds.get().isPresent) {
// errors.participantErrors[npcActor] += BattleStartError.alreadyInBattle(npcActor)
// }
if (npcActor.pokemonList.size < battleFormat.battleType.slotsPerActor) {
if (npcActor.pokemonList.filter { it.health > 0 }.size < battleFormat.battleType.slotsPerActor) {
errors.participantErrors[npcActor] += BattleStartError.insufficientPokemon(
actorEntity = npcEntity,
requiredCount = battleFormat.battleType.slotsPerActor,
@@ -9,14 +9,11 @@
package com.cobblemon.mod.common.battles
import com.cobblemon.mod.common.Cobblemon.LOGGER
import com.cobblemon.mod.common.api.battles.interpreter.BasicContext
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
import com.cobblemon.mod.common.api.battles.interpreter.Effect
import com.cobblemon.mod.common.api.battles.interpreter.MissingContext
import com.cobblemon.mod.common.api.battles.interpreter.*
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.battles.model.actor.EntityBackedBattleActor
import com.cobblemon.mod.common.api.text.red
import com.cobblemon.mod.common.api.text.yellow
import com.cobblemon.mod.common.battles.dispatch.InstructionSet
import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
@@ -63,12 +60,12 @@ object ShowdownInterpreter {
updateInstructionParser["-ability"] = { _, instructionSet, message, _ -> AbilityInstruction(instructionSet, message) }
updateInstructionParser["-activate"] = { _, instructionSet, message, _ -> ActivateInstruction(instructionSet, message) }
updateInstructionParser["bagitem"] = { _, _, message, _ -> BagItemInstruction(message) }
updateInstructionParser["-boost"] = { _, instructionSet, message, remainingLines -> BoostInstruction(instructionSet, message, remainingLines, true) }
updateInstructionParser["-boost"] = { battle, _, message, _ -> BoostInstruction(battle, message, true) }
updateInstructionParser["-block"] = { _, _, message, _ -> BlockInstruction(message) }
updateInstructionParser["cant"] = { _, _, message, _ -> CantInstruction(message) }
updateInstructionParser["-clearallboost"] = { _, _, message, _ -> ClearAllBoostInstruction(message) }
updateInstructionParser["-clearnegativeboost"] = { _, _, message, _ -> ClearNegativeBoostInstruction(message) }
updateInstructionParser["-clearboost"] = { _, _, message, _ -> ClearBoostInstruction(message) }
updateInstructionParser["-clearboost"] = { _, _, message, _ -> ClearBoostInstruction(message) }
updateInstructionParser["-copyboost"] = { _, _, message, _ -> CopyBoostInstruction(message) }
updateInstructionParser["-crit"] = { _, instructionSet, message, _ -> CritInstruction(message, instructionSet) }
updateInstructionParser["-curestatus"] = { _, _, message, _ -> CureStatusInstruction(message) }
@@ -108,7 +105,7 @@ object ShowdownInterpreter {
updateInstructionParser["-terastallize"] = { _, _, message, _ -> TerastallizeInstruction(message) }
updateInstructionParser["-transform"] = { battle, _, message, _ -> TransformInstruction(battle, message) }
updateInstructionParser["turn"] = { _, _, message, _ -> TurnInstruction(message) }
updateInstructionParser["-unboost"] = { _, instructionSet, message, remainingLines -> BoostInstruction(instructionSet, message, remainingLines, false) }
updateInstructionParser["-unboost"] = { battle, _, message, _ -> BoostInstruction(battle, message, false) }
updateInstructionParser["upkeep"] = { _, _, _, _ -> UpkeepInstruction() }
updateInstructionParser["-weather"] = { _, _, message, _ -> WeatherInstruction(message) }
updateInstructionParser["win"] = { _, _, message, _ -> WinInstruction(message) }
@@ -279,8 +276,16 @@ object ShowdownInterpreter {
}
instructionSet.execute(battle)
}
catch (e: InvalidInstructionException) {
e.message?.let {
battle.broadcastChatMessage(it.red())
LOGGER.error(it)
}
}
catch (e: Exception) {
LOGGER.error("Caught exception interpreting {}", e)
battle.broadcastChatMessage("A fatal error occurred. Please report to developers.".red())
LOGGER.error("Caught exception interpreting battle instructions.", e)
}
}
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.battles.interpreter.instructions
import com.bedrockk.molang.runtime.MoLangRuntime
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
import com.cobblemon.mod.common.api.battles.interpreter.InvalidInstructionException
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
@@ -19,7 +20,6 @@ import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.battles.ShowdownInterpreter
import com.cobblemon.mod.common.battles.dispatch.ActionEffectInstruction
import com.cobblemon.mod.common.battles.dispatch.GO
import com.cobblemon.mod.common.battles.dispatch.InstructionSet
import com.cobblemon.mod.common.battles.dispatch.UntilDispatch
import com.cobblemon.mod.common.util.battleLang
import com.cobblemon.mod.common.util.cobblemonResource
@@ -33,19 +33,25 @@ import java.util.concurrent.CompletableFuture
* @author Hiroku
* @since August 20th, 2022
*/
class BoostInstruction(val instructionSet: InstructionSet, val message: BattleMessage, val remainingLines: Iterator<BattleMessage>, val isBoost: Boolean = true): ActionEffectInstruction {
class BoostInstruction(battle: PokemonBattle, val message: BattleMessage, val isBoost: Boolean = true): ActionEffectInstruction {
override var future: CompletableFuture<*> = CompletableFuture.completedFuture(Unit)
override var holds = mutableSetOf<String>()
override val id = cobblemonResource("boost")
val pokemon = message.battlePokemon(0, battle) ?: throw InvalidInstructionException(message)
val statKey = message.argumentAt(1) ?: throw InvalidInstructionException(message)
val stages = message.argumentAt(2)?.toInt() ?: throw InvalidInstructionException(message)
val stat = Stats.getStat(statKey).displayName
override fun preActionEffect(battle: PokemonBattle) {
}
override fun runActionEffect(battle: PokemonBattle, runtime: MoLangRuntime) {
if (stages == 0) return // only play effect if there was a stat change
battle.dispatch {
val actionEffect = if (isBoost) BOOST_EFFECT else UNBOOST_EFFECT
val providers = mutableListOf<Any>(battle)
val pokemon = message.battlePokemon(0, battle) ?: return@dispatch GO
pokemon.effectedPokemon.entity?.let { UsersProvider(it) }?.let(providers::add)
val context = ActionEffectContext(
actionEffect = actionEffect,
@@ -60,10 +66,6 @@ class BoostInstruction(val instructionSet: InstructionSet, val message: BattleMe
}
override fun postActionEffect(battle: PokemonBattle) {
val pokemon = message.battlePokemon(0, battle) ?: return
val statKey = message.argumentAt(1) ?: return
val stages = message.argumentAt(2)?.toInt() ?: return
val stat = Stats.getStat(statKey).displayName
val severity = Stats.getSeverity(stages)
val rootKey = if (isBoost) "boost" else "unboost"
@@ -164,7 +164,7 @@ class GildedChestBlock(settings: Properties, val type: Type = Type.RED) : BaseEn
world.addFreshEntity(entity)
world.removeBlock(pos, false)
afterOnServer(ticks = 2) {
afterOnServer(seconds = 0.1F) {
if (player !in player.level().players()) {
return@afterOnServer
}
@@ -126,7 +126,7 @@ class FossilMultiblockStructure (
stack?.shrink(1)
}
val pokemon = this.resultingFossil?.result?.create()
val pokemon = this.resultingFossil?.result?.create(player)
if(pokemon != null) {
pokemon.caughtBall = ballType
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.entity.PokemonSideDelegate
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addFunctions
import com.cobblemon.mod.common.api.pokeball.PokeBalls
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
import com.cobblemon.mod.common.api.scheduling.ScheduledTask
import com.cobblemon.mod.common.api.scheduling.SchedulingTracker
@@ -31,10 +32,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.repository.Pokem
import com.cobblemon.mod.common.client.render.pokemon.PokemonRenderer.Companion.ease
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.MovingSoundInstance
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.resolve
import com.cobblemon.mod.common.util.*
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.Minecraft
import net.minecraft.network.syncher.EntityDataAccessor
@@ -106,6 +104,10 @@ class PokemonClientDelegate : PosableState(), PokemonSideDelegate {
} else if (data == PokemonEntity.ASPECTS) {
currentAspects = currentEntity.entityData.get(PokemonEntity.ASPECTS)
currentEntity.pokemon.shiny = currentAspects.contains("shiny")
} else if (data == PokemonEntity.CAUGHT_BALL) {
PokeBalls.getPokeBall(currentEntity.entityData.get(PokemonEntity.CAUGHT_BALL).asIdentifierDefaultingNamespace())?.let {
currentEntity.pokemon.caughtBall = it
}
} else if (data == PokemonEntity.DYING_EFFECTS_STARTED) {
val isDying = currentEntity.entityData.get(PokemonEntity.DYING_EFFECTS_STARTED)
if (isDying) {
@@ -1,87 +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.client.render.models.blockbench.pokemon.gen4
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class HappinyModel(root: ModelPart) : PokemonPosableModel(root), BipedFrame {
override val rootPart = root.registerChildWithAllChildren("happiny")
override val leftLeg = getPart("left_foot")
override val rightLeg = getPart("right_foot")
override var portraitScale = 2.09F
override var portraitTranslation = Vec3(-0.1, -0.8, 0.0)
override var profileScale = 0.76F
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var sleep: CobblemonPose
lateinit var battle_idle: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("happiny", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("happiny", "blink") }
val hairQuirk = quirk { bedrockStateful("happiny", "hairshake_quirk") }
val happy = quirk { bedrockStateful("happiny", "happy_quirk") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("happiny", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink, hairQuirk, happy),
transformTicks = 10,
animations = arrayOf(
bedrock("happiny", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
transformTicks = 10,
animations = arrayOf(
bedrock("happiny", "ground_walk")
)
)
battle_idle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
quirks = arrayOf(blink, hairQuirk, happy),
transformTicks = 10,
condition = { it.isBattling },
animations = arrayOf(
bedrock("happiny", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, sleep, battle_idle)) bedrockStateful("happiny", "faint") else null
}
@@ -169,7 +169,6 @@ object PokemonModelRepository : VaryingModelRepository<PokemonPosableModel>() {
inbuilt("hitmontop", ::HitmontopModel)
inbuilt("electivire", ::ElectivireModel)
inbuilt("glaceon", ::GlaceonModel)
inbuilt("happiny", ::HappinyModel)
inbuilt("leafeon", ::LeafeonModel)
inbuilt("lickilicky", ::LickilickyModel)
inbuilt("mimejr", ::MimejrModel)
@@ -136,7 +136,7 @@ abstract class VaryingModelRepository<T : PosableModel> {
val jsonObject = gson.fromJson(json, JsonObject::class.java)
return {
var boneName = jsonObject.getAsJsonPrimitive("rootBone")
adapter.modelPart = if (boneName != null && it.children[boneName.asString] != null) it.children[boneName.asString] else it.children[fileName] ?: it.children.values.first()
adapter.modelPart = if (boneName != null && it.children[boneName.asString] != null) it.children[boneName.asString] else it.children[fileName] ?: it.children.entries.filter { LocatorAccess.PREFIX !in it.key }.first().value
gson.fromJson(jsonObject, poserClass).also {
it.poses.forEach { (poseName, pose) -> pose.poseName = poseName }
}
@@ -23,7 +23,7 @@ object CobblemonTooltipGenerator : TooltipGenerator() {
val resultLines = mutableListOf<Component>()
if (stack.item.builtInRegistryHolder().unwrapKey().isPresent && stack.item.builtInRegistryHolder().unwrapKey().get().location().namespace == Cobblemon.MODID) {
if (stack.get(DataComponents.HIDE_TOOLTIP) != null) {
if (stack.get(DataComponents.HIDE_ADDITIONAL_TOOLTIP) != null) {
return null
}
val language = Language.getInstance()
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.client.tooltips
import com.cobblemon.mod.common.api.fishing.FishingBaits
import com.cobblemon.mod.common.api.pokemon.egg.EggGroup
import com.cobblemon.mod.common.api.text.*
import com.cobblemon.mod.common.api.types.ElementalTypes
import com.cobblemon.mod.common.item.interactive.PokerodItem
@@ -58,7 +59,16 @@ object FishingBaitTooltipGenerator : TooltipGenerator() {
"gender_chance" -> Genders[Gender.valueOf(effectSubcategory.toUpperCase())]
"tera" -> ElementalTypes.get(effectSubcategory)?.displayName
"typing" -> ElementalTypes.get(effectSubcategory)?.displayName
"egg_group" -> {
val effectSubcategory = effect.subcategory?.path
val eggGroup = effectSubcategory?.let { EggGroup.fromIdentifier(it) }
eggGroup?.let {
val langKey = "egg_group.${it.name.lowercase()}"
lang(langKey)
} ?: Component.literal(effectSubcategory ?: "Unknown").gold()
}
else -> Component.empty()
} ?: Component.literal("cursed").obfuscate()
@@ -13,6 +13,8 @@ import com.cobblemon.mod.common.datafixer.fix.BlockPosUpdateFix
import com.cobblemon.mod.common.datafixer.fix.EvolutionProxyNestingFix
import com.cobblemon.mod.common.datafixer.fix.FeatureFix
import com.cobblemon.mod.common.datafixer.fix.IvEvToIdentifierFix
import com.cobblemon.mod.common.datafixer.fix.MovesetJsonFix
import com.cobblemon.mod.common.datafixer.fix.ShoulderStateJsonFix
import com.cobblemon.mod.common.datafixer.fix.TeraTypeFix
import com.cobblemon.mod.common.datafixer.fix.TradeableMissingFix
import com.cobblemon.mod.common.datafixer.schema.CobblemonRootSchema
@@ -83,6 +85,8 @@ object CobblemonSchemas {
builder.addFixer(ItemStackComponentizationFix(schema1))
builder.addFixer(BlockPosUpdateFix(schema1))
builder.addFixer(FeatureFix(schema1))
builder.addFixer(MovesetJsonFix(schema1))
builder.addFixer(ShoulderStateJsonFix(schema1))
}
private class CobblemonDataFixerCodec<R>(private val baseCodec: Codec<R>, private val typeReference: TypeReference) : Codec<R> {
@@ -98,7 +102,7 @@ object CobblemonSchemas {
.map(Number::toInt)
.result()
// If none always do op unlike vanilla.
.orElse(DATA_VERSION - 1)
.orElse(0)
val dynamicWithoutVersion = Dynamic(ops, ops.remove(input, VERSION_KEY))
val dataFixedDynamic = DATA_FIXER.update(this.typeReference, dynamicWithoutVersion, inputVersion, DATA_VERSION)
return this.baseCodec.decode(dataFixedDynamic)
@@ -0,0 +1,24 @@
/*
* 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.datafixer.fix
import com.mojang.datafixers.schemas.Schema
import com.mojang.serialization.Dynamic
class MovesetJsonFix(output: Schema) : PokemonFix(output) {
override fun fixPokemonData(dynamic: Dynamic<*>): Dynamic<*> {
val moveSetJson = dynamic.get("MoveSet").asMapOpt().result()
//Moveset is probably already a list,
if (!moveSetJson.isPresent) {
return dynamic
}
return dynamic.set("MoveSet", dynamic.createList(moveSetJson.get().map { it.second }))
}
}
@@ -0,0 +1,28 @@
/*
* 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.datafixer.fix
import com.mojang.datafixers.schemas.Schema
import com.mojang.serialization.Dynamic
class ShoulderStateJsonFix(output: Schema) : PokemonFix(output) {
override fun fixPokemonData(dynamic: Dynamic<*>): Dynamic<*> {
val moveSetJson = dynamic.get("State").result()
//State not here
if (moveSetJson.isEmpty) {
return dynamic
}
if (moveSetJson.get().mapValues.getOrThrow().size == 0) {
return dynamic.remove("State")
}
return dynamic
}
}
@@ -725,7 +725,7 @@ class PokeRodFishingBobberEntity(type: EntityType<out PokeRodFishingBobberEntity
hookedEntity = level().getEntity(hookedEntityID)
}
afterOnServer(ticks = 2) {
afterOnServer(seconds = 0.1F) {
if (player !in player.level().players()) {
return@afterOnServer
}
@@ -9,31 +9,28 @@
package com.cobblemon.mod.common.entity.npc
import com.bedrockk.molang.runtime.value.DoubleValue
import com.bedrockk.molang.runtime.value.StringValue
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.battles.model.actor.AIBattleActor
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.battles.model.actor.EntityBackedBattleActor
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.api.storage.party.PartyStore
import com.cobblemon.mod.common.battles.ai.RandomBattleAI
import com.cobblemon.mod.common.battles.ai.StrongBattleAI
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.net.messages.client.battle.BattleEndPacket
import com.cobblemon.mod.common.util.battleLang
import com.cobblemon.mod.common.util.chainFutures
import com.cobblemon.mod.common.util.effectiveName
import com.cobblemon.mod.common.util.update
import net.minecraft.world.phys.Vec3
import java.util.concurrent.CompletableFuture
class NPCBattleActor(
val npc: NPCEntity,
val party: PartyStore,
pokemonList: List<BattlePokemon>,
val skill: Int
) : AIBattleActor(
gameId = npc.uuid,
pokemonList = party.toBattleTeam(),
pokemonList = pokemonList,
battleAI = StrongBattleAI(skill)
), EntityBackedBattleActor<NPCEntity> {
override val entity = npc
@@ -42,6 +39,16 @@ class NPCBattleActor(
override fun nameOwned(name: String) = battleLang("owned_pokemon", this.getName(), name)
override val initialPos = entity.position()
constructor(
npc: NPCEntity,
party: PartyStore,
skill: Int
): this(
npc,
party.toBattleTeam(healPokemon = npc.npc.autoHealParty),
skill
)
override fun setupStruct() {
super.setupStruct()
struct.addFunction("skill") { DoubleValue(skill) }
@@ -51,7 +58,7 @@ class NPCBattleActor(
super.sendUpdate(packet)
if (packet is BattleEndPacket) {
if (npc.isAlive) {
val allEntities = party.mapNotNull { it.entity }.toMutableList()
val allEntities = pokemonList.mapNotNull { it.entity }.toMutableList()
val finalFuture = CompletableFuture<Unit>()
chainFutures(allEntities.map { pokemonEntity -> { pokemonEntity.recallWithAnimation() } }.iterator(), finalFuture)
if (allEntities.isEmpty()) {
@@ -72,11 +79,17 @@ class NPCBattleActor(
override fun win(otherWinners: List<BattleActor>, losers: List<BattleActor>) {
super.win(otherWinners, losers)
npc.playAnimation(NPCEntity.WIN_ANIMATION)
if (npc.npc.autoHealParty) {
npc.party?.heal()
}
}
override fun lose(winners: List<BattleActor>, otherLosers: List<BattleActor>) {
super.lose(winners, otherLosers)
npc.playAnimation(NPCEntity.LOSE_ANIMATION)
if (npc.npc.autoHealParty) {
npc.party?.heal()
}
// winners.forEach {
// rewards.forEach {
// winner give reward :))
@@ -113,11 +113,12 @@ class NPCEntity(world: Level) : AgeableMob(CobblemonEntities.NPC, world), Npc, P
val level: Int
get() = entityData.get(LEVEL)
var skill: Int? = npc.skill ?: 0 // range from 0 - 5
var skill: Int? = null // range from 0 - 5
var party: NPCPartyStore? = null
fun getPartyForChallenge(player: ServerPlayer): NPCPartyStore? {
val party = this.party
return if (party != null) {
party
} else if (npc.party?.isStatic == false) {
@@ -60,6 +60,7 @@ import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokemonPacket
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
import com.cobblemon.mod.common.net.serverhandling.storage.SendOutPokemonHandler.SEND_OUT_DURATION
import com.cobblemon.mod.common.pokeball.PokeBall
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData
import com.cobblemon.mod.common.pokedex.scanner.ScannableEntity
import com.cobblemon.mod.common.pokemon.FormData
@@ -152,6 +153,7 @@ open class PokemonEntity(
@JvmStatic val SPAWN_DIRECTION = SynchedEntityData.defineId(PokemonEntity::class.java, EntityDataSerializers.FLOAT)
@JvmStatic val FRIENDSHIP = SynchedEntityData.defineId(PokemonEntity::class.java, EntityDataSerializers.INT)
@JvmStatic val FREEZE_FRAME = SynchedEntityData.defineId(PokemonEntity::class.java, EntityDataSerializers.FLOAT)
@JvmStatic val CAUGHT_BALL = SynchedEntityData.defineId(PokemonEntity::class.java, EntityDataSerializers.STRING)
const val BATTLE_LOCK = "battle"
@@ -255,6 +257,9 @@ open class PokemonEntity(
/** The aspects exposed to the client */
val exposedAspects: Set<String> get() = this.effects.mockEffect?.exposedForm?.aspects?.toSet() ?: this.pokemon.aspects
/** The pokeball exposed to the client. Used for sendout animation. */
val exposedBall: PokeBall get() = this.effects.mockEffect?.exposedBall ?: this.pokemon.caughtBall
override val struct: QueryStruct = QueryStruct(hashMapOf())
.addStandardFunctions()
.addEntityFunctions(this)
@@ -290,6 +295,7 @@ open class PokemonEntity(
builder.define(COUNTS_TOWARDS_SPAWN_CAP, true)
builder.define(FRIENDSHIP, 0)
builder.define(FREEZE_FRAME, -1F)
builder.define(CAUGHT_BALL, "")
}
override fun onSyncedDataUpdated(data: EntityDataAccessor<*>) {
@@ -386,7 +392,7 @@ open class PokemonEntity(
}
//This is so that pokemon in the pasture block are ALWAYS in sync with the pokemon box
//Before, pokemon entities in pastures would hold an old ref to a pokemon obj and changes to that would not appear to the underlying file
if (this.tethering != null) {
if (this.tethering != null && age % 20 == 0) {
// Only for online players
this.ownerUUID?.let { ownerUUID ->
val player = level().getPlayerByUUID(ownerUUID) as? ServerPlayer
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.entity.pokemon
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.entity.PokemonSender
import com.cobblemon.mod.common.api.entity.PokemonSideDelegate
import com.cobblemon.mod.common.api.pokeball.PokeBalls
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.api.pokemon.status.Statuses
@@ -19,6 +20,7 @@ import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.activestate.ActivePokemonState
import com.cobblemon.mod.common.pokemon.activestate.SentOutState
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import com.cobblemon.mod.common.util.getIsSubmerged
import com.cobblemon.mod.common.util.playSoundServer
import com.cobblemon.mod.common.util.update
@@ -102,6 +104,7 @@ class PokemonServerDelegate : PokemonSideDelegate {
val trackedSpecies = mock?.species ?: entity.pokemon.species.resourceIdentifier.toString()
val trackedNickname = mock?.nickname ?: entity.pokemon.nickname ?: Component.empty()
val trackedAspects = mock?.aspects ?: entity.pokemon.aspects
val trackedBall = mock?.pokeball ?: entity.pokemon.caughtBall.name.toString()
//used getOwnerPlayer().uuid instead of getOwnerUUID() to avoid a potential NPE
entity.ownerUUID = entity.pokemon.getOwnerPlayer()?.uuid
@@ -113,6 +116,7 @@ class PokemonServerDelegate : PokemonSideDelegate {
entity.entityData.set(PokemonEntity.LABEL_LEVEL, entity.pokemon.level)
entity.entityData.set(PokemonEntity.MOVING, entity.deltaMovement.multiply(1.0, if (entity.onGround()) 0.0 else 1.0, 1.0).length() > 0.005F)
entity.entityData.set(PokemonEntity.FRIENDSHIP, entity.pokemon.friendship)
entity.entityData.set(PokemonEntity.CAUGHT_BALL, trackedBall)
updatePoseType()
}
@@ -223,16 +223,6 @@ class PokerodItem(val pokeRodId: ResourceLocation, settings: Properties) : Fishi
PokerodCastEvent.Pre(itemStack, bobberEntity, getBaitStackOnRod(itemStack)),
{ event -> return InteractionResultHolder.fail(itemStack) },
{ event ->
// play the Rod casting sound and set it
world.playSoundServer(
Vec3(user.x,
user.y,
user.z),
CobblemonSounds.FISHING_ROD_CAST,
SoundSource.PLAYERS,
1.0f,
1.0f / (world.getRandom().nextFloat() * 0.4f + 0.8f)
)
world.addFreshEntity(bobberEntity)
CobblemonCriteria.CAST_POKE_ROD.trigger(user as ServerPlayer, baitOnRod != null)
@@ -63,7 +63,7 @@ class SpawnPokemonPacket(
entity.entityData.get(PokemonEntity.POSE_TYPE),
entity.entityData.get(PokemonEntity.UNBATTLEABLE),
entity.entityData.get(PokemonEntity.HIDE_LABEL),
entity.pokemon.caughtBall.name,
entity.exposedBall.name,
entity.entityData.get(PokemonEntity.SPAWN_DIRECTION),
entity.entityData.get(PokemonEntity.FRIENDSHIP),
entity.entityData.get(PokemonEntity.FREEZE_FRAME),
@@ -10,7 +10,9 @@ package com.cobblemon.mod.common.pokedex.scanner
import com.cobblemon.mod.common.pokedex.scanner.PokedexUsageContext.Companion.BLOCK_LENGTH_PER_ZOOM_STAGE
import net.minecraft.world.entity.Entity
import net.minecraft.world.level.ClipContext
import net.minecraft.world.phys.AABB
import net.minecraft.world.phys.HitResult
//Handles the actual raycasting to figure out what pokemon we are looking at
object PokemonScanner {
@@ -71,6 +73,21 @@ object PokemonScanner {
closestEntity = entity
closestDistance = distanceToEntity
}
if (closestEntity != null) {
// Check if the view path collides with a solid block along the path
val pathCollidesWithBlock = castingEntity.level().clip(
ClipContext(
eyePos,
intersection.get(),
ClipContext.Block.COLLIDER,
ClipContext.Fluid.NONE,
castingEntity
)).type == HitResult.Type.BLOCK
if (pathCollidesWithBlock) {
// Targeted entity is obscured by a solid block
closestEntity = null
}
}
}
}
return closestEntity
@@ -509,7 +509,7 @@ open class Pokemon : ShowdownIdentifiable {
internal var heldItem: ItemStack = ItemStack.EMPTY
init {
storeCoordinates.subscribe { if (it != null && it.store !is PCStore && this.tetheringId != null) afterOnServer(ticks = 1) { this.tetheringId = null } }
storeCoordinates.subscribe { if (it != null && it.store !is PCStore && this.tetheringId != null) afterOnServer(seconds = 0.05F) { this.tetheringId = null } }
storeCoordinates.subscribe {
it?.store?.getObservingPlayers()?.forEach {
CobblemonEvents.POKEMON_GAINED.post(PokemonGainedEvent(it.uuid, this))
@@ -56,7 +56,7 @@ open class CobblemonStarterHandler : StarterHandler {
}
val properties = category.pokemon[index]
val pokemon = properties.create()
val pokemon = properties.create(player)
CobblemonEvents.STARTER_CHOSEN.postThen(StarterChosenEvent(player, properties, pokemon)) {
Cobblemon.storage.getParty(player).add(
@@ -67,8 +67,8 @@ object TradeManager : RequestManager<TradeManager.TradeRequest>() {
override fun onAccept(request: TradeRequest) {
val trade = ActiveTrade(PlayerTradeParticipant(request.receiver), PlayerTradeParticipant(request.sender))
activeTrades.add(trade)
request.sendToSender(TradeStartedPacket(request.sender.uuid, request.sender.name.copy(), trade.player2.party.mapNullPreserving(::TradeablePokemon)))
request.sendToReceiver(TradeStartedPacket(request.receiver.uuid, request.receiver.name.copy(), trade.player1.party.mapNullPreserving(::TradeablePokemon)))
request.sendToSender(TradeStartedPacket(request.sender.uuid, request.sender.name.copy(), trade.player1.party.mapNullPreserving(::TradeablePokemon)))
request.sendToReceiver(TradeStartedPacket(request.receiver.uuid, request.receiver.name.copy(), trade.player2.party.mapNullPreserving(::TradeablePokemon)))
}
override fun canAccept(request: TradeRequest): Boolean {
@@ -69,6 +69,7 @@ object NPCClassAdapter : JsonDeserializer<NPCClass> {
}
obj.get("party")?.let { npcClass.party = ctx.deserialize(it, NPCPartyProvider::class.java) }
obj.get("skill")?.let { npcClass.skill = it.asInt }
obj.get("autoHealParty")?.let { npcClass.autoHealParty = it.asBoolean }
obj.get("battleTheme")?.let { npcClass.battleTheme = it.asString.asIdentifierDefaultingNamespace() }
obj.get("ai")?.let { npcClass.ai.addAll(it.asJsonArray.map<JsonElement, BrainConfig> { ctx.deserialize(it, BrainConfig::class.java) }.toMutableList()) }
@@ -0,0 +1,78 @@
{
"format_version": "1.8.0",
"animations": {
"animation.seismictoss.actor": {
"animation_length": 4,
"bones": {
"root_part": {
"position": {
"0.0": [0, 0, 0],
"0.125": [0, 0, -3],
"0.25": [0, 0, -14],
"0.375": [0, 0, -30],
"0.5": [0, 0, -30],
"3.375": [0, 0, -10],
"3.4583": [0, 0, -4],
"3.5833": [0, 0, 0]
},
"scale": {
"0.1667": [1, 1, 1],
"0.2083": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"0.25": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"0.2917": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"0.3333": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"0.375": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"3.375": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
}
}
},
"animation.seismictoss.target": {
"animation_length": 3,
"bones": {
"root_part": {
"position": {
"0.0": ["math.sin(q.anim_time*90*360)*1", 0, 0],
"0.2917": [0, 0, 0],
"0.4167": [0, 0, 0],
"0.625": [0, 250, 0],
"0.75": [0, 300, 0],
"2.0": [0, 300, 0],
"2.0833": [0, 250, 0],
"2.25": [0, 0, 0],
"2.2917": [0, -1, 0],
"2.3333": [0, 0, 0]
},
"scale": {
"0.0": [1, 1, 1],
"0.4167": [1, 1, 1],
"0.4583": [0.5, 2.5, 0.5],
"0.6667": [0, 3, 0],
"2.0": [0, 3, 0],
"2.25": [0.75, 2, 0.75],
"2.2917": ["1-math.sin(q.anim_time*90*60)*0.7", "1+math.sin(q.anim_time*90*60)*0.4", "1-math.sin(q.anim_time*90*60)*0.7"],
"2.9583": [1, 1, 1]
}
}
}
}
}
}
@@ -11,7 +11,7 @@
"events": {
"paraSparks": {
"sound_effect": {
"event_name": "cobblemon:status.nonvolatile.paralysis.actor"
"event_name": "cobblemon:status.paralysis.actor"
}
}
},
@@ -11,7 +11,7 @@
"events": {
"poisonHit": {
"sound_effect": {
"event_name": "cobblemon:status.nonvolatile.poison.actor"
"event_name": "cobblemon:status.poison.actor"
}
}
},
@@ -11,7 +11,7 @@
"events": {
"toxicHit": {
"sound_effect": {
"event_name": "cobblemon:status.nonvolatile.toxpoison.actor"
"event_name": "cobblemon:status.badlypoison.actor"
}
}
},
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:bite_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/bite"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.25]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.55
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [0.9, 0.9],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 320,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [0, 32],
"frames_per_second": 18,
"max_frame": 10
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#002A1E11",
"0.12": "#FFFFF1D3",
"0.54": "#FFFFF1D3",
"1.0": "#002A1E11"
}
}
}
}
}
}
@@ -0,0 +1,66 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:bite_targetspark",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/critical_hit"
}
},
"curves": {
"variable.bitespark": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.87, 1, 0.5, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 14
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -0.25],
"radius": 0.025,
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.35
},
"minecraft:particle_initial_speed": "math.random(1.75,4.55)*3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -5, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": ["0.1*v.bitespark", "0.1*v.bitespark"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 8,
"uv": [0, 0],
"uv_size": [7, 7]
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF291C0E",
"0.27": "#FFFFDCA1",
"1.0": "#FF291C0E"
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:crunch_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/bite"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.25]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.55
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [1.05, 1.05],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 320,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [0, 32],
"frames_per_second": 18,
"max_frame": 10
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00111E2A",
"0.1": "#FF8D97A9",
"0.63": "#FF8D97A9",
"1.0": "#00FF0000"
}
}
}
}
}
}
@@ -0,0 +1,64 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:crunch_targetrocks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/impact-rockgrey"
}
},
"curves": {
"variable.scale": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 0.92, 0.58, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 16
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.2],
"direction": ["math.random(-0.61,0.61)", "math.random(-0.45,2.05)", "math.random(-0.61,0.61)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(0.85, 1.65)*0.65"
},
"minecraft:particle_initial_spin": {
"rotation": "math.random(0,360)"
},
"minecraft:particle_initial_speed": "math.random(6.5,11.5)*1.0",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -30, 0],
"linear_drag_coefficient": 1
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.2-(v.particle_random_1*0.1)) * variable.scale", "(0.2-(v.particle_random_1*0.1)) * variable.scale"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 56,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [8, 8],
"step_UV": [0, 8],
"frames_per_second": 20,
"max_frame": 7,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_drag": 1.5,
"coefficient_of_restitution": 0.7,
"collision_radius": 0.1
}
}
}
}
@@ -0,0 +1,68 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:crunch_targetspark",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/critical_hit"
}
},
"curves": {
"variable.bitespark": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.91, 1, 0.25, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 24
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -0.25],
"radius": 0.025,
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.7
},
"minecraft:particle_initial_speed": "math.random(1.75,4.05)*4",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -8, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": ["0.1*v.bitespark", "0.1*v.bitespark"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 8,
"uv": [0, 0],
"uv_size": [7, 7]
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF3F000F",
"0.29": "#FFD94066",
"0.57": "#FFB82347",
"0.9": "#00881D35",
"1.0": "#00881D35"
}
}
}
}
}
}
@@ -0,0 +1,82 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:haze_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/poof"
}
},
"curves": {
"variable.gassize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 1, 1, 1]
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.haze.actor"
}
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 180,
"max_particles": 1000
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_lifetime_events": {
"creation_event": "event_sound"
},
"minecraft:emitter_shape_point": {},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(1.25,1.75)"
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(1.25,4.45)*1.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1.5, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": ["0.2*v.gassize", "0.2*v.gassize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 6,
"max_frame": 8,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#50030404",
"0.31": "#A00D1217",
"0.67": "#A0091016",
"1.0": "#00021026"
}
}
}
}
}
}
@@ -0,0 +1,76 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:haze_actorshroud",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/poof"
}
},
"curves": {
"variable.gassize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 1, 1, 1]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 140,
"max_particles": 1000
},
"minecraft:emitter_lifetime_looping": {
"active_time": 2.25
},
"minecraft:emitter_shape_disc": {
"offset": [0, "math.random(0,6)", -2],
"radius": 8,
"direction": ["math.random(-1,1)", "math.random(0,1)", "math.random(-1,1)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(1.25,1.75)"
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(1.25,4.45)*0.1",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": ["0.25*v.gassize", "0.25*v.gassize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 6,
"max_frame": 8,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#50030404",
"0.31": "#A00D1217",
"0.67": "#A0091016",
"1.0": "#00021026"
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:hyperfang_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/fang"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.25]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.55
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [1, 1],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 192,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [0, 32],
"frames_per_second": 16,
"max_frame": 6
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00FF0000",
"0.16": "#FFFFF06F",
"0.54": "#FFFFC25D",
"1.0": "#00FF0000"
}
}
}
}
}
}
@@ -0,0 +1,72 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:hyperfang_targetdot",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/xs-fadeorb"
}
},
"curves": {
"variable.bitespark": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.87, 1, 0.5, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 9
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -0.25],
"radius": 0.01,
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.45
},
"minecraft:particle_initial_speed": "math.random(1.0,2.5)*3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -3, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": ["0.1*v.bitespark", "0.1*v.bitespark"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 45,
"texture_height": 5,
"flipbook": {
"base_UV": [5, 0],
"size_UV": [5, 5],
"step_UV": [5, 0],
"frames_per_second": 12,
"max_frame": 8,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFFF8500",
"0.27": "#FFFFE100",
"1.0": "#00FF0000"
}
}
}
}
}
}
@@ -0,0 +1,65 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:hyperfang_targetspark",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/critical_hit"
}
},
"curves": {
"variable.bitespark": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.87, 1, 0.5, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 14
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -0.25],
"radius": 0.025,
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.45
},
"minecraft:particle_initial_speed": "math.random(1,3)*4",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": ["0.125*v.bitespark", "0.125*v.bitespark"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 8,
"uv": [0, 0],
"uv_size": [7, 7]
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFFF8500",
"0.27": "#FFFFE100",
"1.0": "#00FF0000"
}
}
}
}
}
}
@@ -0,0 +1,58 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:hypnosis_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/psyring1"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 5,
"max_particles": 100
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_shape_point": {
"offset": ["math.random(-0.03,0.03)", "math.random(-0.03,0.03)", -0.3],
"direction": ["math.random(-1,1)*0.2", "math.random(-1,1)*0.2", -10]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.8
},
"minecraft:particle_initial_speed": 1.25,
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": -0.25
},
"minecraft:particle_appearance_billboard": {
"size": ["0.25+(v.particle_age*0.5)", "0.25+(v.particle_age*0.5)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 117,
"texture_height": 13,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [13, 13],
"step_UV": [13, 0],
"frames_per_second": 12,
"max_frame": 9,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFC377FF",
"0.8": "#A09148FF",
"1.0": "#009148FF"
}
}
}
}
}
}
@@ -0,0 +1,63 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:hypnosis_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/spiral"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": "math.clamp(8*q.entity_height,4,24)"
},
"minecraft:emitter_lifetime_looping": {
"active_time": 0.1
},
"minecraft:emitter_shape_sphere": {
"radius": "(q.entity_radius*1.15)/math.clamp(q.entity_scale*1.1-0.1,1,9)",
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.95
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": 2,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1.5, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": [0.225, 0.225],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 8,
"max_frame": 8
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00AE00FF",
"0.25": "#A0FF51CD",
"0.45": "#C0FF87E9",
"0.6": "#D0DD00FF",
"0.75": "#A0B702FF",
"1.0": "#009600FF"
}
}
}
}
}
}
@@ -0,0 +1,60 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:hypnosis_targetimpact",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/psyspiral"
}
},
"curves": {
"variable.spiralsize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.5, 0.82, 0.95, 1, 1]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-(q.entity_radius*1.375)/math.clamp(q.entity_scale*1.1-0.1,1,9)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.8
},
"minecraft:particle_appearance_billboard": {
"size": ["0.75*v.spiralsize", "0.75*v.spiralsize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 192,
"texture_height": 24,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [24, 24],
"step_UV": [24, 0],
"frames_per_second": 16,
"max_frame": 8,
"loop": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFC377FF",
"0.8": "#A09148FF",
"1.0": "#009148FF"
}
}
}
}
}
}
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:kinesis_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/spoon"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-1.1/math.clamp(q.entity_scale*1.1-0.1,1,3)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 2
},
"minecraft:particle_motion_parametric": {
"relative_position": [0, "math.sin(v.particle_age*300)*0.05", 0]
},
"minecraft:particle_appearance_billboard": {
"size": [0.37, 0.4],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 42,
"texture_height": 15,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [14, 15],
"step_UV": [14, 0],
"frames_per_second": 4,
"max_frame": 3
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00FF008D",
"0.2": "#ffffffff",
"0.8": "#ffffffff",
"1.0": "#00FF008D"
}
}
}
}
}
}
@@ -0,0 +1,66 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:kinesis_actorspiral",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/spiral"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 7,
"max_particles": 100
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.75
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, "-1.1/math.clamp(q.entity_scale*1.1-0.1,1,3)"],
"radius": 0.5,
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.95
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": 1,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1.5, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": [0.2, 0.2],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 8,
"max_frame": 8
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00AE00FF",
"0.25": "#A0FF51CD",
"0.45": "#C0FF87E9",
"0.6": "#D0DD00FF",
"0.75": "#A0B702FF",
"1.0": "#009600FF"
}
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:lick_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/lick"
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.lick.target"
}
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0.1, -0.2]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.5
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [0.18, 0.6],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 42,
"texture_height": 20,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [6, 20],
"step_UV": [6, 0],
"frames_per_second": 16,
"max_frame": 7,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFFFFFFF",
"0.65": "#FFFFFFFF",
"1.0": "#00FFFFFF"
}
}
}
}
}
}
@@ -0,0 +1,64 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:lick_targetdrip",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/splash"
}
},
"curves": {
"variable.dousefade": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 1, 1, 1, 1, 1, 0.87, 0.57, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 6,
"max_particles": 100
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0.1, -0.15],
"radius": "0.375/math.clamp(q.entity_scale*1.1-0.07,1,2)",
"surface_only": true
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 2
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, "-v.particle_age*7", 0]
},
"minecraft:particle_appearance_billboard": {
"size": ["0.06*v.dousefade", "0.04*v.dousefade"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 12,
"texture_height": 2,
"flipbook": {
"base_UV": ["math.random_integer(0,1)*3", 0],
"size_UV": [3, 2],
"step_UV": [3, 0],
"frames_per_second": 1.5,
"max_frame": 4
}
}
},
"minecraft:particle_motion_collision": {
"collision_drag": 0.5,
"coefficient_of_restitution": 0.2,
"collision_radius": 0.01
},
"minecraft:particle_appearance_tinting": {
"color": [1, 1, 1, 1]
}
}
}
}
@@ -0,0 +1,65 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:lick_targetsplash",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/splash"
}
},
"curves": {
"variable.dousefade": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 1, 1, 1, 1, 1, 0.87, 0.57, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 12
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0.1, -0.15],
"radius": "0.1/math.clamp(q.entity_scale*1.1-0.07,1,2)",
"surface_only": true,
"direction": ["math.random(-15,15)", "math.random(-20,50)", "math.random(-15,15)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.65
},
"minecraft:particle_initial_speed": "math.random(4,12)",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -16, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": ["0.06*v.dousefade", "0.04*v.dousefade"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 12,
"texture_height": 2,
"flipbook": {
"base_UV": ["math.random_integer(0,1)*3", 0],
"size_UV": [3, 2],
"step_UV": [3, 0],
"frames_per_second": 3,
"max_frame": 4
}
}
},
"minecraft:particle_motion_collision": {
"collision_drag": 0.5,
"coefficient_of_restitution": 0.85,
"collision_radius": 0.01
},
"minecraft:particle_appearance_tinting": {
"color": [1, 1, 1, 1]
}
}
}
}
@@ -0,0 +1,72 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mist_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/poof"
}
},
"curves": {
"variable.gassize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 1, 1, 1]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 180,
"max_particles": 1000
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_shape_point": {},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(1.25,1.75)"
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(1.25,4.45)*1.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1.5, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": ["0.2*v.gassize", "0.2*v.gassize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 6,
"max_frame": 8,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#38FFFFFF",
"0.28": "#A0DCF6FF",
"0.67": "#A0B5E7FF",
"1.0": "#005897FF"
}
}
}
}
}
}
@@ -0,0 +1,76 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mist_actorshroud",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/poof"
}
},
"curves": {
"variable.gassize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 1, 1, 1]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 140,
"max_particles": 1000
},
"minecraft:emitter_lifetime_looping": {
"active_time": 2.25
},
"minecraft:emitter_shape_disc": {
"offset": [0, "math.random(0,6)", -2],
"radius": 8,
"direction": ["math.random(-1,1)", "math.random(0,1)", "math.random(-1,1)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(1.25,1.75)"
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(1.25,4.45)*0.1",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": ["0.25*v.gassize", "0.25*v.gassize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 6,
"max_frame": 8,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#38FFFFFF",
"0.28": "#A0DCF6FF",
"0.67": "#A0B5E7FF",
"1.0": "#005897FF"
}
}
}
}
}
}
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:pursuit_target",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/pursuit"
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.pursuit.target"
}
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 3,
"max_particles": 2
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.75
},
"minecraft:emitter_lifetime_events": {
"creation_event": "event_sound"
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-0.3/math.clamp(q.entity_scale*1.1-0.1,1,9)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [0.75, 0.75],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 210,
"texture_height": 21,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [21, 21],
"step_UV": [21, 0],
"frames_per_second": 16,
"max_frame": 10,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,59 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:pursuit_targetdots",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/xs-fadeorb"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 20
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, "-0.25/math.clamp(q.entity_scale*1.1-0.1,1,9)"],
"radius": "0.025/math.clamp(q.entity_scale*1.1-0.1,1,3)",
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": "math.random(2.1,6.3)",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 1.5
},
"minecraft:particle_appearance_billboard": {
"size": ["0.1-(v.particle_random_1*0.05)", "0.1-(v.particle_random_1*0.05)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 45,
"texture_height": 5,
"flipbook": {
"base_UV": [15, 0],
"size_UV": [5, 5],
"step_UV": [5, 0],
"frames_per_second": 12,
"max_frame": 6,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF697BB8",
"0.72": "#FF1F294B",
"1.0": "#00588DFF"
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:pursuit_targethit",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/hit"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-0.2/math.clamp(q.entity_scale*1.1-0.1,1,9)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.2
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,1)*90"
},
"minecraft:particle_appearance_billboard": {
"size": [1, 1],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 160,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [0, 32],
"frames_per_second": 24,
"max_frame": 5,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF697BB8",
"1.0": "#FF1F294B"
}
}
}
}
}
}
@@ -0,0 +1,66 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/quickattack_dashlines"
}
},
"curves": {
"variable.qsquish": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 100,
"max_particles": 100
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.25
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -1],
"radius": "math.clamp(query.entity_radius,1,50)",
"direction": [0, 0, 1]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.2
},
"minecraft:particle_initial_speed": "9+v.particle_age",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 0, 1]
},
"minecraft:particle_appearance_billboard": {
"size": ["0.2*v.qsquish", 0.02],
"facing_camera_mode": "lookat_direction",
"uv": {
"texture_width": 14,
"texture_height": 1,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [2, 1],
"step_UV": [2, 0],
"frames_per_second": 16,
"max_frame": 7
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.17": "#FFFFC58D",
"0.5": "#FFFFFBB4",
"0.86": "#FFFFA372"
}
}
}
}
}
}
@@ -0,0 +1,62 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_actorgrab",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/grab"
}
},
"curves": {
"variable.grabshrink": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 0.75, 0.6, 0.52, 0.5, 0.5, 0.5]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.3]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.5
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(q.entity_height,0.1,1.5)*v.grabshrink", "math.clamp(q.entity_height,0.1,1.5)*v.grabshrink"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 598,
"texture_height": 23,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [23, 23],
"step_UV": [46, 0],
"frames_per_second": 24,
"max_frame": 26
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00FFFFFF",
"0.3": "#ffffffff",
"0.5": "#ffffffff",
"1.0": "#00FF0000"
}
}
}
}
}
}
@@ -0,0 +1,62 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_actorin",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/xs-fadeorb"
}
},
"curves": {
"variable.grabline": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 0.5, 0.25, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 24
},
"minecraft:emitter_lifetime_looping": {
"active_time": 0.2
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -0.3],
"radius": "math.clamp(1.1+q.entity_height,1,3)/math.clamp(q.entity_scale,1,2)",
"surface_only": true,
"direction": "inwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.35
},
"minecraft:particle_initial_speed": "(20+(q.entity_height*3))/math.clamp(q.entity_scale,1,2)",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": "(6+(q.entity_height*1.5))/math.clamp(q.entity_scale,1,2)"
},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(0.15*q.entity_height,0.15,0.25)*v.grabline", "math.clamp(0.15*q.entity_height,0.15,0.25)*v.grabline"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 45,
"texture_height": 5,
"uv": [10, 0],
"uv_size": [5, 5]
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00FF6700",
"0.21": "#FFFFE792",
"0.5": "#FFFFD951",
"1.0": "#00FF6700"
}
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_ding",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/skyding"
}
},
"curves": {
"variable.dingsize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.8, 1, 1, 1, 0.95, 0.85, 0.5, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0.4, 0.5]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.65
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["0.9*v.dingsize", "0.9*v.dingsize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 275,
"texture_height": 25,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [25, 25],
"step_UV": [25, 0],
"frames_per_second": 16,
"max_frame": 11
}
}
}
}
}
}
@@ -0,0 +1,65 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/quickattack_dashlines"
}
},
"curves": {
"variable.qsquish": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 175,
"max_particles": 100
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.25
},
"minecraft:emitter_shape_sphere": {
"radius": "math.clamp(query.entity_radius,2.5,50)",
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": "12+v.particle_age",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 3
},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(0.25*q.entity_height,0.06,0.25)*v.qsquish", 0.02],
"facing_camera_mode": "lookat_direction",
"uv": {
"texture_width": 14,
"texture_height": 1,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [2, 1],
"step_UV": [2, 0],
"frames_per_second": 16,
"max_frame": 7
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.17": "#FFFFC58D",
"0.5": "#FFFFFBB4",
"0.86": "#FFFFA372"
}
}
}
}
}
}
@@ -0,0 +1,64 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_targetdrop",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/quickattack_dashlines"
}
},
"curves": {
"variable.qsquish": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 1, 1, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 225,
"max_particles": 100
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.225
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 2, 0],
"radius": "math.clamp(query.entity_radius,2.5,50)",
"direction": [0, -1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": "8+v.particle_age",
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(0.25*q.entity_height,0.06,0.25)*v.qsquish", 0.02],
"facing_camera_mode": "lookat_direction",
"uv": {
"texture_width": 14,
"texture_height": 1,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [2, 1],
"step_UV": [2, 0],
"frames_per_second": 16,
"max_frame": 7
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.17": "#FFFFC58D",
"0.5": "#FFFFFBB4",
"0.86": "#FFFFA372"
}
}
}
}
}
}
@@ -0,0 +1,71 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_targetdust",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/smokeorb"
}
},
"curves": {
"variable.mudsize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 1, 1, 1, 1, 0.5, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 600,
"max_particles": 600
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.15
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0.05, 0.1],
"radius": 0.1,
"direction": ["math.random(-10,10)*1", "math.random(1.5,25.5)*1.25", "math.random(-10,10)*1"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1.3
},
"minecraft:particle_initial_speed": "math.random(2.3,22.2)*0.7",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 2.5
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.25+(v.particle_random_1*0.15))*v.mudsize", "(0.25+(v.particle_random_1*0.15))*v.mudsize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 99,
"texture_height": 9,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [9, 9],
"step_UV": [9, 0],
"frames_per_second": 8,
"max_frame": 10,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.1
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00454038",
"0.14": "#7065594E",
"1.0": "#00454038"
}
}
}
}
}
}
@@ -0,0 +1,66 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:seismictoss_targetrocks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/impact-rock"
}
},
"curves": {
"variable.mudsize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 1, 1, 1, 1, 1, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 500,
"max_particles": 100
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.25
},
"minecraft:emitter_shape_disc": {
"offset": [0, 0.02, 0.1],
"radius": 0.5,
"direction": ["math.random(-10,10)*2", "math.random(2.5,34.5)*1.75", "math.random(-10,10)*2"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1.7
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(6.3,42.2)*0.8",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -30, 0],
"linear_drag_coefficient": 0.75
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.075+(v.particle_random_1*0.2))*v.mudsize", "(0.075+(v.particle_random_1*0.2))*v.mudsize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 56,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [8, 8],
"step_UV": [0, 8],
"frames_per_second": 16,
"max_frame": 7,
"loop": true
}
}
},
"minecraft:particle_motion_collision": {
"collision_drag": 2,
"coefficient_of_restitution": 0.7,
"collision_radius": 0.01
}
}
}
}
@@ -0,0 +1,67 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:sing_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/note"
}
},
"curves": {
"variable.songsize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.63, 0.9, 0.98, 1, 1, 1, 1]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 3,
"max_particles": 100
},
"minecraft:emitter_lifetime_looping": {
"active_time": 2.75
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.15],
"direction": ["math.sin(v.emitter_age*400)*2", "math.cos(v.emitter_age*390)*2", "math.random(-15,-10)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1.75
},
"minecraft:particle_initial_speed": "math.random(1.31,1.325)*1.1",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 0.3, 0],
"linear_drag_coefficient": 0.4
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.15*v.songsize)+(v.particle_random_2*0.04)", "(0.24375*v.songsize)+(v.particle_random_2*0.04)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 26,
"flipbook": {
"base_UV": [0, "math.round(v.particle_random_4)*13"],
"size_UV": [8, 13],
"step_UV": [8, 0],
"frames_per_second": 6,
"max_frame": 4,
"loop": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#60A5F8FF",
"0.5": "#CC67BCFF",
"1.0": "#005601FF"
}
}
}
}
}
}
@@ -0,0 +1,57 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:sing_actorwave",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/large-ring"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 2.5,
"max_particles": 10
},
"minecraft:emitter_lifetime_once": {
"active_time": 2
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.25],
"direction": [0, 0, -1]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.7
},
"minecraft:particle_initial_speed": 0.2,
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 0.5
},
"minecraft:particle_appearance_billboard": {
"size": [0.5, 0.5],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 160,
"texture_height": 20,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [20, 20],
"step_UV": [20, 0],
"frames_per_second": 13,
"max_frame": 8
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#6096E5FF",
"0.35": "#CC67BCFF",
"1.0": "#505601FF"
}
}
}
}
}
}
@@ -0,0 +1,69 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:sing_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/note"
}
},
"curves": {
"variable.songsize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.63, 0.9, 0.98, 1, 1, 1]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": "5*(q.entity_radius*1.01)",
"max_particles": 100
},
"minecraft:emitter_lifetime_looping": {
"active_time": 3
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0.2, 0],
"radius": "q.entity_radius*1.1",
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1.75
},
"minecraft:particle_initial_speed": "math.random(1.31,1.325)*0.3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 0.3, 0],
"linear_drag_coefficient": 0.4
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.15*v.songsize)+(v.particle_random_2*0.04)", "(0.24375*v.songsize)+(v.particle_random_2*0.04)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 26,
"flipbook": {
"base_UV": [0, "math.round(v.particle_random_4)*13"],
"size_UV": [8, 13],
"step_UV": [8, 0],
"frames_per_second": 6,
"max_frame": 4,
"loop": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00A5F8FF",
"0.5": "#CC67BCFF",
"1.0": "#005601FF"
}
}
}
}
}
}
@@ -0,0 +1,67 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:superfang_actor",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/poof"
}
},
"curves": {
"variable.smokesize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.66, 0.94, 1, 1, 1, 1, 1, 0.93, 0.66, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 10,
"max_particles": 100
},
"minecraft:emitter_lifetime_looping": {
"active_time": 0.8
},
"minecraft:emitter_shape_disc": {
"offset": [0, "(0.2+(q.entity_height*1)-(q.entity_height*(v.particle_random_2*0.2)))/0.85", 0],
"radius": "(q.entity_radius-(q.entity_radius*(v.particle_random_2*0.3)))/0.85",
"surface_only": true,
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(1.1,1.7)"
},
"minecraft:particle_initial_speed": 0.5,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["(0.25*v.smokesize)-(v.particle_random_2*0.075)", "(0.25*v.smokesize)-(v.particle_random_2*0.075)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 5,
"max_frame": 8,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00000000",
"0.3": "#B0000000",
"0.7": "#B0000000",
"1.0": "#00000000"
}
}
}
}
}
}
@@ -0,0 +1,56 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:superfang_actorrage",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/impact-fighting"
}
},
"curves": {
"variable.ragesize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.66, 0.94, 1, 1, 0.93, 0.66, 0]
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 10,
"max_particles": 100
},
"minecraft:emitter_lifetime_looping": {
"active_time": 0.9
},
"minecraft:emitter_shape_disc": {
"offset": [0, "0.25+(q.entity_height*1.1)-(q.entity_height*(v.particle_random_2*0.3))", 0],
"radius": "q.entity_radius*1.1-(q.entity_radius*(v.particle_random_2*0.25))",
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.35
},
"minecraft:particle_initial_speed": 0.2,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["0.2*v.ragesize", "0.2*v.ragesize"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 56,
"flipbook": {
"base_UV": [0, 8],
"size_UV": [7, 7],
"step_UV": [0, 8],
"frames_per_second": 10,
"max_frame": 5,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:superfang_target",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/fang"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, -0.25]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.55
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [1, 1],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 32,
"texture_height": 192,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [0, 32],
"frames_per_second": 16,
"max_frame": 6
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#00FFFFFF",
"0.16": "#FFFFEDEA",
"0.38": "#FFFFAFA0",
"0.58": "#FFFF4429",
"1.0": "#008B0000"
}
}
}
}
}
}
@@ -0,0 +1,65 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:superfang_targetspark",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/critical_hit"
}
},
"curves": {
"variable.bitespark": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0, 0.87, 1, 0.5, 0]
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 14
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 0, -0.25],
"radius": 0.025,
"surface_only": true,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.45
},
"minecraft:particle_initial_speed": "math.random(1,3)*4",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": ["0.125*v.bitespark", "0.125*v.bitespark"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 8,
"texture_height": 8,
"uv": [0, 0],
"uv_size": [7, 7]
}
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.01,
"expire_on_contact": true
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFFFAFA0",
"0.35": "#FFFF4429",
"1.0": "#00990000"
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:withdraw_actor1",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/withdraw"
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.withdraw.actor"
}
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_lifetime_events": {
"creation_event": "event_sound"
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-q.entity_radius*0.7"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(q.entity_height*0.8,0.1,1.2)", "math.clamp(q.entity_height*0.8,0.1,1.2)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 147,
"texture_height": 84,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [21, 21],
"step_UV": [21, 0],
"frames_per_second": 10,
"max_frame": 7,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:withdraw_actor2",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/withdraw"
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.withdraw.actor"
}
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_lifetime_events": {
"creation_event": "event_sound"
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-q.entity_radius*0.7"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(q.entity_height*0.8,0.1,1.2)", "math.clamp(q.entity_height*0.8,0.1,1.2)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 147,
"texture_height": 84,
"flipbook": {
"base_UV": [0, 21],
"size_UV": [21, 21],
"step_UV": [21, 0],
"frames_per_second": 10,
"max_frame": 7,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:withdraw_actor3",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/withdraw"
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.withdraw.actor"
}
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_lifetime_events": {
"creation_event": "event_sound"
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-q.entity_radius*0.7"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(q.entity_height*0.8,0.1,1.2)", "math.clamp(q.entity_height*0.8,0.1,1.2)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 147,
"texture_height": 84,
"flipbook": {
"base_UV": [0, 42],
"size_UV": [21, 21],
"step_UV": [21, 0],
"frames_per_second": 10,
"max_frame": 7,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,54 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:withdraw_actor4",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/withdraw"
}
},
"events": {
"event_sound": {
"sound_effect": {
"event_name": "cobblemon:move.withdraw.actor"
}
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1.5
},
"minecraft:emitter_lifetime_events": {
"creation_event": "event_sound"
},
"minecraft:emitter_shape_point": {
"offset": [0, 0, "-q.entity_radius*0.7"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.4
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp(q.entity_height*0.8,0.1,1.2)", "math.clamp(q.entity_height*0.8,0.1,1.2)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 147,
"texture_height": 84,
"flipbook": {
"base_UV": [0, 63],
"size_UV": [21, 21],
"step_UV": [21, 0],
"frames_per_second": 10,
"max_frame": 7,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:withdraw_actorbubbles",
"basic_render_parameters": {
"material": "particles_blend",
"texture": "textures/particles/small_bubble"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": "math.clamp(15*(q.entity_radius*0.75),15,35)",
"max_particles": 120
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.4
},
"minecraft:emitter_shape_sphere": {
"radius": "(q.entity_radius*(0.95+v.emitter_age))/math.clamp(q.entity_scale*1.1-0.1,1,2)",
"surface_only": true,
"direction": ["math.random(-1.5,1.5)*0.4", "math.random(1,2)", "math.random(-1.5,1.5)*0.4"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.7
},
"minecraft:particle_initial_speed": "math.random(1.55,3.75)+(q.entity_height*0.1)",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -0.125, 0],
"linear_drag_coefficient": 3
},
"minecraft:particle_appearance_billboard": {
"size": ["0.125+(v.particle_random_2*0.1)*math.clamp(q.entity_height,1,1.25)", "0.125+(v.particle_random_2*0.1)*math.clamp(q.entity_height,1,1.25)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 48,
"texture_height": 8,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [8, 8],
"step_UV": [8, 0],
"frames_per_second": 18,
"max_frame": 6,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_lighting": {}
}
}
}
@@ -365,15 +365,15 @@
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
@@ -1010,18 +1010,6 @@
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"3.0": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"0.125": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.3333": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.375": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"3.0": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]}
}
}
}
},
@@ -164,6 +164,438 @@
}
}
},
"animation.milotic.ground_walk": {
"loop": true,
"bones": {
"body": {
"position": [0, -2, "-13+Math.cos((query.anim_time) * 90 * 2) * 1"]
},
"neck": {
"rotation": [15, 0, 0]
},
"neck2": {
"rotation": [-25, 0, 0]
},
"neck3": {
"rotation": [-10, 0, 0]
},
"neck4": {
"rotation": [12.5, 0, 0]
},
"neck5": {
"rotation": [12.5, 0, 0]
},
"head_angle": {
"rotation": [12.5, 0, 0]
},
"eyelash_left2": {
"rotation": [0, 15, 0]
},
"eyelash_left3": {
"rotation": [0, 15, 0]
},
"eyelash_left4": {
"rotation": [0, 7.5, 0]
},
"eyelash_left5": {
"rotation": [0, -52.5, 0]
},
"eyelash_left6": {
"rotation": [0, -62.5, 0]
},
"eyelash_right2": {
"rotation": [0, -15, 0]
},
"eyelash_right3": {
"rotation": [0, -15, 0]
},
"eyelash_right4": {
"rotation": [0, -7.5, 0]
},
"eyelash_right5": {
"rotation": [0, 52.5, 0]
},
"eyelash_right6": {
"rotation": [0, 62.5, 0]
},
"hair_left1": {
"rotation": [0, -2.5, 77.5]
},
"hair_left2": {
"rotation": [0, 0, -5]
},
"hair_left3": {
"rotation": [0, 0, -5]
},
"hair_left4": {
"rotation": [-0.07551, 4.97252, -3.02145]
},
"hair_left5": {
"rotation": [0, -5, -10]
},
"hair_left6": {
"rotation": [0, -5, 5]
},
"hair_left7": {
"rotation": [0, -5, 7.5]
},
"hair_left8": {
"rotation": [0, 0, 7.5]
},
"hair_right1": {
"rotation": [0, 2.5, -77.5]
},
"hair_right2": {
"rotation": [0, 0, 5]
},
"hair_right3": {
"rotation": [0, 0, 5]
},
"hair_right4": {
"rotation": [-0.07551, -4.97252, 3.02145]
},
"hair_right5": {
"rotation": [0, 5, 10]
},
"hair_right6": {
"rotation": [0, 5, -5]
},
"hair_right7": {
"rotation": [0, 5, -7.5]
},
"hair_right8": {
"rotation": [0, 0, -7.5]
},
"torso": {
"rotation": [57.5, 0, "math.sin(q.anim_time*90*4+50)*2"]
},
"tail1": {
"rotation": [32.5, 0, "math.sin(q.anim_time*90*4)*3"]
},
"tail2": {
"rotation": [-2.5, 0, "math.sin(q.anim_time*90*4-60)*4"]
},
"tail3": {
"rotation": [0, 0, "math.sin(q.anim_time*90*4-120)*6"]
},
"tail4": {
"rotation": [0, 0, "math.sin(q.anim_time*90*4-180)*10"]
},
"tail5": {
"rotation": [2.49673, -0.02352, "0.2189+math.sin(q.anim_time*90*4-240)*10"]
},
"tail6": {
"rotation": [25, 0, "math.sin(q.anim_time*90*4-360)*16"]
},
"tail7": {
"rotation": [32.5, 0, "math.sin(q.anim_time*90*4-420)*15"]
},
"tail8": {
"rotation": [45, 0, "math.sin(q.anim_time*90*4-460)*15"]
},
"tail_fins": {
"rotation": [0, -50, "math.sin(q.anim_time*90*4-500)*15"]
}
}
},
"animation.milotic.water_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [0, -7.5, 0.00001],
"position": [-0.5, "-5+Math.cos((query.anim_time) * 90 * 2) * 2", -10]
},
"neck2": {
"rotation": [-32.22927, 13.82594, -19.1114]
},
"neck3": {
"rotation": [-9.90769, 19.62486, -2.29425]
},
"neck4": {
"rotation": [1.61029, 18.32496, -1.40133]
},
"eyebrow_left_rotation": {
"rotation": [0, 0, 0]
},
"hair_left2": {
"rotation": [5.0763, -12.42428, -4.24916]
},
"hair_left3": {
"rotation": [5.05707, -9.94292, -3.81228]
},
"hair_left4": {
"rotation": [4.99935, -7.44357, -3.80355]
},
"hair_left5": {
"rotation": [4.62863, -2.25659, -5.82345]
},
"hair_left6": {
"rotation": [5.10395, 2.27982, -7.50755]
},
"hair_left7": {
"rotation": [5, 0, -7.5]
},
"hair_left8": {
"rotation": [5, 0, -5]
},
"eyelash_left": {
"rotation": [2.5, 2.5, 0]
},
"eyelash_left2": {
"rotation": [-5.0639, 17.49037, -0.22838]
},
"eyelash_left3": {
"rotation": [0, 22.5, 0]
},
"eyelash_left4": {
"rotation": [0, 10, 0]
},
"eyelash_left5": {
"rotation": [0, -37.5, 0]
},
"torso": {
"rotation": [69.93033, -56.34612, 0.25026]
},
"tail1": {
"rotation": [3.31937, 6.75962, -29.95713]
},
"tail2": {
"rotation": [0.10407, -0.51864, -41.2109]
},
"tail3": {
"rotation": [-9.16112, -3.92892, -35.02617]
},
"tail4": {
"rotation": [-9.0102, -4.02994, -40.05421]
},
"tail5": {
"rotation": [-16.76884, 6.26649, -24.00507]
},
"tail8": {
"rotation": [-15.75003, -9.40585, -9.52142]
},
"tail_fins": {
"rotation": [-42.2098, 68.84015, -53.25769]
},
"tail_fin": {
"rotation": [0, 0, 10]
},
"tail_fin2": {
"rotation": [0, 0, 7.5]
},
"tail_fin3": {
"rotation": [0, 0, 2.5]
},
"head_angle": {
"rotation": [40, 0, 0]
},
"tail7": {
"rotation": [-12.85767, -4.59902, -21.11073]
},
"hair_right2": {
"rotation": [5.0763, 12.42428, 4.24916]
},
"hair_right3": {
"rotation": [5.05707, 9.94292, 3.81228]
},
"hair_right4": {
"rotation": [4.99935, 7.44357, 3.80355]
},
"hair_right5": {
"rotation": [4.62863, 2.25659, 5.82345]
},
"hair_right6": {
"rotation": [5.33581, -4.75998, 7.28055]
},
"hair_right7": {
"rotation": [4.95744, 0.65182, 0.02822]
},
"hair_right8": {
"rotation": [4.99527, 0.21782, 2.5095]
},
"eyelash_right": {
"rotation": [2.5, -2.5, 0],
"position": [0, 0, 0]
},
"eyelash_right2": {
"rotation": [-5.0639, -17.49037, 0.22838]
},
"eyelash_right3": {
"rotation": [0, -20, 0]
},
"eyelash_left6": {
"rotation": [0, -50, 0]
},
"eyelash_right4": {
"rotation": [0, -10, 0]
},
"eyelash_right5": {
"rotation": [0, 37.5, 0]
},
"eyelash_right6": {
"rotation": [0, 50, 0]
},
"neck": {
"rotation": [25.57876, -51.11002, 15.25293]
},
"eyes": {
"position": [0, 0.25, 0]
},
"hair_right1": {
"rotation": [-0.6574, -7.4713, -69.95708]
},
"tail6": {
"rotation": [-12.5244, 10.42548, -17.85594]
},
"eyebrow_right2": {
"rotation": [-53.16171, -7.57131, 9.97528]
},
"hair_left1": {
"rotation": [-0.6574, 7.4713, 69.95708]
},
"head": {
"rotation": [-25, 0, 0]
},
"neck5": {
"rotation": [7.5, 0, 0]
}
}
},
"animation.milotic.water_swim": {
"loop": true,
"bones": {
"body": {
"rotation": [90, 0, 0],
"position": [0, "-3+Math.cos((query.anim_time) * 90 * 2) * 2", "-7+Math.cos((query.anim_time) * 90 * 2) * 1"]
},
"neck": {
"rotation": [-5, 0, "math.sin(q.anim_time*90*4)*1"]
},
"neck2": {
"rotation": [10, 0, "math.sin(q.anim_time*90*4-60)*2"]
},
"neck3": {
"rotation": [-10, 0, "math.sin(q.anim_time*90*4-60)*2"]
},
"neck4": {
"rotation": [-15, 0, "math.sin(q.anim_time*90*4-120)*1"]
},
"neck5": {
"rotation": [-15, 0, 0]
},
"head_angle": {
"rotation": [-55, 0, "-math.sin(q.anim_time*90*4-60)*2"]
},
"eyelash_left2": {
"rotation": [0, 15, 0]
},
"eyelash_left3": {
"rotation": [0, 15, 0]
},
"eyelash_left4": {
"rotation": [0, 7.5, 0]
},
"eyelash_left5": {
"rotation": [0, -52.5, 0]
},
"eyelash_left6": {
"rotation": [0, -62.5, 0]
},
"eyelash_right2": {
"rotation": [0, -15, 0]
},
"eyelash_right3": {
"rotation": [0, -15, 0]
},
"eyelash_right4": {
"rotation": [0, -7.5, 0]
},
"eyelash_right5": {
"rotation": [0, 52.5, 0]
},
"eyelash_right6": {
"rotation": [0, 62.5, 0]
},
"hair_left1": {
"rotation": [0, -5, 77.5]
},
"hair_left2": {
"rotation": [0, -37.5, -5]
},
"hair_left3": {
"rotation": [-3.28331, -15.28603, -4.67158]
},
"hair_left4": {
"rotation": [-0.07788, -15.02746, -2.99471]
},
"hair_left5": {
"rotation": [0, -5, -10]
},
"hair_left6": {
"rotation": [0, -5, 5]
},
"hair_left7": {
"rotation": [0, -5, 7.5]
},
"hair_left8": {
"rotation": [0, 0, 7.5]
},
"hair_right1": {
"rotation": [0, 5, -77.5]
},
"hair_right2": {
"rotation": [0, 37.5, 5]
},
"hair_right3": {
"rotation": [-3.28331, 15.28603, 4.67158]
},
"hair_right4": {
"rotation": [-0.07788, 15.02746, 2.99471]
},
"hair_right5": {
"rotation": [0, 5, 10]
},
"hair_right6": {
"rotation": [0, 5, -5]
},
"hair_right7": {
"rotation": [0, 5, -7.5]
},
"hair_right8": {
"rotation": [0, 0, -7.5]
},
"torso": {
"rotation": [0, 0, "math.sin(q.anim_time*90*4+50)*2"]
},
"tail1": {
"rotation": ["-2.5+math.sin(q.anim_time*90*2)*2", 0, "math.sin(q.anim_time*90*4)*1"]
},
"tail2": {
"rotation": ["2.5+math.sin(q.anim_time*90*2-40)*2", 0, "math.sin(q.anim_time*90*4-60)*3"]
},
"tail3": {
"rotation": ["math.sin(q.anim_time*90*2-80)*1", 0, "math.sin(q.anim_time*90*4-120)*2"]
},
"tail4": {
"rotation": ["2.5+math.sin(q.anim_time*90*2-120)*1", 0, "math.sin(q.anim_time*90*4-180)*3"]
},
"tail5": {
"rotation": ["2.497+math.sin(q.anim_time*90*2-160)*1", -0.00692, "0.1714+math.sin(q.anim_time*90*4-240)*4"]
},
"tail6": {
"rotation": ["-2.5+math.sin(q.anim_time*90*2-200)*1", 0, "math.sin(q.anim_time*90*4-360)*5"]
},
"tail7": {
"rotation": [-2.5, 0, "math.sin(q.anim_time*90*4-420)*4"]
},
"tail8": {
"rotation": [0, 0, "math.sin(q.anim_time*90*4-460)*3"]
},
"tail_fins": {
"rotation": [17.5, -15, "math.sin(q.anim_time*90*4-500)*5"]
}
}
},
"animation.milotic.blink": {
"animation_length": 0.1667,
"bones": {
@@ -255,14 +687,6 @@
"position": [-0.1, 0, 0]
}
}
},
"animation.milotic.cry": {
"animation_length": 1.2,
"sound_effects": {
"0.04": {
"effect": "pokemon.milotic.cry"
}
}
}
}
}
@@ -33,13 +33,14 @@
"rotation": ["10-math.sin(q.anim_time*90*1-45)*4", 0, 0]
},
"leg_left2": {
"rotation": ["23.5+math.sin(q.anim_time*90*2)*6", 0, 0]
"rotation": ["13+math.sin(q.anim_time*90*2)*5", 0, 0]
},
"hand_right": {
"rotation": [0, 0, "-40-math.sin(q.anim_time*90*2)*4"]
},
"leg_left1": {
"rotation": ["-30-math.sin(q.anim_time*90*2)*6", 0, "5+math.sin(q.anim_time*90*2)*1"]
"rotation": ["-30-math.sin(q.anim_time*90*2)*6", 0, "5+math.sin(q.anim_time*90*2)*1"],
"position": [0, "0-math.sin(q.anim_time*90*2)*0.2", "0+math.sin(q.anim_time*90*2)*0.3"]
},
"tail5": {
"rotation": [7.5, "math.sin(q.anim_time*90*1-120)*8", 0]
@@ -69,22 +70,23 @@
"rotation": [17.5, "math.sin(q.anim_time*90*1-135)*8", 0]
},
"foot_left": {
"rotation": ["15-math.sin(q.anim_time*90*2)*2", 0, 0]
"rotation": ["22.5-math.sin(q.anim_time*90*2)*3", 0, 0]
},
"foot_left2": {
"rotation": [-25, 0, 0]
"rotation": ["-23.0091-math.sin(q.anim_time*90*2)*-2", -0.48399, 1.94152]
},
"leg_right1": {
"rotation": ["-30-math.sin(q.anim_time*90*2)*6", 0, "-5-math.sin(q.anim_time*90*2)*1"]
"rotation": ["-30-math.sin(q.anim_time*90*2)*6", 0, "-5-math.sin(q.anim_time*90*2)*1"],
"position": [0, "0-math.sin(q.anim_time*90*2)*0.2", "0+math.sin(q.anim_time*90*2)*0.3"]
},
"leg_right2": {
"rotation": ["23.5+math.sin(q.anim_time*90*2)*6", 0, 0]
"rotation": ["13+math.sin(q.anim_time*90*2)*5", 0, 0]
},
"foot_right": {
"rotation": ["15-math.sin(q.anim_time*90*2)*2", 0, 0]
"rotation": ["22.5-math.sin(q.anim_time*90*2)*3", 0, 0]
},
"foot_right2": {
"rotation": [-25, 0, 0]
"rotation": ["-23.0091-math.sin(q.anim_time*90*2)*-2", 0.48399, -1.94152]
}
}
},
@@ -249,11 +251,6 @@
"1.5": [0, 0, 0]
}
}
},
"sound_effects": {
"0.0": {
"effect": "pokemon.garchomp.cry"
}
}
},
"animation.garchomp.battle_idle": {
@@ -291,13 +288,13 @@
"rotation": ["7.5-math.sin(q.anim_time*90*4)*6", 0, "0-math.sin(q.anim_time*90*4)*1.5"]
},
"leg_left2": {
"rotation": ["5.5+math.sin(q.anim_time*90*4)*9", "-math.sin(q.anim_time*90*4)*2", 5]
"rotation": ["-0.5+math.sin(q.anim_time*90*4)*6", "-math.sin(q.anim_time*90*4)*2", 5]
},
"hand_right": {
"rotation": [0, 0, "-40-math.sin(q.anim_time*90*4)*6"]
},
"leg_left1": {
"position": [0, "math.sin(q.anim_time*90*4)*0.1", 0]
"position": [0, "0-math.sin(q.anim_time*90*4)*0.2", "0+math.sin(q.anim_time*90*4)*0.6"]
},
"arm_left": {
"rotation": [-5.22206, "34.6575-math.sin(q.anim_time*90*4-45)*4", 15.86961]
@@ -324,26 +321,27 @@
"rotation": [17.5, "math.sin(q.anim_time*90*2-135)*8", 0]
},
"foot_left": {
"rotation": ["-10-math.sin(q.anim_time*90*4)*2", 0, 0]
"rotation": ["-21-math.sin(q.anim_time*90*4)*2", 0, 0]
},
"foot_left2": {
"rotation": ["-12.5-math.sin(q.anim_time*90*4)*2", 0, 0]
"rotation": ["-2.7011-math.sin(q.anim_time*90*4)*3/2", -3.45533, 6.66067]
},
"leg_right0": {
"rotation": ["-35-math.sin(q.anim_time*90*4)*6", 0, "2.5+math.sin(q.anim_time*90*4)*2"],
"position": [0, "math.sin(q.anim_time*90*4)*0.2", 0]
},
"leg_right1": {
"position": ["math.sin(q.anim_time*90*4)*0.1", 0, 0]
"rotation": ["1.7287-math.sin(q.anim_time*90*4)*2", -7.18659, "2.1694-math.sin(q.anim_time*90*4)*1"],
"position": [0, "0-math.sin(q.anim_time*90*4)*0.2", "0+math.sin(q.anim_time*90*4)*0.6"]
},
"leg_right2": {
"rotation": ["20+math.sin(q.anim_time*90*4)*6", "5+math.sin(q.anim_time*90*4)*0.5", "5-math.sin(q.anim_time*90*4)*1"]
"rotation": ["14.5+math.sin(q.anim_time*90*4)*7", 0, 0]
},
"foot_right": {
"rotation": ["5-math.sin(q.anim_time*90*4)*2", "math.sin(q.anim_time*90*4)*2", 0]
"rotation": ["32.5-math.sin(q.anim_time*90*4)*3", 0, 0]
},
"foot_right2": {
"rotation": [-5, 0, "-math.sin(q.anim_time*90*4)*1"]
"rotation": ["-31.0384-math.sin(q.anim_time*90*4)*-2", 0.87411, -4.41107]
}
}
}
@@ -23,6 +23,14 @@
"root": [0, 0, -1]
}
},
{
"name": "locator_top",
"parent": "charizard",
"pivot": [0, 41, -1],
"locators": {
"top": [0, 41, -1]
}
},
{
"name": "body",
"parent": "charizard",
@@ -37,11 +45,11 @@
}
},
{
"name": "locator_body",
"name": "locator_middle",
"parent": "body",
"pivot": [0, 20, -0.5],
"locators": {
"body": [0, 20, -0.5]
"middle": [0, 20, -0.5]
}
},
{
@@ -60,6 +68,14 @@
{"origin": [-6, 18, -7], "size": [12, 7, 13], "uv": [0, 31]}
]
},
{
"name": "locator_seat_1",
"parent": "torso2",
"pivot": [0, 25, 5.5],
"locators": {
"seat_1": [0, 25, 5.5]
}
},
{
"name": "neck",
"parent": "torso2",
@@ -5,7 +5,7 @@
"description": {
"identifier": "geometry.onix",
"texture_width": 256,
"texture_height": 256,
"texture_height": 128,
"visible_bounds_width": 23,
"visible_bounds_height": 4.5,
"visible_bounds_offset": [0, 1.75, 0]
@@ -25,13 +25,25 @@
"parent": "body",
"pivot": [0, 11, -30],
"cubes": [
{"origin": [-13, 0, -46], "size": [26, 22, 16], "inflate": 0.01, "uv": [0, 43]},
{"origin": [-13, 4, -52], "size": [26, 18, 6], "inflate": 0.02, "uv": [0, 119]}
{"origin": [-13, 0, -52], "size": [26, 21, 22], "inflate": 0.02, "uv": [0, 45]}
]
},
{
"name": "muzzle",
"parent": "head",
"pivot": [0, 5.75, -52],
"cubes": [
{"origin": [-0.5, 13, -52], "size": [12, 8, 6], "pivot": [11.5, 19, -52], "rotation": [0, -45, 0], "uv": [172, 108]},
{"origin": [-11.5, 13, -52], "size": [12, 8, 6], "pivot": [-11.5, 19, -52], "rotation": [0, 45, 0], "uv": [166, 82]},
{"origin": [-12, 6.05, -64.95], "size": [24, 7, 13], "uv": [60, 88]},
{"origin": [-10, 6.05, -68.95], "size": [20, 7, 4], "uv": [96, 65]},
{"origin": [-3, 11, -74.9], "size": [6, 8, 15], "inflate": 0.015, "pivot": [0, 19, -60.6], "rotation": [30, 0, 0], "uv": [210, 32]},
{"origin": [-3, 16, -60.5], "size": [6, 5, 9], "inflate": 0.01, "uv": [178, 0]}
]
},
{
"name": "eyes",
"parent": "head",
"parent": "muzzle",
"pivot": [-13, 19, -52]
},
{
@@ -40,7 +52,7 @@
"pivot": [-7.2, 15.25, -55.8],
"rotation": [0, 45, 0],
"cubes": [
{"origin": [-11.75, 13.25, -56.3], "size": [10, 5, 0], "pivot": [-6.2, 15.25, -56.3], "rotation": [0, 0, 2.5], "uv": [82, 5]}
{"origin": [-10.75, 13.25, -56.2], "size": [9, 4, 0], "pivot": [-6.2, 15.25, -56.3], "rotation": [0, 0, 2.5], "uv": [82, 4]}
]
},
{
@@ -48,15 +60,15 @@
"parent": "eye_left",
"pivot": [-3.5, 15, -56.3],
"cubes": [
{"origin": [-4, 14, -56.3], "size": [1, 2, 0], "inflate": 0.01, "pivot": [-3.5, 15, -56.3], "rotation": [0, 0, 0], "uv": [0, 2]}
{"origin": [-4, 14, -56.21], "size": [1, 2, 0], "inflate": 0.01, "pivot": [-3.5, 15, -56.3], "rotation": [0, 0, 0], "uv": [0, 2]}
]
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [-3.5, 15.25, -56.1],
"pivot": [-3.5, 15.25, -56],
"cubes": [
{"origin": [-5, 14, -56.2], "size": [3, 2, 0], "inflate": 0.02, "pivot": [-3.5, 15.25, -56.1], "rotation": [0, 0, 0], "uv": [8, 2]}
{"origin": [-5, 14, -56.1], "size": [3, 2, 0], "inflate": 0.03, "pivot": [-3.5, 15.25, -56], "rotation": [0, 0, 0], "uv": [8, 2]}
]
},
{
@@ -65,73 +77,60 @@
"pivot": [7.2, 15.25, -55.8],
"rotation": [0, -45, 0],
"cubes": [
{"origin": [1.75, 13.25, -56.3], "size": [10, 5, 0], "pivot": [6.2, 15.25, -56.3], "rotation": [0, 0, -2.5], "uv": [82, 0]}
{"origin": [1.75, 13.25, -56.2], "size": [9, 4, 0], "pivot": [6.2, 15.25, -56.3], "rotation": [0, 0, -2.5], "uv": [82, 0]}
]
},
{
"name": "pupil_right",
"parent": "eye_right",
"pivot": [3.5, 15.25, -56.3],
"pivot": [3.5, 15, -56.3],
"cubes": [
{"origin": [3, 14, -56.3], "size": [1, 2, 0], "inflate": 0.01, "pivot": [3.5, 15.25, -56.3], "rotation": [0, 0, 0], "uv": [0, 0]}
{"origin": [3, 14, -56.21], "size": [1, 2, 0], "inflate": 0.01, "pivot": [3.5, 15, -56.3], "rotation": [0, 0, 0], "uv": [0, 0]}
]
},
{
"name": "eyelid_right",
"parent": "pupil_right",
"pivot": [3.5, 15.25, -56.3],
"parent": "eye_right",
"pivot": [3.5, 15.25, -56],
"cubes": [
{"origin": [2, 14, -56.2], "size": [3, 2, 0], "inflate": 0.02, "pivot": [3.5, 15.25, -56.3], "rotation": [0, 0, 0], "uv": [8, 0]}
]
},
{
"name": "muzzle",
"parent": "head",
"pivot": [0, 5.75, -52],
"cubes": [
{"origin": [-0.5, 13, -52], "size": [12, 9, 13], "pivot": [11.5, 19, -52], "rotation": [0, -45, 0], "uv": [148, 110]},
{"origin": [-11.5, 13, -52], "size": [12, 9, 13], "pivot": [-11.5, 19, -52], "rotation": [0, 45, 0], "uv": [141, 154]},
{"origin": [-12, 6.25, -63.75], "size": [24, 7, 12], "uv": [72, 36]},
{"origin": [-10, 6.25, -67.75], "size": [20, 7, 4], "uv": [140, 141]},
{"origin": [-3, 5, -67.5], "size": [6, 8, 21], "inflate": 0.01, "pivot": [0, 5, -67.5], "rotation": [25, 0, 0], "uv": [115, 112]},
{"origin": [-3, 16, -60.6], "size": [6, 6, 9], "inflate": 0.01, "uv": [0, 169]}
{"origin": [2, 14, -56.1], "size": [3, 2, 0], "inflate": 0.03, "pivot": [3.5, 15.25, -56], "rotation": [0, 0, 0], "uv": [8, 0]}
]
},
{
"name": "horn",
"parent": "head",
"pivot": [0, 22, -51],
"pivot": [0, 21, -51],
"rotation": [-2.5, 0, 0],
"cubes": [
{"origin": [-1.5, 22, -51], "size": [3, 4, 14], "uv": [62, 0]},
{"origin": [-0.5, 26, -48], "size": [1, 13, 6], "uv": [0, 0]},
{"origin": [0, 25, -49], "size": [0, 20, 11], "uv": [48, 148]}
{"origin": [-1.5, 21, -51], "size": [3, 4, 14], "uv": [62, 0]},
{"origin": [-0.5, 25, -48], "size": [1, 13, 6], "uv": [0, 0]},
{"origin": [0, 24, -49], "size": [0, 20, 11], "uv": [0, 36]}
]
},
{
"name": "jaw",
"parent": "head",
"pivot": [0, 6.25, -46],
"pivot": [0, 6.25, -46.4],
"rotation": [-5, 0, 0],
"cubes": [
{"origin": [-10.5, 0.25, -54], "size": [21, 6, 9], "uv": [135, 95]}
{"origin": [-10.5, 0.25, -58.4], "size": [21, 6, 9], "uv": [80, 108]}
]
},
{
"name": "jaw2",
"parent": "jaw",
"pivot": [0, 0.25, -54],
"pivot": [0, 0.25, -54.4],
"cubes": [
{"origin": [-9.5, 0.25, -64], "size": [19, 5, 10], "uv": [138, 0]}
{"origin": [-9.5, 0.25, -64.4], "size": [19, 5, 6], "uv": [96, 76]}
]
},
{
"name": "jaw3",
"parent": "jaw2",
"pivot": [0, 0.25, -64],
"pivot": [0, 0.25, -64.4],
"rotation": [-10, 0, 0],
"cubes": [
{"origin": [-7.5, 0.49881, -67.05452], "size": [15, 5, 3], "uv": [169, 132]}
{"origin": [-7.5, 0.49881, -67.45452], "size": [15, 5, 3], "uv": [128, 56]}
]
},
{
@@ -157,7 +156,7 @@
"parent": "segment2",
"pivot": [0, 11, 1],
"cubes": [
{"origin": [-9, 2, -8], "size": [18, 18, 18], "uv": [84, 0]}
{"origin": [-9, 2, -8], "size": [18, 18, 18], "uv": [84, 2]}
]
},
{
@@ -170,7 +169,7 @@
"parent": "segment3",
"pivot": [0, 11, 16.5],
"cubes": [
{"origin": [-7, 4, 10], "size": [14, 14, 13], "uv": [131, 42]}
{"origin": [-7, 4, 10], "size": [14, 14, 13], "uv": [74, 38]}
]
},
{
@@ -183,7 +182,7 @@
"parent": "segment4",
"pivot": [0, 11, 33],
"cubes": [
{"origin": [-10, 1, 23], "size": [20, 20, 20], "uv": [64, 61]}
{"origin": [-10, 1, 23], "size": [20, 20, 20], "uv": [0, 88]}
]
},
{
@@ -196,7 +195,7 @@
"parent": "segment5",
"pivot": [0, 11, 52],
"cubes": [
{"origin": [-9, 2, 43], "size": [18, 18, 18], "uv": [0, 83]}
{"origin": [-9, 2, 43], "size": [18, 18, 18], "uv": [138, 20]}
]
},
{
@@ -209,7 +208,7 @@
"parent": "segment6",
"pivot": [0, 11, 69],
"cubes": [
{"origin": [-8, 3, 61], "size": [16, 16, 16], "uv": [72, 101]}
{"origin": [-8, 3, 61], "size": [16, 16, 16], "uv": [192, 0]}
]
},
{
@@ -222,7 +221,7 @@
"parent": "segment7",
"pivot": [0, 11, 84],
"cubes": [
{"origin": [-6, 5, 77], "size": [12, 12, 14], "uv": [144, 69]}
{"origin": [-6, 5, 77], "size": [12, 12, 14], "uv": [204, 55]}
]
},
{
@@ -235,7 +234,7 @@
"parent": "segment8",
"pivot": [0, 11, 98],
"cubes": [
{"origin": [-6, 5, 91], "size": [12, 12, 14], "uv": [102, 141]}
{"origin": [-6, 5, 91], "size": [12, 12, 14], "uv": [188, 82]}
]
},
{
@@ -248,7 +247,7 @@
"parent": "segment9",
"pivot": [0, 11, 112],
"cubes": [
{"origin": [-6, 5, 105], "size": [12, 12, 14], "uv": [50, 133]}
{"origin": [-6, 5, 105], "size": [12, 12, 14], "uv": [152, 56]}
]
},
{
@@ -261,7 +260,7 @@
"parent": "segment10",
"pivot": [0, 11, 124],
"cubes": [
{"origin": [-5, 6, 119], "size": [10, 10, 10], "uv": [156, 15]}
{"origin": [-5, 6, 119], "size": [10, 10, 10], "uv": [138, 0]}
]
},
{
@@ -274,7 +273,7 @@
"parent": "segment11",
"pivot": [0, 11, 133],
"cubes": [
{"origin": [-4, 7, 129], "size": [8, 8, 8], "uv": [94, 167]}
{"origin": [-4, 7, 129], "size": [8, 8, 8], "uv": [224, 108]}
]
},
{
@@ -287,7 +286,7 @@
"parent": "segment12",
"pivot": [0, 11, 141],
"cubes": [
{"origin": [-4, 7, 137], "size": [8, 8, 8], "uv": [70, 159]}
{"origin": [-4, 7, 137], "size": [8, 8, 8], "uv": [140, 108]}
]
},
{
@@ -300,7 +299,7 @@
"parent": "segment13",
"pivot": [0, 11, 153],
"cubes": [
{"origin": [-4, 6, 145], "size": [8, 10, 16], "uv": [0, 143]}
{"origin": [-4, 6, 145], "size": [8, 10, 16], "uv": [134, 82]}
]
},
{
@@ -313,7 +312,7 @@
"parent": "segment14",
"pivot": [0, 11, 165],
"cubes": [
{"origin": [-3, 8, 161], "size": [6, 6, 8], "uv": [88, 133]}
{"origin": [-3, 8, 161], "size": [6, 6, 8], "uv": [228, 82]}
]
}
]
@@ -63,7 +63,7 @@
{"origin": [-6, 43, -8.5], "size": [12, 6, 10], "inflate": 0.001, "uv": [84, 46]},
{"origin": [-5, 44.5, -13.5], "size": [10, 4, 5], "uv": [127, 88]},
{"origin": [-3.5, 44.5, -18.5], "size": [7, 3, 6], "uv": [57, 0]},
{"origin": [-2.5, 44.51, -22.5], "size": [5, 2, 5], "uv": [117, 65]}
{"origin": [-2.5, 44.5, -22.5], "size": [5, 2, 5], "uv": [117, 65]}
]
},
{
@@ -172,16 +172,16 @@
"cubes": [
{"origin": [5.5, 27.5, -10], "size": [9, 10, 10], "uv": [218, 4]},
{"origin": [13, 29.5, -8], "size": [4, 6, 6], "uv": [206, 89]},
{"origin": [17, 29, -8.5], "size": [5, 7, 7], "uv": [135, 97]},
{"origin": [8, 37.5, -6], "size": [4, 5, 2], "uv": [98, 108]}
]
},
{
"name": "arm_left2",
"parent": "arm_left",
"pivot": [22, 32.5, -2],
"pivot": [17, 32.5, -2],
"cubes": [
{"origin": [22, 30, -8], "size": [5, 5, 6], "uv": [138, 26]}
{"origin": [22, 30, -8], "size": [5, 5, 6], "uv": [138, 26]},
{"origin": [17, 29, -8.5], "size": [5, 7, 7], "uv": [135, 97]}
]
},
{
@@ -223,16 +223,16 @@
"cubes": [
{"origin": [-14.5, 27.5, -10], "size": [9, 10, 10], "uv": [89, 62]},
{"origin": [-17, 29.5, -8], "size": [4, 6, 6], "uv": [186, 89]},
{"origin": [-22, 29, -8.5], "size": [5, 7, 7], "uv": [203, 43]},
{"origin": [-12, 37.5, -6], "size": [4, 5, 2], "uv": [32, 91]}
]
},
{
"name": "arm_right2",
"parent": "arm_right",
"pivot": [-22, 32.5, -2],
"pivot": [-17, 32.5, -2],
"cubes": [
{"origin": [-27, 30, -8], "size": [5, 5, 6], "uv": [178, 46]}
{"origin": [-27, 30, -8], "size": [5, 5, 6], "uv": [178, 46]},
{"origin": [-22, 29, -8.5], "size": [5, 7, 7], "uv": [203, 43]}
]
},
{
Loaded 100 of 753 files, more files were not shown because too many files have changed in this diff. Show more