Skip to content

Commit

Permalink
more code cleanup + configurable swimming mons
Browse files Browse the repository at this point in the history
  • Loading branch information
IoIxD committed May 21, 2024
1 parent 76a7960 commit 6d24d1b
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 101 deletions.
21 changes: 18 additions & 3 deletions src/main/java/net/ioixd/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class Config implements FabricPacket {

public List<String> list = new ArrayList<>();
public List<String> alsoFlyList = new ArrayList<>();
public List<String> alsoSwimList = new ArrayList<>();

public ListUse listUse;

Expand All @@ -60,7 +61,7 @@ public void write(PacketByteBuf p) {

p.writeDouble(legendaryModifier);
p.writeBoolean(legendaryModifierCapBreak);

p.writeBoolean(allowFlying);
p.writeBoolean(allowSwimming);
p.writeEnumConstant(listUse);
Expand All @@ -75,6 +76,11 @@ public void write(PacketByteBuf p) {
for (String value : alsoFlyList) {
p.writeString(value);
}
size = alsoSwimList.size();
p.writeInt(size);
for (String value : alsoSwimList) {
p.writeString(value);
}
}

private PacketType<Config> SYNC = PacketType.create(Cobblemounts.CONFIG_SYNC_ID, Config::read);
Expand Down Expand Up @@ -176,11 +182,14 @@ public void update() throws Exception {
this.alsoFlyList = toml.getList("alsoFlying", new ArrayList<String>()).stream().map(f -> {
return f.toLowerCase();
}).toList();
this.alsoSwimList = toml.getList("alsoSwimming", new ArrayList<String>()).stream().map(f -> {
return f.toLowerCase();
}).toList();
}

public static Config read(PacketByteBuf p) {
var config = new Config();

config.groundCappedSpeed = p.readBoolean();
config.groundUseLogScaling = p.readBoolean();
config.groundSpeedScalar = p.readDouble();
Expand All @@ -198,7 +207,7 @@ public static Config read(PacketByteBuf p) {

config.swimSpeedCap = p.readDouble();
config.legendaryModifierCapBreak = p.readBoolean();

config.allowFlying = p.readBoolean();
config.allowSwimming = p.readBoolean();

Expand All @@ -215,6 +224,12 @@ public static Config read(PacketByteBuf p) {
var str = p.readString();
config.alsoFlyList.add(str);
}
s = p.readInt();
config.alsoSwimList = new ArrayList<>(s);
for (int i = 0; i < s; i++) {
var str = p.readString();
config.alsoSwimList.add(str);
}
return config;
}
}
140 changes: 59 additions & 81 deletions src/main/java/net/ioixd/client/mixin/PokemonMovementHandler.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.ioixd.client.mixin;

import com.cobblemon.mod.common.api.types.ElementalType;
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag;
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
import com.cobblemon.mod.common.pokemon.Pokemon;
Expand All @@ -22,7 +23,9 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;

@Mixin(PokemonEntity.class)
public abstract class PokemonMovementHandler extends LivingEntity {
Expand Down Expand Up @@ -52,7 +55,6 @@ protected void tickControlled(PlayerEntity player, Vec3d movement) {
Block water = pokemon.getBlockStateAtPos().getBlock();
boolean inLiquid = water instanceof FluidBlock;


AtomicBoolean isFlying = new AtomicBoolean(false);
Vec3d moveXZ = movement;// movement.rotateY((float) Math.toRadians(-player.getYaw()));
Vec3d forward = player.getRotationVector().normalize().multiply(movement.z);
Expand All @@ -61,18 +63,34 @@ protected void tickControlled(PlayerEntity player, Vec3d movement) {

Vec3d flyMove = forward.add(left);

pokemonData.getTypes().forEach(ty -> {
var pokemonName = pokemonData.getSpecies().getName().toLowerCase();
var name = ty.getName();
if (CobblemountsClient.SYNCED_CONFIG.alsoFlyList.contains(pokemonName)) {
name = "flying";
}
var pokemonName = pokemonData.getSpecies().getName().toLowerCase();

ArrayList<ElementalType> types_raw = new ArrayList<>();
pokemonData.getTypes().iterator().forEachRemaining(types_raw::add);
var types = types_raw.stream()
.map(ty -> ty.getName())
.collect(Collectors.toList());

if (CobblemountsClient.SYNCED_CONFIG.alsoFlyList.contains(pokemonName)) {
types.add("flying");
}

if (CobblemountsClient.SYNCED_CONFIG.alsoSwimList.contains(pokemonName)) {
types.add("water");
}

types.forEach(name -> {
switch (name) {
case "water":
case "flying":
boolean condition;
EntityPose animation;
boolean flying;
float speedScalar;
float speedCap;
boolean isSpeedCapped;
boolean useLogScaling;

switch (name) {
case "water":
if (!CobblemountsClient.SYNCED_CONFIG.allowSwimming) {
Expand All @@ -81,6 +99,11 @@ protected void tickControlled(PlayerEntity player, Vec3d movement) {
condition = inLiquid;
animation = EntityPose.SWIMMING;
flying = false;
speedScalar = (float) CobblemountsClient.SYNCED_CONFIG.swimSpeedScalar;
speedCap = (float) CobblemountsClient.SYNCED_CONFIG.swimSpeedCap;
isSpeedCapped = CobblemountsClient.SYNCED_CONFIG.swimCappedSpeed;
useLogScaling = CobblemountsClient.SYNCED_CONFIG.swimUseLogScaling;

break;
case "flying":
if (!CobblemountsClient.SYNCED_CONFIG.allowFlying) {
Expand All @@ -89,107 +112,62 @@ protected void tickControlled(PlayerEntity player, Vec3d movement) {
condition = !pokemon.isOnGround() && !inLiquid;
animation = EntityPose.FALL_FLYING;
flying = true;
speedScalar = (float) CobblemountsClient.SYNCED_CONFIG.flightSpeedScalar;
speedCap = (float) CobblemountsClient.SYNCED_CONFIG.flightSpeedCap;
isSpeedCapped = CobblemountsClient.SYNCED_CONFIG.flightCappedSpeed;
useLogScaling = CobblemountsClient.SYNCED_CONFIG.flightUseLogScaling;
break;
// We will never hit this part but we need to set the values anyways
// to make the compiler happy.
default:
condition = false;
animation = null;
flying = false;
speedScalar = 0.0f;
speedCap = 0.0f;
isSpeedCapped = false;
useLogScaling = true;
break;
}

if (condition) {
// Let the spaghetti begin. Now may be time to say that I have NEVER coded Java before :s
// First, decide between swimming or flying scalars
float speedScalar = (float) CobblemountsClient.SYNCED_CONFIG.swimSpeedScalar;
float speedCap = (float) CobblemountsClient.SYNCED_CONFIG.swimSpeedCap;
boolean isSpeedCapped = CobblemountsClient.SYNCED_CONFIG.swimCappedSpeed;
boolean useLogScaling = CobblemountsClient.SYNCED_CONFIG.swimUseLogScaling;

if (flying) {
speedScalar = (float) CobblemountsClient.SYNCED_CONFIG.flightSpeedScalar;
speedCap = (float) CobblemountsClient.SYNCED_CONFIG.flightSpeedCap;
isSpeedCapped = CobblemountsClient.SYNCED_CONFIG.flightCappedSpeed;
useLogScaling = CobblemountsClient.SYNCED_CONFIG.flightUseLogScaling;
}
// Then, do some additional checks for legendaries
float legendaryModifier = pokemonData.isLegendary() ? 0.0f
: (float) CobblemountsClient.SYNCED_CONFIG.legendaryModifier;
: (float) CobblemountsClient.SYNCED_CONFIG.legendaryModifier;
boolean isLegendary = pokemonData.isLegendary();

// Fun fact, in a previous itteration, I repeated this code twice with a check to see if we
// were opperating in swim mode or flight mode. I need coffee.
// elifelifelifelifelifelifelifelifelifelifelif...
float flyingSpeed = 0.0f;

float flyingSpeed;
if (flyMove.z != 0.0) {
// Step 1 : check if using log or lin scaling
if (!useLogScaling) {
// Step 2 : compute the base flight speed
flyingSpeed = ((pokemonData.getSpeed() / 256.0f) * (speedScalar / 2.0f));
// Step 3 : check if the cobblemon is legendary
if (isLegendary) {
// Step 3.1 : check if speed cap is applied
if (isSpeedCapped) {
// Step 3.2 : check if speed cap breaking is allowed
if (CobblemountsClient.SYNCED_CONFIG.legendaryModifierCapBreak) {
// Step 3.3 : compute final speed based on broken cap
if (flyingSpeed >= speedCap) {
flyingSpeed = (speedCap + ((legendaryModifier * speedScalar) / 2.0f));
} else {
flyingSpeed = (flyingSpeed + ((legendaryModifier * speedScalar) / 2.0f));
}
} else {
flyingSpeed = 2.5f
* (float) Math.log((pokemonData.getSpeed() + speedScalar) / speedScalar);
}
if (isLegendary) {
if (isSpeedCapped) {
if (CobblemountsClient.SYNCED_CONFIG.legendaryModifierCapBreak) {
if (flyingSpeed >= speedCap) {
flyingSpeed = (speedCap + legendaryModifier);
} else {
flyingSpeed = (flyingSpeed + ((legendaryModifier * speedScalar) / 2.0f));
if (flyingSpeed >= speedCap) {
flyingSpeed = speedCap;
}
flyingSpeed = (flyingSpeed + legendaryModifier);
}
} else {
flyingSpeed = (flyingSpeed + ((legendaryModifier * speedScalar) / 2.0f));
}
} else {
// If the cobblemon isn't legendary, at least there's no cap-breaking shenanigans.
if (isSpeedCapped) {
flyingSpeed = (flyingSpeed + legendaryModifier);
if (flyingSpeed >= speedCap) {
flyingSpeed = speedCap;
}
}
} else {
flyingSpeed = (flyingSpeed + legendaryModifier);
}
} else {
// We're not done yet ! We still need to do the SAME EXACT THING but for LOGARITHMIC SCALING !!!!!!
// Step 2
flyingSpeed = 2.5f * (float)Math.log((pokemonData.getSpeed() + speedScalar) / speedScalar);
// Step 3
if (isLegendary) {
// Step 3.1
if (isSpeedCapped) {
// Step 3.2
if (CobblemountsClient.SYNCED_CONFIG.legendaryModifierCapBreak) {
// Step 3.3
if (flyingSpeed >= speedCap) {
flyingSpeed = (speedCap + legendaryModifier);
} else {
flyingSpeed = (flyingSpeed + legendaryModifier);
}
} else {
flyingSpeed = (flyingSpeed + legendaryModifier);
if (flyingSpeed >= speedCap) {
flyingSpeed = speedCap;
}
}
} else {
flyingSpeed = (flyingSpeed + legendaryModifier);
}
} else {
if (isSpeedCapped) {
if (flyingSpeed >= speedCap) {
flyingSpeed = speedCap;
}
if (isSpeedCapped) {
if (flyingSpeed >= speedCap) {
flyingSpeed = speedCap;
}
}

}

pokemon.move(MovementType.SELF, flyMove.multiply(flyingSpeed));
isFlying.set(true);
}
Expand All @@ -201,7 +179,7 @@ protected void tickControlled(PlayerEntity player, Vec3d movement) {
pokemon.setPose(EntityPose.STANDING);
}
break;
}
}
});
if (!isFlying.get()) {
if (!(player instanceof ServerPlayerEntity) && MinecraftClient.getInstance().options.jumpKey.isPressed()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ private void tickMovement(Vec3d movement, CallbackInfo info) {
* ((pokemonData.getSpeed() / 12.0f) * (speedScalar / 2.0f));
} else {
movementSpeed = (player.getMovementSpeed() * 10.0f
* (2.5f * (float) Math.log((pokemonData.getSpeed() + speedScalar) / speedScalar)));
* (20.5f * (float) Math.log((pokemonData.getSpeed() + speedScalar) / speedScalar)));
}
if (isLegendary) {
if (isSpeedCapped) {
Expand Down
7 changes: 3 additions & 4 deletions src/main/java/net/ioixd/mixin/PokemonServersideTickMixin.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.ioixd.mixin;


import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag;
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
import net.ioixd.Cobblemounts;
Expand Down Expand Up @@ -33,7 +32,7 @@ protected PokemonServersideTickMixin(EntityType<? extends LivingEntity> entityTy
super(entityType, world);
}

@Inject(method = "tick",at = @At("TAIL"))
@Inject(method = "tick", at = @At("TAIL"))
protected void tick(CallbackInfo ci) {
var pokemon = (PokemonEntity) (Object) this;
var envcfg = pokemon.getWorld() instanceof ServerWorld ? Cobblemounts.CONFIG : CobblemountsClient.SYNCED_CONFIG;
Expand All @@ -48,7 +47,7 @@ protected void tick(CallbackInfo ci) {
var pokemonName = pokemonData.getSpecies().getName().toLowerCase();
pokemonData.getTypes().forEach(ty -> {
var name = ty.getName();
if(envcfg.alsoFlyList.contains(pokemonName)){
if (envcfg.alsoFlyList.contains(pokemonName)) {
name = "flying";
}
switch (name) {
Expand Down Expand Up @@ -97,7 +96,7 @@ protected void tick(CallbackInfo ci) {
if (envcfg.allowFlying) {
pokemonData.getTypes().forEach(ty -> {
var name = ty.getName();
if(envcfg.alsoFlyList.contains(pokemonName)){
if (envcfg.alsoFlyList.contains(pokemonName)) {
name = "flying";
}
if (name.equals("flying")) {
Expand Down
24 changes: 12 additions & 12 deletions src/main/resources/cobblemounts.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
# Ground speed 2 @ 600 spd
groundCappedSpeed = true # Linear default : true
groundUseLogScaling = false # Linear default : false
groundSpeedScalar = 0.75 # Linear default : 170
groundSpeedScalar = 0.8 # Linear default : 170
groundSpeedCap = 2.0 # Linear default : 0.4

# Flight is extremely versatile, so its capped at 2. Also, speed 1 is
Expand All @@ -27,19 +27,19 @@ groundSpeedCap = 2.0 # Linear default : 0.4
# Flight speed 0.5 @ 100 spd
# Flight speed 1 @ 200 spd
# Flight speed 1.5 @ 350 spd
flightCappedSpeed = true # Linear default : true
flightUseLogScaling = true # Linear default : false
flightSpeedScalar = 450.0 # Linear default : 64.0
flightSpeedCap = 1.75 # Linear default : 3.0
flightCappedSpeed = true # Linear default : true
flightUseLogScaling = true # Linear default : false
flightSpeedScalar = 450.0 # Linear default : 64.0
flightSpeedCap = 1.75 # Linear default : 3.0

# Swimming is the most niche ability, so it's uncapped and scales the hardest.
# Swim speed 1 @ 70 spd
# Swim speed 2 @ 200 spd
# Swim speed 3 @ 350 spd
swimCappedSpeed = false # Linear default : true
swimUseLogScaling = true # Linear default : false
swimSpeedScalar = 300.0 # Linear default : 64.0
swimSpeedCap = 3.0 # Linear default : 3.0
swimCappedSpeed = false # Linear default : true
swimUseLogScaling = true # Linear default : false
swimSpeedScalar = 300.0 # Linear default : 64.0
swimSpeedCap = 3.0 # Linear default : 3.0

# Legendaries get a speed boost accounted for in the formula.
# You may chose to let it bypass the speed caps.
Expand All @@ -50,6 +50,6 @@ legendaryModifierCapBreak = true
allowFlying = true
allowSwimming = true

list = [] # Which Pokemon you can or can't mount.
alsoFlying = [] # Which Pokemons can fly, ignoring its types
listUse = "" # Set to "blacklist" or "whitelist" to control the behavior of the below list. If it is an invalid option or blank, the option isn't used.
list = [] # Which Pokemon you can or can't mount.
alsoFlying = [] # Which Pokemons can fly, ignoring its types
listUse = "" # Set to "blacklist" or "whitelist" to control the behavior of the below list. If it is an invalid option or blank, the option isn't used.

0 comments on commit 6d24d1b

Please sign in to comment.