More abstract and straightforward android research system
This commit is contained in:
parent
6769af52f5
commit
bba2a1d9e0
@ -12,8 +12,8 @@ import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
|
|||||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapability;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.client.AndroidGui;
|
import ru.dbotthepony.mc.otm.client.AndroidGui;
|
||||||
import ru.dbotthepony.mc.otm.matter.MatterGrid;
|
import ru.dbotthepony.mc.otm.matter.MatterGrid;
|
||||||
@ -54,6 +54,7 @@ public class OverdriveThatMatters {
|
|||||||
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.BlockEntities.class);
|
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.BlockEntities.class);
|
||||||
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.Menus.class);
|
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.Menus.class);
|
||||||
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.AndroidFeatures.class);
|
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.AndroidFeatures.class);
|
||||||
|
FMLJavaModLoadingContext.get().getModEventBus().register(Registry.AndroidResearch.class);
|
||||||
|
|
||||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(AndroidCapability::registerEffects);
|
FMLJavaModLoadingContext.get().getModEventBus().addListener(AndroidCapability::registerEffects);
|
||||||
|
|
||||||
|
@ -13,13 +13,13 @@ import net.minecraftforge.event.RegistryEvent;
|
|||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
import net.minecraftforge.registries.ForgeRegistry;
|
import net.minecraftforge.registries.ForgeRegistry;
|
||||||
import net.minecraftforge.registries.IForgeRegistry;
|
|
||||||
import net.minecraftforge.registries.RegistryBuilder;
|
import net.minecraftforge.registries.RegistryBuilder;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidFeature;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearch;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearchType;
|
||||||
import ru.dbotthepony.mc.otm.block.*;
|
import ru.dbotthepony.mc.otm.block.*;
|
||||||
import ru.dbotthepony.mc.otm.block.entity.*;
|
import ru.dbotthepony.mc.otm.block.entity.*;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidAirBags;
|
import ru.dbotthepony.mc.otm.android.AndroidFeatureType;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidAirBagsType;
|
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidFeatureType;
|
|
||||||
import ru.dbotthepony.mc.otm.item.ItemBattery;
|
import ru.dbotthepony.mc.otm.item.ItemBattery;
|
||||||
import ru.dbotthepony.mc.otm.item.ItemMatterCapacitor;
|
import ru.dbotthepony.mc.otm.item.ItemMatterCapacitor;
|
||||||
import ru.dbotthepony.mc.otm.item.ItemPatternStorage;
|
import ru.dbotthepony.mc.otm.item.ItemPatternStorage;
|
||||||
@ -39,10 +39,14 @@ public class Registry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static ForgeRegistry<AndroidFeatureType<?>> ANDROID_FEATURES;
|
private static ForgeRegistry<AndroidFeatureType<?>> ANDROID_FEATURES;
|
||||||
|
private static ForgeRegistry<AndroidResearchType<?>> ANDROID_RESEARCH;
|
||||||
|
|
||||||
public static ForgeRegistry<AndroidFeatureType<?>> ANDROID_FEATURES() {
|
public static ForgeRegistry<AndroidFeatureType<?>> ANDROID_FEATURES() {
|
||||||
return ANDROID_FEATURES;
|
return ANDROID_FEATURES;
|
||||||
}
|
}
|
||||||
|
public static ForgeRegistry<AndroidResearchType<?>> ANDROID_RESEARCH() {
|
||||||
|
return ANDROID_RESEARCH;
|
||||||
|
}
|
||||||
|
|
||||||
public static void createRegistry() {
|
public static void createRegistry() {
|
||||||
if (ANDROID_FEATURES != null)
|
if (ANDROID_FEATURES != null)
|
||||||
@ -54,6 +58,13 @@ public class Registry {
|
|||||||
// make it shut up
|
// make it shut up
|
||||||
builder.setType(c(AndroidFeatureType.class));
|
builder.setType(c(AndroidFeatureType.class));
|
||||||
ANDROID_FEATURES = (ForgeRegistry<AndroidFeatureType<?>>) builder.create();
|
ANDROID_FEATURES = (ForgeRegistry<AndroidFeatureType<?>>) builder.create();
|
||||||
|
|
||||||
|
var builder2 = new RegistryBuilder<AndroidResearchType<?>>();
|
||||||
|
builder2.setName(new ResourceLocation(OverdriveThatMatters.MOD_ID, "android_research"));
|
||||||
|
|
||||||
|
// make it shut up
|
||||||
|
builder2.setType(c(AndroidResearchType.class));
|
||||||
|
ANDROID_RESEARCH = (ForgeRegistry<AndroidResearchType<?>>) builder2.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> Class<T> c(Class<?> cls) { return (Class<T>) cls; }
|
private static <T> Class<T> c(Class<?> cls) { return (Class<T>) cls; }
|
||||||
@ -266,7 +277,7 @@ public class Registry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class AndroidFeatures {
|
public static class AndroidFeatures {
|
||||||
public static final AndroidAirBagsType AIR_BAGS = new AndroidAirBagsType();
|
public static final AndroidFeatureType<AndroidFeature> AIR_BAGS = new AndroidFeatureType<>(AndroidFeature::new);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
AIR_BAGS.setRegistryName(Names.AIR_BAGS);
|
AIR_BAGS.setRegistryName(Names.AIR_BAGS);
|
||||||
@ -278,6 +289,25 @@ public class Registry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class AndroidResearch {
|
||||||
|
public static final AndroidResearchType<ru.dbotthepony.mc.otm.android.AndroidResearch> AIR_BAGS = new AndroidResearchType<>(
|
||||||
|
new ru.dbotthepony.mc.otm.android.AndroidResearch.Builder()
|
||||||
|
.setExperienceCost(18)
|
||||||
|
.addFeatureResult(AndroidFeatures.AIR_BAGS)
|
||||||
|
.withDescription()
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
static {
|
||||||
|
AIR_BAGS.setRegistryName(Names.AIR_BAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public static void register(final RegistryEvent.Register<AndroidResearchType<?>> event) {
|
||||||
|
event.getRegistry().register(AIR_BAGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class Menus {
|
public static class Menus {
|
||||||
public static final MenuType<AndroidStationMenu> ANDROID_STATION = new MenuType<>(AndroidStationMenu::new);
|
public static final MenuType<AndroidStationMenu> ANDROID_STATION = new MenuType<>(AndroidStationMenu::new);
|
||||||
public static final MenuType<BatteryBankMenu> BATTERY_BANK = new MenuType<>(BatteryBankMenu::new);
|
public static final MenuType<BatteryBankMenu> BATTERY_BANK = new MenuType<>(BatteryBankMenu::new);
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
package ru.dbotthepony.mc.otm.android;
|
||||||
|
|
||||||
public class AndroidFeature {
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraftforge.common.util.INBTSerializable;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
|
|
||||||
|
public class AndroidFeature implements INBTSerializable<CompoundTag> {
|
||||||
public final AndroidFeatureType<? extends AndroidFeature> type;
|
public final AndroidFeatureType<? extends AndroidFeature> type;
|
||||||
public final IAndroidCapability capability;
|
public final IAndroidCapability capability;
|
||||||
|
|
||||||
@ -40,4 +44,20 @@ public class AndroidFeature {
|
|||||||
public void tickServer() {
|
public void tickServer() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void serializeNBT(CompoundTag tag) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompoundTag serializeNBT() {
|
||||||
|
var tag = new CompoundTag();
|
||||||
|
serializeNBT(tag);
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deserializeNBT(CompoundTag tag) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,9 +1,9 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
package ru.dbotthepony.mc.otm.android;
|
||||||
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.network.chat.TranslatableComponent;
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
import net.minecraftforge.registries.*;
|
import net.minecraftforge.registries.*;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
@ -26,25 +26,6 @@ public class AndroidFeatureType<T extends AndroidFeature> extends ForgeRegistryE
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isResearchable() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected AndroidFeatureResearchNode getResearchNodeInner() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AndroidFeatureResearchNode cache;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public AndroidFeatureResearchNode getResearchNode() {
|
|
||||||
if (cache != null)
|
|
||||||
return cache;
|
|
||||||
|
|
||||||
return cache = getResearchNodeInner();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Component getDisplayName() {
|
public Component getDisplayName() {
|
||||||
if (getRegistryName() == null)
|
if (getRegistryName() == null)
|
||||||
return new TranslatableComponent("android_feature.null.null");
|
return new TranslatableComponent("android_feature.null.null");
|
303
src/main/java/ru/dbotthepony/mc/otm/android/AndroidResearch.java
Normal file
303
src/main/java/ru/dbotthepony/mc/otm/android/AndroidResearch.java
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.android;
|
||||||
|
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.Items;
|
||||||
|
import net.minecraftforge.common.util.INBTSerializable;
|
||||||
|
import net.minecraftforge.registries.ForgeRegistry;
|
||||||
|
import net.minecraftforge.registries.RegistryManager;
|
||||||
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
|
import ru.dbotthepony.mc.otm.network.MatteryNetworking;
|
||||||
|
import ru.dbotthepony.mc.otm.network.android.AndroidResearchRequestPacket;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public abstract class AndroidResearch implements INBTSerializable<CompoundTag> {
|
||||||
|
public final AndroidResearchType<?> type;
|
||||||
|
public final AndroidCapabilityPlayer capability;
|
||||||
|
|
||||||
|
protected boolean researched = false;
|
||||||
|
public boolean dirty = true;
|
||||||
|
|
||||||
|
public void markDirty() {
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isResearched() {
|
||||||
|
return researched;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AndroidResearch(AndroidResearchType<?> type, AndroidCapabilityPlayer capability) {
|
||||||
|
this.capability = capability;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract public List<AndroidResearchType<?>> getPrerequisites();
|
||||||
|
abstract public void onResearched();
|
||||||
|
abstract public void consumeCost();
|
||||||
|
abstract public boolean canAfford();
|
||||||
|
|
||||||
|
public List<Component> getTooltip() {
|
||||||
|
return List.of(type.getDisplayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean research(boolean force) {
|
||||||
|
if (researched)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!force && !canAfford())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
consumeCost();
|
||||||
|
researched = true;
|
||||||
|
onResearched();
|
||||||
|
|
||||||
|
markDirty();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean research() {
|
||||||
|
return research(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void researchClient() {
|
||||||
|
if (!researched && canAfford() && capability.isAndroid())
|
||||||
|
MatteryNetworking.CHANNEL.sendToServer(new AndroidResearchRequestPacket(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompoundTag serializeNBT() {
|
||||||
|
var nbt = new CompoundTag();
|
||||||
|
serializeNBT(nbt);
|
||||||
|
return nbt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void serializeNBT(CompoundTag tag) {
|
||||||
|
tag.putByte("researched", researched ? (byte) 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deserializeNBT(CompoundTag nbt) {
|
||||||
|
researched = nbt.getByte("researched") > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
record DeferredItemStack(ResourceLocation id, int amount) {}
|
||||||
|
|
||||||
|
public int experience = 0;
|
||||||
|
public boolean has_description = false;
|
||||||
|
public final ArrayList<DeferredItemStack> items = new ArrayList<>();
|
||||||
|
public final ArrayList<ResourceLocation> prerequisites = new ArrayList<>();
|
||||||
|
public final ArrayList<ResourceLocation> feature_results = new ArrayList<>();
|
||||||
|
|
||||||
|
public Builder addPrerequisite(ResourceLocation location) {
|
||||||
|
prerequisites.add(location);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addFeatureResult(ResourceLocation location) {
|
||||||
|
feature_results.add(location);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addFeatureResult(AndroidFeatureType<?> location) {
|
||||||
|
feature_results.add(Objects.requireNonNull(location.getRegistryName()));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addItem(ResourceLocation location) {
|
||||||
|
items.add(new DeferredItemStack(location, 1));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addItem(ResourceLocation location, int amount) {
|
||||||
|
items.add(new DeferredItemStack(location, amount));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setExperienceCost(int experience) {
|
||||||
|
this.experience = experience;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder withDescription() {
|
||||||
|
this.has_description = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final ArrayList<ItemStack> resolved_stacks = new ArrayList<>();
|
||||||
|
private final ArrayList<AndroidResearchType<?>> resolved_preq = new ArrayList<>();
|
||||||
|
private final ArrayList<AndroidFeatureType<?>> resolved_features = new ArrayList<>();
|
||||||
|
|
||||||
|
private boolean resolved = false;
|
||||||
|
|
||||||
|
private void resolve() {
|
||||||
|
if (!resolved) {
|
||||||
|
resolved = true;
|
||||||
|
|
||||||
|
for (var item : items) {
|
||||||
|
var get_item = RegistryManager.ACTIVE.getRegistry(Item.class).getValue(item.id);
|
||||||
|
|
||||||
|
if (get_item != null && get_item != Items.AIR) {
|
||||||
|
resolved_stacks.add(new ItemStack(get_item, item.amount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var entry : prerequisites) {
|
||||||
|
var get = Registry.ANDROID_RESEARCH().getValue(entry);
|
||||||
|
|
||||||
|
if (get != null) {
|
||||||
|
resolved_preq.add(get);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Can not find android research " + entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var entry : feature_results) {
|
||||||
|
var get = Registry.ANDROID_FEATURES().getValue(entry);
|
||||||
|
|
||||||
|
if (get != null) {
|
||||||
|
resolved_features.add(get);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Can not find android feature " + entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AndroidResearchType.AndroidResearchFactory<AndroidResearch> build() {
|
||||||
|
return (type, capability) -> {
|
||||||
|
resolve();
|
||||||
|
|
||||||
|
return new AndroidResearch(type, capability) {
|
||||||
|
@Override
|
||||||
|
public List<Component> getTooltip() {
|
||||||
|
var list = new ArrayList<>(super.getTooltip());
|
||||||
|
|
||||||
|
if (has_description) {
|
||||||
|
list.add(new TranslatableComponent("android_research." + type.getRegistryName().getNamespace() + "." + type.getRegistryName().getPath() + ".description"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!researched) {
|
||||||
|
if (experience > 0) {
|
||||||
|
if (capability.ply.experienceLevel >= experience) {
|
||||||
|
list.add(new TranslatableComponent("otm.android_station.research.xp_cost", experience).withStyle(ChatFormatting.DARK_GREEN));
|
||||||
|
} else {
|
||||||
|
list.add(new TranslatableComponent("otm.android_station.research.xp_cost", experience).withStyle(ChatFormatting.DARK_RED));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var stack : resolved_stacks) {
|
||||||
|
boolean hit = false;
|
||||||
|
|
||||||
|
if (stack.getTag() == null) {
|
||||||
|
for (var inv_stack : capability.ply.getInventory().items) {
|
||||||
|
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount()) {
|
||||||
|
hit = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var inv_stack : capability.ply.getInventory().items) {
|
||||||
|
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount() && inv_stack.getTag() != null && inv_stack.getTag().equals(stack.getTag())) {
|
||||||
|
hit = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hit) {
|
||||||
|
list.add(new TranslatableComponent("otm.android_station.research.item", stack.getDisplayName(), stack.getCount()).withStyle(ChatFormatting.DARK_GREEN));
|
||||||
|
} else {
|
||||||
|
list.add(new TranslatableComponent("otm.android_station.research.item", stack.getDisplayName(), stack.getCount()).withStyle(ChatFormatting.DARK_RED));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AndroidResearchType<?>> getPrerequisites() {
|
||||||
|
return List.copyOf(resolved_preq);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResearched() {
|
||||||
|
for (var feature : resolved_features) {
|
||||||
|
capability.addFeature(feature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canAfford() {
|
||||||
|
if (capability.ply.experienceLevel < experience)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (var stack : resolved_stacks) {
|
||||||
|
boolean hit = false;
|
||||||
|
|
||||||
|
if (stack.getTag() == null) {
|
||||||
|
for (var inv_stack : capability.ply.getInventory().items) {
|
||||||
|
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount()) {
|
||||||
|
hit = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var inv_stack : capability.ply.getInventory().items) {
|
||||||
|
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount() && inv_stack.getTag() != null && inv_stack.getTag().equals(stack.getTag())) {
|
||||||
|
hit = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hit)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void consumeCost() {
|
||||||
|
if (experience > 0)
|
||||||
|
capability.ply.giveExperienceLevels(-experience);
|
||||||
|
|
||||||
|
for (var stack : resolved_stacks) {
|
||||||
|
if (stack.getTag() == null) {
|
||||||
|
for (var inv_stack : capability.ply.getInventory().items) {
|
||||||
|
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount()) {
|
||||||
|
inv_stack.shrink(stack.getCount());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var inv_stack : capability.ply.getInventory().items) {
|
||||||
|
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount() && inv_stack.getTag() != null && inv_stack.getTag().equals(stack.getTag())) {
|
||||||
|
inv_stack.shrink(stack.getCount());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
capability.ply.getInventory().setChanged();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.android;
|
||||||
|
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
|
import net.minecraftforge.registries.ForgeRegistryEntry;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
|
|
||||||
|
public class AndroidResearchType<T extends AndroidResearch> extends ForgeRegistryEntry<AndroidResearchType<?>> {
|
||||||
|
public interface AndroidResearchFactory<T extends AndroidResearch> {
|
||||||
|
T factory(AndroidResearchType<T> entry, AndroidCapabilityPlayer capability);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final AndroidResearchFactory<T> factory;
|
||||||
|
|
||||||
|
public AndroidResearchType(AndroidResearchFactory<T> factory) {
|
||||||
|
this.factory = factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T factory(AndroidCapabilityPlayer capability) {
|
||||||
|
return factory.factory(this, capability);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Component getDisplayName() {
|
||||||
|
if (getRegistryName() == null)
|
||||||
|
return new TranslatableComponent("android_research.null.null");
|
||||||
|
|
||||||
|
return new TranslatableComponent("android_research." + getRegistryName().getNamespace() + "." + getRegistryName().getPath());
|
||||||
|
}
|
||||||
|
}
|
@ -17,7 +17,7 @@ import net.minecraft.world.phys.shapes.VoxelShape;
|
|||||||
import net.minecraftforge.common.util.LazyOptional;
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation;
|
import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.shapes.BlockShapes;
|
import ru.dbotthepony.mc.otm.shapes.BlockShapes;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
|
|||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.AABB;
|
import net.minecraft.world.phys.AABB;
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryMachineEnergyStorage;
|
import ru.dbotthepony.mc.otm.capability.MatteryMachineEnergyStorage;
|
||||||
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
|
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
package ru.dbotthepony.mc.otm.capability;
|
||||||
|
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
@ -20,11 +20,9 @@ import net.minecraftforge.event.entity.living.LivingEvent;
|
|||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||||
import net.minecraftforge.fmllegacy.network.PacketDistributor;
|
import net.minecraftforge.fmllegacy.network.PacketDistributor;
|
||||||
import org.apache.logging.log4j.core.jmx.Server;
|
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage;
|
import ru.dbotthepony.mc.otm.android.AndroidFeature;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.android.AndroidFeatureType;
|
||||||
import ru.dbotthepony.mc.otm.network.MatteryNetworking;
|
import ru.dbotthepony.mc.otm.network.MatteryNetworking;
|
||||||
import ru.dbotthepony.mc.otm.network.android.AndroidBatteryPacket;
|
import ru.dbotthepony.mc.otm.network.android.AndroidBatteryPacket;
|
||||||
import ru.dbotthepony.mc.otm.network.android.AndroidEnergyPacket;
|
import ru.dbotthepony.mc.otm.network.android.AndroidEnergyPacket;
|
||||||
@ -167,12 +165,8 @@ public class AndroidCapability implements ICapabilityProvider, IAndroidCapabilit
|
|||||||
|
|
||||||
for (var feature : features.values()) {
|
for (var feature : features.values()) {
|
||||||
var compound = new CompoundTag();
|
var compound = new CompoundTag();
|
||||||
|
feature.serializeNBT(compound);
|
||||||
compound.putString("id", Objects.requireNonNull(feature.type.getRegistryName()).toString());
|
compound.putString("id", Objects.requireNonNull(feature.type.getRegistryName()).toString());
|
||||||
|
|
||||||
if (feature instanceof INBTSerializable serializable) {
|
|
||||||
compound.put("data", serializable.serializeNBT());
|
|
||||||
}
|
|
||||||
|
|
||||||
features_nbt.add(compound);
|
features_nbt.add(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,10 +196,7 @@ public class AndroidCapability implements ICapabilityProvider, IAndroidCapabilit
|
|||||||
|
|
||||||
if (get_feature != null && get_feature.isApplicable(this)) {
|
if (get_feature != null && get_feature.isApplicable(this)) {
|
||||||
var feature = get_feature.factory(this);
|
var feature = get_feature.factory(this);
|
||||||
|
feature.deserializeNBT(tag);
|
||||||
if (feature instanceof INBTSerializable serializable) {
|
|
||||||
serializable.deserializeNBT(tag.getCompound("data"));
|
|
||||||
}
|
|
||||||
|
|
||||||
addFeature(feature);
|
addFeature(feature);
|
||||||
feature.attachFinish();
|
feature.attachFinish();
|
@ -1,6 +1,9 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
package ru.dbotthepony.mc.otm.capability;
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.ListTag;
|
||||||
|
import net.minecraft.nbt.Tag;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraftforge.client.event.InputUpdateEvent;
|
import net.minecraftforge.client.event.InputUpdateEvent;
|
||||||
@ -9,20 +12,30 @@ import net.minecraftforge.event.AttachCapabilitiesEvent;
|
|||||||
import net.minecraftforge.event.entity.player.PlayerEvent;
|
import net.minecraftforge.event.entity.player.PlayerEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.android.AndroidResearch;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearchType;
|
||||||
|
import ru.dbotthepony.mc.otm.network.android.AndroidResearchPacket;
|
||||||
import ru.dbotthepony.mc.otm.network.android.AndroidStatusPacket;
|
import ru.dbotthepony.mc.otm.network.android.AndroidStatusPacket;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class AndroidCapabilityPlayer extends AndroidCapability {
|
public class AndroidCapabilityPlayer extends AndroidCapability {
|
||||||
public boolean is_android = false;
|
public boolean is_android = false;
|
||||||
private boolean network_is_android = false;
|
private boolean network_is_android = false;
|
||||||
|
|
||||||
|
private final ArrayList<AndroidResearch> research_list = new ArrayList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invalidateNetworkState() {
|
public void invalidateNetworkState() {
|
||||||
super.invalidateNetworkState();
|
super.invalidateNetworkState();
|
||||||
network_is_android = false;
|
network_is_android = false;
|
||||||
|
|
||||||
|
for (var instance : research_list) {
|
||||||
|
instance.dirty = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -63,16 +76,56 @@ public class AndroidCapabilityPlayer extends AndroidCapability {
|
|||||||
|
|
||||||
if (compound.contains("is_android"))
|
if (compound.contains("is_android"))
|
||||||
is_android = compound.getByte("is_android") > 0;
|
is_android = compound.getByte("is_android") > 0;
|
||||||
|
|
||||||
|
research_list.clear();
|
||||||
|
|
||||||
|
var list = compound.getList("research", Tag.TAG_COMPOUND);
|
||||||
|
|
||||||
|
for (var _tag : list) {
|
||||||
|
if (_tag instanceof CompoundTag tag) {
|
||||||
|
var research = Registry.ANDROID_RESEARCH().getValue(new ResourceLocation(tag.getString("id")));
|
||||||
|
|
||||||
|
if (research != null) {
|
||||||
|
var instance = research.factory(this);
|
||||||
|
instance.deserializeNBT(tag);
|
||||||
|
research_list.add(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public CompoundTag serializeNBT() {
|
public CompoundTag serializeNBT() {
|
||||||
CompoundTag tag = super.serializeNBT();
|
CompoundTag tag = super.serializeNBT();
|
||||||
tag.putByte("is_android", is_android ? (byte) 1 : (byte) 0);
|
tag.putByte("is_android", is_android ? (byte) 1 : 0);
|
||||||
|
|
||||||
|
var list = new ListTag();
|
||||||
|
|
||||||
|
for (var instance : research_list) {
|
||||||
|
var _tag = new CompoundTag();
|
||||||
|
instance.serializeNBT(_tag);
|
||||||
|
_tag.putString("id", Objects.requireNonNull(instance.type.getRegistryName()).toString());
|
||||||
|
list.add(_tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
tag.put("research", list);
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AndroidResearch getResearch(AndroidResearchType<?> type) {
|
||||||
|
for (var instance : research_list) {
|
||||||
|
if (instance.type == type) {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var instance = type.factory(this);
|
||||||
|
research_list.add(instance);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onAttachCapabilityEvent(AttachCapabilitiesEvent<Entity> event) {
|
public static void onAttachCapabilityEvent(AttachCapabilitiesEvent<Entity> event) {
|
||||||
if (event.getObject() instanceof Player ply) {
|
if (event.getObject() instanceof Player ply) {
|
||||||
@ -143,7 +196,7 @@ public class AndroidCapabilityPlayer extends AndroidCapability {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Player ply;
|
public final Player ply;
|
||||||
|
|
||||||
public AndroidCapabilityPlayer(Player ent) {
|
public AndroidCapabilityPlayer(Player ent) {
|
||||||
super(ent);
|
super(ent);
|
||||||
@ -158,6 +211,13 @@ public class AndroidCapabilityPlayer extends AndroidCapability {
|
|||||||
network_is_android = is_android;
|
network_is_android = is_android;
|
||||||
sendNetwork(new AndroidStatusPacket(is_android));
|
sendNetwork(new AndroidStatusPacket(is_android));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (var instance : research_list) {
|
||||||
|
if (instance.dirty) {
|
||||||
|
instance.dirty = false;
|
||||||
|
sendNetwork(new AndroidResearchPacket(instance));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final BigDecimal ENERGY_FOR_HUNGER_POINT = new BigDecimal(1000);
|
public static final BigDecimal ENERGY_FOR_HUNGER_POINT = new BigDecimal(1000);
|
@ -1,10 +1,11 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
package ru.dbotthepony.mc.otm.capability;
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
|
||||||
import net.minecraftforge.common.util.INBTSerializable;
|
import net.minecraftforge.common.util.INBTSerializable;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidFeature;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidFeatureType;
|
||||||
import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage;
|
import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
@ -4,7 +4,6 @@ import net.minecraftforge.common.capabilities.Capability;
|
|||||||
import net.minecraftforge.common.capabilities.CapabilityInject;
|
import net.minecraftforge.common.capabilities.CapabilityInject;
|
||||||
import net.minecraftforge.common.capabilities.CapabilityManager;
|
import net.minecraftforge.common.capabilities.CapabilityManager;
|
||||||
import net.minecraftforge.energy.IEnergyStorage;
|
import net.minecraftforge.energy.IEnergyStorage;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.MathContext;
|
import java.math.MathContext;
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
|
||||||
|
|
||||||
public class AndroidAirBags extends AndroidFeature {
|
|
||||||
public AndroidAirBags(AndroidFeatureType<?> type, IAndroidCapability capability) {
|
|
||||||
super(type, capability);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
public class AndroidAirBagsType extends AndroidFeatureType<AndroidAirBags> {
|
|
||||||
public AndroidAirBagsType() {
|
|
||||||
super(AndroidAirBags::new);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public AndroidFeatureResearchNode getResearchNodeInner() {
|
|
||||||
return new AndroidFeatureResearchNode(this, new AndroidFeatureResearchCost(18))
|
|
||||||
.withDescription();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
|
||||||
|
|
||||||
import net.minecraft.ChatFormatting;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import net.minecraft.network.chat.TranslatableComponent;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public record AndroidFeatureResearchCost(int experience, ItemStack ...items) {
|
|
||||||
public boolean matches(Player ply) {
|
|
||||||
if (ply.experienceLevel < experience)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (var stack : items) {
|
|
||||||
boolean hit = false;
|
|
||||||
|
|
||||||
if (stack.getTag() == null) {
|
|
||||||
for (var inv_stack : ply.getInventory().items) {
|
|
||||||
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount()) {
|
|
||||||
hit = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (var inv_stack : ply.getInventory().items) {
|
|
||||||
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount() && inv_stack.getTag() != null && inv_stack.getTag().equals(stack.getTag())) {
|
|
||||||
hit = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hit)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Component> getTooltip() {
|
|
||||||
var list = new ArrayList<Component>();
|
|
||||||
|
|
||||||
if (experience > 0)
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.xp_cost", experience));
|
|
||||||
|
|
||||||
for (var itemstack : items)
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.item", itemstack.getDisplayName(), itemstack.getCount()));
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Component> getTooltip(Player ply) {
|
|
||||||
var list = new ArrayList<Component>();
|
|
||||||
|
|
||||||
if (experience > 0) {
|
|
||||||
if (ply.experienceLevel >= experience) {
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.xp_cost", experience).withStyle(ChatFormatting.DARK_GREEN));
|
|
||||||
} else {
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.xp_cost", experience).withStyle(ChatFormatting.DARK_RED));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var stack : items) {
|
|
||||||
boolean hit = false;
|
|
||||||
|
|
||||||
if (stack.getTag() == null) {
|
|
||||||
for (var inv_stack : ply.getInventory().items) {
|
|
||||||
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount()) {
|
|
||||||
hit = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (var inv_stack : ply.getInventory().items) {
|
|
||||||
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount() && inv_stack.getTag() != null && inv_stack.getTag().equals(stack.getTag())) {
|
|
||||||
hit = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hit) {
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.item", stack.getDisplayName(), stack.getCount()).withStyle(ChatFormatting.DARK_GREEN));
|
|
||||||
} else {
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.item", stack.getDisplayName(), stack.getCount()).withStyle(ChatFormatting.DARK_RED));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean research(Player ply) {
|
|
||||||
if (!matches(ply))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (experience > 0)
|
|
||||||
ply.giveExperienceLevels(-experience);
|
|
||||||
|
|
||||||
for (var stack : items) {
|
|
||||||
if (stack.getTag() == null) {
|
|
||||||
for (var inv_stack : ply.getInventory().items) {
|
|
||||||
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount()) {
|
|
||||||
inv_stack.shrink(stack.getCount());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (var inv_stack : ply.getInventory().items) {
|
|
||||||
if (inv_stack.is(stack.getItem()) && inv_stack.getCount() >= stack.getCount() && inv_stack.getTag() != null && inv_stack.getTag().equals(stack.getTag())) {
|
|
||||||
inv_stack.shrink(stack.getCount());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ply.getInventory().setChanged();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,120 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.capability.android;
|
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import net.minecraft.network.chat.TranslatableComponent;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
|
||||||
import ru.dbotthepony.mc.otm.network.MatteryNetworking;
|
|
||||||
import ru.dbotthepony.mc.otm.network.android.AndroidResearchRequestPacket;
|
|
||||||
import ru.dbotthepony.mc.otm.screen.SkinElement;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class AndroidFeatureResearchNode {
|
|
||||||
public final AndroidFeatureType<?> type;
|
|
||||||
public final AndroidFeatureResearchCost cost;
|
|
||||||
|
|
||||||
public final Set<AndroidFeatureType<?>> predecessors = new HashSet<>();
|
|
||||||
|
|
||||||
protected final Component description;
|
|
||||||
public boolean with_description = false;
|
|
||||||
|
|
||||||
public SkinElement icon;
|
|
||||||
|
|
||||||
public AndroidFeatureResearchNode(AndroidFeatureType<?> type, AndroidFeatureResearchCost cost) {
|
|
||||||
this.type = type;
|
|
||||||
this.cost = cost;
|
|
||||||
description = new TranslatableComponent("android_feature." + type.getRegistryName().getNamespace() + "." + type.getRegistryName().getPath() + ".description");
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidFeatureResearchNode(AndroidFeatureType<?> type, AndroidFeatureResearchCost cost, SkinElement icon) {
|
|
||||||
this(type, cost);
|
|
||||||
this.icon = icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidFeatureResearchNode addPredecessor(AndroidFeatureType<?> value) {
|
|
||||||
predecessors.add(value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidFeatureResearchNode withDescription() {
|
|
||||||
with_description = true;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canResearch(Player ply, AndroidCapabilityPlayer cap) {
|
|
||||||
for (var prec : predecessors) {
|
|
||||||
if (!cap.hasFeature(prec))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cost.matches(ply);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void research(Player ply, AndroidCapabilityPlayer cap) {
|
|
||||||
if (cap.hasFeature(type))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!canResearch(ply, cap))
|
|
||||||
return;
|
|
||||||
|
|
||||||
cost.research(ply);
|
|
||||||
cap.addFeature(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void researchClient() {
|
|
||||||
var ply = Minecraft.getInstance().player;
|
|
||||||
|
|
||||||
ply.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
|
|
||||||
if (cap.hasFeature(type))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!canResearch(ply, (AndroidCapabilityPlayer) cap))
|
|
||||||
return;
|
|
||||||
|
|
||||||
MatteryNetworking.CHANNEL.sendToServer(new AndroidResearchRequestPacket(type));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Component getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Component> getTooltip() {
|
|
||||||
var list = new ArrayList<Component>();
|
|
||||||
list.add(type.getDisplayName());
|
|
||||||
|
|
||||||
if (with_description) {
|
|
||||||
list.add(getDescription());
|
|
||||||
}
|
|
||||||
|
|
||||||
list.addAll(cost.getTooltip());
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Component> getTooltip(Player ply) {
|
|
||||||
var list = new ArrayList<Component>();
|
|
||||||
list.add(type.getDisplayName());
|
|
||||||
|
|
||||||
if (with_description) {
|
|
||||||
list.add(getDescription());
|
|
||||||
}
|
|
||||||
|
|
||||||
list.addAll(cost.getTooltip(ply));
|
|
||||||
|
|
||||||
ply.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
|
|
||||||
for (var prec : predecessors) {
|
|
||||||
if (!cap.hasFeature(prec)) {
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.missing_predecessors", prec.getDisplayName()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
@ -14,7 +14,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
|||||||
import net.minecraftforge.client.gui.ForgeIngameGui;
|
import net.minecraftforge.client.gui.ForgeIngameGui;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
@ -12,8 +12,8 @@ import net.minecraft.world.item.*;
|
|||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraftforge.common.util.FakePlayer;
|
import net.minecraftforge.common.util.FakePlayer;
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
@ -7,7 +7,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraftforge.common.util.LazyOptional;
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation;
|
import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
import ru.dbotthepony.mc.otm.capability.IAndroidCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
|
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
|
||||||
|
|
||||||
|
@ -111,5 +111,14 @@ public class MatteryNetworking {
|
|||||||
AndroidResearchRequestPacket::play,
|
AndroidResearchRequestPacket::play,
|
||||||
Optional.of(NetworkDirection.PLAY_TO_SERVER)
|
Optional.of(NetworkDirection.PLAY_TO_SERVER)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CHANNEL.registerMessage(
|
||||||
|
next_network_id++,
|
||||||
|
AndroidResearchPacket.class,
|
||||||
|
AndroidResearchPacket::write,
|
||||||
|
AndroidResearchPacket::read,
|
||||||
|
AndroidResearchPacket::play,
|
||||||
|
Optional.of(NetworkDirection.PLAY_TO_CLIENT)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,14 @@ package ru.dbotthepony.mc.otm.network.android;
|
|||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.fml.DistExecutor;
|
import net.minecraftforge.fml.DistExecutor;
|
||||||
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidFeature;
|
import ru.dbotthepony.mc.otm.android.AndroidFeature;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidFeatureType;
|
import ru.dbotthepony.mc.otm.android.AndroidFeatureType;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.network.android;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
import net.minecraftforge.fml.DistExecutor;
|
||||||
|
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
||||||
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearch;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearchType;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public record AndroidResearchPacket(AndroidResearchType<?> type, CompoundTag payload) {
|
||||||
|
public AndroidResearchPacket(AndroidResearch research) {
|
||||||
|
this(research.type, research.serializeNBT());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(FriendlyByteBuf buffer) {
|
||||||
|
buffer.writeInt(Registry.ANDROID_RESEARCH().getID(type));
|
||||||
|
buffer.writeNbt(payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AndroidResearchPacket read(FriendlyByteBuf buffer) {
|
||||||
|
return new AndroidResearchPacket(Registry.ANDROID_RESEARCH().getValue(buffer.readInt()), buffer.readNbt());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void play(Supplier<NetworkEvent.Context> context) {
|
||||||
|
context.get().setPacketHandled(true);
|
||||||
|
context.get().enqueueWork(() -> {
|
||||||
|
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::playClient);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void playClient() {
|
||||||
|
var ply = Minecraft.getInstance().player;
|
||||||
|
|
||||||
|
if (ply != null) {
|
||||||
|
ply.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
|
||||||
|
if (cap instanceof AndroidCapabilityPlayer pcap) {
|
||||||
|
pcap.getResearch(type).deserializeNBT(payload);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,52 +1,43 @@
|
|||||||
package ru.dbotthepony.mc.otm.network.android;
|
package ru.dbotthepony.mc.otm.network.android;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.fml.DistExecutor;
|
|
||||||
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearch;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearchType;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidFeature;
|
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidFeatureType;
|
|
||||||
import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public record AndroidResearchRequestPacket(AndroidFeatureType<?> feature) {
|
public record AndroidResearchRequestPacket(AndroidResearchType<?> research) {
|
||||||
public AndroidResearchRequestPacket(AndroidFeatureType<?> feature) {
|
public AndroidResearchRequestPacket(AndroidResearchType<?> research) {
|
||||||
this.feature = feature;
|
this.research = research;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AndroidResearchRequestPacket(AndroidFeature feature) {
|
public AndroidResearchRequestPacket(AndroidResearch feature) {
|
||||||
this(feature.type);
|
this(feature.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(FriendlyByteBuf buffer) {
|
public void write(FriendlyByteBuf buffer) {
|
||||||
buffer.writeInt(Registry.ANDROID_FEATURES().getID(feature));
|
buffer.writeInt(Registry.ANDROID_RESEARCH().getID(research));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void play(Supplier<NetworkEvent.Context> context) {
|
public void play(Supplier<NetworkEvent.Context> context) {
|
||||||
context.get().setPacketHandled(true);
|
context.get().setPacketHandled(true);
|
||||||
context.get().enqueueWork(() -> context.get().getSender().getCapability(MatteryCapability.ANDROID).ifPresent(cap -> this.playServer((AndroidCapabilityPlayer) cap, (ServerPlayer) context.get().getSender())));
|
context.get().enqueueWork(() -> context.get().getSender().getCapability(MatteryCapability.ANDROID).ifPresent(cap -> this.playServer((AndroidCapabilityPlayer) cap, context.get().getSender())));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playServer(AndroidCapabilityPlayer cap, ServerPlayer ply) {
|
public void playServer(AndroidCapabilityPlayer cap, ServerPlayer ply) {
|
||||||
if (cap.hasFeature(feature))
|
if (!cap.isAndroid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var node = feature.getResearchNode();
|
cap.getResearch(research).research();
|
||||||
|
|
||||||
if (node == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
node.research(ply, cap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AndroidResearchRequestPacket read(FriendlyByteBuf buffer) {
|
public static AndroidResearchRequestPacket read(FriendlyByteBuf buffer) {
|
||||||
return new AndroidResearchRequestPacket(Objects.requireNonNull(Registry.ANDROID_FEATURES().getValue(buffer.readInt())));
|
return new AndroidResearchRequestPacket(Objects.requireNonNull(Registry.ANDROID_RESEARCH().getValue(buffer.readInt())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,11 @@ package ru.dbotthepony.mc.otm.network.android;
|
|||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.fml.DistExecutor;
|
import net.minecraftforge.fml.DistExecutor;
|
||||||
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
import net.minecraftforge.fmllegacy.network.NetworkEvent;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
@ -1,39 +1,31 @@
|
|||||||
package ru.dbotthepony.mc.otm.screen;
|
package ru.dbotthepony.mc.otm.screen;
|
||||||
|
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.GameRenderer;
|
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.network.chat.TextComponent;
|
|
||||||
import net.minecraft.network.chat.TranslatableComponent;
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
|
||||||
import ru.dbotthepony.mc.otm.Registry;
|
import ru.dbotthepony.mc.otm.Registry;
|
||||||
|
import ru.dbotthepony.mc.otm.android.AndroidResearch;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer;
|
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
|
||||||
import ru.dbotthepony.mc.otm.capability.android.AndroidFeatureResearchNode;
|
|
||||||
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
|
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
|
||||||
import ru.dbotthepony.mc.otm.screen.panels.*;
|
import ru.dbotthepony.mc.otm.screen.panels.*;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
|
public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
|
||||||
class AndroidFeatureButton extends EditablePanel {
|
class AndroidResearchButton extends EditablePanel {
|
||||||
public static final int BUTTON_SIZE = 16;
|
public static final int BUTTON_SIZE = 16;
|
||||||
private final AndroidFeatureResearchNode node;
|
private final AndroidResearch node;
|
||||||
|
|
||||||
public static final RGBAColor RESEARCHED = new RGBAColor(150, 150, 200);
|
public static final RGBAColor RESEARCHED = new RGBAColor(150, 150, 200);
|
||||||
public static final RGBAColor CAN_BE_RESEARCHED = new RGBAColor(150, 200, 150);
|
public static final RGBAColor CAN_BE_RESEARCHED = new RGBAColor(150, 200, 150);
|
||||||
public static final RGBAColor CAN_NOT_BE_RESEARCHED = new RGBAColor(200, 150, 150);
|
public static final RGBAColor CAN_NOT_BE_RESEARCHED = new RGBAColor(200, 150, 150);
|
||||||
|
|
||||||
public AndroidFeatureButton(@Nullable EditablePanel parent, AndroidFeatureResearchNode node) {
|
public AndroidResearchButton(@Nullable EditablePanel parent, AndroidResearch node) {
|
||||||
super(AndroidStationScreen.this, parent, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
|
super(AndroidStationScreen.this, parent, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
|
||||||
this.node = node;
|
this.node = node;
|
||||||
setDockMargin(2, 2, 0, 0);
|
setDockMargin(2, 2, 0, 0);
|
||||||
@ -43,9 +35,9 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
|
|||||||
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) {
|
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) {
|
||||||
Minecraft.getInstance().player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> {
|
Minecraft.getInstance().player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> {
|
||||||
if (_cap instanceof AndroidCapabilityPlayer cap) {
|
if (_cap instanceof AndroidCapabilityPlayer cap) {
|
||||||
if (cap.hasFeature(node.type)) {
|
if (node.isResearched()) {
|
||||||
RenderHelper.setDrawColor(RESEARCHED);
|
RenderHelper.setDrawColor(RESEARCHED);
|
||||||
} else if (node.canResearch(Minecraft.getInstance().player, cap)) {
|
} else if (node.canAfford()) {
|
||||||
RenderHelper.setDrawColor(CAN_BE_RESEARCHED);
|
RenderHelper.setDrawColor(CAN_BE_RESEARCHED);
|
||||||
} else {
|
} else {
|
||||||
RenderHelper.setDrawColor(CAN_NOT_BE_RESEARCHED);
|
RenderHelper.setDrawColor(CAN_NOT_BE_RESEARCHED);
|
||||||
@ -65,19 +57,15 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
|
|||||||
@Override
|
@Override
|
||||||
protected boolean innerRenderTooltips(PoseStack stack, float mouse_x, float mouse_y, float flag) {
|
protected boolean innerRenderTooltips(PoseStack stack, float mouse_x, float mouse_y, float flag) {
|
||||||
if (is_hovered) {
|
if (is_hovered) {
|
||||||
var list = new ArrayList<>(node.getTooltip(Minecraft.getInstance().player));
|
var list = new ArrayList<>(node.getTooltip());
|
||||||
|
|
||||||
Minecraft.getInstance().player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> {
|
if (node.isResearched()) {
|
||||||
if (_cap instanceof AndroidCapabilityPlayer cap) {
|
|
||||||
if (cap.hasFeature(node.type)) {
|
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.researched").withStyle(ChatFormatting.DARK_AQUA));
|
list.add(new TranslatableComponent("otm.android_station.research.researched").withStyle(ChatFormatting.DARK_AQUA));
|
||||||
} else if (node.canResearch(Minecraft.getInstance().player, cap)) {
|
} else if (node.canAfford()) {
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.can_be_researched").withStyle(ChatFormatting.DARK_GREEN));
|
list.add(new TranslatableComponent("otm.android_station.research.can_be_researched").withStyle(ChatFormatting.DARK_GREEN));
|
||||||
} else {
|
} else {
|
||||||
list.add(new TranslatableComponent("otm.android_station.research.can_not_be_researched").withStyle(ChatFormatting.DARK_RED));
|
list.add(new TranslatableComponent("otm.android_station.research.can_not_be_researched").withStyle(ChatFormatting.DARK_RED));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
renderComponentTooltip(stack, list, (int) mouse_x, (int) mouse_y);
|
renderComponentTooltip(stack, list, (int) mouse_x, (int) mouse_y);
|
||||||
}
|
}
|
||||||
@ -99,16 +87,19 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
|
|||||||
@Override
|
@Override
|
||||||
protected FramePanel makeMainFrame() {
|
protected FramePanel makeMainFrame() {
|
||||||
var frame = new FramePanel(this, null, 0, 0, FRAME_WIDTH, FRAME_HEIGHT, getTitle());
|
var frame = new FramePanel(this, null, 0, 0, FRAME_WIDTH, FRAME_HEIGHT, getTitle());
|
||||||
|
|
||||||
var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * 18, 0, GRID_WIDTH, GRID_HEIGHT);
|
var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * 18, 0, GRID_WIDTH, GRID_HEIGHT);
|
||||||
|
|
||||||
for (var feature : Registry.ANDROID_FEATURES().getValues()) {
|
minecraft.player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> {
|
||||||
var node = feature.getResearchNode();
|
if (_cap instanceof AndroidCapabilityPlayer cap) {
|
||||||
|
for (var feature : Registry.ANDROID_RESEARCH().getValues()) {
|
||||||
|
var node = cap.getResearch(feature);
|
||||||
|
|
||||||
if (node != null) {
|
if (node != null) {
|
||||||
new AndroidFeatureButton(grid, node);
|
new AndroidResearchButton(grid, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
grid.setDocking(Dock.RIGHT);
|
grid.setDocking(Dock.RIGHT);
|
||||||
|
|
||||||
|
@ -44,7 +44,8 @@
|
|||||||
"otm.android_station.research.missing_predecessors": "%s needs to be researched first",
|
"otm.android_station.research.missing_predecessors": "%s needs to be researched first",
|
||||||
|
|
||||||
"android_feature.overdrive_that_matters.air_bags": "Air bags",
|
"android_feature.overdrive_that_matters.air_bags": "Air bags",
|
||||||
"android_feature.overdrive_that_matters.air_bags.description": "Allows to swim in water",
|
"android_research.overdrive_that_matters.air_bags": "Air bags",
|
||||||
|
"android_research.overdrive_that_matters.air_bags.description": "Allows unit to swim in water",
|
||||||
|
|
||||||
"otm.suffix.merge": "%s %s",
|
"otm.suffix.merge": "%s %s",
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user