Skip to content

Commit

Permalink
Added IronMan SuitUp SFX,FX <#5>
Browse files Browse the repository at this point in the history
  • Loading branch information
copyandexecute committed May 7, 2024
1 parent 866ce8b commit e1a72d9
Show file tree
Hide file tree
Showing 12 changed files with 159 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import gg.norisk.heroes.ironman.IronManManager;
import gg.norisk.heroes.ironman.client.render.entity.feature.FlightParticleRenderer;
import gg.norisk.heroes.ironman.client.render.entity.feature.IronManArmorOverlayRenderer;
import gg.norisk.heroes.ironman.player.IronManPlayer;
import gg.norisk.heroes.ironman.player.IronManPlayerKt;
import net.minecraft.client.model.ModelPart;
Expand Down Expand Up @@ -42,6 +43,7 @@ private void injected(EntityRendererFactory.Context context, boolean bl, Callbac
context.getModelManager()
)
);
this.addFeature(new IronManArmorOverlayRenderer(this));
}

@WrapOperation(
Expand All @@ -54,7 +56,7 @@ private Identifier handleFakeSkin(SkinTextures instance, Operation<Identifier> o
AbstractClientPlayerEntity player,
ModelPart modelPart,
ModelPart modelPart2) {
if (IronManPlayerKt.isIronMan(player)) {
if (IronManArmorOverlayRenderer.Companion.shouldRenderIronManSkin(player)) {
return IronManManager.INSTANCE.getSkin();
} else {
return original.call(instance);
Expand All @@ -63,7 +65,7 @@ private Identifier handleFakeSkin(SkinTextures instance, Operation<Identifier> o

@Inject(method = "getTexture(Lnet/minecraft/client/network/AbstractClientPlayerEntity;)Lnet/minecraft/util/Identifier;", at = @At("RETURN"), cancellable = true)
private void injected(AbstractClientPlayerEntity abstractClientPlayerEntity, CallbackInfoReturnable<Identifier> cir) {
if (IronManPlayerKt.isIronMan(abstractClientPlayerEntity)) {
if (IronManArmorOverlayRenderer.Companion.shouldRenderIronManSkin(abstractClientPlayerEntity)) {
cir.setReturnValue(IronManManager.INSTANCE.getSkin());
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gg.norisk.heroes.ironman.mixin.entity;

import gg.norisk.heroes.ironman.abilities.FlyAbility;
import gg.norisk.heroes.ironman.abilities.TransformAbility;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.mob.FlyingEntity;
Expand All @@ -14,5 +15,6 @@ public abstract class LivingEntityMixin {
@Inject(method = "onTrackedDataSet", at = @At("RETURN"))
private void injected(TrackedData<?> trackedData, CallbackInfo ci) {
FlyAbility.INSTANCE.handleTrackedDataSet((LivingEntity) (Object) this, trackedData);
TransformAbility.INSTANCE.handleTrackedDataSet((LivingEntity) (Object) this, trackedData);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public abstract class PlayerEntityMixin extends LivingEntity implements IronManP
private float flyingLeaningPitch;
@Unique
private long startFlightTimestamp;
@Unique
private long transformTimestamp;

protected PlayerEntityMixin(EntityType<? extends LivingEntity> entityType, World world) {
super(entityType, world);
Expand All @@ -39,7 +41,7 @@ protected PlayerEntityMixin(EntityType<? extends LivingEntity> entityType, World
@Inject(method = "initDataTracker", at = @At("TAIL"))
private void initDataTrackerInjecetion(CallbackInfo ci) {
this.dataTracker.startTracking(IronManPlayerKt.getFlyTracker(), false);
this.dataTracker.startTracking(IronManPlayerKt.getIronManTracker(), true);
this.dataTracker.startTracking(IronManPlayerKt.getIronManTracker(), false);
}

@Inject(method = "tick", at = @At("HEAD"))
Expand Down Expand Up @@ -90,4 +92,15 @@ public long getStartFlightTimestamp() {
public void setStartFlightTimestamp(long startFlightTimestamp) {
this.startFlightTimestamp = startFlightTimestamp;
}

@Unique
@Override
public long getTransformTimestamp() {
return transformTimestamp;
}
@Unique
@Override
public void setTransformTimestamp(long transformTimestamp) {
this.transformTimestamp = transformTimestamp;
}
}
2 changes: 2 additions & 0 deletions src/main/kotlin/gg/norisk/heroes/ironman/IronManManager.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gg.norisk.heroes.ironman

import gg.norisk.heroes.ironman.abilities.FlyAbility
import gg.norisk.heroes.ironman.abilities.TransformAbility
import gg.norisk.heroes.ironman.abilities.keybindings.KeyBindingManager
import gg.norisk.heroes.ironman.registry.ItemRegistry
import gg.norisk.heroes.ironman.registry.SoundRegistry
Expand All @@ -20,6 +21,7 @@ object IronManManager : ModInitializer, DedicatedServerModInitializer, ClientMod
logger.info("Starting IronMan...")
// Common initialization
FlyAbility.initServer()
TransformAbility.initServer()
SoundRegistry.init()
ItemRegistry.init()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import gg.norisk.heroes.ironman.abilities.keybindings.KeyBindingManager
import gg.norisk.heroes.ironman.client.sound.FlyingSoundInstance
import gg.norisk.heroes.ironman.player.IronManPlayer
import gg.norisk.heroes.ironman.player.flyTracker
import gg.norisk.heroes.ironman.player.isIronMan
import gg.norisk.heroes.ironman.player.isIronManFlying
import gg.norisk.heroes.ironman.registry.SoundRegistry
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents
Expand All @@ -29,6 +30,7 @@ import net.silkmc.silk.network.packet.c2sPacket
object FlyAbility {
val firstAbilityTogglePacket = c2sPacket<Boolean>("first-ability-toggle".toId())
val secondAbilityTogglePacket = c2sPacket<Boolean>("second-ability-toggle".toId())
val thirdAbilityTogglePacket = c2sPacket<Boolean>("third-ability-toggle".toId())

fun initClient() {
KeyEvents.keyEvent.listen { event ->
Expand All @@ -40,13 +42,18 @@ object FlyAbility {
if (event.isClicked()) {
secondAbilityTogglePacket.send(true)
}
} else if (event.matchesKeyBinding(KeyBindingManager.thirdAbilityKey)) {
if (event.isClicked()) {
thirdAbilityTogglePacket.send(true)
}
}
}
}

fun initServer() {
firstAbilityTogglePacket.receiveOnServer { packet, context ->
val player = context.player
if (!player.isIronMan) return@receiveOnServer
player.isIronManFlying = !player.isIronManFlying
if (player.isIronManFlying) {
val world = player.world as ServerWorld
Expand Down Expand Up @@ -96,8 +103,6 @@ object FlyAbility {
if (player.isIronManFlying && player is ClientPlayerEntity) {
MinecraftClient.getInstance().soundManager.play(FlyingSoundInstance(player))
}
} else {

}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package gg.norisk.heroes.ironman.abilities

import gg.norisk.heroes.ironman.abilities.FlyAbility.thirdAbilityTogglePacket
import gg.norisk.heroes.ironman.player.IronManPlayer
import gg.norisk.heroes.ironman.player.ironManTracker
import gg.norisk.heroes.ironman.player.isIronMan
import gg.norisk.heroes.ironman.registry.SoundRegistry
import net.minecraft.entity.LivingEntity
import net.minecraft.entity.data.TrackedData
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.sound.SoundCategory

object TransformAbility {
fun initClient() {
}

fun initServer() {
thirdAbilityTogglePacket.receiveOnServer { packet, context ->
val player = context.player
player.isIronMan = !player.isIronMan
}
}

fun handleTrackedDataSet(livingEntity: LivingEntity, trackedData: TrackedData<*>) {
val player = livingEntity as? PlayerEntity ?: return
val world = player.world
if (ironManTracker == trackedData) {
(player as IronManPlayer).transformTimestamp = System.currentTimeMillis()
player.playSuitUpSound()
}
}

private fun PlayerEntity.playSuitUpSound() {
if (!world.isClient) {
world.playSoundFromEntity(
null,
this,
SoundRegistry.SUIT_UP,
SoundCategory.PLAYERS,
2f,
1f
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ object KeyBindingManager {
"key.ironman.categories.abilities"
)
)
val thirdAbilityKey = KeyBindingHelper.registerKeyBinding(
KeyBinding(
"key.ironman.suit",
GLFW.GLFW_KEY_G,
"key.ironman.categories.abilities"
)
)

fun init() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package gg.norisk.heroes.ironman.client.render.entity.feature

import gg.norisk.heroes.ironman.IronManManager
import gg.norisk.heroes.ironman.player.IronManPlayer
import gg.norisk.heroes.ironman.player.isIronMan
import net.fabricmc.api.EnvType
import net.fabricmc.api.Environment
import net.minecraft.client.MinecraftClient
import net.minecraft.client.render.OverlayTexture
import net.minecraft.client.render.VertexConsumerProvider
import net.minecraft.client.render.entity.feature.FeatureRenderer
import net.minecraft.client.render.entity.feature.FeatureRendererContext
import net.minecraft.client.render.entity.model.BipedEntityModel
import net.minecraft.client.util.math.MatrixStack
import net.minecraft.entity.LivingEntity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.util.math.MathHelper

@Environment(EnvType.CLIENT)
class IronManArmorOverlayRenderer<T : LivingEntity, M : BipedEntityModel<T>, A : BipedEntityModel<T>>(
featureRendererContext: FeatureRendererContext<T, M>,
) : FeatureRenderer<T, M>(featureRendererContext) {
var currentScale = 0.4f

override fun render(
matrixStack: MatrixStack,
vertexConsumerProvider: VertexConsumerProvider,
i: Int,
livingEntity: T,
f: Float,
g: Float,
h: Float,
j: Float,
k: Float,
l: Float
) {
val player = livingEntity as? PlayerEntity ?: return
if (player.isIronMan) {
currentScale = MathHelper.lerp(MinecraftClient.getInstance().tickDelta * 0.05f, currentScale, 1.05f)
} else {
currentScale = MathHelper.lerp(MinecraftClient.getInstance().tickDelta * 0.05f, currentScale, 0.4f)
}

if (player.shouldRenderIronManSkin()) {
return
}

if (!player.isIronMan && (player as IronManPlayer).transformTimestamp + 250L < System.currentTimeMillis()) {
return
}

matrixStack.push()
matrixStack.scale(currentScale, currentScale, currentScale)
this.contextModel.render(
matrixStack,
vertexConsumerProvider.getBuffer(this.contextModel.getLayer(IronManManager.skin)),
i,
OverlayTexture.DEFAULT_UV, 1.0f, 1.0f, 1.0f, 1.0f
)
matrixStack.pop()
}

companion object {
fun PlayerEntity.shouldRenderIronManSkin(): Boolean {
if ((this as IronManPlayer).transformTimestamp + 1000L < System.currentTimeMillis() && isIronMan) {
return true
}
return false
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import net.minecraft.entity.player.PlayerEntity
interface IronManPlayer {
fun getFlyingLeaningPitch(tickDelta: Float): Float
var startFlightTimestamp: Long
var transformTimestamp: Long
}

val flyTracker: TrackedData<Boolean> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import net.minecraft.sound.SoundEvent
object SoundRegistry {
var JETPACK = Registry.register(Registries.SOUND_EVENT, "jetpack".toId(), SoundEvent.of("jetpack".toId()))
var FLY_START_STOUND = Registry.register(Registries.SOUND_EVENT, "fly_start_sound".toId(), SoundEvent.of("fly_start_sound".toId()))
var SUIT_UP = Registry.register(Registries.SOUND_EVENT, "suit_up".toId(), SoundEvent.of("suit_up".toId()))

fun init() {
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/assets/ironman/sounds.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
"sounds": [
"ironman:fly_start_sound"
]
},
"suit_up": {
"sounds": [
"ironman:suit_up"
]
}
}

Binary file not shown.

0 comments on commit e1a72d9

Please sign in to comment.