Skip to content

Commit f1d5e75

Browse files
committed
Merge remote-tracking branch 'Conno2429/1.6' into 1.6-archremoval
2 parents 91f414a + 79c7a3f commit f1d5e75

73 files changed

Lines changed: 1883 additions & 647 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

common/src/main/java/generations/gg/generations/core/generationscore/common/GenerationsCobblemonEvents.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.cobblemon.mod.common.api.events.CobblemonEvents.HELD_ITEM_POST
1010
import com.cobblemon.mod.common.api.events.CobblemonEvents.LOOT_DROPPED
1111
import com.cobblemon.mod.common.api.events.CobblemonEvents.POKEMON_INTERACTION_GUI_CREATION
1212
import com.cobblemon.mod.common.api.events.drops.LootDroppedEvent
13+
import com.cobblemon.mod.common.api.moves.Moves
1314
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeature
1415
import com.cobblemon.mod.common.api.text.text
1516
import com.cobblemon.mod.common.battles.actor.PlayerBattleActor
@@ -19,6 +20,7 @@ import com.cobblemon.mod.common.util.asTranslated
1920
import com.cobblemon.mod.common.util.cobblemonResource
2021
import com.cobblemon.mod.common.util.giveOrDropItemStack
2122
import generations.gg.generations.core.generationscore.common.api.player.Caught
23+
import generations.gg.generations.core.generationscore.common.battle.GenerationsInstructionProcessor
2224
import generations.gg.generations.core.generationscore.common.client.render.rarecandy.instanceOrNull
2325
import generations.gg.generations.core.generationscore.common.config.LegendKeys
2426
import generations.gg.generations.core.generationscore.common.config.SpeciesKey
@@ -47,10 +49,10 @@ class GenerationsCobblemonEvents {
4749

4850

4951
fun init() {
50-
CobblemonEvents.TERASTALLIZATION.subscribe(Priority.NORMAL) {
51-
FlagSpeciesFeature("terastal_active", true).run { it.pokemon.effectedPokemon.run(::apply) }
52-
}
52+
// FORME_CHANGE.subscribe(Priority.NORMAL, {(a, b, c) -> GenerationsInstructionProcessor.processDetailsChange(a, b, c) })
5353

54+
CobblemonEvents.TERASTALLIZATION.subscribe(Priority.NORMAL, GenerationsInstructionProcessor::processTerastallization)
55+
CobblemonEvents.BATTLE_STARTED_PRE.subscribe(Priority.NORMAL, GenerationsInstructionProcessor::preBattleChanges)
5456

5557
// FORME_CHANGE.subscribe(Priority.NORMAL, {(a, b, c) -> GenerationsInstructionProcessor.processDetailsChange(a, b, c) })
5658
// CobblemonEvents.MEGA_EVOLUTION.subscribe(Priority.NORMAL, GenerationsInstructionProcessor::processMegaEvolution)

common/src/main/java/generations/gg/generations/core/generationscore/common/GenerationsResources.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@ object GenerationsResources {
88
fun init() {
99
val showdownPath = Path.of("./showdown/sim")
1010
val showdownFiles = listOf(
11-
"battle-actions.js",
12-
"abilities.js",
13-
"moves.js"
11+
"battle-actions.js" to "sim",
12+
"abilities.js" to "data",
13+
"moves.js" to "data"
1414
)
1515
Files.createDirectories(showdownPath)
1616

17-
for (file in showdownFiles) {
18-
copyResourceIfChanged("/assets/generations_core/showdown_data/$file", showdownPath.resolve(file))
17+
for ((file, subDir) in showdownFiles) {
18+
val targetPath = showdownPath.resolveSibling(subDir).resolve(file)
19+
GenerationsCore.LOGGER.info("Attempting to copy: $file")
20+
copyResourceIfChanged("assets/generations_core/showdown_data/$file", targetPath)
1921
}
2022
}
2123

2224
private fun copyResourceIfChanged(resourcePath: String, destination: Path) {
23-
val inputStream: InputStream = javaClass.getResourceAsStream(resourcePath)
25+
val inputStream: InputStream = javaClass.classLoader.getResourceAsStream(resourcePath)
2426
?: run {
2527
GenerationsCore.LOGGER.warn("Resource not found at: $resourcePath")
2628
return

common/src/main/java/generations/gg/generations/core/generationscore/common/api/GenerationsMolangFunctions.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import generations.gg.generations.core.generationscore.common.client.model.Model
1717
import generations.gg.generations.core.generationscore.common.config.SpeciesKey
1818
import generations.gg.generations.core.generationscore.common.util.getOrCreate
1919
import generations.gg.generations.core.generationscore.common.util.getProviderOrNull
20+
import generations.gg.generations.core.generationscore.common.util.isSpecies
21+
import generations.gg.generations.core.generationscore.common.util.removeMove
22+
import generations.gg.generations.core.generationscore.common.util.removePokemon
2023
import generations.gg.generations.core.generationscore.common.world.entity.block.PokemonUtil
2124
import net.minecraft.core.BlockPos
2225
import net.minecraft.core.registries.Registries
@@ -81,6 +84,14 @@ object GenerationsMolangFunctions {
8184
is IntSpeciesFeature -> it.getIntOrNull(1)?.also { feature.value = it }?.also { feature.apply(pokemon) }
8285
else -> return@Function DoubleValue.ZERO
8386
}
87+
},
88+
89+
"remove_rotom_move" to Function {
90+
pokemon.removeMove("overheat")
91+
pokemon.removeMove("hydropump")
92+
pokemon.removeMove("blizzard")
93+
pokemon.removeMove("airslash")
94+
pokemon.removeMove("leafstorm")
8495
}
8596
)
8697
})

common/src/main/java/generations/gg/generations/core/generationscore/common/battle/GenerationsInstructionProcessor.kt

Lines changed: 139 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package generations.gg.generations.core.generationscore.common.battle
22

3+
import com.cobblemon.mod.common.CobblemonNetwork
4+
import com.cobblemon.mod.common.api.abilities.Abilities
35
import com.cobblemon.mod.common.api.abilities.Ability
46
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
57
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
6-
import com.cobblemon.mod.common.api.events.battles.instruction.FormeChangeEvent
7-
import com.cobblemon.mod.common.api.events.battles.instruction.MegaEvolutionEvent
8+
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
9+
import com.cobblemon.mod.common.api.events.battles.BattleStartedPreEvent
810
import com.cobblemon.mod.common.api.events.battles.instruction.TerastallizationEvent
11+
import com.cobblemon.mod.common.api.moves.Moves
912
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeature
1013
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeature
1114
import com.cobblemon.mod.common.api.pokemon.feature.StringSpeciesFeature
12-
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
15+
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
16+
import com.cobblemon.mod.common.net.messages.client.battle.BattleInitializePacket
1317
import com.cobblemon.mod.common.net.messages.client.battle.BattleTransformPokemonPacket
1418
import com.cobblemon.mod.common.pokemon.Pokemon
15-
import com.mojang.datafixers.util.Unit
16-
import generations.gg.generations.core.generationscore.common.GenerationsCore
19+
import com.cobblemon.mod.common.util.server
20+
import generations.gg.generations.core.generationscore.common.util.replaceMove
21+
import java.util.UUID
22+
23+
import net.minecraft.server.level.ServerPlayer
1724

1825
object GenerationsInstructionProcessor {
19-
private var originalAbility: Ability? = null
2026

2127
@JvmStatic
2228
fun processFormeChangeInstruction(battle: PokemonBattle, message: BattleMessage) {
@@ -32,7 +38,8 @@ object GenerationsInstructionProcessor {
3238

3339
val name = s3[1]
3440

35-
originalAbility = battlePokemon.originalPokemon.ability
41+
val ability = battlePokemon.originalPokemon.ability.name
42+
battlePokemon.originalPokemon.persistentData.putString("original_ability", ability)
3643

3744
if (effectedPokemon.form.name.equals("Dusk-Mane")) {
3845
battlePokemon.originalPokemon.persistentData.putString("necro_fusion", "dusk")
@@ -41,7 +48,7 @@ object GenerationsInstructionProcessor {
4148
}
4249

4350
var pair: Pair<String, Any> = when(name) {
44-
"ash" -> "ash" to true
51+
// "ash" -> "ash" to true
4552
"mega" -> "mega" to true
4653
"mega-x" -> "mega_x" to true
4754
"mega-y" -> "mega_y" to true
@@ -71,6 +78,40 @@ object GenerationsInstructionProcessor {
7178
}
7279
}
7380

81+
@JvmStatic
82+
fun processTerastallization(terastallizationEvent: TerastallizationEvent) {
83+
val battle = terastallizationEvent.battle
84+
val teraCheck = FlagSpeciesFeature("terastal_active", true)
85+
val pokemon = terastallizationEvent.pokemon
86+
terastallizationEvent.pokemon.effectedPokemon.applyBattleFeature(teraCheck)
87+
88+
val active = battle.activePokemon.find {
89+
it.battlePokemon?.uuid == pokemon.uuid || it.battlePokemon?.effectedPokemon?.uuid == pokemon.uuid
90+
}
91+
val pnx = active?.getPNX()
92+
val updated = pokemon
93+
if (pnx != null) {
94+
(battle.playerUUIDs + battle.spectators).forEach { viewer ->
95+
val isAlly = battle.isAllied(viewer, pokemon.actor)
96+
println("UUID: " + viewer)
97+
val packet = BattleTransformPokemonPacket(pnx, updated, isAlly)
98+
getPlayerFromUUID(viewer)?.let { CobblemonNetwork.sendPacketToPlayer(it, packet) }
99+
}
100+
}
101+
102+
battle.dispatchWaitingToFront(2.5f) { Unit }
103+
}
104+
105+
@JvmStatic
106+
fun preBattleChanges(battleStartedPreEvent: BattleStartedPreEvent) {
107+
val battle = battleStartedPreEvent.battle
108+
for (actors in battle.actors) {
109+
for (battlePokemon in actors.pokemonList) {
110+
doggoMoveChanger(battlePokemon)
111+
}
112+
}
113+
}
114+
74115
@JvmStatic
75116
fun processBattleEnd(battle: PokemonBattle) {
76117
battle.actors.forEach { actor ->
@@ -97,32 +138,48 @@ object GenerationsInstructionProcessor {
97138
battlePokemon.originalPokemon.updateAspects()
98139
}
99140
}
100-
battlePokemon.originalPokemon.restoreAbility(tempAbility, originalAbility, name)
141+
doggoMoveChanger(battlePokemon)
142+
battlePokemon.originalPokemon.restoreAbility(tempAbility)
101143
}
102144
}
103145
}
104146
}
105147

106148
private fun Pokemon.removeBattleFeature() {
107149
val data = this.persistentData
108-
val name = if(data.contains("form_name")) data.getString("form_name").also { data.remove("form_name") } else return
109-
val value = if(data.contains("form_value")) data.getString("form_value").also { data.remove("form_value") } else null
110150

111-
if(value == null) {
112-
features.removeIf { it.name == name }
113-
} else {
114-
val feature = features.firstOrNull { it.name == name } ?: return
151+
if (data.contains("terastal")) {
152+
val name = data.getString("terastal")
153+
features.removeIf {it.name == name}
154+
data.remove("terastal")
155+
data.remove("tera_type")
156+
}
157+
158+
if (data.contains("form_name")) {
159+
val name = data.getString("form_name").also { data.remove("form_name") }
160+
val value = if(data.contains("form_value")) data.getString("form_value").also { data.remove("form_value") } else null
115161

116-
if(feature is StringSpeciesFeature) {
117-
feature.value = value
162+
if(value == null) {
163+
features.removeIf { it.name == name }
164+
} else {
165+
val feature = features.firstOrNull { it.name == name } ?: return
166+
167+
if(feature is StringSpeciesFeature) {
168+
feature.value = value
169+
}
118170
}
119171
}
120172

121173
updateAspects()
122174
}
123175

124176
private fun Pokemon.applyBattleFeature(feature: SpeciesFeature) {
125-
this.persistentData.putString("form_name", feature.name)
177+
if (feature.name.equals("terastal_active")) {
178+
this.persistentData.putString("terastal", feature.name)
179+
this.persistentData.putString("tera_type", this.teraType.id.path)
180+
} else {
181+
this.persistentData.putString("form_name", feature.name)
182+
}
126183
if(feature is StringSpeciesFeature) {
127184
this.persistentData.putString("form_value", feature.value)
128185
feature.apply(this)
@@ -131,14 +188,71 @@ private fun Pokemon.applyBattleFeature(feature: SpeciesFeature) {
131188
}
132189
}
133190

134-
private fun Pokemon.restoreAbility(tempAbility: Ability, originalAbility: Ability?, name: String) {
135-
if (name == "mega" || name == "mega_x" || name == "mega_y") {
136-
if (tempAbility != originalAbility) {
137-
originalAbility?.let { ability ->
138-
this.updateAbility(ability)
139-
} ?: run {
140-
GenerationsCore.LOGGER.warn("Original Ability is null")
191+
private fun Pokemon.restoreAbility(tempAbility: Ability) {
192+
val abilityId = this.persistentData.getString("original_ability")
193+
val template = Abilities.get(abilityId)
194+
195+
if (template != null) {
196+
val ability = template.create()
197+
if (tempAbility.template != template) {
198+
this.updateAbility(ability)
199+
}
200+
}
201+
}
202+
203+
private fun PokemonBattle.isAllied(uuid: UUID, actor: BattleActor?): Boolean {
204+
if (actor == null) return false
205+
return actors.any {
206+
it.getPlayerUUIDs().contains(uuid) && it.getSide() == actor.getSide()
207+
}
208+
}
209+
210+
private fun getPlayerFromUUID(uuid: UUID): ServerPlayer? {
211+
return server()?.playerList?.getPlayer(uuid)
212+
}
213+
214+
private fun doggoMoveChanger(battlePokemon: BattlePokemon) {
215+
val effectedPokemon = battlePokemon.effectedPokemon
216+
val ironHead = Moves.getByNameOrDummy("ironhead")
217+
val behemothBlade = Moves.getByNameOrDummy("behemothblade")
218+
val behemothBash = Moves.getByNameOrDummy("behemothbash")
219+
220+
val speciesName = battlePokemon.originalPokemon.species.name.lowercase()
221+
222+
val hasIronHead = battlePokemon.moveSet.any {move -> move.template.name.equals("ironhead")}
223+
val hasBehemoth = battlePokemon.moveSet.any { move ->
224+
move.template.name.lowercase() in listOf("behemothblade", "behemothbash")
225+
}
226+
if (effectedPokemon.aspects.contains("crowned")) {
227+
val benchedMoves = effectedPokemon.benchedMoves
228+
229+
println("PRE-CLEAR")
230+
benchedMoves.forEach {
231+
println("benchedmove: " + it.moveTemplate.name)
232+
}
233+
234+
benchedMoves.clear()
235+
236+
println("POST-CLEAR")
237+
benchedMoves.forEach {
238+
println("benchedmove: " + it.moveTemplate.name)
239+
}
240+
if (hasIronHead) {
241+
when (speciesName) {
242+
"zacian" -> effectedPokemon.replaceMove("ironhead", "behemothblade")
243+
"zamazenta" -> effectedPokemon.replaceMove("ironhead", "behemothbash")
244+
}
245+
} else if (hasBehemoth) {
246+
when (speciesName) {
247+
"zacian" -> {
248+
effectedPokemon.replaceMove("behemothblade", "ironhead")
249+
}
250+
"zamazenta" -> {
251+
effectedPokemon.replaceMove("behemothbash", "ironhead")
252+
}
141253
}
142254
}
143255
}
144256
}
257+
258+

common/src/main/java/generations/gg/generations/core/generationscore/common/client/BattleOverlayProxy.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package generations.gg.generations.core.generationscore.common.client
33
import com.cobblemon.mod.common.api.gui.blitk
44
import com.cobblemon.mod.common.api.gui.drawPosablePortrait
55
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
6+
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeature
67
import com.cobblemon.mod.common.api.text.bold
78
import com.cobblemon.mod.common.api.text.text
89
import com.cobblemon.mod.common.api.types.tera.TeraType
9-
import com.cobblemon.mod.common.api.types.tera.TeraTypes
1010
import com.cobblemon.mod.common.client.CobblemonClient
1111
import com.cobblemon.mod.common.client.CobblemonResources
1212
import com.cobblemon.mod.common.client.battle.ActiveClientBattlePokemon
@@ -58,6 +58,7 @@ import com.mojang.blaze3d.systems.RenderSystem
5858
import com.mojang.blaze3d.vertex.PoseStack
5959
import com.mojang.math.Axis
6060
import generations.gg.generations.core.generationscore.common.client.screen.TeraTypeIcon
61+
import generations.gg.generations.core.generationscore.common.client.render.tera.TeraStateTracker
6162
import net.minecraft.client.Minecraft
6263
import net.minecraft.client.gui.GuiGraphics
6364
import net.minecraft.client.renderer.LightTexture
@@ -112,6 +113,7 @@ object BattleOverlayProxy {
112113
val b = (hue and 0b11111111) / 255F
113114

114115
val truePokemon = activeBattlePokemon.actor.pokemon.find { it.uuid == activeBattlePokemon.battlePokemon?.uuid }
116+
115117
drawBattleTile(
116118
context = context,
117119
x = x,
@@ -122,7 +124,7 @@ object BattleOverlayProxy {
122124
level = battlePokemon.level,
123125
displayName = battlePokemon.displayName,
124126
gender = battlePokemon.gender,
125-
teraType = battlePokemon.properties.teraType?.let { TeraTypes.get(it) },
127+
teraType = if (battlePokemon.state.currentAspects.contains("terastal_active")) truePokemon?.teraType else null,
126128
status = battlePokemon.status,
127129
state = battlePokemon.state,
128130
colour = Triple(r, g, b),
@@ -172,8 +174,8 @@ object BattleOverlayProxy {
172174
val tileWidth = if (isCompact) COMPACT_TILE_WIDTH else TILE_WIDTH
173175
val portraitOffsetX = if (isCompact) COMPACT_PORTRAIT_OFFSET_X else PORTRAIT_OFFSET_X
174176
val portraitOffsetY = if (isCompact) COMPACT_PORTRAIT_OFFSET_Y else PORTRAIT_OFFSET_Y
175-
val teraXOffset = if(isCompact) 26 else 38
176-
val teraYOffset = if(isCompact) 22 else 28
177+
val teraXOffset = if(isCompact) 82 else 94
178+
val teraYOffset = y + if(isCompact) 5 else 7
177179
var teraDiameter = if(isCompact) 9 else 18
178180

179181
val portraitDiameter = if (isCompact) COMPACT_PORTRAIT_DIAMETER else PORTRAIT_DIAMETER
@@ -410,7 +412,7 @@ object BattleOverlayProxy {
410412
}
411413

412414
TeraTypeIcon(
413-
teraYOffset, teraStartX, teraType, small = isCompact, opacity = opacity
415+
teraStartX, teraYOffset, teraType, small = true, opacity = opacity
414416

415417
).render(context)
416418
}

0 commit comments

Comments
 (0)