Skip to content

Commit

Permalink
Merge pull request Gaider10#7 from qouteall/1.19
Browse files Browse the repository at this point in the history
A lot of improvements
  • Loading branch information
Fusion-Flux authored Jun 22, 2022
2 parents b8b0b32 + af19ca7 commit c49ebaf
Show file tree
Hide file tree
Showing 9 changed files with 229 additions and 394 deletions.
68 changes: 68 additions & 0 deletions src/main/java/com/fusionflux/gravity_api/RotationAnimation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.fusionflux.gravity_api;

import com.fusionflux.gravity_api.util.RotationUtil;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Quaternion;

@Environment(EnvType.CLIENT)
public class RotationAnimation {
private static boolean inAnimation = false;
private static Quaternion startGravityRotation;
private static Quaternion endGravityRotation;
private static long startTimeMs;
private static long endTimeMs;

public static void applyRotationAnimation(Direction newGravity, Direction prevGravity, int durationTimeMs) {
if (durationTimeMs == 0) {
inAnimation = false;
return;
}

long now = getTimeMs();

Quaternion currentGravityRotation = getCurrentGravityRotation(prevGravity);

Quaternion targetGravityRotation = RotationUtil.getWorldRotationQuaternion(newGravity);

inAnimation = true;
startGravityRotation = currentGravityRotation;
endGravityRotation = targetGravityRotation;
startTimeMs = now;
endTimeMs = now + durationTimeMs;
}

private static long getTimeMs() {
return System.currentTimeMillis();
}

public static Quaternion getCurrentGravityRotation(Direction currentGravity) {

long now = getTimeMs();

if (now > endTimeMs) {
inAnimation = false;
}

if (!inAnimation) {
return RotationUtil.getWorldRotationQuaternion(currentGravity);
}

double delta = ((double) (now - startTimeMs)) / (endTimeMs - startTimeMs);

// make sure that frustum culling updates when running rotation animation
MinecraftClient.getInstance().worldRenderer.scheduleTerrainUpdate();

return RotationUtil.interpolate(
startGravityRotation, endGravityRotation,
mapProgress((float) delta)
);
}

private static float mapProgress(float delta) {
return MathHelper.clamp((delta * delta * (3 - 2 * delta)), 0, 1);
}
}
45 changes: 25 additions & 20 deletions src/main/java/com/fusionflux/gravity_api/api/GravityChangerAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Optional;

import com.fusionflux.gravity_api.GravityChangerMod;
import com.fusionflux.gravity_api.util.RotationUtil;
import com.fusionflux.gravity_api.util.EntityTags;
import com.fusionflux.gravity_api.util.Gravity;
Expand Down Expand Up @@ -49,35 +50,35 @@ private static <C extends Component, V> Optional<C> maybeGetSafe(ComponentKey<C>
* This may not be the applied gravity direction for the player, see GravityChangerAPI#getAppliedGravityDirection
*/
public static Direction getGravityDirection(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
return maybeGetSafe(GRAVITY_COMPONENT, entity).map(GravityComponent::getTrackedGravityDirection).orElse(Direction.DOWN);
}
return Direction.DOWN;
}

public static ArrayList<Gravity> getGravityList(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
return maybeGetSafe(GRAVITY_COMPONENT, entity).map(GravityComponent::getGravity).orElse(new ArrayList<Gravity>());
}
return new ArrayList<Gravity>();
}

public static Direction getPrevGravtityDirection(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
return maybeGetSafe(GRAVITY_COMPONENT, entity).map(GravityComponent::getPrevTrackedGravityDirection).orElse(Direction.DOWN);
}
return Direction.DOWN;
}

public static Direction getDefaultGravityDirection(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
return maybeGetSafe(GRAVITY_COMPONENT, entity).map(GravityComponent::getDefaultTrackedGravityDirection).orElse(Direction.DOWN);
}
return Direction.DOWN;
}

public static boolean getIsInverted(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
return maybeGetSafe(GRAVITY_COMPONENT, entity).map(GravityComponent::getInvertGravity).orElse(false);
}
return false;
Expand All @@ -90,46 +91,50 @@ public static boolean getIsInverted(Entity entity) {
* This may not immediately change the applied gravity direction for the player, see GravityChangerAPI#getAppliedGravityDirection
*/
public static void addGravity(Entity entity, Gravity gravity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(gc -> gc.addGravity(gravity,false));
}
}

public static void updateGravity(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(gc -> gc.updateGravity(false));
}
}

public static void setGravity(Entity entity, ArrayList<Gravity> gravity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(gc -> gc.setGravity(gravity,false));
}
}

public static void setIsInverted(Entity entity, boolean isInverted) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(gc -> gc.invertGravity(isInverted));
}
}

public static void clearGravity(Entity entity) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
if (EntityTags.canChangeGravity(entity)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(GravityComponent::clearGravity);
}
}

public static void setDefaultGravityDirection(Entity entity, Direction gravityDirection) {
if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(gc -> gc.setDefaultTrackedGravityDirection(gravityDirection));
public static void setDefaultGravityDirection(Entity entity, Direction gravityDirection, int animationDurationMs) {
if (EntityTags.canChangeGravity(entity)) {
maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(
gc -> gc.setDefaultTrackedGravityDirection(gravityDirection, animationDurationMs)
);
}
}

//public static void resetGravity(Entity entity) {
// if (!entity.getType().getRegistryEntry().isIn(EntityTags.FORBIDDEN_ENTITIES)) {
// maybeGetSafe(GRAVITY_COMPONENT, entity).ifPresent(GravityComponent::resetGravity);
// }
//}


public static void setDefaultGravityDirection(Entity entity, Direction gravityDirection) {
setDefaultGravityDirection(
entity, gravityDirection,
GravityChangerMod.config.rotationTime
);
}

/**
* Returns the world relative velocity for the given player
* Using minecraft's methods to get the velocity of a the player will return player relative velocity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.fusionflux.gravity_api.mixin;

import com.fusionflux.gravity_api.util.RotationUtil;
import com.fusionflux.gravity_api.RotationAnimation;
import com.fusionflux.gravity_api.GravityChangerMod;
import com.fusionflux.gravity_api.accessor.ServerPlayerEntityAccessor;
import com.fusionflux.gravity_api.api.GravityChangerAPI;
Expand Down Expand Up @@ -44,11 +44,8 @@ private void inject_moveToWorld_sendPacket_1(CallbackInfoReturnable<ServerPlayer
Direction gravityDirection = GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this);
if(gravityDirection != GravityChangerAPI.getDefaultGravityDirection((ServerPlayerEntity)(Object)this) && GravityChangerMod.config.resetGravityOnDimensionChange) {
GravityChangerAPI.setDefaultGravityDirection((ServerPlayerEntity)(Object)this, Direction.DOWN);
RotationUtil.applyNewRotation(gravityDirection,GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerMod.config.rotationTime);
} else {
GravityChangerAPI.setDefaultGravityDirection((ServerPlayerEntity)(Object)this, GravityChangerAPI.getDefaultGravityDirection((ServerPlayerEntity)(Object)this));
RotationUtil.applyNewRotation(gravityDirection,GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerMod.config.rotationTime);
this.gravitychanger$sendGravityPacket(gravityDirection, false);
}
}

Expand All @@ -65,11 +62,8 @@ private void inject_teleport_sendPacket_0(CallbackInfo ci) {
Direction gravityDirection = GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this);
if(gravityDirection != GravityChangerAPI.getDefaultGravityDirection((ServerPlayerEntity)(Object)this) && GravityChangerMod.config.resetGravityOnDimensionChange) {
GravityChangerAPI.setDefaultGravityDirection((ServerPlayerEntity)(Object)this, Direction.DOWN);
RotationUtil.applyNewRotation(gravityDirection,GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerMod.config.rotationTime);
} else {
GravityChangerAPI.setDefaultGravityDirection((ServerPlayerEntity)(Object)this, GravityChangerAPI.getDefaultGravityDirection((ServerPlayerEntity)(Object)this));
RotationUtil.applyNewRotation(gravityDirection,GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerMod.config.rotationTime);
this.gravitychanger$sendGravityPacket(gravityDirection, false);
}
}

Expand All @@ -79,12 +73,8 @@ private void inject_teleport_sendPacket_0(CallbackInfo ci) {
)
private void inject_copyFrom(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo ci) {
if(GravityChangerMod.config.resetGravityOnRespawn) {
RotationUtil.applyNewRotation(GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerAPI.getDefaultGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerMod.config.rotationTime);
//GravityChangerAPI.updateGravity(oldPlayer);
//GravityChangerAPI.setGravityDirection(oldPlayer, GravityChangerAPI.getDefaultGravityDirection(oldPlayer));
} else {
GravityChangerAPI.setDefaultGravityDirection((ServerPlayerEntity)(Object)this, GravityChangerAPI.getDefaultGravityDirection(oldPlayer));
RotationUtil.applyNewRotation(GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerAPI.getGravityDirection((ServerPlayerEntity)(Object)this),GravityChangerMod.config.rotationTime);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.fusionflux.gravity_api.mixin.client;

import com.fusionflux.gravity_api.RotationAnimation;
import com.fusionflux.gravity_api.api.GravityChangerAPI;
import com.fusionflux.gravity_api.util.RotationUtil;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Quaternion;
import net.minecraft.util.math.Vec3d;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -29,29 +31,11 @@ public abstract class GameRendererMixin {
)
)
private void inject_renderWorld(float tickDelta, long limitTime, MatrixStack matrix, CallbackInfo ci) {
if(this.camera.getFocusedEntity() != null) {
if (this.camera.getFocusedEntity() != null) {
Entity focusedEntity = this.camera.getFocusedEntity();
Direction gravityDirection = GravityChangerAPI.getGravityDirection(focusedEntity);
double offset =1.62;
if(GravityChangerAPI.getGravityDirection(focusedEntity) == GravityChangerAPI.getPrevGravtityDirection(focusedEntity).getOpposite()){
offset = offset/2;
}

Vec3d translation = RotationUtil.vecPlayerToWorld(new Vec3d(0,offset,0),GravityChangerAPI.getGravityDirection(focusedEntity));
matrix.translate(0,-offset,0);
matrix.multiply(RotationUtil.getRotation(gravityDirection));
matrix.translate(translation.x,translation.y,translation.z);

Quaternion currentGravityRotation = RotationAnimation.getCurrentGravityRotation(gravityDirection);
matrix.multiply(currentGravityRotation);
}
// float accuTicks = GravityChangerAPI.getAccumulatedTicks(focusedEntity);
// if(accuTicks <=1) {
// Direction gravityDirection = ((EntityAccessor) this.camera.getFocusedEntity()).gravitychanger$getAppliedGravityDirection();
// Direction prevGravityDirection = GravityChangerAPI.getPrevGravityDirection(this.camera.getFocusedEntity());
// matrix.multiply(RotationUtil.interpolate(RotationUtil.getWorldRotationQuaternion(prevGravityDirection), RotationUtil.getWorldRotationQuaternion(gravityDirection), accuTicks ));
// GravityChangerAPI.setAccumulatedTicks(focusedEntity,accuTicks+(tickDelta*.25f));
// }else{
// Direction gravityDirection = ((EntityAccessor) this.camera.getFocusedEntity()).gravitychanger$getAppliedGravityDirection();
// matrix.multiply(RotationUtil.getWorldRotationQuaternion(gravityDirection));
// }
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/fusionflux/gravity_api/util/EntityTags.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
package com.fusionflux.gravity_api.util;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.tag.TagKey;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;

public class EntityTags {
public static final TagKey<EntityType<?>> FORBIDDEN_ENTITIES = TagKey.of(Registry.ENTITY_TYPE_KEY, new Identifier("gravitychanger", "forbidden_entities"));
public static final TagKey<EntityType<?>> FORBIDDEN_ENTITY_RENDERING = TagKey.of(Registry.ENTITY_TYPE_KEY, new Identifier("gravitychanger", "forbidden_entity_rendering"));

public static boolean canChangeGravity(Entity entity) {
if (entity instanceof LivingEntity || entity instanceof ProjectileEntity) {
return !entity.getType().getRegistryEntry().isIn(FORBIDDEN_ENTITIES);
}
else {
return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public interface GravityComponent extends Component {

Direction getDefaultTrackedGravityDirection();

void setDefaultTrackedGravityDirection(Direction gravityDirection);
void setDefaultTrackedGravityDirection(Direction gravityDirection, int animationDurationMs);

void addGravity(Gravity gravity, boolean initialGravity);

Expand Down
Loading

0 comments on commit c49ebaf

Please sign in to comment.