Rewrote the apple type mapping

This commit is contained in:
Sollace 2019-02-07 11:46:59 +02:00
parent 156e6e420c
commit daa96b1246
13 changed files with 277 additions and 130 deletions

View file

@ -57,7 +57,7 @@ public class UBlocks {
public static final Block apple_leaves = new BlockFruitLeaves(Unicopia.MODID, "apple_leaves", apple_tree) public static final Block apple_leaves = new BlockFruitLeaves(Unicopia.MODID, "apple_leaves", apple_tree)
.setBaseGrowthChance(1200) .setBaseGrowthChance(1200)
.setTint(0xFFEE81) .setTint(0xFFEE81)
.setHarvestFruit(w -> UItems.apple.getRandomApple(w.rand, null)) .setHarvestFruit(w -> UItems.apple.getRandomApple())
.setUnharvestFruit(w -> new ItemStack(UItems.rotten_apple)); .setUnharvestFruit(w -> new ItemStack(UItems.rotten_apple));
static void init(IForgeRegistry<Block> registry) { static void init(IForgeRegistry<Block> registry) {

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import com.minelittlepony.unicopia.item.ItemApple; import com.minelittlepony.unicopia.item.ItemApple;
import com.minelittlepony.unicopia.item.ItemAppleMultiType;
import com.minelittlepony.unicopia.item.ItemCereal; import com.minelittlepony.unicopia.item.ItemCereal;
import com.minelittlepony.unicopia.item.ItemCloud; import com.minelittlepony.unicopia.item.ItemCloud;
import com.minelittlepony.unicopia.item.ItemCurse; import com.minelittlepony.unicopia.item.ItemCurse;
@ -52,11 +53,11 @@ import com.minelittlepony.unicopia.forgebullshit.OreReplacer;
import com.minelittlepony.unicopia.forgebullshit.RegistryLockSpinner; import com.minelittlepony.unicopia.forgebullshit.RegistryLockSpinner;
public class UItems { public class UItems {
public static final ItemApple apple = new ItemApple("minecraft", "apple") public static final ItemAppleMultiType apple = new ItemAppleMultiType("minecraft", "apple")
.setSubTypes("apple", "green", "sweet", "sour") .setSubTypes("apple", "green", "sweet", "sour")
.setTypeRarities(10, 20, 10, 30); .setTypeRarities(10, 20, 10, 30);
public static final ItemApple zap_apple = new ItemZapApple(Unicopia.MODID, "zap_apple") public static final ItemAppleMultiType zap_apple = new ItemZapApple(Unicopia.MODID, "zap_apple")
.setSubTypes("zap_apple", "red", "green", "sweet", "sour", "zap"); .setSubTypes("zap_apple", "red", "green", "sweet", "sour", "zap");
public static final ItemApple rotten_apple = new ItemRottenApple(Unicopia.MODID, "rotten_apple"); public static final ItemApple rotten_apple = new ItemRottenApple(Unicopia.MODID, "rotten_apple");

View file

@ -1,84 +1,71 @@
package com.minelittlepony.unicopia.item; package com.minelittlepony.unicopia.item;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.function.Supplier;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.UItems; import com.minelittlepony.unicopia.UItems;
import com.minelittlepony.unicopia.edibles.IEdible; import com.minelittlepony.unicopia.edibles.IEdible;
import com.minelittlepony.unicopia.edibles.Toxicity; import com.minelittlepony.unicopia.edibles.Toxicity;
import com.minelittlepony.unicopia.forgebullshit.IMultiItem; import com.minelittlepony.util.collection.Pool;
import com.minelittlepony.util.collection.Weighted;
import net.minecraft.block.BlockPlanks; import net.minecraft.block.BlockPlanks;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemFood; import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ItemApple extends ItemFood implements IMultiItem, IEdible { public class ItemApple extends ItemFood implements IEdible {
private int[] typeRarities = new int[0]; public static final Pool<Object, Weighted<Supplier<ItemStack>>> typeVariantMap = Pool.of(BlockPlanks.EnumType.OAK,
BlockPlanks.EnumType.OAK, new Weighted<Supplier<ItemStack>>()
.put(1, () -> new ItemStack(UItems.rotten_apple))
.put(2, () -> new ItemStack(UItems.apple, 1, 1))
.put(3, () -> new ItemStack(UItems.apple, 1, 0)),
BlockPlanks.EnumType.SPRUCE, new Weighted<Supplier<ItemStack>>()
.put(1, () -> new ItemStack(UItems.apple, 1, 3))
.put(2, () -> new ItemStack(UItems.apple, 1, 1))
.put(3, () -> new ItemStack(UItems.apple, 1, 2))
.put(4, () -> new ItemStack(UItems.rotten_apple)),
BlockPlanks.EnumType.BIRCH, new Weighted<Supplier<ItemStack>>()
.put(1, () -> new ItemStack(UItems.rotten_apple))
.put(2, () -> new ItemStack(UItems.apple, 1, 2))
.put(5, () -> new ItemStack(UItems.apple, 1, 1)),
BlockPlanks.EnumType.JUNGLE, new Weighted<Supplier<ItemStack>>()
.put(5, () -> new ItemStack(UItems.apple, 1, 1))
.put(2, () -> new ItemStack(UItems.apple, 1, 2))
.put(1, () -> new ItemStack(UItems.apple, 1, 3)),
BlockPlanks.EnumType.ACACIA, new Weighted<Supplier<ItemStack>>()
.put(1, () -> new ItemStack(UItems.rotten_apple))
.put(2, () -> new ItemStack(UItems.apple, 1, 2))
.put(5, () -> new ItemStack(UItems.apple, 1, 1)),
BlockPlanks.EnumType.DARK_OAK, new Weighted<Supplier<ItemStack>>()
.put(1, () -> new ItemStack(UItems.rotten_apple))
.put(2, () -> new ItemStack(UItems.apple, 1, 2))
.put(5, () -> new ItemStack(UItems.zap_apple)
)
);
private String[] subTypes = new String[0]; public static ItemStack getRandomItemStack(Object variant) {
return typeVariantMap.getOptional(variant)
private String[] variants = subTypes; .flatMap(Weighted::get)
.map(Supplier::get)
public ItemStack getRandomApple(Random rand, Object variant) { .orElse(ItemStack.EMPTY);
int[] rarity = typeRarities;
int result = 0;
for (int i = 0; i < rarity.length && i < subTypes.length; i++) {
if (rand.nextInt(rarity[i]) == 0) {
result++;
}
}
if (variant == BlockPlanks.EnumType.JUNGLE) {
result = oneOr(result, 0, 1);
}
if (variant == BlockPlanks.EnumType.BIRCH) {
result = oneOr(result, 0, 2);
}
if (variant == BlockPlanks.EnumType.SPRUCE) {
if (result == 0) {
return new ItemStack(UItems.rotten_apple, 1);
}
}
if (variant == BlockPlanks.EnumType.DARK_OAK) {
if (result == 1) {
return new ItemStack(UItems.zap_apple, 1);
}
}
if (variant == BlockPlanks.EnumType.ACACIA) {
result = oneOr(result, 0, 4);
}
return new ItemStack(this, 1, result);
} }
int oneOr(int initial, int a, int b) { public ItemStack getRandomApple() {
if (initial == a) { return getRandomApple(null);
return b; }
}
if (initial == b) { public ItemStack getRandomApple(Object variant) {
return a; return getRandomItemStack(variant);
}
return initial;
} }
public ItemApple(String domain, String name) { public ItemApple(String domain, String name) {
super(4, 3, false); super(4, 3, false);
setTranslationKey(name); setTranslationKey(name);
if (!"minecraft".contentEquals(domain)) { if (!"minecraft".contentEquals(domain)) {
@ -86,69 +73,11 @@ public class ItemApple extends ItemFood implements IMultiItem, IEdible {
} }
} }
public ItemApple setSubTypes(String... types) {
setHasSubtypes(types.length > 0);
setMaxDamage(0);
subTypes = types;
variants = new String[subTypes.length];
setTranslationKey(variants[0] = types[0]);
for (int i = 1; i < variants.length; i++) {
variants[i] = variants[0] + "_" + subTypes[i % subTypes.length];
}
return this;
}
public ItemApple setTypeRarities(int ... rarity) {
typeRarities = rarity;
return this;
}
@Override
public String[] getVariants() {
return variants;
}
@Override
public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
if (isInCreativeTab(tab)) {
items.add(new ItemStack(this, 1, 0));
for (int i = 1; i < subTypes.length; i++) {
items.add(new ItemStack(this, 1, i));
}
}
}
@Override @Override
public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) { public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
tooltip.add(getToxicityLevel(stack).getTooltip()); tooltip.add(getToxicityLevel(stack).getTooltip());
} }
@Override
public int getMetadata(ItemStack stack) {
if (getHasSubtypes()) {
return super.getMetadata(stack) % subTypes.length;
}
return super.getMetadata(stack);
}
@Override
public String getTranslationKey(ItemStack stack) {
if (getHasSubtypes()) {
int meta = Math.max(0, stack.getMetadata() % subTypes.length);
if (meta > 0) {
return super.getTranslationKey(stack) + "." + subTypes[meta];
}
}
return super.getTranslationKey(stack);
}
@Override @Override
public Toxicity getToxicityLevel(ItemStack stack) { public Toxicity getToxicityLevel(ItemStack stack) {
return Toxicity.SAFE; return Toxicity.SAFE;

View file

@ -0,0 +1,86 @@
package com.minelittlepony.unicopia.item;
import com.minelittlepony.unicopia.forgebullshit.IMultiItem;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
public class ItemAppleMultiType extends ItemApple implements IMultiItem {
private int[] typeRarities = new int[0];
private String[] subTypes = new String[0];
private String[] variants = subTypes;
public ItemAppleMultiType(String domain, String name) {
super(domain, name);
}
public ItemAppleMultiType setSubTypes(String... types) {
setHasSubtypes(types.length > 0);
setMaxDamage(0);
subTypes = types;
variants = new String[types.length];
setTranslationKey(variants[0] = types[0]);
for (int i = 1; i < variants.length; i++) {
variants[i] = variants[0] + "_" + types[i % types.length];
}
return this;
}
@Override
public String[] getVariants() {
return variants;
}
protected int[] getTypeRarities() {
return typeRarities;
}
protected String[] getSubTypes() {
return subTypes;
}
public ItemAppleMultiType setTypeRarities(int ... rarity) {
typeRarities = rarity;
return this;
}
@Override
public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
if (isInCreativeTab(tab)) {
items.add(new ItemStack(this, 1, 0));
for (int i = 1; i < getSubTypes().length; i++) {
items.add(new ItemStack(this, 1, i));
}
}
}
@Override
public int getMetadata(ItemStack stack) {
if (getHasSubtypes()) {
return super.getMetadata(stack) % getSubTypes().length;
}
return super.getMetadata(stack);
}
@Override
public String getTranslationKey(ItemStack stack) {
if (getHasSubtypes()) {
int meta = Math.max(0, stack.getMetadata() % getSubTypes().length);
if (meta > 0) {
return super.getTranslationKey(stack) + "." + getSubTypes()[meta];
}
}
return super.getTranslationKey(stack);
}
}

View file

@ -21,7 +21,7 @@ import net.minecraft.util.NonNullList;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ItemZapApple extends ItemApple { public class ItemZapApple extends ItemAppleMultiType {
public ItemZapApple(String domain, String name) { public ItemZapApple(String domain, String name) {
super(domain, name); super(domain, name);

View file

@ -62,12 +62,12 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
@Override @Override
public int getWarmupTime(IPlayer player) { public int getWarmupTime(IPlayer player) {
return 0; return 3;
} }
@Override @Override
public int getCooldownTime(IPlayer player) { public int getCooldownTime(IPlayer player) {
return 500; return 50;
} }
@Override @Override
@ -77,7 +77,8 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
@Override @Override
public PowerStomp.Data tryActivate(IPlayer player) { public PowerStomp.Data tryActivate(IPlayer player) {
RayTraceResult mop = VecHelper.getObjectMouseOver(player.getOwner(), 2, 1); RayTraceResult mop = VecHelper.getObjectMouseOver(player.getOwner(), 6, 1);
if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) {
BlockPos pos = mop.getBlockPos(); BlockPos pos = mop.getBlockPos();
IBlockState state = player.getWorld().getBlockState(pos); IBlockState state = player.getWorld().getBlockState(pos);
@ -332,7 +333,7 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
} }
private ItemStack getApple(World w, IBlockState log) { private ItemStack getApple(World w, IBlockState log) {
return UItems.apple.getRandomApple(w.rand, getVariant(log)); return UItems.apple.getRandomApple(getVariant(log));
} }
private int measureTree(World w, IBlockState log, BlockPos pos) { private int measureTree(World w, IBlockState log, BlockPos pos) {

View file

@ -6,8 +6,8 @@ import com.minelittlepony.unicopia.Predicates;
import com.minelittlepony.unicopia.entity.IMagicals; import com.minelittlepony.unicopia.entity.IMagicals;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
import com.minelittlepony.util.PosHelper; import com.minelittlepony.util.PosHelper;
import com.minelittlepony.util.blockstate.IStateMapping; import com.minelittlepony.util.collection.IStateMapping;
import com.minelittlepony.util.blockstate.StateMapList; import com.minelittlepony.util.collection.StateMapList;
import com.minelittlepony.util.shape.IShape; import com.minelittlepony.util.shape.IShape;
import com.minelittlepony.util.shape.Sphere; import com.minelittlepony.util.shape.Sphere;
import com.minelittlepony.util.vector.VecHelper; import com.minelittlepony.util.vector.VecHelper;

View file

@ -3,8 +3,8 @@ package com.minelittlepony.unicopia.spell;
import com.minelittlepony.unicopia.UMaterials; import com.minelittlepony.unicopia.UMaterials;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
import com.minelittlepony.util.PosHelper; import com.minelittlepony.util.PosHelper;
import com.minelittlepony.util.blockstate.IStateMapping; import com.minelittlepony.util.collection.IStateMapping;
import com.minelittlepony.util.blockstate.StateMapList; import com.minelittlepony.util.collection.StateMapList;
import com.minelittlepony.util.shape.IShape; import com.minelittlepony.util.shape.IShape;
import com.minelittlepony.util.shape.Sphere; import com.minelittlepony.util.shape.Sphere;
import com.minelittlepony.util.vector.VecHelper; import com.minelittlepony.util.vector.VecHelper;

View file

@ -1,8 +1,8 @@
package com.minelittlepony.unicopia.spell; package com.minelittlepony.unicopia.spell;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
import com.minelittlepony.util.blockstate.IStateMapping; import com.minelittlepony.util.collection.IStateMapping;
import com.minelittlepony.util.blockstate.StateMapList; import com.minelittlepony.util.collection.StateMapList;
import com.minelittlepony.util.shape.IShape; import com.minelittlepony.util.shape.IShape;
import com.minelittlepony.util.shape.Sphere; import com.minelittlepony.util.shape.Sphere;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.util.blockstate; package com.minelittlepony.util.collection;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;

View file

@ -0,0 +1,48 @@
package com.minelittlepony.util.collection;
import java.util.HashMap;
import java.util.Optional;
public class Pool<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = -4794854344664655790L;
private final K defaultKey;
@SuppressWarnings("unchecked")
public static <K, V> Pool<K, V> of(K def, Object...entries) {
Pool<K, V> result = new Pool<>(def);
for (int i = 0; i < entries.length - 1; i += 2) {
result.put((K)entries[i], (V)entries[i + 1]);
}
return result;
}
public Pool(K defKey) {
defaultKey = defKey;
}
public Pool<K, V> add(K key, V value) {
put(key, value);
return this;
}
@Override
public V get(Object key) {
if (!containsKey(key)) {
key = defaultKey;
}
return super.get(key);
}
public Optional<V> getOptional(K key) {
if (!containsKey(key)) {
return Optional.empty();
}
return Optional.ofNullable(get(key));
}
}

View file

@ -1,4 +1,4 @@
package com.minelittlepony.util.blockstate; package com.minelittlepony.util.collection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;

View file

@ -0,0 +1,82 @@
package com.minelittlepony.util.collection;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.function.Consumer;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;
import com.google.common.collect.Lists;
public class Weighted<T> {
private static final Random rand = new Random();
private float totalWeight = 0;
private final List<Entry> entries = Lists.newArrayList();
public static <T> Weighted<T> of(Consumer<Weighted<T>> constructor) {
Weighted<T> result = new Weighted<>();
constructor.accept(result);
return result;
}
public Weighted<T> put(int weight, @Nonnull T value) {
entries.add(new Entry(weight, value));
totalWeight += weight;
recalculate();
return this;
}
private void recalculate() {
float rangeStart = 0;
for (Entry i : entries) {
i.min = rangeStart;
i.max = rangeStart + (i.weight/totalWeight);
rangeStart = i.max;
}
}
public Optional<T> get() {
if (entries.isEmpty()) {
return Optional.empty();
}
float random = rand.nextFloat();
return entries.stream()
.filter(i -> random >= i.min && random <= i.max)
.map(Entry::getResult)
.findFirst();
}
@Immutable
class Entry {
final float weight;
final T result;
float min;
float max;
Entry(int weight, T result) {
this.weight = weight;
this.result = result;
}
T getResult() {
return result;
}
}
}