Implemented passive evolution trigger, reduced visibility on species and form evolution property, cleaned up package structure of evolution stuff.

This commit is contained in:
Licious
2022-05-05 13:25:29 +01:00
parent b3eb6d7ec7
commit a7f1a24208
20 changed files with 49 additions and 38 deletions
@@ -1,8 +1,8 @@
package com.cablemc.pokemoncobbled.common.api.pokemon.evolution
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.TradeEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.TradeEvolution
/**
* Represents an evolution of a [Pokemon] that can only occur during specific actions and with added context.
@@ -4,9 +4,9 @@ import com.cablemc.pokemoncobbled.common.api.moves.MoveTemplate
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonProperties
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.requirement.EvolutionRequirement
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.TradeEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.TradeEvolution
/**
* Represents an evolution of a [Pokemon], this is the server side counterpart of [EvolutionDisplay].
@@ -1,8 +1,8 @@
package com.cablemc.pokemoncobbled.common.api.pokemon.evolution
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.CobbledClientEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.CobbledServerEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.controller.CobbledClientEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.controller.CobbledServerEvolutionController
import com.google.gson.JsonElement
import net.minecraft.nbt.NbtElement
@@ -1,7 +1,7 @@
package com.cablemc.pokemoncobbled.common.api.pokemon.evolution
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.LevelEvolution
/**
* Represents an evolution of a [Pokemon] that can occur without any additional context or actions.
@@ -6,8 +6,8 @@ import com.cablemc.pokemoncobbled.common.api.entity.Despawner
import com.cablemc.pokemoncobbled.common.api.events.CobbledEvents
import com.cablemc.pokemoncobbled.common.api.events.pokemon.ShoulderMountEvent
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonSpecies
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.PassiveEvolution
import com.cablemc.pokemoncobbled.common.api.scheduling.afterOnMain
import com.cablemc.pokemoncobbled.common.api.storage.party.PlayerPartyStore
import com.cablemc.pokemoncobbled.common.api.types.ElementalTypes
import com.cablemc.pokemoncobbled.common.client.entity.PokemonClientDelegate
import com.cablemc.pokemoncobbled.common.entity.EntityProperty
@@ -128,6 +128,7 @@ class PokemonEntity(
ticksLived++
if (this.ticksLived % 20 == 0) {
this.updateEyeHeight()
this.attemptPassiveEvolution()
}
}
@@ -284,8 +285,6 @@ class PokemonEntity(
(stack.item as? PokemonInteractiveItem)?.onInteraction(playerIn, this, stack)
}
private fun tryMountingShoulder(player: ServerPlayerEntity) {
if (this.pokemon.belongsTo(player) && this.hasRoomToMount(player)) {
CobbledEvents.SHOULDER_MOUNT.postThen(ShoulderMountEvent(player, pokemon, isLeft = player.shoulderEntityLeft.isEmpty)) {
@@ -322,4 +321,11 @@ class PokemonEntity(
(this as AccessorEntity).standingEyeHeight(this.getActiveEyeHeight(EntityPose.STANDING, this.type.dimensions))
}
private fun attemptPassiveEvolution() {
this.pokemon.evolutions.filterIsInstance<PassiveEvolution>()
.forEach { evolution ->
evolution.attemptEvolution(this.pokemon)
}
}
}
@@ -2,7 +2,7 @@ package com.cablemc.pokemoncobbled.common.item.interactive
import com.cablemc.pokemoncobbled.common.entity.pokemon.PokemonEntity
import com.cablemc.pokemoncobbled.common.item.CobbledItemGroups
import com.cablemc.pokemoncobbled.common.pokemon.evolution.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.ItemInteractionEvolution
import net.minecraft.item.ItemStack
import net.minecraft.server.network.ServerPlayerEntity
@@ -10,8 +10,7 @@ class EvolutionItem(properties: Settings = Settings().group(CobbledItemGroups.EV
override fun processInteraction(player: ServerPlayerEntity, entity: PokemonEntity, stack: ItemStack) {
val pokemon = entity.pokemon
pokemon.species.evolutions.filterIsInstance<ItemInteractionEvolution>()
.sortedBy { evolution -> evolution.optional }
pokemon.evolutions.filterIsInstance<ItemInteractionEvolution>()
.forEach { evolution ->
if (evolution.attemptEvolution(pokemon, this)) {
this.consumeItem(player, stack)
@@ -8,7 +8,7 @@ import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.EvolutionDisplay
import com.cablemc.pokemoncobbled.common.net.messages.common.pokemon.update.evolution.EvolutionLikeUpdatePacket
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.CobbledEvolutionDisplay
import com.cablemc.pokemoncobbled.common.pokemon.evolution.DummyEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.DummyEvolution
import net.minecraft.network.PacketByteBuf
/**
@@ -11,7 +11,7 @@ class AcceptEvolutionPacket() : EvolutionDisplayUpdatePacket() {
}
override fun applyToPokemon(pokemon: Pokemon) {
val evolution = pokemon.species.evolutions.firstOrNull { evolution -> evolution.id.equals(this.evolutionId, true) } ?: return
val evolution = pokemon.evolutions.firstOrNull { evolution -> evolution.id.equals(this.evolutionId, true) } ?: return
pokemon.pendingEvolutions.start(evolution)
}
@@ -5,7 +5,7 @@ import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.EvolutionDisplay
import com.cablemc.pokemoncobbled.common.net.messages.common.pokemon.update.evolution.EvolutionLikeUpdatePacket
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.CobbledEvolutionDisplay
import com.cablemc.pokemoncobbled.common.pokemon.evolution.DummyEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.DummyEvolution
import net.minecraft.network.PacketByteBuf
/**
@@ -89,7 +89,8 @@ data class FormData(
val types: Iterable<ElementalType>
get() = secondaryType?.let { listOf(primaryType, it) } ?: listOf(primaryType)
val evolutions: MutableSet<Evolution>
// Only exists for use of Pokemon.evolutions do not expose to end user due to how the species/form data is structured
internal val evolutions: MutableSet<Evolution>
get() = _evolutions ?: species.evolutions
fun eyeHeight(entity: PokemonEntity): Float {
@@ -28,9 +28,9 @@ import com.cablemc.pokemoncobbled.common.pokemon.activestate.ActivePokemonState
import com.cablemc.pokemoncobbled.common.pokemon.activestate.InactivePokemonState
import com.cablemc.pokemoncobbled.common.pokemon.activestate.PokemonState
import com.cablemc.pokemoncobbled.common.pokemon.activestate.SentOutState
import com.cablemc.pokemoncobbled.common.pokemon.evolution.CobbledClientEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.CobbledServerEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.controller.CobbledClientEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.controller.CobbledServerEvolutionController
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.status.PersistentStatus
import com.cablemc.pokemoncobbled.common.pokemon.status.PersistentStatusContainer
import com.cablemc.pokemoncobbled.common.util.DataKeys
@@ -90,8 +90,7 @@ open class Pokemon {
experience = experienceGroup.getExperience(value)
}
_level.emit(value)
this.species.evolutions.filterIsInstance<LevelEvolution>()
.sortedBy { evolution -> evolution.optional }
this.evolutions.filterIsInstance<LevelEvolution>()
.forEach { evolution ->
evolution.attemptEvolution(this)
}
@@ -169,6 +168,10 @@ open class Pokemon {
val storeCoordinates = SettableObservable<StoreCoordinates<*>?>(null)
// We want non-optional evolutions to trigger first to avoid unnecessary packets and any cost associate with an optional one that would just be lost
val evolutions: Iterable<Evolution> = this.form.evolutions.sortedBy { evolution -> evolution.optional }
// Lazy due to leaking this
/**
* The server side [EvolutionController] responsible for holding [Evolution]s.
@@ -2,10 +2,10 @@ package com.cablemc.pokemoncobbled.common.pokemon
import com.cablemc.pokemoncobbled.common.api.abilities.AbilityTemplate
import com.cablemc.pokemoncobbled.common.api.pokemon.effect.ShoulderEffect
import com.cablemc.pokemoncobbled.common.api.pokemon.experience.ExperienceGroups
import com.cablemc.pokemoncobbled.common.api.pokemon.stats.Stat
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.Evolution
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.PreEvolution
import com.cablemc.pokemoncobbled.common.api.pokemon.experience.ExperienceGroups
import com.cablemc.pokemoncobbled.common.api.pokemon.stats.Stat
import com.cablemc.pokemoncobbled.common.api.types.ElementalType
import com.cablemc.pokemoncobbled.common.api.types.ElementalTypes
import com.cablemc.pokemoncobbled.common.entity.pokemon.PokemonEntity
@@ -42,7 +42,8 @@ class Species {
var forms = mutableListOf(FormData())
val evolutions: MutableSet<Evolution> = hashSetOf()
// Only exists for use of Pokemon.evolutions do not expose to end user due to how the species/form data is structured
internal val evolutions: MutableSet<Evolution> = hashSetOf()
val preEvolution: PreEvolution? = null
@@ -2,9 +2,9 @@ package com.cablemc.pokemoncobbled.common.pokemon.evolution.adapters
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.Evolution
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.adapters.EvolutionAdapter
import com.cablemc.pokemoncobbled.common.pokemon.evolution.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.TradeEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.ItemInteractionEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.TradeEvolution
import com.google.common.collect.HashBiMap
import com.google.gson.*
import java.lang.reflect.Type
@@ -1,4 +1,4 @@
package com.cablemc.pokemoncobbled.common.pokemon.evolution
package com.cablemc.pokemoncobbled.common.pokemon.evolution.controller
import com.cablemc.pokemoncobbled.common.CobbledNetwork.sendToServer
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.EvolutionController
@@ -1,4 +1,4 @@
package com.cablemc.pokemoncobbled.common.pokemon.evolution
package com.cablemc.pokemoncobbled.common.pokemon.evolution.controller
import com.cablemc.pokemoncobbled.common.api.events.CobbledEvents
import com.cablemc.pokemoncobbled.common.api.events.pokemon.evolution.EvolutionAcceptedEvent
@@ -136,7 +136,7 @@ internal class CobbledServerEvolutionController(override val pokemon: Pokemon) :
result
})
private fun findEvolutionFromId(id: String) = this.pokemon.species.evolutions
private fun findEvolutionFromId(id: String) = this.pokemon.evolutions
.firstOrNull { evolution -> evolution.id.equals(id, true) }
}
@@ -1,4 +1,4 @@
package com.cablemc.pokemoncobbled.common.pokemon.evolution
package com.cablemc.pokemoncobbled.common.pokemon.evolution.variants
import com.cablemc.pokemoncobbled.common.api.moves.MoveTemplate
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonProperties
@@ -6,6 +6,7 @@ import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.Evolution
import com.cablemc.pokemoncobbled.common.api.pokemon.evolution.requirement.EvolutionRequirement
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
// Used only to comply with pokemon update packet structure
internal class DummyEvolution : Evolution {
override val id = "dummy"
@@ -1,4 +1,4 @@
package com.cablemc.pokemoncobbled.common.pokemon.evolution
package com.cablemc.pokemoncobbled.common.pokemon.evolution.variants
import com.cablemc.pokemoncobbled.common.api.moves.MoveTemplate
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonProperties
@@ -1,4 +1,4 @@
package com.cablemc.pokemoncobbled.common.pokemon.evolution
package com.cablemc.pokemoncobbled.common.pokemon.evolution.variants
import com.cablemc.pokemoncobbled.common.api.moves.MoveTemplate
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonProperties
@@ -1,4 +1,4 @@
package com.cablemc.pokemoncobbled.common.pokemon.evolution
package com.cablemc.pokemoncobbled.common.pokemon.evolution.variants
import com.cablemc.pokemoncobbled.common.api.moves.MoveTemplate
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonProperties
@@ -3,8 +3,8 @@ package com.cablemc.pokemoncobbled.api.pokemon
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonProperties
import com.cablemc.pokemoncobbled.common.api.pokemon.PokemonSpecies
import com.cablemc.pokemoncobbled.common.pokemon.Pokemon
import com.cablemc.pokemoncobbled.common.pokemon.evolution.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.TradeEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.LevelEvolution
import com.cablemc.pokemoncobbled.common.pokemon.evolution.variants.TradeEvolution
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test