Update android capability stuff

This commit is contained in:
DBotThePony 2021-12-31 18:24:05 +07:00
parent 9efb4d6176
commit e859b93350
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 100 additions and 104 deletions

View File

@ -5,7 +5,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.DeathScreen; import net.minecraft.client.gui.screens.DeathScreen;
import net.minecraft.client.gui.screens.InBedChatScreen; import net.minecraft.client.gui.screens.InBedChatScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -16,7 +15,6 @@ import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.client.event.ScreenOpenEvent; import net.minecraftforge.client.event.ScreenOpenEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.gui.ForgeIngameGui; import net.minecraftforge.client.gui.ForgeIngameGui;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@ -27,7 +25,6 @@ import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.core.Fraction; import ru.dbotthepony.mc.otm.core.Fraction;
import java.math.BigDecimal;
import java.util.Optional; import java.util.Optional;
import java.util.Random; import java.util.Random;
@ -75,7 +72,7 @@ public class AndroidGui {
} }
mc.player.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> { mc.player.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
if (!((AndroidCapabilityPlayer) cap).will_become_android) { if (!((AndroidCapabilityPlayer) cap).willBecomeAndroid) {
known_button.x = known_button_x; known_button.x = known_button_x;
known_button.y = known_button_y; known_button.y = known_button_y;
known_button_x = -1; known_button_x = -1;
@ -114,7 +111,7 @@ public class AndroidGui {
known_button_screen = screen; known_button_screen = screen;
mc.player.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> { mc.player.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
if (((AndroidCapabilityPlayer) cap).will_become_android) { if (((AndroidCapabilityPlayer) cap).willBecomeAndroid) {
known_button_screen = screen; known_button_screen = screen;
} }
}); });

View File

@ -35,9 +35,9 @@ public record AndroidStatusPacket(Type type, boolean status) {
ply.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> { ply.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
if (cap instanceof AndroidCapabilityPlayer pcap) { if (cap instanceof AndroidCapabilityPlayer pcap) {
if (type == Type.IS_ANDROID) if (type == Type.IS_ANDROID)
pcap.is_android = status; pcap.isAndroid = status;
else if (type == Type.WILL_BECOME_ANDROID) else if (type == Type.WILL_BECOME_ANDROID)
pcap.will_become_android = status; pcap.willBecomeAndroid = status;
} }
}); });
} }

View File

@ -43,27 +43,26 @@ import java.util.*
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapabilityProvider, IAndroidCapability, INBTSerializable<CompoundTag?> { open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapabilityProvider, IAndroidCapability, INBTSerializable<CompoundTag?> {
@JvmField @JvmField protected var battery = Fraction.ZERO
protected var energy_stored = Fraction.ZERO @JvmField protected var maxBattery = Fraction(60000)
@JvmField
protected var energy_stored_max = Fraction(60000)
override var batteryItemStack = ItemStack.EMPTY override var batteryItemStack = ItemStack.EMPTY
private var network_energy = Fraction(-1) private var remoteBattery = Fraction(-1)
private var network_energy_max = Fraction(-1) private var remoteMaxBattery = Fraction(-1)
private var network_battery = ItemStack.EMPTY private var remoteBatteryStack = ItemStack.EMPTY
@JvmField protected val features: MutableMap<AndroidFeatureType<*>?, AndroidFeature> = HashMap() @JvmField protected val features: MutableMap<AndroidFeatureType<*>?, AndroidFeature> = HashMap()
@JvmField protected val network_queue = ArrayList<Any>() @JvmField protected val networkQueue = ArrayList<Any>()
@JvmField protected val delayed_tick_server = ArrayList<Runnable>() @JvmField protected val queuedTicks = ArrayList<Runnable>()
@JvmField protected var network_first = false @JvmField protected var networkFirst = false
protected fun addFeature(feature: AndroidFeature): Boolean { protected fun addFeature(feature: AndroidFeature): Boolean {
if (features.containsKey(feature.type)) return false if (features.containsKey(feature.type)) return false
features[feature.type] = feature features[feature.type] = feature
if (!ent.level.isClientSide) { if (!ent.level.isClientSide) {
delayed_tick_server.add(Runnable { feature.applyModifiers() }) queuedTicks.add(Runnable { feature.applyModifiers() })
} }
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
sendNetwork(AndroidFeaturePacket(true, feature)) sendNetwork(AndroidFeaturePacket(true, feature))
@ -80,7 +79,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
features[feature] = factory features[feature] = factory
if (!ent.level.isClientSide) { if (!ent.level.isClientSide) {
delayed_tick_server.add(Runnable { factory!!.applyModifiers() }) queuedTicks.add(Runnable { factory!!.applyModifiers() })
} }
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
@ -95,7 +94,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
if (removed != null) { if (removed != null) {
if (!ent.level.isClientSide) { if (!ent.level.isClientSide) {
delayed_tick_server.add { removed.removeModifiers() } queuedTicks.add { removed.removeModifiers() }
} }
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
@ -122,9 +121,9 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
} }
override fun invalidateNetworkState() { override fun invalidateNetworkState() {
network_energy = Fraction.MINUS_ONE remoteBattery = Fraction.MINUS_ONE
network_energy_max = Fraction.MINUS_ONE remoteMaxBattery = Fraction.MINUS_ONE
network_battery = ItemStack.EMPTY remoteBatteryStack = ItemStack.EMPTY
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
for (feature in features.values) { for (feature in features.values) {
@ -134,15 +133,15 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
} }
} }
override fun setEnergy(value: Fraction?) { override fun setEnergy(value: Fraction) {
energy_stored = value!! battery = value
} }
override fun setMaxEnergy(value: Fraction?) { override fun setMaxEnergy(value: Fraction) {
energy_stored_max = value!! maxBattery = value
} }
override fun onHurt(event: LivingHurtEvent?) { override fun onHurt(event: LivingHurtEvent) {
for (feature in features.values) { for (feature in features.values) {
feature.onHurt(event) feature.onHurt(event)
} }
@ -151,8 +150,8 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
override fun serializeNBT(): CompoundTag { override fun serializeNBT(): CompoundTag {
val tag = CompoundTag() val tag = CompoundTag()
tag["energy_stored"] = energy_stored.serializeNBT() tag["energy_stored"] = battery.serializeNBT()
tag["energy_stored_max"] = energy_stored_max.serializeNBT() tag["energy_stored_max"] = maxBattery.serializeNBT()
tag["battery"] = batteryItemStack.serializeNBT() tag["battery"] = batteryItemStack.serializeNBT()
val featureList = ListTag() val featureList = ListTag()
@ -173,11 +172,11 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
compound!! compound!!
compound.ifHas("energy_stored") { compound.ifHas("energy_stored") {
energy_stored = Fraction.deserializeNBT(it) battery = Fraction.deserializeNBT(it)
} }
compound.ifHas("energy_stored_max") { compound.ifHas("energy_stored_max") {
energy_stored_max = Fraction.deserializeNBT(it) maxBattery = Fraction.deserializeNBT(it)
} }
compound.ifHas("battery", CompoundTag::class.java) { compound.ifHas("battery", CompoundTag::class.java) {
@ -199,7 +198,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
addFeature(feature) addFeature(feature)
if (!ent.level.isClientSide) { if (!ent.level.isClientSide) {
delayed_tick_server.add(Runnable { feature.applyModifiers() }) queuedTicks.add(Runnable { feature.applyModifiers() })
} }
} }
} }
@ -214,39 +213,39 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
protected fun sendNetwork(packet: Any) { protected fun sendNetwork(packet: Any) {
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
if (network_first) { if (networkFirst) {
MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with { ent }, packet) MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with { ent }, packet)
} else { } else {
network_queue.add(packet) networkQueue.add(packet)
} }
} }
} }
protected open fun tickNetwork() { protected open fun tickNetwork() {
network_first = true networkFirst = true
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
if (energy_stored != network_energy) { if (battery != remoteBattery) {
network_energy = energy_stored remoteBattery = battery
sendNetwork(AndroidEnergyPacket(false, energy_stored)) sendNetwork(AndroidEnergyPacket(false, battery))
} }
if (energy_stored_max != network_energy_max) { if (maxBattery != remoteMaxBattery) {
network_energy_max = energy_stored_max remoteMaxBattery = maxBattery
sendNetwork(AndroidEnergyPacket(true, energy_stored_max)) sendNetwork(AndroidEnergyPacket(true, maxBattery))
} }
if (!network_battery.equals(batteryItemStack, false)) { if (!remoteBatteryStack.equals(batteryItemStack, false)) {
network_battery = batteryItemStack.copy() remoteBatteryStack = batteryItemStack.copy()
sendNetwork(AndroidBatteryPacket(batteryItemStack)) sendNetwork(AndroidBatteryPacket(batteryItemStack))
} }
if (network_queue.size != 0) { if (networkQueue.size != 0) {
for (packet in network_queue) { for (packet in networkQueue) {
MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with {ent}, packet) MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with {ent}, packet)
} }
network_queue.clear() networkQueue.clear()
} }
} }
} }
@ -255,7 +254,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
protected open fun tickInnerClientAlways() {} protected open fun tickInnerClientAlways() {}
override fun tickClient() { override fun tickClient() {
delayed_tick_server.clear() queuedTicks.clear()
if (!ent.isAlive) return if (!ent.isAlive) return
tickInnerClientAlways() tickInnerClientAlways()
if (isAndroid()) { if (isAndroid()) {
@ -275,10 +274,10 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
feature.tickServer() feature.tickServer()
} }
} }
for (runnable in delayed_tick_server) { for (runnable in queuedTicks) {
runnable.run() runnable.run()
} }
delayed_tick_server.clear() queuedTicks.clear()
tickNetwork() tickNetwork()
} }
@ -292,12 +291,12 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
if (ent.hasEffect(effect)) if (ent.hasEffect(effect))
ent.removeEffect(effect) ent.removeEffect(effect)
if (!batteryItemStack.isEmpty && energy_stored < energy_stored_max) { if (!batteryItemStack.isEmpty && battery < maxBattery) {
batteryItemStack.getCapability(CapabilityEnergy.ENERGY).ifPresent { batteryItemStack.getCapability(CapabilityEnergy.ENERGY).ifPresent {
if (it is IMatteryEnergyStorage) { if (it is IMatteryEnergyStorage) {
energy_stored += it.extractEnergyInner(energy_stored_max - energy_stored, false) battery += it.extractEnergyInner(maxBattery - battery, false)
} else { } else {
energy_stored += it.extractEnergy(energy_stored_max - energy_stored, false) battery += it.extractEnergy(maxBattery - battery, false)
} }
} }
} }
@ -333,11 +332,11 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
} }
} }
val new = (energy_stored - howMuch).moreThanZero() val new = (battery - howMuch).moreThanZero()
drained += energy_stored - new drained += battery - new
if (!simulate) { if (!simulate) {
energy_stored = new battery = new
if (ent is ServerPlayer) { if (ent is ServerPlayer) {
ent.awardStat(Registry.Names.POWER_CONSUMED, drained.toInt() * 10) ent.awardStat(Registry.Names.POWER_CONSUMED, drained.toInt() * 10)
@ -369,11 +368,11 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
} }
} }
val new = (energy_stored + howMuch).min(energy_stored_max) val new = (battery + howMuch).min(maxBattery)
received += new - energy_stored received += new - battery
if (!simulate) { if (!simulate) {
energy_stored = new battery = new
} }
return received return received
@ -395,14 +394,14 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
val it = resolver.get() val it = resolver.get()
if (it is IMatteryEnergyStorage) { if (it is IMatteryEnergyStorage) {
return energy_stored + it.batteryLevel return battery + it.batteryLevel
} else { } else {
return energy_stored + it.energyStored return battery + it.energyStored
} }
} }
} }
return energy_stored return battery
} }
override fun getMaxBatteryLevel(): Fraction { override fun getMaxBatteryLevel(): Fraction {
@ -413,14 +412,14 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
val it = resolver.get() val it = resolver.get()
if (it is IMatteryEnergyStorage) { if (it is IMatteryEnergyStorage) {
return energy_stored_max + it.maxBatteryLevel return maxBattery + it.maxBatteryLevel
} else { } else {
return energy_stored_max + it.maxEnergyStored return maxBattery + it.maxEnergyStored
} }
} }
} }
return energy_stored_max return maxBattery
} }
private val resolver = LazyOptional.of { this } private val resolver = LazyOptional.of { this }

View File

@ -25,63 +25,63 @@ import java.util.*
class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply) { class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply) {
@JvmField @JvmField
var is_android = false var isAndroid = false
private var network_is_android = false private var isAndroidNetwork = false
@JvmField @JvmField
var will_become_android = false var willBecomeAndroid = false
private var network_will_become_android = false private var willBecomeAndroidNetwork = false
private val research = ArrayList<AndroidResearch>() private val research = ArrayList<AndroidResearch>()
override fun invalidateNetworkState() { override fun invalidateNetworkState() {
super.invalidateNetworkState() super.invalidateNetworkState()
network_is_android = false isAndroidNetwork = false
network_will_become_android = false willBecomeAndroidNetwork = false
for (instance in research) { for (instance in research) {
instance.dirty = true instance.dirty = true
} }
} }
override fun isAndroid(): Boolean = is_android override fun isAndroid(): Boolean = isAndroid
fun isEverAndroid(): Boolean = is_android || will_become_android fun isEverAndroid(): Boolean = isAndroid || willBecomeAndroid
fun becomeAndroidSoft() { fun becomeAndroidSoft() {
if (is_android || will_become_android) return if (isAndroid || willBecomeAndroid) return
will_become_android = true willBecomeAndroid = true
(ply as? ServerPlayer)?.displayClientMessage(TranslatableComponent("otm.pill.message").withStyle(ChatFormatting.GRAY), false) (ply as? ServerPlayer)?.displayClientMessage(TranslatableComponent("otm.pill.message").withStyle(ChatFormatting.GRAY), false)
} }
fun becomeAndroid() { fun becomeAndroid() {
if (is_android) return if (isAndroid) return
is_android = true isAndroid = true
will_become_android = false willBecomeAndroid = false
energy_stored = Fraction(60000) battery = Fraction(60000)
energy_stored_max = Fraction(60000) maxBattery = Fraction(60000)
} }
fun becomeAndroidAndKill() { fun becomeAndroidAndKill() {
if (is_android) return if (isAndroid) return
becomeAndroid() becomeAndroid()
ply.hurt(Registry.DAMAGE_BECOME_ANDROID, ply.maxHealth * 2) ply.hurt(Registry.DAMAGE_BECOME_ANDROID, ply.maxHealth * 2)
} }
fun becomeHumane() { fun becomeHumane() {
if (will_become_android) will_become_android = false if (willBecomeAndroid) willBecomeAndroid = false
if (!is_android) return if (!isAndroid) return
is_android = false isAndroid = false
energy_stored = Fraction(0) battery = Fraction(0)
energy_stored_max = Fraction(60000) maxBattery = Fraction(60000)
dropBattery() dropBattery()
} }
fun becomeHumaneAndKill() { fun becomeHumaneAndKill() {
if (will_become_android) will_become_android = false if (willBecomeAndroid) willBecomeAndroid = false
if (!is_android) return if (!isAndroid) return
becomeHumane() becomeHumane()
ply.hurt(Registry.DAMAGE_BECOME_HUMANE, ply.maxHealth * 2) ply.hurt(Registry.DAMAGE_BECOME_HUMANE, ply.maxHealth * 2)
@ -90,8 +90,8 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun deserializeNBT(compound: CompoundTag?) { override fun deserializeNBT(compound: CompoundTag?) {
super.deserializeNBT(compound!!) super.deserializeNBT(compound!!)
is_android = compound.getBoolean("is_android") isAndroid = compound.getBoolean("is_android")
will_become_android = compound.getBoolean("will_become_android") willBecomeAndroid = compound.getBoolean("will_become_android")
research.clear() research.clear()
val list = compound.getList("research", Tag.TAG_COMPOUND.toInt()) val list = compound.getList("research", Tag.TAG_COMPOUND.toInt())
@ -112,8 +112,8 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun serializeNBT(): CompoundTag { override fun serializeNBT(): CompoundTag {
val tag = super.serializeNBT() val tag = super.serializeNBT()
tag["is_android"] = is_android tag["is_android"] = isAndroid
tag["will_become_android"] = will_become_android tag["will_become_android"] = willBecomeAndroid
val list = ListTag() val list = ListTag()
@ -146,14 +146,14 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun tickNetwork() { override fun tickNetwork() {
super.tickNetwork() super.tickNetwork()
if (is_android != network_is_android) { if (isAndroid != isAndroidNetwork) {
network_is_android = is_android isAndroidNetwork = isAndroid
sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.IS_ANDROID, is_android)) sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.IS_ANDROID, isAndroid))
} }
if (will_become_android != network_will_become_android) { if (willBecomeAndroid != willBecomeAndroidNetwork) {
network_will_become_android = will_become_android willBecomeAndroidNetwork = willBecomeAndroid
sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.WILL_BECOME_ANDROID, will_become_android)) sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.WILL_BECOME_ANDROID, willBecomeAndroid))
} }
for (instance in research) { for (instance in research) {
@ -170,7 +170,7 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun tickInnerClientAlways() { override fun tickInnerClientAlways() {
super.tickInnerClientAlways() super.tickInnerClientAlways()
if (will_become_android) { if (willBecomeAndroid) {
if (ply.isSleeping) { if (ply.isSleeping) {
sleep_ticks++ sleep_ticks++
} else { } else {
@ -182,7 +182,7 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun tickServerAlways() { override fun tickServerAlways() {
super.tickServerAlways() super.tickServerAlways()
if (will_become_android) { if (willBecomeAndroid) {
if (ply.isSleeping) { if (ply.isSleeping) {
sleep_ticks++ sleep_ticks++
@ -268,7 +268,7 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
val original = resolver.resolve().get() as AndroidCapabilityPlayer val original = resolver.resolve().get() as AndroidCapabilityPlayer
if (original.will_become_android && event.isWasDeath) { if (original.willBecomeAndroid && event.isWasDeath) {
original.becomeAndroid() original.becomeAndroid()
(event.player as? ServerPlayer)?.displayClientMessage(TranslatableComponent("otm.pill.message_finish").withStyle(ChatFormatting.DARK_RED), false) (event.player as? ServerPlayer)?.displayClientMessage(TranslatableComponent("otm.pill.message_finish").withStyle(ChatFormatting.DARK_RED), false)
} }

View File

@ -37,9 +37,9 @@ interface IAndroidCapability : IMatteryEnergyStorage, INBTSerializable<CompoundT
fun isAndroid(): Boolean = true fun isAndroid(): Boolean = true
fun onHurt(event: LivingHurtEvent?) {} fun onHurt(event: LivingHurtEvent) {}
var batteryItemStack: ItemStack var batteryItemStack: ItemStack
fun invalidateNetworkState() // tell capability that player forgot everything, and everything needs to be re-networked fun invalidateNetworkState() // tell capability that player forgot everything, and everything needs to be re-networked
fun setEnergy(value: Fraction?) fun setEnergy(value: Fraction)
fun setMaxEnergy(value: Fraction?) fun setMaxEnergy(value: Fraction)
} }