This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
RelicCraft/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinEntity.java

88 lines
3.0 KiB
Java
Raw Normal View History

2020-04-04 02:32:34 +00:00
package com.thebrokenrail.reliccraft.mixin;
import com.thebrokenrail.reliccraft.block.TeleportationRestrictorBlock;
import net.minecraft.entity.Entity;
2020-04-19 01:16:30 +00:00
import net.minecraft.entity.EntityType;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.nbt.CompoundTag;
2020-04-19 01:16:30 +00:00
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.World;
2020-04-04 02:32:34 +00:00
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
2020-04-04 02:32:34 +00:00
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
2020-04-04 02:32:34 +00:00
@SuppressWarnings("unused")
@Mixin(Entity.class)
public abstract class MixinEntity implements TeleportationRestrictorBlock.TeleportingEntity {
@Shadow
protected boolean inNetherPortal;
2020-04-19 01:16:30 +00:00
@Shadow
public abstract World getEntityWorld();
@Shadow
public abstract DataTracker getDataTracker();
2020-04-04 02:32:34 +00:00
@Unique
2020-04-19 01:16:30 +00:00
private static final byte DEFAULT_TELEPORT_COOLDOWN = 80;
2020-04-04 02:32:34 +00:00
2020-04-19 01:16:30 +00:00
@Unique
private static final TrackedData<Byte> TELEPORT_COOLDOWN = DataTracker.registerData(Entity.class, TrackedDataHandlerRegistry.BYTE);
@Inject(at = @At("RETURN"), method = "<init>")
public void init(EntityType<?> type, World world, CallbackInfo info) {
getDataTracker().startTracking(TELEPORT_COOLDOWN, (byte) 0);
2020-04-04 02:32:34 +00:00
}
@Override
2020-04-19 01:16:30 +00:00
public void resetTeleportCooldown() {
getDataTracker().set(TELEPORT_COOLDOWN, (byte) 0);
}
2020-04-19 01:16:30 +00:00
@Inject(at = @At("RETURN"), method = "baseTick")
public void baseTick(CallbackInfo info) {
updateNetherPortal();
2020-04-19 01:16:30 +00:00
byte data = getDataTracker().get(TELEPORT_COOLDOWN);
if (getEntityWorld() instanceof ServerWorld && data < DEFAULT_TELEPORT_COOLDOWN) {
data++;
getDataTracker().set(TELEPORT_COOLDOWN, data);
2020-04-04 02:32:34 +00:00
}
}
@Unique
private void updateNetherPortal() {
if (cannotTeleport()) {
inNetherPortal = false;
}
}
@Inject(at = @At("HEAD"), method = "canUsePortals", cancellable = true)
public void canUsePortals(CallbackInfoReturnable<Boolean> info) {
if (cannotTeleport()) {
info.setReturnValue(false);
}
}
2020-04-04 02:32:34 +00:00
@Override
public boolean cannotTeleport() {
2020-04-19 01:16:30 +00:00
return getDataTracker().get(TELEPORT_COOLDOWN) < DEFAULT_TELEPORT_COOLDOWN;
2020-04-04 02:32:34 +00:00
}
@Inject(at = @At("HEAD"), method = "toTag")
public void toTag(CompoundTag tag, CallbackInfoReturnable<CompoundTag> info) {
2020-04-19 01:16:30 +00:00
tag.putByte("RelicCraftTeleportCooldown", getDataTracker().get(TELEPORT_COOLDOWN));
}
@Inject(at = @At("HEAD"), method = "fromTag")
public void fromTag(CompoundTag tag, CallbackInfo info) {
2020-04-19 01:16:30 +00:00
getDataTracker().set(TELEPORT_COOLDOWN, tag.getByte("RelicCraftTeleportCooldown"));
updateNetherPortal();
}
2020-04-04 02:32:34 +00:00
}