Rewrite toxins and get rid of a lot of item replacements and other fixes

This commit is contained in:
Sollace 2020-04-25 22:03:36 +02:00
parent 55a559321a
commit d95086c807
16 changed files with 217 additions and 175 deletions

View file

@ -1,5 +1,8 @@
package com.minelittlepony.unicopia.ability; package com.minelittlepony.unicopia.ability;
import java.util.HashMap;
import java.util.Map;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@ -7,7 +10,7 @@ import net.minecraft.util.registry.MutableRegistry;
import net.minecraft.util.registry.SimpleRegistry; import net.minecraft.util.registry.SimpleRegistry;
public interface Abilities { public interface Abilities {
MutableRegistry<Integer> KEYS_CODES = new SimpleRegistry<>(); Map<Identifier, Integer> KEYS_CODES = new HashMap<>();
MutableRegistry<Ability<?>> REGISTRY = new SimpleRegistry<>(); MutableRegistry<Ability<?>> REGISTRY = new SimpleRegistry<>();
// unicorn / alicorn // unicorn / alicorn
@ -32,7 +35,7 @@ public interface Abilities {
static <T extends Ability<?>> T register(T power, String name, int keyCode) { static <T extends Ability<?>> T register(T power, String name, int keyCode) {
Identifier id = new Identifier("unicopia", name); Identifier id = new Identifier("unicopia", name);
KEYS_CODES.add(id, keyCode); KEYS_CODES.put(id, keyCode);
return REGISTRY.add(id, power); return REGISTRY.add(id, power);
} }
} }

View file

@ -14,13 +14,12 @@ import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPointer;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Position; import net.minecraft.util.math.Position;
import net.minecraft.world.RayTraceContext; import net.minecraft.world.RayTraceContext;
import net.minecraft.world.World; import net.minecraft.world.World;
public class CloudPlacerItem extends Item implements Dispensable { public class CloudPlacerItem extends Item {
private final EntityType<? extends CloudEntity> cloudSupplier; private final EntityType<? extends CloudEntity> cloudSupplier;
@ -31,7 +30,15 @@ public class CloudPlacerItem extends Item implements Dispensable {
); );
this.cloudSupplier = spawner; this.cloudSupplier = spawner;
setDispenseable(); Dispensable.setDispenseable(this, (source, stack) -> {
Position pos = DispenserBlock.getOutputLocation(source);
placeCloud(source.getWorld(), new BlockPos(pos.getX(), pos.getY(), pos.getZ()));
stack.decrement(1);
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
});
} }
public void placeCloud(World world, BlockPos pos) { public void placeCloud(World world, BlockPos pos) {
@ -66,15 +73,4 @@ public class CloudPlacerItem extends Item implements Dispensable {
return new TypedActionResult<>(ActionResult.SUCCESS, stack); return new TypedActionResult<>(ActionResult.SUCCESS, stack);
} }
@Override
public TypedActionResult<ItemStack> dispenseStack(BlockPointer source, ItemStack stack) {
Position pos = DispenserBlock.getOutputLocation(source);
placeCloud(source.getWorld(), new BlockPos(pos.getX(), pos.getY(), pos.getZ()));
stack.decrement(1);
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
}
} }

View file

@ -16,36 +16,31 @@ import net.minecraft.item.Items;
import net.minecraft.item.ShearsItem; import net.minecraft.item.ShearsItem;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPointer;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ExtendedShearsItem extends ShearsItem implements Dispensable { public class ExtendedShearsItem extends ShearsItem {
private final Optional<DispenserBehavior> vanillaDispenserBehaviour = getBehavior(new ItemStack(Items.SHEARS));
public ExtendedShearsItem() { public ExtendedShearsItem() {
super(new Item.Settings().maxDamage(238).group(ItemGroup.TOOLS)); super(new Item.Settings().maxDamage(238).group(ItemGroup.TOOLS));
setDispenseable(); final Optional<DispenserBehavior> vanillaDispenserBehaviour = Dispensable.getBehavior(new ItemStack(Items.SHEARS));
DispenserBlock.registerBehavior(Items.SHEARS, getBehavior(new ItemStack(this)).get()); DispenserBlock.registerBehavior(Items.SHEARS, Dispensable.setDispenseable(this, (source, stack) -> {
}
@Override BlockPos pos = source.getBlockPos().offset(source.getBlockState().get(DispenserBlock.FACING));
public TypedActionResult<ItemStack> dispenseStack(BlockPointer source, ItemStack stack) { World w = source.getWorld();
Direction facing = source.getBlockState().get(DispenserBlock.FACING);
BlockPos pos = source.getBlockPos().offset(facing);
World w = source.getWorld();
if (UItems.MOSS.tryConvert(w, w.getBlockState(pos), pos, null)) { if (UItems.MOSS.tryConvert(w, w.getBlockState(pos), pos, null)) {
stack.damage(1, w.random, null); stack.damage(1, w.random, null);
return TypedActionResult.success(stack); return TypedActionResult.success(stack);
} }
return vanillaDispenserBehaviour return vanillaDispenserBehaviour
.map(action -> TypedActionResult.success(action.dispense(source, stack))) .map(action -> {
.orElseGet(() -> TypedActionResult.fail(stack)); return TypedActionResult.pass(action.dispense(source, stack));
})
.orElseGet(() -> TypedActionResult.fail(stack));
}));
} }
@Override @Override

View file

@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.magic.Affinity;
import com.minelittlepony.unicopia.magic.CastResult; import com.minelittlepony.unicopia.magic.CastResult;
import com.minelittlepony.unicopia.magic.Castable; import com.minelittlepony.unicopia.magic.Castable;
import com.minelittlepony.unicopia.magic.DispenceableMagicEffect; import com.minelittlepony.unicopia.magic.DispenceableMagicEffect;
import com.minelittlepony.unicopia.magic.Dispensable;
import com.minelittlepony.unicopia.magic.MagicEffect; import com.minelittlepony.unicopia.magic.MagicEffect;
import com.minelittlepony.unicopia.magic.Useable; import com.minelittlepony.unicopia.magic.Useable;
import com.minelittlepony.unicopia.magic.spell.SpellRegistry; import com.minelittlepony.unicopia.magic.spell.SpellRegistry;
@ -40,8 +41,7 @@ public class MagicGemItem extends Item implements Castable {
super(new Settings() super(new Settings()
.maxCount(16) .maxCount(16)
.group(ItemGroup.BREWING)); .group(ItemGroup.BREWING));
Dispensable.setDispenseable(this, this::dispenseStack);
setDispenseable();
} }
@Override @Override

View file

@ -30,14 +30,9 @@ public class MossItem extends ToxicItem {
if (!state.equals(converted)) { if (!state.equals(converted)) {
world.setBlockState(pos, converted, 3); world.setBlockState(pos, converted, 3);
world.playSound(null, pos, SoundEvents.ENTITY_SHEEP_SHEAR, SoundCategory.PLAYERS, 1, 1); world.playSound(null, pos, SoundEvents.ENTITY_SHEEP_SHEAR, SoundCategory.PLAYERS, 1, 1);
int amount = 1; int amount = player != null && Pony.of(player).getSpecies().canUseEarth() ? world.random.nextInt(4) : 1;
if (player != null && Pony.of(player).getSpecies().canUseEarth()) {
amount = world.random.nextInt(4);
}
Block.dropStack(world, pos, new ItemStack(this, amount)); Block.dropStack(world, pos, new ItemStack(this, amount));

View file

@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.item;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.magic.Caster; import com.minelittlepony.unicopia.magic.Caster;
import com.minelittlepony.unicopia.magic.Dispensable;
import com.minelittlepony.unicopia.util.projectile.TossableItem; import com.minelittlepony.unicopia.util.projectile.TossableItem;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -21,7 +22,7 @@ public class RottenTomatoItem extends TomatoItem implements TossableItem {
public RottenTomatoItem(Settings settings) { public RottenTomatoItem(Settings settings) {
super(settings); super(settings);
setDispenseable(); Dispensable.setDispenseable(this, this::dispenseStack);
} }
@Override @Override

View file

@ -12,23 +12,29 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BookItem; import net.minecraft.item.BookItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext; import net.minecraft.item.ItemUsageContext;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPointer;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
public class SpellbookItem extends BookItem implements Dispensable { public class SpellbookItem extends BookItem {
public SpellbookItem() { public SpellbookItem() {
super(new Item.Settings() super(new Item.Settings()
.maxCount(1) .maxCount(1)
.group(ItemGroup.BREWING)); .group(ItemGroup.BREWING));
Dispensable.setDispenseable(this, (source, stack) -> {
Direction facing = source.getBlockState().get(DispenserBlock.FACING);
BlockPos pos = source.getBlockPos().offset(facing);
setDispenseable(); int yaw = facing.getOpposite().getHorizontal() * 90;
placeBook(source.getWorld(), pos.getX(), pos.getY(), pos.getZ(), yaw);
stack.decrement(1);
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
});
} }
@Override @Override
@ -63,30 +69,6 @@ public class SpellbookItem extends BookItem implements Dispensable {
world.spawnEntity(book); world.spawnEntity(book);
} }
@Override
public TypedActionResult<ItemStack> dispenseStack(BlockPointer source, ItemStack stack) {
Direction facing = source.getBlockState().get(DispenserBlock.FACING);
BlockPos pos = source.getBlockPos().offset(facing);
//0deg == SOUTH
//90deg == WEST
//180deg == NORTH
//270deg == EAST
/*switch (facing) {
case NORTH: yaw -= 90; break;
case SOUTH: yaw += 90; break;
case EAST: yaw += 180; break;
default:
}*/
int yaw = facing.getOpposite().getHorizontal() * 90;
placeBook(source.getWorld(), pos.getX(), pos.getY(), pos.getZ(), yaw);
stack.decrement(1);
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
}
} }

View file

@ -6,15 +6,14 @@ import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.entity.UEntities; import com.minelittlepony.unicopia.entity.UEntities;
import com.minelittlepony.unicopia.magic.spell.ScorchSpell; import com.minelittlepony.unicopia.magic.spell.ScorchSpell;
import com.minelittlepony.unicopia.toxin.ToxicBlockItem;
import com.minelittlepony.unicopia.toxin.ToxicItem; import com.minelittlepony.unicopia.toxin.ToxicItem;
import com.minelittlepony.unicopia.toxin.Toxicity; import com.minelittlepony.unicopia.toxin.Toxicity;
import com.minelittlepony.unicopia.toxin.Toxin; import com.minelittlepony.unicopia.toxin.Toxin;
import com.minelittlepony.unicopia.toxin.Toxics;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.Item.Settings; import net.minecraft.item.Item.Settings;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.block.Blocks;
import net.minecraft.item.AliasedBlockItem; import net.minecraft.item.AliasedBlockItem;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.FoodComponent; import net.minecraft.item.FoodComponent;
@ -182,6 +181,8 @@ public interface UItems {
// FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(zap_apple), new ItemStack(cooked_zap_apple), 0.1F); // FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(zap_apple), new ItemStack(cooked_zap_apple), 0.1F);
// FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(juice), new ItemStack(burned_juice), 0); // FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(juice), new ItemStack(burned_juice), 0);
// FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(cuccoon), new ItemStack(chitin_shell), 0.3F); // FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(cuccoon), new ItemStack(chitin_shell), 0.3F);
Toxics.bootstrap();
} }
interface VanillaOverrides { interface VanillaOverrides {
@ -190,63 +191,6 @@ public interface UItems {
AppleItem APPLE = register(new AppleItem(FoodComponents.APPLE), Items.APPLE); AppleItem APPLE = register(new AppleItem(FoodComponents.APPLE), Items.APPLE);
Item GRASS = register(new ToxicBlockItem(Blocks.GRASS, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD.and(Toxin.NAUSEA)), Items.GRASS);
Item FERN = register(new ToxicBlockItem(Blocks.FERN, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.STRENGTH)), Items.FERN);
Item DEAD_BUSH = register(new ToxicBlockItem(Blocks.DEAD_BUSH, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.NAUSEA)), Items.DEAD_BUSH);
Item DANDELION = register(new ToxicBlockItem(Blocks.DANDELION, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.DANDELION);
Item POPPY = register(new ToxicBlockItem(Blocks.POPPY, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD), Items.POPPY);
Item BLUE_ORCHID = register(new ToxicBlockItem(Blocks.BLUE_ORCHID, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.BLUE_ORCHID);
Item ALLIUM = register(new ToxicBlockItem(Blocks.ALLIUM, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.FAIR, Toxin.FOOD), Items.ALLIUM);
Item AZUER_BLUET = register(new ToxicBlockItem(Blocks.AZURE_BLUET, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD.and(Toxin.RADIOACTIVITY)), Items.AZURE_BLUET);
Item RED_TULIP = register(new ToxicBlockItem(Blocks.RED_TULIP, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.RED_TULIP);
Item ORANGE_TULIP = register(new ToxicBlockItem(Blocks.ORANGE_TULIP, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.ORANGE_TULIP);
Item WHITE_TULIP = register(new ToxicBlockItem(Blocks.WHITE_TULIP, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.FAIR, Toxin.FOOD), Items.WHITE_TULIP);
Item PINK_TULIP = register(new ToxicBlockItem(Blocks.PINK_TULIP, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.PINK_TULIP);
Item OXEYE_DAISY = register(new ToxicBlockItem(Blocks.OXEYE_DAISY, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.BLINDNESS)), Items.OXEYE_DAISY);
Item CORNFLOWER = register(new ToxicBlockItem(Blocks.CORNFLOWER, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.CORNFLOWER);
Item ROSE_BUSH = register(new ToxicBlockItem(Blocks.ROSE_BUSH, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD.and(Toxin.DAMAGE)), Items.ROSE_BUSH);
Item PEONY = register(new ToxicBlockItem(Blocks.PEONY, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.PEONY);
Item TALL_GRASS = register(new ToxicBlockItem(Blocks.TALL_GRASS, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SAFE, Toxin.FOOD), Items.TALL_GRASS);
Item LARGE_FERN = register(new ToxicBlockItem(Blocks.LARGE_FERN, new Settings()
.food(UFoodComponents.RANDOM_FOLIAGE)
.group(ItemGroup.DECORATIONS), UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.DAMAGE)), Items.LARGE_FERN);
static <T extends Item> T register(T newItem, Item oldItem) { static <T extends Item> T register(T newItem, Item oldItem) {
return Registry.ITEM.set(Registry.ITEM.getRawId(oldItem), Registry.ITEM.getId(oldItem), newItem); return Registry.ITEM.set(Registry.ITEM.getRawId(oldItem), Registry.ITEM.getId(oldItem), newItem);
} }

View file

@ -29,7 +29,7 @@ public enum Affinity {
} }
public Text getName() { public Text getName() {
Text text = new TranslatableText("affinity." + getTranslationKey() + ".name"); Text text = new TranslatableText("affinity." + getTranslationKey());
text.getStyle().setColor(getColourCode()); text.getStyle().setColor(getColourCode());
return text; return text;
} }

View file

@ -12,26 +12,43 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPointer; import net.minecraft.util.math.BlockPointer;
import net.minecraft.util.math.Direction;
public interface Dispensable { public interface Dispensable {
/** /**
* Enables dispensing behaviours for this item. * Enables dispensing behaviours for this item.
*/ */
default Item setDispenseable() { static DispenserBehavior setDispenseable(Item item, Dispensable action) {
DispenserBlock.registerBehavior((Item)this, new ItemDispenserBehavior() { ItemDispenserBehavior behaviour = new ItemDispenserBehavior() {
private ActionResult result;
@Override @Override
protected ItemStack dispenseSilently(BlockPointer source, ItemStack stack) { protected ItemStack dispenseSilently(BlockPointer source, ItemStack stack) {
TypedActionResult<ItemStack> result = dispenseStack(source, stack); TypedActionResult<ItemStack> result = action.dispenseStack(source, stack);
this.result = result.getResult();
if (result.getResult() != ActionResult.SUCCESS) { if (this.result != ActionResult.SUCCESS) {
return super.dispenseSilently(source, stack); return super.dispenseSilently(source, stack);
} }
return result.getValue(); return result.getValue();
} }
});
return (Item)this; @Override
protected void playSound(BlockPointer pointer) {
if (result != ActionResult.PASS) {
super.playSound(pointer);
}
}
@Override
protected void spawnParticles(BlockPointer pointer, Direction side) {
if (result != ActionResult.PASS) {
super.spawnParticles(pointer, side);
}
}
};
DispenserBlock.registerBehavior(item, behaviour);
return behaviour;
} }
/** /**
@ -39,7 +56,7 @@ public interface Dispensable {
*/ */
TypedActionResult<ItemStack> dispenseStack(BlockPointer source, ItemStack stack); TypedActionResult<ItemStack> dispenseStack(BlockPointer source, ItemStack stack);
default Optional<DispenserBehavior> getBehavior(ItemStack stack) { static Optional<DispenserBehavior> getBehavior(ItemStack stack) {
return Optional.ofNullable(DispenserAccess.INSTANCE.getBehaviorForItem(stack)); return Optional.ofNullable(DispenserAccess.INSTANCE.getBehaviorForItem(stack));
} }
} }

View file

@ -0,0 +1,69 @@
package com.minelittlepony.unicopia.mixin;
import java.util.List;
import javax.annotation.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.minelittlepony.unicopia.toxin.Toxic;
import com.minelittlepony.unicopia.toxin.ToxicHolder;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.UseAction;
import net.minecraft.world.World;
@Mixin(BlockItem.class)
abstract class MixinBlockItem extends Item implements ToxicHolder {
public MixinBlockItem() {super(null); }
@Nullable
private Toxic toxic;
@Override
public void setToxic(Toxic toxic) {
this.toxic = toxic;
}
@Override
public UseAction getUseAction(ItemStack stack) {
if (toxic != null) {
return toxic.getUseAction(stack);
}
return super.getUseAction(stack);
}
@Inject(method = "appendTooltip", at = @At("RETURN"))
private void onAppendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context, CallbackInfo into) {
if (toxic != null) {
tooltip.add(toxic.getTooltip(stack));
}
}
@Override
public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) {
ItemStack result = super.finishUsing(stack, world, entity);
if (toxic != null) {
return toxic.finishUsing(stack, world, entity);
}
return result;
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
if (toxic == null) {
return super.use(world, player, hand);
}
return toxic.use(world, player, hand, () -> super.use(world, player, hand));
}
}

View file

@ -0,0 +1,16 @@
package com.minelittlepony.unicopia.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import com.minelittlepony.unicopia.toxin.ToxicHolder;
import net.minecraft.item.FoodComponent;
import net.minecraft.item.Item;
@Mixin(Item.class)
abstract class MixinItem implements ToxicHolder {
@Override
@Accessor("foodComponent")
public abstract void setFood(FoodComponent food);
}

View file

@ -25,6 +25,10 @@ public class Toxic {
private final Function<ItemStack, Toxicity> toxicity; private final Function<ItemStack, Toxicity> toxicity;
private final Toxin toxin; private final Toxin toxin;
Toxic(Item item, UseAction action, Toxin toxin, Toxicity toxicity) {
this(item, action, toxin, stack -> toxicity);
}
Toxic(Item item, UseAction action, Toxin toxin, Function<ItemStack, Toxicity> toxicity) { Toxic(Item item, UseAction action, Toxin toxin, Function<ItemStack, Toxicity> toxicity) {
this.item = item; this.item = item;
this.action = action; this.action = action;

View file

@ -1,48 +1,18 @@
package com.minelittlepony.unicopia.toxin; package com.minelittlepony.unicopia.toxin;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.UseAction; import net.minecraft.util.UseAction;
import net.minecraft.world.World;
public class ToxicBlockItem extends BlockItem { public class ToxicBlockItem extends BlockItem {
private final Toxic toxic; public ToxicBlockItem(Block block, Settings settings, Toxic toxic) {
super(block, settings);
((ToxicHolder)this).setToxic(toxic);
}
public ToxicBlockItem(Block block, Settings settings, UseAction action, Toxicity toxicity, Toxin toxin) { public ToxicBlockItem(Block block, Settings settings, UseAction action, Toxicity toxicity, Toxin toxin) {
super(block, settings); super(block, settings);
toxic = new Toxic(this, action, toxin, stack -> toxicity); ((ToxicHolder)this).setToxic(new Toxic(this, action, toxin, toxicity));
}
@Override
public UseAction getUseAction(ItemStack stack) {
return toxic.getUseAction(stack);
}
@Override
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
tooltip.add(toxic.getTooltip(stack));
}
@Override
public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) {
super.finishUsing(stack, world, entity);
return toxic.finishUsing(stack, world, entity);
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
return toxic.use(world, player, hand, () -> super.use(world, player, hand));
} }
} }

View file

@ -0,0 +1,8 @@
package com.minelittlepony.unicopia.toxin;
import net.minecraft.item.FoodComponent;
public interface ToxicHolder {
void setFood(FoodComponent food);
void setToxic(Toxic toxic);
}

View file

@ -0,0 +1,42 @@
package com.minelittlepony.unicopia.toxin;
import com.minelittlepony.unicopia.item.UFoodComponents;
import net.minecraft.item.FoodComponent;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.UseAction;
public interface Toxics {
Toxic GRASS = register(Items.GRASS, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD.and(Toxin.NAUSEA));
Toxic FERN = register(Items.FERN, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.STRENGTH));
Toxic DEAD_BUSH = register(Items.DEAD_BUSH, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.NAUSEA));
Toxic DANDELION = register(Items.DANDELION, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic POPPY = register(Items.POPPY, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD);
Toxic BLUE_ORCHID = register(Items.BLUE_ORCHID, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic ALLIUM = register(Items.ALLIUM, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.FAIR, Toxin.FOOD);
Toxic AZUER_BLUET = register(Items.AZURE_BLUET, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD.and(Toxin.RADIOACTIVITY));
Toxic RED_TULIP = register(Items.RED_TULIP, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic ORANGE_TULIP = register(Items.ORANGE_TULIP, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic WHITE_TULIP = register(Items.WHITE_TULIP, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.FAIR, Toxin.FOOD);
Toxic PINK_TULIP = register(Items.PINK_TULIP, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic OXEYE_DAISY = register(Items.OXEYE_DAISY, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.BLINDNESS));
Toxic CORNFLOWER = register(Items.CORNFLOWER, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic ROSE_BUSH = register(Items.ROSE_BUSH, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD.and(Toxin.DAMAGE));
Toxic PEONY = register(Items.PEONY, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic TALL_GRASS = register(Items.TALL_GRASS, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SAFE, Toxin.FOOD);
Toxic LARGE_FERN = register(Items.LARGE_FERN, UFoodComponents.RANDOM_FOLIAGE, UseAction.EAT, Toxicity.SEVERE, Toxin.FOOD.and(Toxin.DAMAGE));
static void bootstrap() {}
static Toxic register(Item target, FoodComponent food, UseAction action, Toxicity toxicity, Toxin toxin) {
Toxic toxic = new Toxic(target, action, toxin, toxicity);
ToxicHolder holder = (ToxicHolder)target;
holder.setFood(food);
holder.setToxic(toxic);
return toxic;
}
}