mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-23 13:37:58 +01:00
Porting to Fabric/Yarn/1.14 part 1
This commit is contained in:
parent
f5f232241a
commit
2670d5cdb6
376 changed files with 8747 additions and 11478 deletions
139
build.gradle
139
build.gradle
|
@ -1,106 +1,85 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
name 'forge'
|
||||
url 'http://files.minecraftforge.net/maven/'
|
||||
}
|
||||
maven {
|
||||
name = "sonatype"
|
||||
url = "https://oss.sonatype.org/content/repositories/snapshots/"
|
||||
}
|
||||
maven {
|
||||
name = 'sponge'
|
||||
url = 'http://repo.spongepowered.org/maven'
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:' + project.forgeGradleVersion
|
||||
}
|
||||
// Fabric build script
|
||||
// 03/06/2019
|
||||
// https://github.com/FabricMC/fabric-example-mod/blob/master/build.gradle
|
||||
|
||||
plugins {
|
||||
id 'java-library'
|
||||
id 'fabric-loom' version '0.2.5-SNAPSHOT'
|
||||
id 'maven-publish'
|
||||
}
|
||||
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||
|
||||
def ver = "${project.buildType}${project.buildVersion}.${project.buildRevision}"
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
|
||||
version = "${project.minecraft_version}-${project.version}"
|
||||
|
||||
if (project.release != 'RELEASE') {
|
||||
version += "-${project.release}"
|
||||
}
|
||||
|
||||
version = ver
|
||||
group = project.group
|
||||
description = project.description
|
||||
description = project.displayname
|
||||
archivesBaseName = project.name
|
||||
|
||||
minecraft {
|
||||
version = project.mcVersion + '-' + project.mcfVersion
|
||||
mappings = project.mcMappings
|
||||
runDir = 'run'
|
||||
replace '@MODID@', project.modid
|
||||
replace '@NAME@', project.name
|
||||
replace '@AUTHOR@', project.author
|
||||
replace '@VERSION@', ver
|
||||
replace '@DESCRIPTION@', project.description
|
||||
}
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
jei {
|
||||
compileClasspath += main.compileClasspath
|
||||
compileClasspath += main.output
|
||||
}
|
||||
external {
|
||||
compileClasspath += main.compileClasspath
|
||||
}
|
||||
main {
|
||||
compileClasspath += external.output
|
||||
ext.refMap = project.refCore
|
||||
}
|
||||
refmapName = 'unicopia.mixin.refmap.json'
|
||||
}
|
||||
|
||||
repositories {
|
||||
flatDir {
|
||||
dir 'lib'
|
||||
maven {
|
||||
name = 'minelp'
|
||||
url = 'http://repo.minelittlepony-mod.com/maven/snapshot'
|
||||
}
|
||||
maven {
|
||||
// location of the maven that hosts JEI files
|
||||
name = "Progwml6 maven"
|
||||
url = "http://dvs1.progwml6.com/files/maven"
|
||||
}
|
||||
maven {
|
||||
// location of a maven mirror for JEI files, as a fallback
|
||||
name = "ModMaven"
|
||||
url = "modmaven.k-4u.nl"
|
||||
name = 'minelp-release'
|
||||
url = 'http://repo.minelittlepony-mod.com/maven/release'
|
||||
}
|
||||
}
|
||||
|
||||
// check for updates every build when on CI
|
||||
if (System.env.CI) {
|
||||
configurations.all {
|
||||
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
deobfCompile('com.minelittlepony:jumpingcastle:1.12.2.1.0.0:universal')
|
||||
// compile against the JEI API but do not include it at runtime
|
||||
deobfProvided "mezz.jei:jei_${project.mcVersion}:${project.jeiVersion}:api"
|
||||
// at runtime, use the full JEI jar
|
||||
runtime "mezz.jei:jei_${project.mcVersion}:${project.jeiVersion}"
|
||||
minecraft "com.mojang:minecraft:${project.minecraft_version}"
|
||||
mappings "net.fabricmc:yarn:${project.yarn_mappings}"
|
||||
modApi "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||
|
||||
compileOnly "com.google.code.findbugs:jsr305:3.0.2"
|
||||
|
||||
//modApi "net.fabricmc.fabric-api:fabric-api-base:0.1.0+"
|
||||
//modApi "net.fabricmc.fabric-api:fabric-events-lifecycle-v0:0.1.0+"
|
||||
//modApi "net.fabricmc.fabric-api:fabric-resource-loader-v0:0.1.0+"
|
||||
|
||||
modCompile "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||
|
||||
modApi "com.minelittlepony:Kirin:${project.kirin_version}"
|
||||
include "com.minelittlepony:Kirin:${project.kirin_version}"
|
||||
|
||||
modImplementation "io.github.prospector.modmenu:ModMenu:1.6.2-93"
|
||||
}
|
||||
|
||||
processResources {
|
||||
def props = [
|
||||
modid: project.modid,
|
||||
name: project.title,
|
||||
description: project.description,
|
||||
version: ver,
|
||||
revision: project.buildRevision,
|
||||
mcversion: project.mcVersion,
|
||||
author: project.author
|
||||
]
|
||||
inputs.property "version", project.version
|
||||
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
include 'mcmod.info'
|
||||
expand props
|
||||
include "fabric.mod.json"
|
||||
expand "version": project.version
|
||||
}
|
||||
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
exclude 'mcmod.info'
|
||||
exclude "fabric.mod.json"
|
||||
}
|
||||
}
|
||||
|
||||
jar {
|
||||
from sourceSets.main.output
|
||||
from sourceSets.external.output
|
||||
from sourceSets.jei.output
|
||||
baseName = "Unicopia-mc${project.mcVersion}"
|
||||
tasks.withType(JavaCompile) {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
task sourcesJar(type: Jar, dependsOn: classes) {
|
||||
classifier = "sources"
|
||||
from sourceSets.main.allSource
|
||||
}
|
||||
|
|
|
@ -1,15 +1,20 @@
|
|||
modid=unicopia
|
||||
title=Unicopia Redux
|
||||
group=com.minelittlepony.unicopia
|
||||
author=Sollace
|
||||
description=Magical Abilities for Mine Little Pony!
|
||||
buildType=inDev
|
||||
buildVersion=2
|
||||
buildRevision=11
|
||||
mcVersion=1.12.2
|
||||
mcfVersion=14.23.5.2824
|
||||
jeiVersion=4.15.0.268
|
||||
mcMappings=stable_39
|
||||
refCore=mixins.unicopia.refmap.json
|
||||
forgeGradleVersion=2.3-SNAPSHOT
|
||||
mixinGradleVersion=0.6-SNAPSHOT
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
org.gradle.daemon=false
|
||||
|
||||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/use
|
||||
minecraft_version=1.14.4
|
||||
yarn_mappings=1.14.4+build.2
|
||||
loader_version=0.4.8+
|
||||
|
||||
# Mod Properties
|
||||
group=com.minelittlepony
|
||||
displayname=Unicopia Redux
|
||||
authors=Sollace
|
||||
description=Magical Abilities for Mine Little Pony!
|
||||
version=3
|
||||
release=SNAPSHOT
|
||||
|
||||
# Dependencies
|
||||
fabric_version=0.3.0+
|
||||
kirin_version=1.14.4-1.4.4
|
||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,6 @@
|
|||
#Mon Apr 15 20:00:20 CAT 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip
|
||||
|
|
Binary file not shown.
11
settings.gradle
Normal file
11
settings.gradle
Normal file
|
@ -0,0 +1,11 @@
|
|||
pluginManagement {
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
name = 'Fabric'
|
||||
url = 'https://maven.fabricmc.net/'
|
||||
}
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
rootProject.name = 'Unicopia'
|
|
@ -1,14 +0,0 @@
|
|||
package baubles.api;
|
||||
|
||||
import org.apache.commons.lang3.NotImplementedException;
|
||||
|
||||
/*
|
||||
* stub
|
||||
*/
|
||||
public enum BaubleType {
|
||||
AMULET, RING, BELT, TRINKET, HEAD, BODY, CHARM;
|
||||
|
||||
public int[] getValidSlots() {
|
||||
throw new NotImplementedException("getValidSlots");
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package baubles.api;
|
||||
|
||||
import org.apache.commons.lang3.NotImplementedException;
|
||||
|
||||
import baubles.api.cap.IBaublesItemHandler;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
|
||||
/*
|
||||
* stub
|
||||
*/
|
||||
public class BaublesApi {
|
||||
public static IBaublesItemHandler getBaublesHandler(EntityPlayer player) {
|
||||
throw new NotImplementedException("getBaublesHandler");
|
||||
}
|
||||
|
||||
public static int isBaubleEquipped(EntityPlayer player, Item bauble) {
|
||||
throw new NotImplementedException("isBaubleEquipped");
|
||||
}
|
||||
}
|
|
@ -1,60 +0,0 @@
|
|||
package baubles.api;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
*
|
||||
* This interface should be extended by items that can be worn in bauble slots
|
||||
*
|
||||
* @author Azanor
|
||||
*/
|
||||
public interface IBauble {
|
||||
|
||||
/**
|
||||
* This method return the type of bauble this is.
|
||||
* Type is used to determine the slots it can go into.
|
||||
*/
|
||||
public BaubleType getBaubleType(ItemStack itemstack);
|
||||
|
||||
/**
|
||||
* This method is called once per tick if the bauble is being worn by a player
|
||||
*/
|
||||
public default void onWornTick(ItemStack itemstack, EntityLivingBase player) {
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called when the bauble is equipped by a player
|
||||
*/
|
||||
public default void onEquipped(ItemStack itemstack, EntityLivingBase player) {
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called when the bauble is unequipped by a player
|
||||
*/
|
||||
public default void onUnequipped(ItemStack itemstack, EntityLivingBase player) {
|
||||
}
|
||||
|
||||
/**
|
||||
* can this bauble be placed in a bauble slot
|
||||
*/
|
||||
public default boolean canEquip(ItemStack itemstack, EntityLivingBase player) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can this bauble be removed from a bauble slot
|
||||
*/
|
||||
public default boolean canUnequip(ItemStack itemstack, EntityLivingBase player) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Will bauble automatically sync to client if a change is detected in its NBT or damage values?
|
||||
* Default is off, so override and set to true if you want to auto sync.
|
||||
* This sync is not instant, but occurs every 10 ticks (.5 seconds).
|
||||
*/
|
||||
public default boolean willAutoSync(ItemStack itemstack, EntityLivingBase player) {
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package baubles.api.cap;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
|
||||
/*
|
||||
* stub
|
||||
*/
|
||||
public interface IBaublesItemHandler extends IItemHandlerModifiable {
|
||||
boolean isItemValidForSlot(int slot, ItemStack stack, EntityLivingBase player);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package com.minelittlepony;
|
||||
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public abstract class MineLittlePony {
|
||||
public static MineLittlePony getInstance() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
package com.minelittlepony.pony.data;
|
||||
|
||||
import net.minecraft.client.entity.AbstractClientPlayer;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
// Stub
|
||||
@SideOnly(Side.CLIENT)
|
||||
public interface IPony {
|
||||
|
||||
static IPony forPlayer(AbstractClientPlayer player) {
|
||||
return null;
|
||||
}
|
||||
|
||||
PonyRace getRace(boolean ignorePony);
|
||||
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
package com.minelittlepony.pony.data;
|
||||
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
// Stub
|
||||
@SideOnly(Side.CLIENT)
|
||||
public enum PonyRace {
|
||||
HUMAN,
|
||||
EARTH,
|
||||
PEGASUS,
|
||||
UNICORN,
|
||||
ALICORN,
|
||||
CHANGELING,
|
||||
ZEBRA,
|
||||
REFORMED_CHANGELING,
|
||||
GRIFFIN,
|
||||
HIPPOGRIFF,
|
||||
BATPONY,
|
||||
SEAPONY;
|
||||
|
||||
public boolean hasHorn() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean hasWings() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isHuman() {
|
||||
return this == HUMAN;
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
package com.minelittlepony.unicopia.jei;
|
||||
|
||||
import mezz.jei.api.gui.IDrawable;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
|
||||
class BlendedDrawable implements IDrawable {
|
||||
|
||||
private final IDrawable wrapped;
|
||||
|
||||
public BlendedDrawable(IDrawable wrapped) {
|
||||
this.wrapped = wrapped;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
return wrapped.getWidth();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHeight() {
|
||||
return wrapped.getHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Minecraft minecraft, int xOffset, int yOffset) {
|
||||
GlStateManager.enableBlend();
|
||||
wrapped.draw(minecraft, xOffset, yOffset);
|
||||
GlStateManager.disableBlend();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
package com.minelittlepony.unicopia.jei;
|
||||
|
||||
import com.minelittlepony.unicopia.Unicopia;
|
||||
import com.minelittlepony.unicopia.enchanting.SpecialRecipe;
|
||||
import com.minelittlepony.unicopia.enchanting.SpellRecipe;
|
||||
import com.minelittlepony.unicopia.init.UItems;
|
||||
import com.minelittlepony.unicopia.spell.SpellRegistry;
|
||||
|
||||
import mezz.jei.api.IGuiHelper;
|
||||
import mezz.jei.api.IModPlugin;
|
||||
import mezz.jei.api.IModRegistry;
|
||||
import mezz.jei.api.ISubtypeRegistry;
|
||||
import mezz.jei.api.JEIPlugin;
|
||||
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
|
||||
|
||||
@JEIPlugin
|
||||
public class JEIUnicopia implements IModPlugin {
|
||||
|
||||
static IGuiHelper GUI_HELPER;
|
||||
|
||||
static final String RECIPE_UID = "unicopia:spellbook_2";
|
||||
|
||||
@Override
|
||||
public void registerItemSubtypes(ISubtypeRegistry registry) {
|
||||
registry.registerSubtypeInterpreter(UItems.spell, SpellRegistry::getKeyFromStack);
|
||||
registry.registerSubtypeInterpreter(UItems.curse, SpellRegistry::getKeyFromStack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerCategories(IRecipeCategoryRegistration registry) {
|
||||
registry.addRecipeCategories(new SpellbookCategory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(IModRegistry registry) {
|
||||
GUI_HELPER = registry.getJeiHelpers().getGuiHelper();
|
||||
|
||||
registry.handleRecipes(SpellRecipe.class, SpellRecipeWrapper::new, RECIPE_UID);
|
||||
registry.handleRecipes(SpecialRecipe.class, SpellRecipeWrapper::new, RECIPE_UID);
|
||||
registry.addRecipes(Unicopia.getCraftingManager().getRecipes(), RECIPE_UID);
|
||||
}
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
package com.minelittlepony.unicopia.jei;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.minelittlepony.unicopia.enchanting.AbstractSpecialRecipe;
|
||||
|
||||
import mezz.jei.api.ingredients.IIngredients;
|
||||
import mezz.jei.api.ingredients.VanillaTypes;
|
||||
import mezz.jei.api.recipe.IRecipeWrapper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class SpellRecipeWrapper implements IRecipeWrapper {
|
||||
|
||||
private final AbstractSpecialRecipe recipe;
|
||||
|
||||
public SpellRecipeWrapper(AbstractSpecialRecipe recipe) {
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
public AbstractSpecialRecipe getRecipe() {
|
||||
return recipe;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getIngredients(IIngredients ingredients) {
|
||||
|
||||
List<List<ItemStack>> ingreds = recipe.getSpellIngredients().stream().map(ingredient -> {
|
||||
return ingredient.getStacks().collect(Collectors.toList());
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
ingredients.setInputLists(VanillaTypes.ITEM, ingreds);
|
||||
|
||||
ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
package com.minelittlepony.unicopia.jei;
|
||||
|
||||
import com.minelittlepony.unicopia.Unicopia;
|
||||
import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook;
|
||||
|
||||
import mezz.jei.api.gui.IDrawable;
|
||||
import mezz.jei.api.gui.IGuiItemStackGroup;
|
||||
import mezz.jei.api.gui.IRecipeLayout;
|
||||
import mezz.jei.api.ingredients.IIngredients;
|
||||
import mezz.jei.api.ingredients.VanillaTypes;
|
||||
import mezz.jei.api.recipe.IRecipeCategory;
|
||||
import mezz.jei.api.recipe.IRecipeWrapper;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
public class SpellbookCategory implements IRecipeCategory<IRecipeWrapper> {
|
||||
|
||||
@Override
|
||||
public String getUid() {
|
||||
return JEIUnicopia.RECIPE_UID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTitle() {
|
||||
return "Spellbook";
|
||||
}
|
||||
|
||||
@Override
|
||||
public IDrawable getIcon() {
|
||||
return JEIUnicopia.GUI_HELPER.drawableBuilder(
|
||||
new ResourceLocation(Unicopia.MODID, "textures/items/spellbook.png"), 0, 0, 16, 16)
|
||||
.setTextureSize(16, 16)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getModName() {
|
||||
return "Unicopia";
|
||||
}
|
||||
|
||||
@Override
|
||||
public IDrawable getBackground() {
|
||||
return new BlendedDrawable(
|
||||
JEIUnicopia.GUI_HELPER.drawableBuilder(GuiSpellBook.spellBookGuiTextures, 405, 0, 105, 108)
|
||||
.setTextureSize(512, 256)
|
||||
.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, @Deprecated IIngredients unused) {
|
||||
recipeLayout.setShapeless();
|
||||
|
||||
IGuiItemStackGroup stacks = recipeLayout.getItemStacks();
|
||||
|
||||
stacks.init(0, true, 29, 3);
|
||||
stacks.init(1, true, 3, 46);
|
||||
stacks.init(2, true, 30, 86);
|
||||
stacks.init(3, true, 80, 72);
|
||||
stacks.init(4, true, 82, 15);
|
||||
|
||||
stacks.init(5, false, 46, 44);
|
||||
|
||||
stacks.set(unused);
|
||||
|
||||
stacks.set(5, unused.getOutputs(VanillaTypes.ITEM).get(0));
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
|
||||
public class Button extends GuiButton implements IGuiTooltipped<Button> {
|
||||
|
||||
private int tipX = 0;
|
||||
private int tipY = 0;
|
||||
|
||||
protected IGuiAction<Button> action;
|
||||
|
||||
private List<String> tooltip = null;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Button(int x, int y, int width, int height, String label, IGuiAction<? extends Button> callback) {
|
||||
super(5000, x, y, width, height, GameGui.format(label));
|
||||
action = (IGuiAction<Button>)callback;
|
||||
}
|
||||
|
||||
public Button setEnabled(boolean enable) {
|
||||
enabled = enable;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Button setTooltip(List<String> tooltip) {
|
||||
this.tooltip = tooltip;
|
||||
return this;
|
||||
}
|
||||
|
||||
protected List<String> getTooltip() {
|
||||
return tooltip;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderToolTip(Minecraft mc, int mouseX, int mouseY) {
|
||||
List<String> tooltip = getTooltip();
|
||||
|
||||
if (visible && isMouseOver() && tooltip != null) {
|
||||
mc.currentScreen.drawHoveringText(tooltip, mouseX + tipX, mouseY + tipY);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Button setTooltipOffset(int x, int y) {
|
||||
tipX = x;
|
||||
tipY = y;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) {
|
||||
if (super.mousePressed(mc, mouseX, mouseY)) {
|
||||
action.perform(this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
|
||||
public abstract class GameGui extends GuiScreen {
|
||||
|
||||
protected static String format(String string, Object... pars) {
|
||||
return string == null ? null : I18n.format(string, pars);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a translation string and returns it in a list wrapped to a given width.
|
||||
* This can be safely used in initGui, where the fontRenderer is often still null.
|
||||
*/
|
||||
protected List<String> formatMultiLine(String string, int width, Object...pars) {
|
||||
FontRenderer fr = fontRenderer;
|
||||
|
||||
if (fr == null) {
|
||||
fr = Minecraft.getMinecraft().fontRenderer;
|
||||
}
|
||||
|
||||
return fr.listFormattedStringToWidth(format(string, pars), width);
|
||||
}
|
||||
|
||||
protected void playSound(SoundEvent event) {
|
||||
mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(event, 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given string to title case regardless of initial case.
|
||||
*/
|
||||
protected static String toTitleCase(String string) {
|
||||
return WordUtils.capitalize(string.toLowerCase());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
|
||||
drawContents(mouseX, mouseY, partialTicks);
|
||||
postDrawContents(mouseX, mouseY, partialTicks);
|
||||
}
|
||||
|
||||
protected void drawContents(int mouseX, int mouseY, float partialTicks) {
|
||||
super.drawScreen(mouseX, mouseY, partialTicks);
|
||||
}
|
||||
|
||||
protected void postDrawContents(int mouseX, int mouseY, float partialTicks) {
|
||||
buttonList.forEach(button -> {
|
||||
if (button instanceof IGuiTooltipped) {
|
||||
((IGuiTooltipped<?>)button).renderToolTip(mc, mouseX, mouseY);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
/**
|
||||
* Response actions for UI events.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface IGuiAction<T> {
|
||||
/**
|
||||
* Performs this action now.
|
||||
*
|
||||
* @param value New Value of the field being changed
|
||||
* @return Adjusted value the field must take on
|
||||
*/
|
||||
void perform(T sender);
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
/**
|
||||
* Response actions for UI events.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface IGuiCallback<T> {
|
||||
/**
|
||||
* Performs this action now.
|
||||
*
|
||||
* @param value New Value of the field being changed
|
||||
* @return Adjusted value the field must take on
|
||||
*/
|
||||
T perform(T value);
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
import com.google.common.base.Splitter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IGuiTooltipped<T extends IGuiTooltipped<T>> {
|
||||
|
||||
T setTooltip(List<String> tooltip);
|
||||
|
||||
T setTooltipOffset(int x, int y);
|
||||
|
||||
default T setTooltip(String tooltip) {
|
||||
return setTooltip(Splitter.onPattern("\r?\n|\\\\n").splitToList(GameGui.format(tooltip)));
|
||||
}
|
||||
|
||||
void renderToolTip(Minecraft mc, int mouseX, int mouseY);
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
|
||||
/**
|
||||
* A simple label for drawing text to a gui screen.
|
||||
*
|
||||
* @author Sollace
|
||||
*
|
||||
*/
|
||||
public class Label extends GuiButton {
|
||||
|
||||
private boolean center;
|
||||
|
||||
private int color;
|
||||
|
||||
private String text;
|
||||
|
||||
public Label(int x, int y, String translationString, int color) {
|
||||
this(x, y, translationString, color, false);
|
||||
}
|
||||
|
||||
public Label(int x, int y, String translationString, int color, boolean center) {
|
||||
super(0, x, y, "");
|
||||
this.color = color;
|
||||
this.center = center;
|
||||
this.text = translationString;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) {
|
||||
if (center) {
|
||||
drawCenteredString(mc.fontRenderer, GameGui.format(text), x, y, color);
|
||||
} else {
|
||||
drawString(mc.fontRenderer, GameGui.format(text), x, y, color);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
package com.minelittlepony.gui;
|
||||
|
||||
import net.minecraft.client.gui.GuiSlider;
|
||||
import net.minecraft.client.gui.GuiPageButtonList.GuiResponder;
|
||||
|
||||
/**
|
||||
* A slider for sliding.
|
||||
*
|
||||
* @author Sollace
|
||||
*
|
||||
*/
|
||||
public class Slider extends GuiSlider {
|
||||
|
||||
private static Responder callback;
|
||||
|
||||
public Slider(int x, int y, float minIn, float maxIn, float defaultValue, GuiSlider.FormatHelper formatter, IGuiCallback<Float> action) {
|
||||
super(callback = new Responder(action), 0, x, y, "", minIn, maxIn, defaultValue, formatter);
|
||||
callback.owner = this;
|
||||
callback = null;
|
||||
}
|
||||
|
||||
private static final class Responder implements GuiResponder {
|
||||
|
||||
private final IGuiCallback<Float> action;
|
||||
|
||||
private Slider owner;
|
||||
|
||||
private Responder(IGuiCallback<Float> callback) {
|
||||
action = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntryValue(int id, boolean value) { }
|
||||
|
||||
@Override
|
||||
public void setEntryValue(int id, float value) {
|
||||
owner.setSliderValue(action.perform(value), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntryValue(int id, String value) { }
|
||||
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
package com.minelittlepony.render.model;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.minelittlepony.util.render.Box;
|
||||
|
||||
import net.minecraft.client.model.ModelRenderer;
|
||||
import net.minecraft.client.model.PositionTextureVertex;
|
||||
import net.minecraft.client.model.TexturedQuad;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
|
||||
public class ModelQuads extends Box<ModelRenderer> {
|
||||
|
||||
public ModelQuads(ModelRenderer renderer) {
|
||||
super(renderer, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
protected List<TexturedQuad> quadList = new ArrayList<TexturedQuad>();
|
||||
|
||||
public ModelQuads addFace(PositionTextureVertex... vertices) {
|
||||
quadList.add(new TexturedShape2d(vertices));
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public void render(BufferBuilder renderer, float scale) {
|
||||
for (TexturedQuad i : quadList) {
|
||||
i.draw(renderer, scale);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
package com.minelittlepony.render.model;
|
||||
|
||||
import net.minecraft.client.model.PositionTextureVertex;
|
||||
import net.minecraft.client.model.TexturedQuad;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
||||
public class TexturedShape2d extends TexturedQuad {
|
||||
|
||||
protected boolean invertNormal;
|
||||
|
||||
public TexturedShape2d(PositionTextureVertex... vertices) {
|
||||
super(vertices);
|
||||
}
|
||||
|
||||
public TexturedShape2d(PositionTextureVertex[] vertices, int texcoordU1, int texcoordV1, int texcoordU2, int texcoordV2, float textureWidth, float textureHeight) {
|
||||
super(vertices, texcoordU1, texcoordV1, texcoordU2, texcoordV2, textureWidth, textureHeight);
|
||||
}
|
||||
|
||||
public TexturedShape2d setInvertNormal() {
|
||||
invertNormal = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void drawQuad(BufferBuilder renderer, float scale) {
|
||||
Vec3d vec3d = vertexPositions[1].vector3D.subtractReverse(vertexPositions[0].vector3D);
|
||||
Vec3d vec3d1 = vertexPositions[1].vector3D.subtractReverse(vertexPositions[2].vector3D);
|
||||
Vec3d vec3d2 = vec3d1.crossProduct(vec3d).normalize();
|
||||
float f = (float)vec3d2.x;
|
||||
float f1 = (float)vec3d2.y;
|
||||
float f2 = (float)vec3d2.z;
|
||||
|
||||
if (invertNormal) {
|
||||
f = -f;
|
||||
f1 = -f1;
|
||||
f2 = -f2;
|
||||
}
|
||||
|
||||
renderer.begin(7, DefaultVertexFormats.OLDMODEL_POSITION_TEX_NORMAL);
|
||||
|
||||
for (int i = 0; i < nVertices; ++i) {
|
||||
PositionTextureVertex positiontexturevertex = vertexPositions[i];
|
||||
renderer.pos(positiontexturevertex.vector3D.x * (double)scale, positiontexturevertex.vector3D.y * (double)scale, positiontexturevertex.vector3D.z * (double)scale).tex((double)positiontexturevertex.texturePositionX, (double)positiontexturevertex.texturePositionY).normal(f, f1, f2).endVertex();
|
||||
}
|
||||
|
||||
Tessellator.getInstance().draw();
|
||||
}
|
||||
}
|
|
@ -1,88 +1,63 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.unicopia.forgebullshit.FUF;
|
||||
import com.minelittlepony.unicopia.hud.UHud;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.IView;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.client.gui.UHud;
|
||||
import com.minelittlepony.unicopia.entity.player.ICamera;
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiOptions;
|
||||
import net.minecraft.client.gui.GuiShareToLan;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraftforge.client.event.EntityViewRenderEvent;
|
||||
import net.minecraftforge.client.event.FOVUpdateEvent;
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
import net.minecraftforge.client.event.RenderLivingEvent;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
import net.minecraftforge.fml.common.eventhandler.EventPriority;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
|
||||
@EventBusSubscriber(value = Side.CLIENT, modid = Unicopia.MODID)
|
||||
class ClientHooks {
|
||||
// This fixes lighting errors on the armour slots.
|
||||
// #MahjongPls
|
||||
@FUF(reason = "Forge should fix this. Cancelling their event skips neccessary state resetting at the end of the render method")
|
||||
@SubscribeEvent
|
||||
public static void postEntityRender(RenderLivingEvent.Post<?> event) {
|
||||
GlStateManager.enableAlpha();
|
||||
public static void postEntityRender() {
|
||||
GlStateManager.enableAlphaTest();
|
||||
|
||||
UClient.instance().postRenderEntity(event.getEntity());
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void preEntityRender(RenderLivingEvent.Pre<?> event) {
|
||||
public static void preEntityRender() {
|
||||
if (UClient.instance().renderEntity(event.getEntity(), event.getPartialRenderTick())) {
|
||||
event.setCanceled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onDisplayGui(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (event.getGui() instanceof GuiOptions || event.getGui() instanceof GuiShareToLan) {
|
||||
UnicopiaClient.addUniButton(event.getButtonList());
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onGameTick(TickEvent.ClientTickEvent event) {
|
||||
if (event.phase == Phase.END) {
|
||||
UClient.instance().tick();
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.HIGHEST)
|
||||
public static void beforePreRenderHud(RenderGameOverlayEvent.Pre event) {
|
||||
GlStateManager.pushMatrix();
|
||||
|
||||
if (event.getType() != ElementType.ALL) {
|
||||
IPlayer player = UClient.instance().getIPlayer();
|
||||
|
||||
if (player != null && Minecraft.getMinecraft().world != null) {
|
||||
if (player != null && MinecraftClient.getInstance().world != null) {
|
||||
UHud.instance.repositionElements(player, event.getResolution(), event.getType(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.LOWEST, receiveCanceled = true)
|
||||
public static void afterPreRenderHud(RenderGameOverlayEvent.Pre event) {
|
||||
if (event.isCanceled()) {
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.LOWEST)
|
||||
public static void postRenderHud(RenderGameOverlayEvent.Post event) {
|
||||
|
||||
if (event.getType() == ElementType.ALL) {
|
||||
IPlayer player = UClient.instance().getIPlayer();
|
||||
|
||||
if (player != null && Minecraft.getMinecraft().world != null) {
|
||||
if (player != null && MinecraftClient.getInstance().world != null) {
|
||||
UHud.instance.renderHud(player, event.getResolution());
|
||||
}
|
||||
}
|
||||
|
@ -90,18 +65,21 @@ class ClientHooks {
|
|||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void modifyFOV(FOVUpdateEvent event) {
|
||||
event.setNewfov(PlayerSpeciesList.instance().getPlayer(event.getEntity()).getCamera().calculateFieldOfView(event.getFov()));
|
||||
public static void registerItemColours(ColorHandlerEvent.Item event) {
|
||||
UItems.registerColors(event.getItemColors());
|
||||
UBlocks.registerColors(event.getItemColors(), event.getBlockColors());
|
||||
}
|
||||
|
||||
public static void modifyFOV(FOVUpdateEvent event) {
|
||||
event.setNewfov(SpeciesList.instance().getPlayer(event.getEntity()).getCamera().calculateFieldOfView(event.getFov()));
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void setupPlayerCamera(EntityViewRenderEvent.CameraSetup event) {
|
||||
|
||||
IPlayer player = UClient.instance().getIPlayer();
|
||||
|
||||
if (player != null) {
|
||||
IView view = player.getCamera();
|
||||
ICamera view = player.getCamera();
|
||||
|
||||
event.setRoll(view.calculateRoll());
|
||||
event.setPitch(view.calculatePitch(event.getPitch()));
|
||||
|
|
|
@ -3,8 +3,8 @@ package com.minelittlepony.unicopia;
|
|||
import com.minelittlepony.unicopia.entity.EntityCloud;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
public enum CloudType {
|
||||
NORMAL,
|
||||
|
@ -20,22 +20,22 @@ public enum CloudType {
|
|||
return true;
|
||||
}
|
||||
|
||||
if (e instanceof EntityPlayer) {
|
||||
if (e instanceof PlayerEntity) {
|
||||
|
||||
if (this == PACKED) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return Predicates.INTERACT_WITH_CLOUDS.test((EntityPlayer)e)
|
||||
|| (Predicates.MAGI.test(e) && EntityCloud.getFeatherEnchantStrength((EntityPlayer)e) > 0);
|
||||
return Predicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)e)
|
||||
|| (Predicates.MAGI.test(e) && EntityCloud.getFeatherEnchantStrength((PlayerEntity)e) > 0);
|
||||
}
|
||||
|
||||
if (e instanceof EntityItem) {
|
||||
return Predicates.ITEM_INTERACT_WITH_CLOUDS.test((EntityItem)e);
|
||||
if (e instanceof ItemEntity) {
|
||||
return Predicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e);
|
||||
}
|
||||
|
||||
if (e instanceof EntityCloud && e.isRiding()) {
|
||||
return canInteract(e.getRidingEntity());
|
||||
if (e instanceof EntityCloud && e.hasVehicle()) {
|
||||
return canInteract(e.getVehicle());
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -1,151 +0,0 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.unicopia.init.UBlocks;
|
||||
import com.minelittlepony.util.fixers.BlockFixer;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.datafix.DataFixer;
|
||||
import net.minecraft.util.datafix.FixTypes;
|
||||
import net.minecraft.util.datafix.IFixableData;
|
||||
import net.minecraftforge.common.util.CompoundDataFixer;
|
||||
import net.minecraftforge.common.util.ModFixs;
|
||||
|
||||
public class Fixes {
|
||||
|
||||
static void init(DataFixer fixer) {
|
||||
|
||||
CompoundDataFixer forgeDataFixer = (CompoundDataFixer)fixer;
|
||||
|
||||
try {
|
||||
ModFixs modfix = forgeDataFixer.init(Unicopia.MODID, 1343);
|
||||
|
||||
modfix.registerFix(FixTypes.CHUNK, new FixCloudBlocks());
|
||||
modfix.registerFix(FixTypes.ITEM_INSTANCE, new FixCloudItems());
|
||||
modfix.registerFix(FixTypes.ITEM_INSTANCE, new FixItems());
|
||||
|
||||
} catch (Throwable ignored) {
|
||||
// no way to check if our fixer is already registered.
|
||||
// so just do it anyway and ignore the error.
|
||||
// @FUF(reason = "FUF")
|
||||
}
|
||||
}
|
||||
|
||||
static class FixItems implements IFixableData {
|
||||
|
||||
private final String[] cloud_spawners = new String[] {
|
||||
"unicopia:racing_cloud_spawner",
|
||||
"unicopia:construction_cloud_spawner",
|
||||
"unicopia:wild_cloud_spawner"
|
||||
};
|
||||
|
||||
@Override
|
||||
public int getFixVersion() {
|
||||
return 1343;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound fixTagCompound(NBTTagCompound compound) {
|
||||
if (compound.hasKey("id", 8)) {
|
||||
String id = compound.getString("id");
|
||||
int damage = compound.hasKey("Damage", 3) ? compound.getInteger("Damage") : 0;
|
||||
|
||||
if (id == "unicopia:cloud") {
|
||||
id = cloud_spawners[damage % cloud_spawners.length];
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
if (id == "unicopia:tomato" && damage == 1) {
|
||||
id = "unicopia:rotten_tomato";
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
if (id == "unicopia:cloudsdale_tomato" && damage == 1) {
|
||||
id = "unicopia:rotten_cloudsdale_tomato";
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
compound.setString("id", id);
|
||||
compound.setInteger("Damage", 0);
|
||||
}
|
||||
|
||||
return compound;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class FixCloudItems implements IFixableData {
|
||||
@Override
|
||||
public int getFixVersion() {
|
||||
return 1342;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound fixTagCompound(NBTTagCompound compound) {
|
||||
|
||||
if (compound.hasKey("id", 8) && compound.hasKey("Damage", 3)) {
|
||||
String id = compound.getString("id");
|
||||
int damage = compound.getInteger("Damage");
|
||||
|
||||
if (id == "unicopia:cloud_block") {
|
||||
if (damage == 1) {
|
||||
damage = 0;
|
||||
id = "unicopia:packed_cloud_block";
|
||||
} else if (damage == 2) {
|
||||
damage = 0;
|
||||
id = "unicopia:enchanted_cloud_block";
|
||||
}
|
||||
}
|
||||
|
||||
if (id == "unicopia:cloud_slab") {
|
||||
if (damage == 1) {
|
||||
damage = 0;
|
||||
id = "unicopia:packed_cloud_slab";
|
||||
} else if (damage == 2) {
|
||||
damage = 0;
|
||||
id = "unicopia:enchanted_cloud_slab";
|
||||
}
|
||||
}
|
||||
|
||||
compound.setString("id", id);
|
||||
compound.setInteger("Damage", 0);
|
||||
}
|
||||
|
||||
return compound;
|
||||
}
|
||||
}
|
||||
|
||||
static class FixCloudBlocks extends BlockFixer {
|
||||
|
||||
@Override
|
||||
public int getFixVersion() {
|
||||
return 1342;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IBlockState fixBlockState(int id, int metadata) {
|
||||
if (id == Block.getIdFromBlock(UBlocks.normal_cloud) && metadata != 0) {
|
||||
if (metadata == 1) {
|
||||
return UBlocks.packed_cloud.getDefaultState();
|
||||
}
|
||||
if (metadata == 2) {
|
||||
return UBlocks.enchanted_cloud.getDefaultState();
|
||||
}
|
||||
}
|
||||
|
||||
int shifted = metadata % 8;
|
||||
|
||||
if (id == Block.getIdFromBlock(UBlocks.cloud_slab) && shifted != 0) {
|
||||
if (shifted == 1) {
|
||||
return UBlocks.packed_cloud_slab.getStateFromMeta(metadata - shifted);
|
||||
}
|
||||
if (shifted == 2) {
|
||||
return UBlocks.enchanted_cloud_slab.getStateFromMeta(metadata - shifted);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,11 +1,6 @@
|
|||
package com.minelittlepony.unicopia.extern;
|
||||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.MineLittlePony;
|
||||
import com.minelittlepony.pony.data.IPony;
|
||||
import com.minelittlepony.pony.data.PonyRace;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
|
||||
public final class MineLP {
|
||||
private static boolean checkComplete;
|
||||
|
@ -34,7 +29,7 @@ public final class MineLP {
|
|||
return Race.HUMAN;
|
||||
}
|
||||
|
||||
switch (IPony.forPlayer(Minecraft.getMinecraft().player).getRace(false)) {
|
||||
switch (IPony.forPlayer(MinecraftClient.getInstance().player).getRace(false)) {
|
||||
case ALICORN:
|
||||
return Race.ALICORN;
|
||||
case CHANGELING:
|
|
@ -1,50 +1,49 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
public final class Predicates {
|
||||
public static final Predicate<EntityPlayer> INTERACT_WITH_CLOUDS = player -> {
|
||||
return player != null && PlayerSpeciesList.instance().getPlayer(player).getPlayerSpecies().canInteractWithClouds();
|
||||
public static final Predicate<PlayerEntity> INTERACT_WITH_CLOUDS = player -> {
|
||||
return player != null && SpeciesList.instance().getPlayer(player).getSpecies().canInteractWithClouds();
|
||||
};
|
||||
|
||||
public static final Predicate<Entity> MAGI = entity -> {
|
||||
return entity instanceof EntityPlayer && PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity).getPlayerSpecies().canCast();
|
||||
return entity instanceof PlayerEntity && SpeciesList.instance().getPlayer((PlayerEntity)entity).getSpecies().canCast();
|
||||
};
|
||||
|
||||
public static final Predicate<Entity> ITEMS = entity -> {
|
||||
return entity instanceof EntityItem && entity.isEntityAlive() && entity.ticksExisted > 1;
|
||||
return entity instanceof ItemEntity && entity.isAlive() && entity.age > 1;
|
||||
};
|
||||
|
||||
public static final Predicate<EntityItem> ITEM_INTERACT_WITH_CLOUDS = item -> {
|
||||
return ITEMS.test(item) && PlayerSpeciesList.instance().getEntity(item).getPlayerSpecies().canInteractWithClouds();
|
||||
public static final Predicate<ItemEntity> ITEM_INTERACT_WITH_CLOUDS = item -> {
|
||||
return ITEMS.test(item) && SpeciesList.instance().getEntity(item).getSpecies().canInteractWithClouds();
|
||||
};
|
||||
|
||||
public static final Predicate<Entity> ENTITY_INTERACT_WITH_CLOUDS = entity -> {
|
||||
return entity != null && (
|
||||
(entity instanceof EntityPlayer && INTERACT_WITH_CLOUDS.test((EntityPlayer)entity))
|
||||
|| (entity instanceof EntityItem && ITEM_INTERACT_WITH_CLOUDS.test((EntityItem)entity))
|
||||
(entity instanceof PlayerEntity && INTERACT_WITH_CLOUDS.test((PlayerEntity)entity))
|
||||
|| (entity instanceof ItemEntity && ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)entity))
|
||||
);
|
||||
};
|
||||
|
||||
public static final Predicate<Entity> BUGGY = entity -> {
|
||||
return entity instanceof EntityPlayer
|
||||
&& PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity).getPlayerSpecies() == Race.CHANGELING;
|
||||
return entity instanceof PlayerEntity
|
||||
&& SpeciesList.instance().getPlayer((PlayerEntity)entity).getSpecies() == Race.CHANGELING;
|
||||
};
|
||||
|
||||
public static EntityPlayer getPlayerFromEntity(Entity entity) {
|
||||
if (entity instanceof EntityPlayer) {
|
||||
return (EntityPlayer) entity;
|
||||
public static PlayerEntity getPlayerFromEntity(Entity entity) {
|
||||
if (entity instanceof PlayerEntity) {
|
||||
return (PlayerEntity) entity;
|
||||
}
|
||||
|
||||
if (entity instanceof EntityItem) {
|
||||
EntityItem item = (EntityItem)entity;
|
||||
if (entity instanceof ItemEntity) {
|
||||
ItemEntity item = (ItemEntity)entity;
|
||||
if (item.getOwner() != null) {
|
||||
return item.getEntityWorld().getPlayerEntityByName(item.getOwner());
|
||||
return item.getEntityWorld().getPlayerByUuid(item.getOwner());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
83
src/main/java/com/minelittlepony/unicopia/SpeciesList.java
Normal file
83
src/main/java/com/minelittlepony/unicopia/SpeciesList.java
Normal file
|
@ -0,0 +1,83 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.UConfig;
|
||||
import com.minelittlepony.unicopia.ducks.IRaceContainerHolder;
|
||||
import com.minelittlepony.unicopia.entity.IEntity;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
public class SpeciesList {
|
||||
|
||||
private static final SpeciesList instance = new SpeciesList();
|
||||
|
||||
public static SpeciesList instance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public boolean whiteListRace(Race race) {
|
||||
boolean result = UConfig.instance().getSpeciesWhiteList().add(race);
|
||||
|
||||
UConfig.instance().save();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean unwhiteListRace(Race race) {
|
||||
boolean result = UConfig.instance().getSpeciesWhiteList().remove(race);
|
||||
|
||||
UConfig.instance().save();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean speciesPermitted(Race race, PlayerEntity sender) {
|
||||
if (race.isOp() && (sender == null || !sender.abilities.creativeMode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return race.isDefault() || UConfig.instance().getSpeciesWhiteList().isEmpty() || UConfig.instance().getSpeciesWhiteList().contains(race);
|
||||
}
|
||||
|
||||
public Race validate(Race race, PlayerEntity sender) {
|
||||
if (!speciesPermitted(race, sender)) {
|
||||
race = Race.EARTH;
|
||||
|
||||
if (!speciesPermitted(race, sender)) {
|
||||
race = Race.HUMAN;
|
||||
}
|
||||
}
|
||||
|
||||
return race;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public IPlayer getPlayer(@Nullable PlayerEntity player) {
|
||||
return this.<IPlayer>getEntity(player);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public IPlayer getPlayer(UUID playerId) {
|
||||
return getPlayer(IPlayer.fromServer(playerId));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public <T extends IEntity> T getEntity(Entity entity) {
|
||||
return this.<Entity, T>getForEntity(entity)
|
||||
.map(IRaceContainerHolder::getRaceContainer)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <E extends Entity, T extends IEntity> Optional<IRaceContainerHolder<T>> getForEntity(Entity entity) {
|
||||
if (entity instanceof IRaceContainerHolder) {
|
||||
return Optional.of(((IRaceContainerHolder<T>)entity));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
124
src/main/java/com/minelittlepony/unicopia/UBlocks.java
Normal file
124
src/main/java/com/minelittlepony/unicopia/UBlocks.java
Normal file
|
@ -0,0 +1,124 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
import com.minelittlepony.unicopia.Unicopia;
|
||||
import com.minelittlepony.unicopia.block.BlockAlfalfa;
|
||||
import com.minelittlepony.unicopia.block.ChiselledChitinBlock;
|
||||
import com.minelittlepony.unicopia.block.ChitinBlock;
|
||||
import com.minelittlepony.unicopia.block.FruitLeavesBlock;
|
||||
import com.minelittlepony.unicopia.block.GlowingGemBlock;
|
||||
import com.minelittlepony.unicopia.block.BlockGrowingCuccoon;
|
||||
import com.minelittlepony.unicopia.block.HiveWallBlock;
|
||||
import com.minelittlepony.unicopia.block.IColourful;
|
||||
import com.minelittlepony.unicopia.block.SlimeLayerBlock;
|
||||
import com.minelittlepony.unicopia.block.StickBlock;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudAnvil;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudBanister;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudSlab;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudStairs;
|
||||
import com.minelittlepony.unicopia.block.BlockDutchDoor;
|
||||
import com.minelittlepony.unicopia.block.SugarBlock;
|
||||
import com.minelittlepony.unicopia.block.UPot;
|
||||
import com.minelittlepony.unicopia.block.USapling;
|
||||
import com.minelittlepony.unicopia.block.BlockTomatoPlant;
|
||||
import com.minelittlepony.unicopia.item.ItemApple;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudDoor;
|
||||
import com.minelittlepony.unicopia.block.BlockDiamondDoor;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudFarm;
|
||||
import com.minelittlepony.unicopia.block.BlockCloudFence;
|
||||
import com.minelittlepony.unicopia.block.BlockCloud;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.client.color.block.BlockColors;
|
||||
import net.minecraft.client.color.item.ItemColors;
|
||||
import net.minecraft.client.color.world.BiomeColors;
|
||||
import net.minecraft.client.color.world.GrassColors;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class UBlocks {
|
||||
public static final BlockCloud normal_cloud = register(new BlockCloud(UMaterials.cloud, CloudType.NORMAL, Unicopia.MODID, "cloud_block"));
|
||||
public static final BlockCloud enchanted_cloud = register(new BlockCloud(UMaterials.cloud, CloudType.ENCHANTED, Unicopia.MODID, "enchanted_cloud_block"));
|
||||
public static final BlockCloud packed_cloud = register(new BlockCloud(UMaterials.cloud, CloudType.PACKED, Unicopia.MODID, "packed_cloud_block"));
|
||||
|
||||
public static final BlockCloudStairs cloud_stairs = register(new BlockCloudStairs(normal_cloud.getDefaultState(), Unicopia.MODID, "cloud_stairs"));
|
||||
|
||||
public static final BlockCloudSlab.Single<?> cloud_slab = register(new BlockCloudSlab.Single<>(normal_cloud, UMaterials.cloud, Unicopia.MODID, "cloud_slab"));
|
||||
public static final BlockCloudSlab.Single<?> enchanted_cloud_slab = register(new BlockCloudSlab.Single<>(enchanted_cloud, UMaterials.cloud, Unicopia.MODID, "enchanted_cloud_slab"));
|
||||
public static final BlockCloudSlab.Single<?> packed_cloud_slab = register(new BlockCloudSlab.Single<>(enchanted_cloud, UMaterials.cloud, Unicopia.MODID, "packed_cloud_slab"));
|
||||
|
||||
public static final BlockCloudDoor mist_door = register(new BlockCloudDoor(UMaterials.cloud, Unicopia.MODID, "mist_door", () -> UItems.mist_door));
|
||||
public static final Block library_door = register(new BlockDutchDoor(Material.WOOD, Unicopia.MODID, "library_door", () -> UItems.library_door)
|
||||
.setSoundType(SoundType.WOOD)
|
||||
.setHardness(3));
|
||||
public static final Block bakery_door = register(new BlockDutchDoor(Material.WOOD, Unicopia.MODID, "bakery_door", () -> UItems.bakery_door)
|
||||
.setSoundType(SoundType.WOOD)
|
||||
.setHardness(3));
|
||||
public static final Block diamond_door = register(new BlockDiamondDoor(Unicopia.MODID, "diamond_door", () -> UItems.diamond_door));
|
||||
|
||||
public static final GlowingGemBlock enchanted_torch = register(new GlowingGemBlock(Unicopia.MODID, "enchanted_torch"));
|
||||
|
||||
public static final BlockCloudAnvil anvil = register(new BlockCloudAnvil(Unicopia.MODID, "anvil"));
|
||||
|
||||
public static final BlockCloudFence cloud_fence = register(new BlockCloudFence(UMaterials.cloud, CloudType.NORMAL, Unicopia.MODID, "cloud_fence"));
|
||||
public static final BlockCloudBanister cloud_banister = register(new BlockCloudBanister(UMaterials.cloud, Unicopia.MODID, "cloud_banister"));
|
||||
|
||||
public static final BlockAlfalfa alfalfa = register(new BlockAlfalfa(Unicopia.MODID, "alfalfa"));
|
||||
|
||||
public static final StickBlock stick = register(new StickBlock(Unicopia.MODID, "stick"));
|
||||
public static final BlockTomatoPlant tomato_plant = register(new BlockTomatoPlant(Unicopia.MODID, "tomato_plant"));
|
||||
|
||||
public static final BlockCloudFarm cloud_farmland = register(new BlockCloudFarm(Unicopia.MODID, "cloud_farmland"));
|
||||
|
||||
public static final HiveWallBlock hive = register(new HiveWallBlock(Unicopia.MODID, "hive"));
|
||||
public static final ChitinBlock chitin = register(new ChitinBlock(Unicopia.MODID, "chitin_block"));
|
||||
public static final Block chissled_chitin = register(new ChiselledChitinBlock(Unicopia.MODID, "chissled_chitin"));
|
||||
|
||||
public static final BlockGrowingCuccoon cuccoon = register(new BlockGrowingCuccoon(Unicopia.MODID, "cuccoon"));
|
||||
public static final SlimeLayerBlock slime_layer = register(new SlimeLayerBlock(Unicopia.MODID, "slime_layer"));
|
||||
|
||||
public static final Block sugar_block = register(new SugarBlock(Unicopia.MODID, "sugar_block"));
|
||||
public static final UPot flower_pot = register(new UPot(), "flower_pot");
|
||||
|
||||
public static final USapling apple_tree = register(new USapling(Unicopia.MODID, "apple_sapling")
|
||||
.setTreeGen((w, s, m) -> new WorldGenTrees(true, 5, Blocks.LOG.getDefaultState(), UBlocks.apple_leaves.getDefaultState(), false));
|
||||
public static final Block apple_leaves = register(new FruitLeavesBlock()
|
||||
.growthChance(1200)
|
||||
.tint(0xFFEE81)
|
||||
.fruit(ItemApple::getRandomItemStack)
|
||||
.compost(w -> new ItemStack(UItems.rotten_apple))), "apple_leaves");
|
||||
|
||||
|
||||
private static <T extends Block> T register(T block) {
|
||||
return block;
|
||||
}
|
||||
|
||||
static void registerColors(ItemColors items, BlockColors blocks) {
|
||||
items.register((stack, tint) -> {
|
||||
@SuppressWarnings("deprecation")
|
||||
BlockState state = ((BlockItem)stack.getItem()).getBlock().getStateFromMeta(stack.getMetadata());
|
||||
|
||||
return blocks.getColorMultiplier(state, null, null, tint);
|
||||
}, apple_leaves);
|
||||
blocks.register((state, world, pos, tint) -> {
|
||||
Block block = state.getBlock();
|
||||
|
||||
if (block instanceof IColourful) {
|
||||
return ((IColourful)block).getCustomTint(state, tint);
|
||||
}
|
||||
|
||||
if (world != null && pos != null) {
|
||||
return BiomeColors.getGrassColor(world, pos);
|
||||
}
|
||||
|
||||
return GrassColors.getColor(0.5D, 1);
|
||||
}, apple_leaves);
|
||||
}
|
||||
|
||||
static void bootstrap() { }
|
||||
}
|
|
@ -6,25 +6,20 @@ import javax.annotation.Nonnull;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.entity.EntityFakeServerPlayer;
|
||||
import com.minelittlepony.unicopia.forgebullshit.FUF;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.world.IInteractionObject;
|
||||
import net.minecraft.world.WorldServer;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
public class UClient {
|
||||
|
||||
private static UClient instance;
|
||||
|
||||
public static boolean isClientSide() {
|
||||
return net.minecraftforge.fml.common.FMLCommonHandler.instance().getSide().isClient();
|
||||
return false;
|
||||
}
|
||||
|
||||
@FUF(reason = "Forced client Separation")
|
||||
public static UClient instance() {
|
||||
if (instance == null) {
|
||||
if (isClientSide()) {
|
||||
|
@ -37,30 +32,26 @@ public class UClient {
|
|||
return instance;
|
||||
}
|
||||
|
||||
@FUF(reason = "Forced client Separation")
|
||||
public void displayGuiToPlayer(EntityPlayer player, IInteractionObject inventory) {
|
||||
public void displayGuiToPlayer(PlayerEntity player, InteractionObject inventory) {
|
||||
player.displayGui(inventory);
|
||||
}
|
||||
|
||||
@FUF(reason = "Forced client Separation")
|
||||
@Nullable
|
||||
public EntityPlayer getPlayer() {
|
||||
public PlayerEntity getPlayer() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public IPlayer getIPlayer() {
|
||||
return PlayerSpeciesList.instance().getPlayer(getPlayer());
|
||||
return SpeciesList.instance().getPlayer(getPlayer());
|
||||
}
|
||||
|
||||
@FUF(reason = "Forced client Separation")
|
||||
@Nullable
|
||||
public EntityPlayer getPlayerByUUID(UUID playerId) {
|
||||
public PlayerEntity getPlayerByUUID(UUID playerId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@FUF(reason = "Forced client Separation")
|
||||
public boolean isClientPlayer(@Nullable EntityPlayer player) {
|
||||
public boolean isClientPlayer(@Nullable PlayerEntity player) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -74,7 +65,7 @@ public class UClient {
|
|||
* Returns an implementation of EntityPlayer appropriate to the side being called on.
|
||||
*/
|
||||
@Nonnull
|
||||
public EntityPlayer createPlayer(Entity observer, GameProfile profile) {
|
||||
public PlayerEntity createPlayer(Entity observer, GameProfile profile) {
|
||||
return new EntityFakeServerPlayer((WorldServer)observer.world, profile);
|
||||
}
|
||||
|
||||
|
|
31
src/main/java/com/minelittlepony/unicopia/UEffects.java
Normal file
31
src/main/java/com/minelittlepony/unicopia/UEffects.java
Normal file
|
@ -0,0 +1,31 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.unicopia.Unicopia;
|
||||
|
||||
import net.minecraft.entity.damage.DamageSource;
|
||||
import net.minecraft.entity.effect.StatusEffect;
|
||||
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||
import net.minecraft.entity.effect.StatusEffects;
|
||||
import net.minecraft.potion.Potion;
|
||||
|
||||
public class UEffects {
|
||||
|
||||
public static final DamageSource food_poisoning = new DamageSource("food_poisoning").bypassesArmor();
|
||||
|
||||
public static final StatusEffect FOOD_POISONING = new UPotion(Unicopia.MODID, "food_poisoning", true, 3484199)
|
||||
.setIconIndex(3, 1)
|
||||
.setSilent()
|
||||
.setEffectiveness(0.25)
|
||||
.setApplicator((p, e, i) -> {
|
||||
|
||||
StatusEffectInstance nausea = e.getActivePotionEffect(StatusEffects.NAUSEA);
|
||||
if (nausea == null) {
|
||||
StatusEffect foodEffect = e.getActivePotionEffect(p);
|
||||
nausea = new StatusEffectInstance(StatusEffects.NAUSEA, foodEffect.getDuration(), foodEffect.getAmplifier(), foodEffect.getIsAmbient(), foodEffect.doesShowParticles());
|
||||
|
||||
e.addPotionEffect(nausea);
|
||||
}
|
||||
|
||||
e.attackEntityFrom(food_poisoning, i);
|
||||
});
|
||||
}
|
|
@ -1,6 +1,14 @@
|
|||
package com.minelittlepony.unicopia.init;
|
||||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.unicopia.Unicopia;
|
||||
import com.minelittlepony.unicopia.client.render.entity.ButterflyEntityRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderCloud;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderCuccoon;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderGem;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderProjectile;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderRainbow;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderSpear;
|
||||
import com.minelittlepony.unicopia.client.render.entity.RenderSpellbook;
|
||||
import com.minelittlepony.unicopia.entity.EntityButterfly;
|
||||
import com.minelittlepony.unicopia.entity.EntityCloud;
|
||||
import com.minelittlepony.unicopia.entity.EntityConstructionCloud;
|
||||
|
@ -8,20 +16,12 @@ import com.minelittlepony.unicopia.entity.EntityCuccoon;
|
|||
import com.minelittlepony.unicopia.entity.EntityRacingCloud;
|
||||
import com.minelittlepony.unicopia.entity.EntityRainbow;
|
||||
import com.minelittlepony.unicopia.entity.EntitySpear;
|
||||
import com.minelittlepony.unicopia.entity.EntitySpell;
|
||||
import com.minelittlepony.unicopia.entity.SpellcastEntity;
|
||||
import com.minelittlepony.unicopia.entity.EntitySpellbook;
|
||||
import com.minelittlepony.unicopia.entity.EntityProjectile;
|
||||
import com.minelittlepony.unicopia.entity.EntityWildCloud;
|
||||
import com.minelittlepony.unicopia.entity.item.AdvancedProjectileEntity;
|
||||
import com.minelittlepony.unicopia.forgebullshit.BiomeBS;
|
||||
import com.minelittlepony.unicopia.forgebullshit.EntityType;
|
||||
import com.minelittlepony.unicopia.render.RenderButterfly;
|
||||
import com.minelittlepony.unicopia.render.RenderCloud;
|
||||
import com.minelittlepony.unicopia.render.RenderCuccoon;
|
||||
import com.minelittlepony.unicopia.render.RenderGem;
|
||||
import com.minelittlepony.unicopia.render.RenderProjectile;
|
||||
import com.minelittlepony.unicopia.render.RenderRainbow;
|
||||
import com.minelittlepony.unicopia.render.RenderSpear;
|
||||
import com.minelittlepony.unicopia.render.RenderSpellbook;
|
||||
|
||||
import net.minecraft.entity.EnumCreatureType;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
|
@ -45,24 +45,24 @@ public class UEntities {
|
|||
builder.creature(EntityWildCloud.class, "wild_cloud"),
|
||||
builder.creature(EntityRacingCloud.class, "racing_cloud"),
|
||||
builder.creature(EntityConstructionCloud.class, "construction_cloud"),
|
||||
builder.creature(EntitySpell.class, "magic_spell"),
|
||||
builder.creature(SpellcastEntity.class, "magic_spell"),
|
||||
builder.creature(EntitySpellbook.class, "spellbook"),
|
||||
builder.creature(EntityRainbow.Spawner.class, "rainbow_spawner"),
|
||||
builder.creature(EntityCuccoon.class, "cuccoon"),
|
||||
builder.creature(EntityButterfly.class, "butterfly").withEgg(0x222200, 0xaaeeff),
|
||||
builder.projectile(EntityRainbow.class, "rainbow", 500, 5),
|
||||
builder.projectile(EntityProjectile.class, "thrown_item", 100, 10),
|
||||
builder.projectile(AdvancedProjectileEntity.class, "thrown_item", 100, 10),
|
||||
builder.projectile(EntitySpear.class, "spear", 100, 10)
|
||||
);
|
||||
}
|
||||
|
||||
public static void preInit() {
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntityCloud.class, RenderCloud::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntitySpell.class, RenderGem::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntityProjectile.class, RenderProjectile::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(SpellcastEntity.class, RenderGem::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(AdvancedProjectileEntity.class, RenderProjectile::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntitySpellbook.class, RenderSpellbook::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntityRainbow.class, RenderRainbow::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntityButterfly.class, RenderButterfly::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntityButterfly.class, ButterflyEntityRenderer::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntityCuccoon.class, RenderCuccoon::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(EntitySpear.class, RenderSpear::new);
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.minelittlepony.unicopia.init;
|
||||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.unicopia.item.ItemAlicornAmulet;
|
||||
import com.minelittlepony.unicopia.item.ItemApple;
|
||||
|
@ -43,7 +43,7 @@ import net.minecraft.item.ItemFood;
|
|||
import net.minecraft.item.ItemSeedFood;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.FurnaceRecipes;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
|
@ -288,12 +288,12 @@ public class UItems {
|
|||
record_crusade, record_pet, record_popular, record_funk);
|
||||
|
||||
if (UClient.isClientSide()) {
|
||||
BuildInTexturesBakery.getBuiltInTextures().add(new ResourceLocation(Unicopia.MODID, "items/empty_slot_gem"));
|
||||
BuildInTexturesBakery.getBuiltInTextures().add(new Identifier(Unicopia.MODID, "items/empty_slot_gem"));
|
||||
}
|
||||
|
||||
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(cuccoon), new ItemStack(chitin_shell), 0.3F);
|
||||
FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(zap_apple), new ItemStack(cooked_zap_apple), 0.1F);
|
||||
FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(juice), new ItemStack(burned_juice), 0);
|
||||
FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(cuccoon), new ItemStack(chitin_shell), 0.3F);
|
||||
}
|
||||
|
||||
public static void fixRecipes() {
|
||||
|
@ -305,8 +305,8 @@ public class UItems {
|
|||
@SideOnly(Side.CLIENT)
|
||||
static void registerColors(ItemColors registry) {
|
||||
registry.registerItemColorHandler((stack, tint) -> {
|
||||
if (MAGI.test(Minecraft.getMinecraft().player)) {
|
||||
return SpellRegistry.instance().getSpellTintFromStack(stack);
|
||||
if (MAGI.test(MinecraftClient.getInstance().player)) {
|
||||
return SpellRegistry.getInstance().getSpellTintFromStack(stack);
|
||||
}
|
||||
|
||||
return 0xffffff;
|
|
@ -0,0 +1,9 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.block.MaterialColor;
|
||||
|
||||
public class UMaterials {
|
||||
public static final Material cloud = new Material.Builder(MaterialColor.WHITE).build();
|
||||
public static final Material hive = new Material.Builder(MaterialColor.NETHER).build();
|
||||
}
|
33
src/main/java/com/minelittlepony/unicopia/UParticles.java
Normal file
33
src/main/java/com/minelittlepony/unicopia/UParticles.java
Normal file
|
@ -0,0 +1,33 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import com.minelittlepony.unicopia.client.particle.ParticleChangelingMagic;
|
||||
import com.minelittlepony.unicopia.client.particle.ParticleDisk;
|
||||
import com.minelittlepony.unicopia.client.particle.ParticleRaindrops;
|
||||
import com.minelittlepony.unicopia.client.particle.ParticleSphere;
|
||||
import com.minelittlepony.unicopia.client.particle.ParticleUnicornMagic;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.particles.ParticleFactoryRegistry;
|
||||
import net.fabricmc.fabric.api.particles.ParticleTypeRegistry;
|
||||
import net.minecraft.particle.DefaultParticleType;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class UParticles {
|
||||
public static final DefaultParticleType UNICORN_MAGIC = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "unicorn_magic"));
|
||||
public static final DefaultParticleType CHANGELING_MAGIC = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "changeling_magic"));
|
||||
|
||||
public static final DefaultParticleType RAIN_DROPS = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "rain_drops"));
|
||||
|
||||
public static final DefaultParticleType SPHERE = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "sphere"));
|
||||
public static final DefaultParticleType DISK = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "disk"));
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public void onInitializeClient() {
|
||||
ParticleFactoryRegistry.getInstance().register(UNICORN_MAGIC, ParticleUnicornMagic::new);
|
||||
ParticleFactoryRegistry.getInstance().register(CHANGELING_MAGIC, ParticleChangelingMagic::new);
|
||||
ParticleFactoryRegistry.getInstance().register(RAIN_DROPS, ParticleRaindrops::new);
|
||||
ParticleFactoryRegistry.getInstance().register(SPHERE, ParticleSphere::new);
|
||||
ParticleFactoryRegistry.getInstance().register(DISK, ParticleDisk::new);
|
||||
}
|
||||
}
|
|
@ -1,12 +1,12 @@
|
|||
package com.minelittlepony.unicopia.potion;
|
||||
package com.minelittlepony.unicopia;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.effect.StatusEffect;
|
||||
import net.minecraft.potion.Potion;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
|
||||
public class UPotion extends Potion {
|
||||
public class UPotion extends StatusEffect {
|
||||
|
||||
private boolean isSilent;
|
||||
private int tickDelay = 40;
|
||||
|
@ -69,7 +69,7 @@ public class UPotion extends Potion {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void performEffect(EntityLivingBase entity, int amplifier) {
|
||||
public void performEffect(LivingEntity entity, int amplifier) {
|
||||
applicator.performEffect(this, entity, amplifier);
|
||||
}
|
||||
|
||||
|
@ -95,6 +95,6 @@ public class UPotion extends Potion {
|
|||
public interface IEffectApplicator {
|
||||
IEffectApplicator NONE = (p, e, i) -> {};
|
||||
|
||||
void performEffect(Potion effect, EntityLivingBase target, int amplifier);
|
||||
void performEffect(Potion effect, LivingEntity target, int amplifier);
|
||||
}
|
||||
}
|
29
src/main/java/com/minelittlepony/unicopia/USounds.java
Normal file
29
src/main/java/com/minelittlepony/unicopia/USounds.java
Normal file
|
@ -0,0 +1,29 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import net.minecraft.sound.SoundEvent;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
|
||||
public class USounds {
|
||||
|
||||
public static final SoundEvent WING_FLAP = register("wing_flap");
|
||||
public static final SoundEvent WIND_RUSH = register("wind_rush");
|
||||
|
||||
public static final SoundEvent INSECT = register("insect");
|
||||
public static final SoundEvent CHANGELING_BUZZ = register("changeling_buzz");
|
||||
|
||||
public static final SoundEvent SLIME_ADVANCE = register("slime_advance");
|
||||
public static final SoundEvent SLIME_RETRACT = register("slime_retract");
|
||||
|
||||
public static final SoundEvent RECORD_CRUSADE = register("record.crusade");
|
||||
public static final SoundEvent RECORD_PET = register("record.pet");
|
||||
public static final SoundEvent RECORD_POPULAR = register("record.popular");
|
||||
public static final SoundEvent RECORD_FUNK = register("record.funk");
|
||||
|
||||
private static SoundEvent register(String name) {
|
||||
Identifier id = new Identifier(Unicopia.MODID, name);
|
||||
return Registry.register(Registry.SOUND_EVENT, id, new SoundEvent(id));
|
||||
}
|
||||
|
||||
static void bootstrap() {}
|
||||
}
|
|
@ -1,20 +1,8 @@
|
|||
package com.minelittlepony.unicopia;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventHandler;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
|
||||
import net.minecraftforge.fml.common.network.IGuiHandler;
|
||||
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
|
@ -22,33 +10,22 @@ import org.apache.logging.log4j.LogManager;
|
|||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minelittlepony.jumpingcastle.api.IChannel;
|
||||
import com.minelittlepony.jumpingcastle.api.JumpingCastle;
|
||||
import com.minelittlepony.unicopia.ability.powers.PowersRegistry;
|
||||
import com.minelittlepony.unicopia.advancements.UAdvancements;
|
||||
import com.minelittlepony.unicopia.command.Commands;
|
||||
import com.minelittlepony.unicopia.enchanting.AffineIngredients;
|
||||
import com.minelittlepony.unicopia.enchanting.Pages;
|
||||
import com.minelittlepony.unicopia.enchanting.SpecialRecipe;
|
||||
import com.minelittlepony.unicopia.enchanting.SpellRecipe;
|
||||
import com.minelittlepony.unicopia.forgebullshit.FBS;
|
||||
import com.minelittlepony.unicopia.init.UEntities;
|
||||
import com.minelittlepony.unicopia.init.UItems;
|
||||
import com.minelittlepony.unicopia.inventory.gui.ContainerSpellBook;
|
||||
import com.minelittlepony.unicopia.inventory.gui.SpellBookContainer;
|
||||
import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook;
|
||||
import com.minelittlepony.unicopia.network.MsgPlayerAbility;
|
||||
import com.minelittlepony.unicopia.network.MsgPlayerCapabilities;
|
||||
import com.minelittlepony.unicopia.network.MsgRequestCapabilities;
|
||||
import com.minelittlepony.unicopia.power.PowersRegistry;
|
||||
import com.minelittlepony.unicopia.util.crafting.CraftingManager;
|
||||
import com.minelittlepony.unicopia.world.Hooks;
|
||||
import com.minelittlepony.unicopia.world.UWorld;
|
||||
|
||||
@Mod(
|
||||
modid = Unicopia.MODID,
|
||||
name = Unicopia.NAME,
|
||||
version = Unicopia.VERSION,
|
||||
dependencies = "required-after:jumpingcastle;after:baubles"
|
||||
)
|
||||
public class Unicopia implements IGuiHandler {
|
||||
public static final String MODID = "unicopia";
|
||||
public static final String NAME = "@NAME@";
|
||||
|
@ -78,26 +55,20 @@ public class Unicopia implements IGuiHandler {
|
|||
return channel;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void preInit(FMLPreInitializationEvent event) {
|
||||
UConfig.init(event.getModConfigurationDirectory());
|
||||
UClient.instance().preInit();
|
||||
UWorld.instance().init();
|
||||
|
||||
MinecraftForge.TERRAIN_GEN_BUS.register(Hooks.class);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerCreated(FMLServerAboutToStartEvent event) {
|
||||
Fixes.init(event.getServer().getDataFixer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerStart(FMLServerStartingEvent event) {
|
||||
Commands.init(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void init(FMLInitializationEvent event) {
|
||||
channel = JumpingCastle.subscribeTo(MODID, () -> {})
|
||||
.listenFor(MsgRequestCapabilities.class)
|
||||
|
@ -115,7 +86,6 @@ public class Unicopia implements IGuiHandler {
|
|||
UClient.instance().init();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void postInit(FMLPostInitializationEvent event) {
|
||||
craftingManager.load();
|
||||
|
||||
|
@ -130,7 +100,7 @@ public class Unicopia implements IGuiHandler {
|
|||
@Override
|
||||
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
||||
switch (ID) {
|
||||
case 0: return new ContainerSpellBook(player.inventory, world, new BlockPos(x, y, z));
|
||||
case 0: return new SpellBookContainer(player.inventory, world, new BlockPos(x, y, z));
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,35 +6,20 @@ import java.util.UUID;
|
|||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.gui.Button;
|
||||
import com.minelittlepony.jumpingcastle.api.Target;
|
||||
import com.minelittlepony.unicopia.entity.EntityFakeClientPlayer;
|
||||
import com.minelittlepony.unicopia.extern.MineLP;
|
||||
import com.minelittlepony.unicopia.gui.GuiScreenSettings;
|
||||
import com.minelittlepony.unicopia.init.UEntities;
|
||||
import com.minelittlepony.unicopia.init.UParticles;
|
||||
import com.minelittlepony.unicopia.input.Keyboard;
|
||||
import com.minelittlepony.unicopia.input.MouseControl;
|
||||
import com.minelittlepony.unicopia.input.MovementControl;
|
||||
import com.minelittlepony.unicopia.inventory.gui.GuiOfHolding;
|
||||
import com.minelittlepony.unicopia.ability.powers.render.DisguiseRenderer;
|
||||
import com.minelittlepony.unicopia.client.gui.SettingsScreen;
|
||||
import com.minelittlepony.unicopia.client.input.Keyboard;
|
||||
import com.minelittlepony.unicopia.client.input.MouseControl;
|
||||
import com.minelittlepony.unicopia.client.input.InversionAwareKeyboardInput;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.network.MsgRequestCapabilities;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
import com.minelittlepony.unicopia.render.DisguiseRenderer;
|
||||
import com.minelittlepony.util.gui.ButtonGridLayout;
|
||||
import com.minelittlepony.util.lang.ClientLocale;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.input.Input;
|
||||
import net.minecraft.client.network.ClientPlayerEntity;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.MovementInput;
|
||||
import net.minecraft.world.IInteractionObject;
|
||||
|
||||
import static com.minelittlepony.util.gui.ButtonGridLayout.*;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
public class UnicopiaClient extends UClient {
|
||||
|
||||
|
@ -50,7 +35,7 @@ public class UnicopiaClient extends UClient {
|
|||
|
||||
private static Race getclientPlayerRace() {
|
||||
if (!UConfig.instance().ignoresMineLittlePony()
|
||||
&& Minecraft.getMinecraft().player != null) {
|
||||
&& MinecraftClient.getInstance().player != null) {
|
||||
Race race = MineLP.getPlayerPonyRace();
|
||||
|
||||
if (!race.isDefault()) {
|
||||
|
@ -62,40 +47,11 @@ public class UnicopiaClient extends UClient {
|
|||
return UConfig.instance().getPrefferedRace();
|
||||
}
|
||||
|
||||
static void addUniButton(List<GuiButton> buttons) {
|
||||
ButtonGridLayout layout = new ButtonGridLayout(buttons);
|
||||
|
||||
GuiButton uni = new Button(0, 0, 150, 20, ClientLocale.format("gui.unicopia"), b -> {
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
|
||||
mc.displayGuiScreen(new GuiScreenSettings(mc.currentScreen));
|
||||
});
|
||||
|
||||
List<Integer> possibleXCandidates = list(layout.getColumns());
|
||||
List<Integer> possibleYCandidates = list(layout.getRows());
|
||||
|
||||
uni.y = last(possibleYCandidates, 1);
|
||||
|
||||
if (layout.getRows()
|
||||
.filter(y -> layout.getRow(y).size() == 1).count() < 2) {
|
||||
uni.y += 25;
|
||||
uni.x = first(possibleXCandidates, 0);
|
||||
|
||||
layout.getRow(last(possibleYCandidates, 0)).forEach(button -> {
|
||||
button.y = Math.max(button.y, uni.y + uni.height + 13);
|
||||
});
|
||||
} else {
|
||||
uni.x = first(possibleXCandidates, 2);
|
||||
}
|
||||
|
||||
layout.getElements().add(uni);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayGuiToPlayer(EntityPlayer player, IInteractionObject inventory) {
|
||||
if (player instanceof EntityPlayerSP) {
|
||||
if ("unicopia:itemofholding".equals(inventory.getGuiID())) {
|
||||
Minecraft.getMinecraft().displayGuiScreen(new GuiOfHolding(inventory));
|
||||
MinecraftClient.getInstance().displayGuiScreen(new GuiOfHolding(inventory));
|
||||
}
|
||||
} else {
|
||||
super.displayGuiToPlayer(player, inventory);
|
||||
|
@ -105,13 +61,13 @@ public class UnicopiaClient extends UClient {
|
|||
@Override
|
||||
@Nullable
|
||||
public EntityPlayer getPlayer() {
|
||||
return Minecraft.getMinecraft().player;
|
||||
return MinecraftClient.getInstance().player;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public EntityPlayer getPlayerByUUID(UUID playerId) {
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
Minecraft mc = MinecraftClient.getInstance();
|
||||
|
||||
if (mc.player.getUniqueID().equals(playerId)) {
|
||||
return mc.player;
|
||||
|
@ -120,6 +76,7 @@ public class UnicopiaClient extends UClient {
|
|||
return mc.world.getPlayerEntityByUUID(playerId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public EntityPlayer createPlayer(Entity observer, GameProfile profile) {
|
||||
return new EntityFakeClientPlayer(observer.world, profile);
|
||||
|
@ -140,13 +97,13 @@ public class UnicopiaClient extends UClient {
|
|||
|
||||
@Override
|
||||
public int getViewMode() {
|
||||
return Minecraft.getMinecraft().gameSettings.thirdPersonView;
|
||||
return MinecraftClient.getInstance().gameSettings.thirdPersonView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postRenderEntity(Entity entity) {
|
||||
if (entity instanceof EntityPlayer) {
|
||||
IPlayer iplayer = PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity);
|
||||
IPlayer iplayer = SpeciesList.instance().getPlayer((EntityPlayer)entity);
|
||||
|
||||
if (iplayer.getGravity().getGravitationConstant() < 0) {
|
||||
GlStateManager.translate(0, entity.height, 0);
|
||||
|
@ -160,12 +117,12 @@ public class UnicopiaClient extends UClient {
|
|||
@Override
|
||||
public boolean renderEntity(Entity entity, float renderPartialTicks) {
|
||||
|
||||
if (DisguiseRenderer.instance().renderDisguise(entity, renderPartialTicks)) {
|
||||
if (DisguiseRenderer.getInstance().renderDisguise(entity, renderPartialTicks)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (entity instanceof EntityPlayer) {
|
||||
IPlayer iplayer = PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity);
|
||||
IPlayer iplayer = SpeciesList.instance().getPlayer((EntityPlayer)entity);
|
||||
|
||||
if (iplayer.getGravity().getGravitationConstant() < 0) {
|
||||
GlStateManager.scale(1, -1, 1);
|
||||
|
@ -174,7 +131,7 @@ public class UnicopiaClient extends UClient {
|
|||
entity.rotationPitch *= -1;
|
||||
}
|
||||
|
||||
if (DisguiseRenderer.instance().renderDisguiseToGui(iplayer)) {
|
||||
if (DisguiseRenderer.getInstance().renderDisguiseToGui(iplayer)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -197,10 +154,11 @@ public class UnicopiaClient extends UClient {
|
|||
clientPlayerRace = getclientPlayerRace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
EntityPlayer player = UClient.instance().getPlayer();
|
||||
PlayerEntity player = UClient.instance().getPlayer();
|
||||
|
||||
if (player != null && !player.isDead) {
|
||||
if (player != null && !player.removed) {
|
||||
Race newRace = getclientPlayerRace();
|
||||
|
||||
if (newRace != clientPlayerRace) {
|
||||
|
@ -212,20 +170,20 @@ public class UnicopiaClient extends UClient {
|
|||
|
||||
Keyboard.getKeyHandler().onKeyInput();
|
||||
|
||||
if (player instanceof EntityPlayerSP) {
|
||||
EntityPlayerSP sp = (EntityPlayerSP)player;
|
||||
MinecraftClient client = MinecraftClient.getInstance();
|
||||
|
||||
MovementInput movement = sp.movementInput;
|
||||
if (player instanceof ClientPlayerEntity) {
|
||||
ClientPlayerEntity sp = (ClientPlayerEntity)player;
|
||||
|
||||
if (!(movement instanceof MovementControl)) {
|
||||
sp.movementInput = new MovementControl(movement);
|
||||
Input movement = sp.input;
|
||||
|
||||
if (!(movement instanceof InversionAwareKeyboardInput)) {
|
||||
sp.input = new InversionAwareKeyboardInput(client, movement);
|
||||
}
|
||||
}
|
||||
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
|
||||
if (!(mc.mouseHelper instanceof MouseControl)) {
|
||||
mc.mouseHelper = new MouseControl();
|
||||
if (!(client.mouse instanceof MouseControl)) {
|
||||
client.mouse = new MouseControl(client);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
public class Hit implements IData {
|
||||
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package com.minelittlepony.unicopia.player;
|
||||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
import com.minelittlepony.unicopia.power.IPower;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
|
||||
public interface IAbilityReceiver {
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
public interface IData {
|
||||
|
||||
}
|
|
@ -1,4 +1,6 @@
|
|||
package com.minelittlepony.unicopia.player;
|
||||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
|
||||
/**
|
||||
* Predicate for abilities to control whether a player can fly.
|
|
@ -1,11 +1,13 @@
|
|||
package com.minelittlepony.unicopia.player;
|
||||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
|
||||
/**
|
||||
* Predicate for abilities to control what the player's physical height is.
|
||||
*
|
||||
* This overrides the default.
|
||||
*/
|
||||
public interface IPlayerHeightPredicate {
|
||||
public interface IHeightPredicate {
|
||||
float getTargetEyeHeight(IPlayer player);
|
||||
|
||||
float getTargetBodyHeight(IPlayer player);
|
|
@ -1,36 +1,14 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.input.IKeyBind;
|
||||
import com.minelittlepony.unicopia.particle.Particles;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.util.shape.IShape;
|
||||
import com.minelittlepony.util.shape.Sphere;
|
||||
import com.minelittlepony.unicopia.client.input.IKeyBindingHandler;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IPower<T extends IData> extends IKeyBind {
|
||||
|
||||
static void spawnParticles(int particleId, Entity entity, int count, int...args) {
|
||||
double halfDist = entity.getEyeHeight() / 1.5;
|
||||
double middle = entity.getEntityBoundingBox().minY + halfDist;
|
||||
|
||||
IShape shape = new Sphere(false, (float)halfDist + entity.width);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
Vec3d point = shape.computePoint(entity.getEntityWorld().rand);
|
||||
|
||||
Particles.instance().spawnParticle(particleId, false,
|
||||
entity.posX + point.x,
|
||||
middle + point.y,
|
||||
entity.posZ + point.z,
|
||||
0, 0, 0, args);
|
||||
}
|
||||
}
|
||||
public interface IPower<T extends IData> extends IKeyBindingHandler.IKeyBinding {
|
||||
|
||||
@Override
|
||||
default String getKeyCategory() {
|
|
@ -1,7 +1,6 @@
|
|||
package com.minelittlepony.unicopia.power.data;
|
||||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import com.minelittlepony.unicopia.power.IData;
|
||||
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
package com.minelittlepony.unicopia.power.data;
|
||||
package com.minelittlepony.unicopia.ability;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import com.minelittlepony.unicopia.power.IData;
|
||||
|
||||
public class Numeric implements IData {
|
||||
|
|
@ -1,18 +1,18 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.entity.EntityCloud;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.power.data.Hit;
|
||||
import com.minelittlepony.util.vector.VecHelper;
|
||||
import com.minelittlepony.unicopia.ability.Hit;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
|
||||
import net.minecraft.client.network.packet.EntityPassengersSetS2CPacket;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.network.play.server.SPacketSetPassengers;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class PowerCarry implements IPower<Hit> {
|
||||
|
@ -24,7 +24,7 @@ public class PowerCarry implements IPower<Hit> {
|
|||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return Keyboard.KEY_K;
|
||||
return GLFW.GLFW_KEY_K;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -47,12 +47,12 @@ public class PowerCarry implements IPower<Hit> {
|
|||
return new Hit();
|
||||
}
|
||||
|
||||
protected EntityLivingBase findRider(EntityPlayer player, World w) {
|
||||
protected LivingEntity findRider(PlayerEntity player, World w) {
|
||||
Entity hit = VecHelper.getLookedAtEntity(player, 10);
|
||||
|
||||
if (hit instanceof EntityLivingBase && !player.isRidingOrBeingRiddenBy(hit)) {
|
||||
if (!(hit instanceof EntityCloud)) {
|
||||
return (EntityLivingBase)hit;
|
||||
if (hit instanceof LivingEntity && !player.isConnectedThroughVehicle(hit)) {
|
||||
if (!(hit instanceof IPickupImmuned)) {
|
||||
return (LivingEntity)hit;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,17 +66,17 @@ public class PowerCarry implements IPower<Hit> {
|
|||
|
||||
@Override
|
||||
public void apply(IPlayer iplayer, Hit data) {
|
||||
EntityPlayer player = iplayer.getOwner();
|
||||
EntityLivingBase rider = findRider(player, iplayer.getWorld());
|
||||
PlayerEntity player = iplayer.getOwner();
|
||||
LivingEntity rider = findRider(player, iplayer.getWorld());
|
||||
|
||||
if (rider != null) {
|
||||
rider.startRiding(player, true);
|
||||
} else {
|
||||
player.removePassengers();
|
||||
player.removeAllPassengers();
|
||||
}
|
||||
|
||||
if (player instanceof EntityPlayerMP) {
|
||||
((EntityPlayerMP)player).getServerWorld().getEntityTracker().sendToTrackingAndSelf(player, new SPacketSetPassengers(player));
|
||||
if (player instanceof ServerPlayerEntity) {
|
||||
((ServerPlayerEntity)player).networkHandler.sendPacket(new EntityPassengersSetS2CPacket(player));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -87,4 +87,8 @@ public class PowerCarry implements IPower<Hit> {
|
|||
@Override
|
||||
public void postApply(IPlayer player) {
|
||||
}
|
||||
|
||||
public interface IPickupImmuned {
|
||||
|
||||
}
|
||||
}
|
|
@ -1,13 +1,17 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.entity.EntityCloud;
|
||||
import com.minelittlepony.unicopia.init.UParticles;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.power.data.Numeric;
|
||||
import com.minelittlepony.util.vector.VecHelper;
|
||||
import com.minelittlepony.unicopia.UParticles;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.ability.Numeric;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
|
||||
public class PowerCloudBase implements IPower<Numeric> {
|
||||
|
||||
|
@ -18,7 +22,7 @@ public class PowerCloudBase implements IPower<Numeric> {
|
|||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return Keyboard.KEY_J;
|
||||
return GLFW.GLFW_KEY_J;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -38,16 +42,12 @@ public class PowerCloudBase implements IPower<Numeric> {
|
|||
|
||||
@Override
|
||||
public Numeric tryActivate(IPlayer player) {
|
||||
EntityCloud cloud = findTarget(player);
|
||||
|
||||
if (cloud != null) {
|
||||
Numeric data = new Numeric(player.getOwner().inventory.currentItem + 1);
|
||||
return findTarget(player).map(cloud -> {
|
||||
Numeric data = new Numeric(player.getOwner().inventory.selectedSlot + 1);
|
||||
cloud.handlePegasusInteration(data.type);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
return null;
|
||||
}).orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -57,25 +57,23 @@ public class PowerCloudBase implements IPower<Numeric> {
|
|||
|
||||
@Override
|
||||
public void apply(IPlayer player, Numeric data) {
|
||||
EntityCloud cloud = findTarget(player);
|
||||
|
||||
if (cloud != null) {
|
||||
findTarget(player).ifPresent(cloud -> {
|
||||
cloud.handlePegasusInteration(data.type);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected EntityCloud findTarget(IPlayer player) {
|
||||
if (player.getOwner().isRiding() && player.getOwner().getRidingEntity() instanceof EntityCloud) {
|
||||
return (EntityCloud)player.getOwner().getRidingEntity();
|
||||
protected Optional<ICloudEntity> findTarget(IPlayer player) {
|
||||
if (player.getOwner().hasVehicle() && player.getOwner().getVehicle() instanceof ICloudEntity) {
|
||||
return Optional.ofNullable((ICloudEntity)player.getOwner().getVehicle());
|
||||
}
|
||||
|
||||
Object e = VecHelper.getLookedAtEntity(player.getOwner(), 18);
|
||||
Entity e = VecHelper.getLookedAtEntity(player.getOwner(), 18);
|
||||
|
||||
if (e instanceof EntityCloud) {
|
||||
return (EntityCloud)e;
|
||||
if (e instanceof ICloudEntity) {
|
||||
return Optional.of((ICloudEntity)e);
|
||||
}
|
||||
|
||||
return null;
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -87,4 +85,8 @@ public class PowerCloudBase implements IPower<Numeric> {
|
|||
public void postApply(IPlayer player) {
|
||||
player.spawnParticles(UParticles.RAIN_DROPS, 5);
|
||||
}
|
||||
|
||||
public interface ICloudEntity {
|
||||
void handlePegasusInteration(int interationType);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
import com.minelittlepony.unicopia.UParticles;
|
||||
import com.minelittlepony.unicopia.ability.Hit;
|
||||
import com.minelittlepony.unicopia.entity.IInAnimate;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.magic.spells.SpellDisguise;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.FallingBlockEntity;
|
||||
import net.minecraft.entity.LightningEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.hit.EntityHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class PowerDisguise extends PowerFeed {
|
||||
|
||||
@Override
|
||||
public String getKeyName() {
|
||||
return "unicopia.power.disguise";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return GLFW.GLFW_KEY_P;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Hit tryActivate(IPlayer player) {
|
||||
return new Hit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(IPlayer iplayer, Hit data) {
|
||||
PlayerEntity player = iplayer.getOwner();
|
||||
HitResult trace = VecHelper.getObjectMouseOver(player, 10, 1);
|
||||
|
||||
Entity looked = null;
|
||||
|
||||
if (trace.getType() == HitResult.Type.BLOCK) {
|
||||
BlockPos pos = ((BlockHitResult)trace).getBlockPos();
|
||||
|
||||
if (!iplayer.getWorld().isAir(pos)) {
|
||||
BlockState state = iplayer.getWorld().getBlockState(pos);
|
||||
|
||||
looked = new FallingBlockEntity(player.getEntityWorld(), 0, 0, 0, state);
|
||||
}
|
||||
} else if (trace.getType() == HitResult.Type.ENTITY) {
|
||||
looked = ((EntityHitResult)trace).getEntity();
|
||||
|
||||
if (looked instanceof PlayerEntity) {
|
||||
looked = SpeciesList.instance().getPlayer((PlayerEntity)looked)
|
||||
.getEffect(SpellDisguise.class)
|
||||
.map(SpellDisguise::getDisguise)
|
||||
.orElse(looked);
|
||||
}
|
||||
|
||||
if (looked instanceof LightningEntity
|
||||
|| (looked instanceof IInAnimate && !((IInAnimate)looked).canInteract(Race.CHANGELING))) {
|
||||
looked = null;
|
||||
}
|
||||
}
|
||||
|
||||
player.getEntityWorld().playSound(null, player.getBlockPos(), SoundEvents.ENTITY_PARROT_IMITATE_POLAR_BEAR, SoundCategory.PLAYERS, 1.4F, 0.4F);
|
||||
|
||||
iplayer.getEffect(SpellDisguise.class).orElseGet(() -> {
|
||||
SpellDisguise disc = new SpellDisguise();
|
||||
|
||||
iplayer.setEffect(disc);
|
||||
return disc;
|
||||
}).setDisguise(looked);
|
||||
|
||||
iplayer.sendCapabilities(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preApply(IPlayer player) {
|
||||
player.addEnergy(2);
|
||||
player.spawnParticles(UParticles.CHANGELING_MAGIC, 5);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postApply(IPlayer player) {
|
||||
player.setEnergy(0);
|
||||
player.spawnParticles(UParticles.CHANGELING_MAGIC, 5);
|
||||
}
|
||||
}
|
|
@ -1,14 +1,13 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.power.data.Hit;
|
||||
import com.minelittlepony.unicopia.spell.ITossedEffect;
|
||||
import com.minelittlepony.unicopia.spell.SpellChangelingTrap;
|
||||
import com.minelittlepony.unicopia.ability.Hit;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.magic.spells.SpellChangelingTrap;
|
||||
|
||||
public class PowerEngulf implements IPower<Hit> {
|
||||
|
||||
|
@ -19,7 +18,7 @@ public class PowerEngulf implements IPower<Hit> {
|
|||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return Keyboard.KEY_L;
|
||||
return GLFW.GLFW_KEY_L;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -50,9 +49,7 @@ public class PowerEngulf implements IPower<Hit> {
|
|||
|
||||
@Override
|
||||
public void apply(IPlayer player, Hit data) {
|
||||
ITossedEffect effect = new SpellChangelingTrap();
|
||||
|
||||
effect.toss(player);
|
||||
new SpellChangelingTrap().toss(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -64,5 +61,4 @@ public class PowerEngulf implements IPower<Hit> {
|
|||
public void postApply(IPlayer player) {
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.ability.Hit;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.util.MagicalDamageSource;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.damage.DamageSource;
|
||||
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||
import net.minecraft.entity.effect.StatusEffects;
|
||||
import net.minecraft.entity.mob.HostileEntity;
|
||||
import net.minecraft.entity.passive.AbstractTraderEntity;
|
||||
import net.minecraft.entity.passive.CowEntity;
|
||||
import net.minecraft.entity.passive.PigEntity;
|
||||
import net.minecraft.entity.passive.SheepEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.particle.ParticleTypes;
|
||||
|
||||
public class PowerFeed implements IPower<Hit> {
|
||||
|
||||
@Override
|
||||
public String getKeyName() {
|
||||
return "unicopia.power.feed";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return GLFW.GLFW_KEY_O;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWarmupTime(IPlayer player) {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCooldownTime(IPlayer player) {
|
||||
return canFeed(player) ? 15 : 80;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse(Race playerSpecies) {
|
||||
return playerSpecies == Race.CHANGELING;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Hit tryActivate(IPlayer player) {
|
||||
if (canFeed(player)) {
|
||||
if (!getTargets(player).isEmpty()) {
|
||||
return new Hit();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean canFeed(IPlayer player) {
|
||||
return player.getOwner().getHealth() < player.getOwner().getHealthMaximum() || player.getOwner().canConsume(false);
|
||||
}
|
||||
|
||||
private boolean canDrain(Entity e) {
|
||||
return (e instanceof LivingEntity)
|
||||
&& (e instanceof CowEntity
|
||||
|| e instanceof AbstractTraderEntity
|
||||
|| e instanceof PlayerEntity
|
||||
|| e instanceof SheepEntity
|
||||
|| e instanceof PigEntity
|
||||
|| e instanceof HostileEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<Hit> getPackageType() {
|
||||
return Hit.class;
|
||||
}
|
||||
|
||||
protected List<LivingEntity> getTargets(IPlayer player) {
|
||||
List<Entity> list = VecHelper.getWithinRange(player.getOwner(), 3, this::canDrain);
|
||||
|
||||
Entity looked = VecHelper.getLookedAtEntity(player.getOwner(), 17);
|
||||
if (looked != null && !list.contains(looked) && canDrain(looked)) {
|
||||
list.add(looked);
|
||||
}
|
||||
|
||||
return list.stream().map(i -> (LivingEntity)i).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(IPlayer iplayer, Hit data) {
|
||||
PlayerEntity player = iplayer.getOwner();
|
||||
|
||||
float maximumHealthGain = player.getHealthMaximum() - player.getHealth();
|
||||
int maximumFoodGain = player.canConsume(false) ? (20 - player.getHungerManager().getFoodLevel()) : 0;
|
||||
|
||||
if (maximumHealthGain > 0 || maximumFoodGain > 0) {
|
||||
|
||||
float healAmount = 0;
|
||||
|
||||
for (LivingEntity i : getTargets(iplayer)) {
|
||||
healAmount += drainFrom(player, i);
|
||||
}
|
||||
|
||||
int foodAmount = (int)Math.floor(Math.min(healAmount / 3, maximumFoodGain));
|
||||
|
||||
if (foodAmount > 0) {
|
||||
healAmount -= foodAmount;
|
||||
player.getHungerManager().add(foodAmount, 0.125f);
|
||||
}
|
||||
|
||||
if (healAmount > 0) {
|
||||
player.heal(Math.min(healAmount, maximumHealthGain));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public float drainFrom(PlayerEntity changeling, LivingEntity living) {
|
||||
DamageSource d = MagicalDamageSource.causePlayerDamage("feed", changeling);
|
||||
|
||||
float damage = living.getHealth()/2;
|
||||
|
||||
if (damage > 0) {
|
||||
living.damage(d, damage);
|
||||
}
|
||||
|
||||
// TODO:
|
||||
//ParticleTypeRegistry.spawnParticles(UParticles.CHANGELING_MAGIC, living, 7);
|
||||
|
||||
if (changeling.hasStatusEffect(StatusEffects.NAUSEA)) {
|
||||
living.addPotionEffect(changeling.removePotionEffect(StatusEffects.NAUSEA));
|
||||
} else if (changeling.getEntityWorld().random.nextInt(2300) == 0) {
|
||||
living.addPotionEffect(new StatusEffectInstance(StatusEffects.WITHER, 20, 1));
|
||||
}
|
||||
|
||||
if (living instanceof PlayerEntity) {
|
||||
damage ++;
|
||||
damage *= 1.6F;
|
||||
|
||||
if (!changeling.hasStatusEffect(StatusEffects.HEALTH_BOOST)) {
|
||||
changeling.addPotionEffect(new StatusEffectInstance(StatusEffects.HEALTH_BOOST, 13000, 1));
|
||||
}
|
||||
}
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preApply(IPlayer player) {
|
||||
player.addExertion(6);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postApply(IPlayer player) {
|
||||
player.spawnParticles(ParticleTypes.HEART, 1);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.UParticles;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.ability.Location;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BoneMealItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class PowerGrow implements IPower<Location> {
|
||||
|
||||
@Override
|
||||
public String getKeyName() {
|
||||
return "unicopia.power.grow";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return GLFW.GLFW_KEY_N;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWarmupTime(IPlayer player) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCooldownTime(IPlayer player) {
|
||||
return 50;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse(Race playerSpecies) {
|
||||
return playerSpecies == Race.EARTH;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location tryActivate(IPlayer player) {
|
||||
HitResult ray = VecHelper.getObjectMouseOver(player.getOwner(), 3, 1);
|
||||
|
||||
if (ray instanceof BlockHitResult && ray.getType() == HitResult.Type.BLOCK) {
|
||||
return new Location(((BlockHitResult)ray).getBlockPos());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<Location> getPackageType() {
|
||||
return Location.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(IPlayer player, Location data) {
|
||||
int count = 0;
|
||||
|
||||
for (BlockPos pos : BlockPos.iterate(
|
||||
new BlockPos(data.x - 2, data.y - 2, data.z - 2),
|
||||
new BlockPos(data.x + 2, data.y + 2, data.z + 2))) {
|
||||
count += applySingle(player.getWorld(), player.getWorld().getBlockState(pos), pos);
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
player.subtractEnergyCost(count * 5);
|
||||
}
|
||||
}
|
||||
|
||||
protected int applySingle(World w, BlockState state, BlockPos pos) {
|
||||
|
||||
ItemStack stack = new ItemStack(Items.BONE_MEAL);
|
||||
|
||||
if (BoneMealItem.useOnFertilizable(stack, w, pos)
|
||||
|| BoneMealItem.useOnGround(stack, w, pos, Direction.UP)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preApply(IPlayer player) {
|
||||
player.addExertion(3);
|
||||
|
||||
if (player.getWorld().isClient()) {
|
||||
player.spawnParticles(UParticles.UNICORN_MAGIC, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postApply(IPlayer player) {
|
||||
|
||||
}
|
||||
}
|
|
@ -1,12 +1,12 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.init.UParticles;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.power.data.Hit;
|
||||
import com.minelittlepony.unicopia.spell.SpellShield;
|
||||
import com.minelittlepony.unicopia.UParticles;
|
||||
import com.minelittlepony.unicopia.ability.Hit;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.magic.spells.SpellShield;
|
||||
|
||||
public class PowerMagic implements IPower<Hit> {
|
||||
|
||||
|
@ -17,7 +17,7 @@ public class PowerMagic implements IPower<Hit> {
|
|||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return Keyboard.KEY_P;
|
||||
return GLFW.GLFW_KEY_P;
|
||||
}
|
||||
|
||||
@Override
|
|
@ -1,54 +1,55 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.gson.annotations.Expose;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.ability.Location;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.item.ItemApple;
|
||||
import com.minelittlepony.unicopia.particle.Particles;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
import com.minelittlepony.unicopia.power.data.Location;
|
||||
import com.minelittlepony.unicopia.world.UWorld;
|
||||
import com.minelittlepony.util.MagicalDamageSource;
|
||||
import com.minelittlepony.util.PosHelper;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
import com.minelittlepony.util.WorldEvent;
|
||||
import com.minelittlepony.util.shape.IShape;
|
||||
import com.minelittlepony.util.shape.Sphere;
|
||||
import com.minelittlepony.util.vector.VecHelper;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockLeaves;
|
||||
import net.minecraft.block.BlockLog;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.properties.IProperty;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.SharedMonsterAttributes;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.LeavesBlock;
|
||||
import net.minecraft.block.LogBlock;
|
||||
import net.minecraft.entity.EntityContext;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.ItemEntity;
|
||||
import net.minecraft.entity.attribute.EntityAttributes;
|
||||
import net.minecraft.entity.damage.DamageSource;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumParticleTypes;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.particle.BlockStateParticleEffect;
|
||||
import net.minecraft.particle.ParticleTypes;
|
||||
import net.minecraft.state.property.Property;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import static net.minecraft.util.EnumFacing.*;
|
||||
|
||||
public class PowerStomp implements IPower<PowerStomp.Data> {
|
||||
|
||||
private final double rad = 4;
|
||||
|
||||
private final AxisAlignedBB areaOfEffect = new AxisAlignedBB(
|
||||
private final Box areaOfEffect = new Box(
|
||||
-rad, -rad, -rad,
|
||||
rad, rad, rad
|
||||
);
|
||||
|
@ -60,7 +61,7 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return Keyboard.KEY_M;
|
||||
return GLFW.GLFW_KEY_M;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -80,12 +81,13 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
|
||||
@Override
|
||||
public PowerStomp.Data tryActivate(IPlayer player) {
|
||||
RayTraceResult mop = VecHelper.getObjectMouseOver(player.getOwner(), 6, 1);
|
||||
HitResult mop = VecHelper.getObjectMouseOver(player.getOwner(), 6, 1);
|
||||
|
||||
if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) {
|
||||
BlockPos pos = mop.getBlockPos();
|
||||
IBlockState state = player.getWorld().getBlockState(pos);
|
||||
if (state.getBlock() instanceof BlockLog) {
|
||||
if (mop instanceof BlockHitResult && mop.getType() == HitResult.Type.BLOCK) {
|
||||
BlockPos pos = ((BlockHitResult)mop).getBlockPos();
|
||||
BlockState state = player.getWorld().getBlockState(pos);
|
||||
|
||||
if (state.getBlock() instanceof LogBlock) {
|
||||
pos = getBaseOfTree(player.getWorld(), state, pos);
|
||||
if (measureTree(player.getWorld(), state, pos) > 0) {
|
||||
return new Data(pos.getX(), pos.getY(), pos.getZ(), 1);
|
||||
|
@ -93,7 +95,7 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
}
|
||||
}
|
||||
|
||||
if (!player.getOwner().onGround && !player.getOwner().capabilities.isFlying) {
|
||||
if (!player.getOwner().onGround && !player.getOwner().abilities.flying) {
|
||||
player.getOwner().addVelocity(0, -6, 0);
|
||||
return new Data(0, 0, 0, 0);
|
||||
}
|
||||
|
@ -106,9 +108,10 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
}
|
||||
|
||||
public static BlockPos getSolidBlockBelow(BlockPos pos, World w) {
|
||||
while (w.isValid(pos)) {
|
||||
while (World.isValid(pos)) {
|
||||
pos = pos.down();
|
||||
if (w.getBlockState(pos).isSideSolid(w, pos, EnumFacing.UP)) {
|
||||
|
||||
if (Block.isFaceFullSquare(w.getBlockState(pos).getCollisionShape(w, pos, EntityContext.absent()), Direction.UP)) {
|
||||
return pos;
|
||||
}
|
||||
}
|
||||
|
@ -119,30 +122,30 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
@Override
|
||||
public void apply(IPlayer iplayer, Data data) {
|
||||
|
||||
EntityPlayer player = iplayer.getOwner();
|
||||
PlayerEntity player = iplayer.getOwner();
|
||||
|
||||
if (data.hitType == 0) {
|
||||
BlockPos ppos = player.getPosition();
|
||||
BlockPos ppos = player.getBlockPos();
|
||||
BlockPos pos = getSolidBlockBelow(ppos, player.getEntityWorld());
|
||||
|
||||
player.addVelocity(0, -(ppos.distanceSq(pos)), 0);
|
||||
player.addVelocity(0, -(ppos.getSquaredDistance(pos)), 0);
|
||||
|
||||
iplayer.getWorld().getEntitiesWithinAABBExcludingEntity(player, areaOfEffect.offset(iplayer.getOriginVector())).forEach(i -> {
|
||||
double dist = Math.sqrt(i.getDistanceSq(pos));
|
||||
iplayer.getWorld().getEntities(player, areaOfEffect.offset(iplayer.getOriginVector())).forEach(i -> {
|
||||
double dist = Math.sqrt(pos.getSquaredDistance(i.getBlockPos()));
|
||||
|
||||
if (dist <= rad + 3) {
|
||||
double force = dist / 5;
|
||||
i.addVelocity(
|
||||
-(player.posX - i.posX) / force,
|
||||
-(player.posY - i.posY - 2) / force + (dist < 1 ? dist : 0),
|
||||
-(player.posZ - i.posZ) / force);
|
||||
-(player.x - i.x) / force,
|
||||
-(player.y - i.y - 2) / force + (dist < 1 ? dist : 0),
|
||||
-(player.z - i.z) / force);
|
||||
|
||||
DamageSource damage = MagicalDamageSource.causePlayerDamage("smash", player);
|
||||
|
||||
double amount = (4 * player.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getAttributeValue()) / (float)dist;
|
||||
double amount = (4 * player.getAttributeInstance(EntityAttributes.ATTACK_DAMAGE).getValue()) / (float)dist;
|
||||
|
||||
if (i instanceof EntityPlayer) {
|
||||
Race race = PlayerSpeciesList.instance().getPlayer((EntityPlayer)i).getPlayerSpecies();
|
||||
if (i instanceof PlayerEntity) {
|
||||
Race race = SpeciesList.instance().getPlayer((PlayerEntity)i).getSpecies();
|
||||
if (race.canUseEarth()) {
|
||||
amount /= 3;
|
||||
}
|
||||
|
@ -152,12 +155,12 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
}
|
||||
}
|
||||
|
||||
i.attackEntityFrom(damage, (float)amount);
|
||||
i.damage(damage, (float)amount);
|
||||
}
|
||||
});
|
||||
|
||||
BlockPos.getAllInBoxMutable(pos.add(-rad, -rad, -rad), pos.add(rad, rad, rad)).forEach(i -> {
|
||||
if (i.distanceSqToCenter(player.posX, player.posY, player.posZ) <= rad*rad) {
|
||||
BlockPos.iterate(pos.add(-rad, -rad, -rad), pos.add(rad, rad, rad)).forEach(i -> {
|
||||
if (i.getSquaredDistance(player.x, player.y, player.z, true) <= rad*rad) {
|
||||
spawnEffect(player.world, i);
|
||||
}
|
||||
});
|
||||
|
@ -169,16 +172,16 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
iplayer.subtractEnergyCost(rad);
|
||||
} else if (data.hitType == 1) {
|
||||
|
||||
boolean harmed = player.getHealth() < player.getMaxHealth();
|
||||
boolean harmed = player.getHealth() < player.getHealthMaximum();
|
||||
|
||||
if (harmed && player.world.rand.nextInt(30) == 0) {
|
||||
if (harmed && player.world.random.nextInt(30) == 0) {
|
||||
iplayer.subtractEnergyCost(3);
|
||||
return;
|
||||
}
|
||||
|
||||
if (harmed || player.world.rand.nextInt(5) == 0) {
|
||||
if (harmed || player.world.random.nextInt(5) == 0) {
|
||||
|
||||
if (!harmed || player.world.rand.nextInt(30) == 0) {
|
||||
if (!harmed || player.world.random.nextInt(30) == 0) {
|
||||
UWorld.enqueueTask(w -> removeTree(w, data.pos()));
|
||||
}
|
||||
|
||||
|
@ -194,36 +197,34 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
}
|
||||
|
||||
private void spawnEffect(World w, BlockPos pos) {
|
||||
IBlockState state = w.getBlockState(pos);
|
||||
BlockState state = w.getBlockState(pos);
|
||||
|
||||
if (state.getBlock() != Blocks.AIR) {
|
||||
if (w.getBlockState(pos.up()).getBlock() == Blocks.AIR) {
|
||||
if (!state.isAir() && w.getBlockState(pos.up()).isAir()) {
|
||||
WorldEvent.DESTROY_BLOCK.play(w, pos, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preApply(IPlayer player) {
|
||||
player.addExertion(40);
|
||||
player.getOwner().spawnRunningParticles();
|
||||
player.getOwner().attemptSprintingParticles();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postApply(IPlayer player) {
|
||||
int timeDiff = getCooldownTime(player) - player.getAbilities().getRemainingCooldown();
|
||||
|
||||
if (player.getOwner().getEntityWorld().getWorldTime() % 1 == 0 || timeDiff == 0) {
|
||||
if (player.getOwner().getEntityWorld().getTime() % 1 == 0 || timeDiff == 0) {
|
||||
spawnParticleRing(player.getOwner(), timeDiff, 1);
|
||||
}
|
||||
}
|
||||
|
||||
private void spawnParticleRing(EntityPlayer player, int timeDiff) {
|
||||
private void spawnParticleRing(PlayerEntity player, int timeDiff) {
|
||||
spawnParticleRing(player, timeDiff, 0);
|
||||
}
|
||||
|
||||
private void spawnParticleRing(EntityPlayer player, int timeDiff, double yVel) {
|
||||
int animationTicks = (int)(timeDiff / 10);
|
||||
private void spawnParticleRing(PlayerEntity player, int timeDiff, double yVel) {
|
||||
int animationTicks = timeDiff / 10;
|
||||
if (animationTicks < 6) {
|
||||
IShape shape = new Sphere(true, animationTicks, 1, 0, 1);
|
||||
|
||||
|
@ -232,28 +233,28 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
yVel *= y * 5;
|
||||
|
||||
for (int i = 0; i < shape.getVolumeOfSpawnableSpace(); i++) {
|
||||
Vec3d point = shape.computePoint(player.getEntityWorld().rand);
|
||||
Particles.instance().spawnParticle(EnumParticleTypes.BLOCK_CRACK.getParticleID(), false,
|
||||
player.posX + point.x,
|
||||
player.posY + y + point.y,
|
||||
player.posZ + point.z,
|
||||
0, yVel, 0,
|
||||
Block.getStateId(Blocks.DIRT.getDefaultState()));
|
||||
Vec3d point = shape.computePoint(player.getEntityWorld().random);
|
||||
player.world.addParticle(new BlockStateParticleEffect(ParticleTypes.BLOCK, Blocks.DIRT.getDefaultState()),
|
||||
player.x + point.x,
|
||||
player.y + y + point.y,
|
||||
player.z + point.z,
|
||||
0, yVel, 0
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void removeTree(World w, BlockPos pos) {
|
||||
IBlockState log = w.getBlockState(pos);
|
||||
BlockState log = w.getBlockState(pos);
|
||||
|
||||
int size = measureTree(w, log, pos);
|
||||
|
||||
if (size > 0) {
|
||||
pos = ascendTrunk(new ArrayList<BlockPos>(), w, pos, log, 0);
|
||||
|
||||
removeTreePart( w, log, pos, 0);
|
||||
removeTreePart( w, log, ascendTrunk(new ArrayList<BlockPos>(), w, pos, log, 0), 0);
|
||||
}
|
||||
}
|
||||
|
||||
private BlockPos ascendTrunk(List<BlockPos> done, World w, BlockPos pos, IBlockState log, int level) {
|
||||
private BlockPos ascendTrunk(List<BlockPos> done, World w, BlockPos pos, BlockState log, int level) {
|
||||
if (level < 3 && !done.contains(pos)) {
|
||||
done.add(pos);
|
||||
|
||||
|
@ -280,26 +281,25 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
return pos;
|
||||
}
|
||||
|
||||
private void removeTreePart(World w, IBlockState log, BlockPos pos, int level) {
|
||||
private void removeTreePart(World w, BlockState log, BlockPos pos, int level) {
|
||||
if (level < 10 && isWoodOrLeaf(w, log, pos)) {
|
||||
if (level < 5) {
|
||||
w.destroyBlock(pos, true);
|
||||
w.breakBlock(pos, true);
|
||||
} else {
|
||||
IBlockState state = w.getBlockState(pos);
|
||||
state.getBlock().dropBlockAsItem(w, pos, state, 0);
|
||||
Block.dropStacks(w.getBlockState(pos), w, pos);
|
||||
w.setBlockState(pos, Blocks.AIR.getDefaultState(), 3);
|
||||
}
|
||||
|
||||
PosHelper.all(pos, p -> {
|
||||
removeTreePart(w, log, p, level + 1);
|
||||
}, UP, NORTH, SOUTH, EAST, WEST);
|
||||
}, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private BlockPos ascendTree(World w, IBlockState log, BlockPos pos, boolean remove) {
|
||||
private BlockPos ascendTree(World w, BlockState log, BlockPos pos, boolean remove) {
|
||||
int breaks = 0;
|
||||
IBlockState state;
|
||||
BlockState state;
|
||||
while (variantAndBlockEquals(w.getBlockState(pos.up()), log)) {
|
||||
if (PosHelper.some(pos, p -> isLeaves(w.getBlockState(p), log), HORIZONTALS)) {
|
||||
break;
|
||||
|
@ -307,10 +307,10 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
|
||||
if (remove) {
|
||||
if (breaks < 10) {
|
||||
w.destroyBlock(pos, true);
|
||||
w.breakBlock(pos, true);
|
||||
} else {
|
||||
state = w.getBlockState(pos);
|
||||
state.getBlock().dropBlockAsItem(w, pos, state, 0);
|
||||
Block.dropStacks(state, w, pos);
|
||||
w.setBlockState(pos, Blocks.AIR.getDefaultState(), 3);
|
||||
}
|
||||
breaks++;
|
||||
|
@ -321,17 +321,17 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
}
|
||||
|
||||
private int dropApples(World w, BlockPos pos) {
|
||||
IBlockState log = w.getBlockState(pos);
|
||||
BlockState log = w.getBlockState(pos);
|
||||
int size = measureTree(w, log, pos);
|
||||
if (size > 0) {
|
||||
|
||||
List<EntityItem> capturedDrops = Lists.newArrayList();
|
||||
List<ItemEntity> capturedDrops = Lists.newArrayList();
|
||||
|
||||
dropApplesPart(capturedDrops, new ArrayList<BlockPos>(), w, log, pos, 0);
|
||||
|
||||
UWorld.enqueueTask(wo -> {
|
||||
capturedDrops.forEach(item -> {
|
||||
item.setNoPickupDelay();
|
||||
item.setToDefaultPickupDelay();
|
||||
wo.spawnEntity(item);
|
||||
});
|
||||
});
|
||||
|
@ -342,48 +342,48 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
return 0;
|
||||
}
|
||||
|
||||
private void dropApplesPart(List<EntityItem> drops, List<BlockPos> done, World w, IBlockState log, BlockPos pos, int level) {
|
||||
private void dropApplesPart(List<ItemEntity> drops, List<BlockPos> done, World w, BlockState log, BlockPos pos, int level) {
|
||||
if (!done.contains(pos)) {
|
||||
done.add(pos);
|
||||
pos = ascendTree(w, log, pos, false);
|
||||
if (level < 10 && isWoodOrLeaf(w, log, pos)) {
|
||||
IBlockState state = w.getBlockState(pos);
|
||||
BlockState state = w.getBlockState(pos);
|
||||
|
||||
if (state.getBlock() instanceof BlockLeaves && w.getBlockState(pos.down()).getMaterial() == Material.AIR) {
|
||||
if (state.getBlock() instanceof LeavesBlock && w.getBlockState(pos.down()).isAir()) {
|
||||
WorldEvent.DESTROY_BLOCK.play(w, pos, state);
|
||||
|
||||
EntityItem item = new EntityItem(w);
|
||||
item.setPosition(pos.getX() + w.rand.nextFloat(), pos.getY() - 0.5, pos.getZ() + w.rand.nextFloat());
|
||||
item.setItem(getApple(w, log));
|
||||
ItemEntity item = new ItemEntity(EntityType.ITEM, w);
|
||||
item.setPosition(pos.getX() + w.random.nextFloat(), pos.getY() - 0.5, pos.getZ() + w.random.nextFloat());
|
||||
item.setStack(getApple(w, log));
|
||||
|
||||
drops.add(item);
|
||||
}
|
||||
|
||||
PosHelper.all(pos, p -> {
|
||||
dropApplesPart(drops, done, w, log, p, level + 1);
|
||||
}, UP, NORTH, SOUTH, EAST, WEST);
|
||||
}, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ItemStack getApple(World w, IBlockState log) {
|
||||
private ItemStack getApple(World w, BlockState log) {
|
||||
return ItemApple.getRandomItemStack(getVariant(log));
|
||||
}
|
||||
|
||||
private int measureTree(World w, IBlockState log, BlockPos pos) {
|
||||
List<BlockPos> logs = new ArrayList<BlockPos>();
|
||||
List<BlockPos> leaves = new ArrayList<BlockPos>();
|
||||
private int measureTree(World w, BlockState log, BlockPos pos) {
|
||||
List<BlockPos> logs = new ArrayList<>();
|
||||
List<BlockPos> leaves = new ArrayList<>();
|
||||
|
||||
countParts(logs, leaves, w, log, pos);
|
||||
|
||||
return logs.size() <= (leaves.size() / 2) ? logs.size() + leaves.size() : 0;
|
||||
}
|
||||
|
||||
private BlockPos getBaseOfTree(World w, IBlockState log, BlockPos pos) {
|
||||
private BlockPos getBaseOfTree(World w, BlockState log, BlockPos pos) {
|
||||
return getBaseOfTreePart(new ArrayList<BlockPos>(), w, log, pos);
|
||||
}
|
||||
|
||||
private BlockPos getBaseOfTreePart(List<BlockPos> done, World w, IBlockState log, BlockPos pos) {
|
||||
private BlockPos getBaseOfTreePart(List<BlockPos> done, World w, BlockState log, BlockPos pos) {
|
||||
if (done.contains(pos) || !variantAndBlockEquals(w.getBlockState(pos), log)) {
|
||||
return null;
|
||||
}
|
||||
|
@ -421,20 +421,20 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
return pos;
|
||||
}
|
||||
|
||||
private boolean isWoodOrLeaf(World w, IBlockState log, BlockPos pos) {
|
||||
IBlockState state = w.getBlockState(pos);
|
||||
return variantAndBlockEquals(state, log) || (isLeaves(state, log) && ((Boolean)state.getValue(BlockLeaves.DECAYABLE)).booleanValue());
|
||||
private boolean isWoodOrLeaf(World w, BlockState log, BlockPos pos) {
|
||||
BlockState state = w.getBlockState(pos);
|
||||
return variantAndBlockEquals(state, log) || (isLeaves(state, log) && state.get(LeavesBlock.PERSISTENT));
|
||||
}
|
||||
|
||||
private void countParts(List<BlockPos> logs, List<BlockPos> leaves, World w, IBlockState log, BlockPos pos) {
|
||||
private void countParts(List<BlockPos> logs, List<BlockPos> leaves, World w, BlockState log, BlockPos pos) {
|
||||
if (logs.contains(pos) || leaves.contains(pos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
IBlockState state = w.getBlockState(pos);
|
||||
BlockState state = w.getBlockState(pos);
|
||||
boolean yay = false;
|
||||
|
||||
if (state.getBlock() instanceof BlockLeaves && ((Boolean)state.getValue(BlockLeaves.DECAYABLE)).booleanValue() && variantEquals(state, log)) {
|
||||
if (state.getBlock() instanceof LeavesBlock && state.get(LeavesBlock.PERSISTENT) && variantEquals(state, log)) {
|
||||
leaves.add(pos);
|
||||
yay = true;
|
||||
} else if (variantAndBlockEquals(state, log)) {
|
||||
|
@ -445,33 +445,31 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
|
|||
if (yay) {
|
||||
PosHelper.all(pos, p -> {
|
||||
countParts(logs, leaves, w, log, p);
|
||||
}, UP, NORTH, SOUTH, EAST, WEST);
|
||||
}, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isLeaves(IBlockState state, IBlockState log) {
|
||||
return state.getBlock() instanceof BlockLeaves && variantEquals(state, log);
|
||||
private boolean isLeaves(BlockState state, BlockState log) {
|
||||
return state.getBlock() instanceof LeavesBlock && variantEquals(state, log);
|
||||
}
|
||||
|
||||
private boolean variantAndBlockEquals(IBlockState one, IBlockState two) {
|
||||
private boolean variantAndBlockEquals(BlockState one, BlockState two) {
|
||||
return (one.getBlock() == two.getBlock()) && variantEquals(one, two);
|
||||
}
|
||||
|
||||
private boolean variantEquals(IBlockState one, IBlockState two) {
|
||||
private boolean variantEquals(BlockState one, BlockState two) {
|
||||
return getVariant(one) == getVariant(two);
|
||||
}
|
||||
|
||||
private Object getVariant(IBlockState state) {
|
||||
if (state.getBlock() instanceof BlockLeaves) {
|
||||
return ((BlockLeaves)state.getBlock()).getWoodType(state.getBlock().getMetaFromState(state));
|
||||
private Object getVariant(BlockState state) {
|
||||
if (state.getBlock() instanceof LeavesBlock) {
|
||||
return ((LeavesBlock)state.getBlock()).getWoodType(state);
|
||||
}
|
||||
|
||||
for (Entry<IProperty<?>, ?> i : state.getProperties().entrySet()) {
|
||||
if (i.getKey().getName().contentEquals("variant")) {
|
||||
return i.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return state.getEntries().entrySet().stream()
|
||||
.filter(i -> i.getKey().getName().contentEquals("variant"))
|
||||
.map(i -> i.getValue())
|
||||
.findFirst().orElse(null);
|
||||
}
|
||||
|
||||
protected static class Data extends Location {
|
|
@ -0,0 +1,174 @@
|
|||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.UParticles;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.ability.Location;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.util.VecHelper;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.FenceBlock;
|
||||
import net.minecraft.block.LeavesBlock;
|
||||
import net.minecraft.block.WallBlock;
|
||||
import net.minecraft.client.network.packet.EntityPassengersSetS2CPacket;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class PowerTeleport implements IPower<Location> {
|
||||
|
||||
@Override
|
||||
public String getKeyName() {
|
||||
return "unicopia.power.teleport";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getKeyCode() {
|
||||
return GLFW.GLFW_KEY_O;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWarmupTime(IPlayer player) {
|
||||
return 20;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCooldownTime(IPlayer player) {
|
||||
return 50;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse(Race playerSpecies) {
|
||||
return playerSpecies.canCast();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location tryActivate(IPlayer player) {
|
||||
HitResult ray = VecHelper.getObjectMouseOver(player.getOwner(), 100, 1);
|
||||
|
||||
World w = player.getWorld();
|
||||
|
||||
if (ray.getType() == HitResult.Type.MISS) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BlockPos pos;
|
||||
|
||||
if (ray.getType() == HitResult.Type.ENTITY) {
|
||||
pos = new BlockPos(ray.getPos());
|
||||
} else {
|
||||
pos = ((BlockHitResult)ray).getBlockPos();
|
||||
}
|
||||
|
||||
boolean airAbove = enterable(w, pos.up()) && enterable(w, pos.up(2));
|
||||
|
||||
if (exception(w, pos, player.getOwner())) {
|
||||
Direction sideHit = ((BlockHitResult)ray).getSide();
|
||||
|
||||
if (player.getOwner().isSneaking()) {
|
||||
sideHit = sideHit.getOpposite();
|
||||
}
|
||||
|
||||
pos = pos.offset(sideHit);
|
||||
}
|
||||
|
||||
if (enterable(w, pos.down())) {
|
||||
pos = pos.down();
|
||||
|
||||
if (enterable(w, pos.down())) {
|
||||
if (!airAbove) {
|
||||
return null;
|
||||
}
|
||||
|
||||
pos = new BlockPos(
|
||||
ray.getPos().getX(),
|
||||
pos.getY() + 2,
|
||||
ray.getPos().getZ());
|
||||
}
|
||||
}
|
||||
|
||||
if ((!enterable(w, pos) && exception(w, pos, player.getOwner()))
|
||||
|| (!enterable(w, pos.up()) && exception(w, pos.up(), player.getOwner()))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new Location(pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Class<Location> getPackageType() {
|
||||
return Location.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(IPlayer iplayer, Location data) {
|
||||
iplayer.getWorld().playSound(null, iplayer.getOrigin(), SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1);
|
||||
|
||||
PlayerEntity player = iplayer.getOwner();
|
||||
double distance = player.squaredDistanceTo(data.x, data.y, data.z) / 10;
|
||||
|
||||
if (player.hasVehicle()) {
|
||||
Entity mount = player.getVehicle();
|
||||
|
||||
player.stopRiding();
|
||||
|
||||
if (mount instanceof ServerPlayerEntity) {
|
||||
((ServerPlayerEntity)player).networkHandler.sendPacket(new EntityPassengersSetS2CPacket(player));
|
||||
}
|
||||
}
|
||||
|
||||
player.setPosition(
|
||||
data.x + (player.x - Math.floor(player.x)),
|
||||
data.y,
|
||||
data.z + (player.z - Math.floor(player.z)));
|
||||
iplayer.subtractEnergyCost(distance);
|
||||
|
||||
player.fallDistance /= distance;
|
||||
|
||||
player.world.playSound(null, data.pos(), SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1);
|
||||
}
|
||||
|
||||
private boolean enterable(World w, BlockPos pos) {
|
||||
BlockState state = w.getBlockState(pos);
|
||||
|
||||
Block block = state.getBlock();
|
||||
|
||||
return w.isAir(pos)
|
||||
|| !state.isOpaque()
|
||||
|| (block instanceof LeavesBlock);
|
||||
}
|
||||
|
||||
private boolean exception(World w, BlockPos pos, PlayerEntity player) {
|
||||
BlockState state = w.getBlockState(pos);
|
||||
|
||||
Block c = state.getBlock();
|
||||
return state.hasSolidTopSurface(w, pos, player)
|
||||
|| state.getMaterial().isLiquid()
|
||||
|| (c instanceof WallBlock)
|
||||
|| (c instanceof FenceBlock)
|
||||
|| (c instanceof LeavesBlock);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preApply(IPlayer player) {
|
||||
player.addExertion(3);
|
||||
player.spawnParticles(UParticles.UNICORN_MAGIC, 5);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postApply(IPlayer player) {
|
||||
player.spawnParticles(UParticles.UNICORN_MAGIC, 5);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.minelittlepony.unicopia.power;
|
||||
package com.minelittlepony.unicopia.ability.powers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
@ -7,7 +7,9 @@ import java.util.Map;
|
|||
import java.util.Optional;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.input.Keyboard;
|
||||
import com.minelittlepony.unicopia.ability.IData;
|
||||
import com.minelittlepony.unicopia.ability.IPower;
|
||||
import com.minelittlepony.unicopia.client.input.Keyboard;
|
||||
|
||||
public class PowersRegistry {
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
package com.minelittlepony.unicopia.ability.powers.render;
|
||||
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.magic.spells.SpellDisguise;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.entity.Entity;
|
||||
|
||||
public class DisguiseRenderer {
|
||||
|
||||
private static final DisguiseRenderer INSTANCE = new DisguiseRenderer();
|
||||
|
||||
public static DisguiseRenderer getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
private final MinecraftClient mc = MinecraftClient.getInstance();
|
||||
|
||||
private boolean rendering;
|
||||
|
||||
public boolean renderDisguise(Entity entity, float usedPartialTick) {
|
||||
|
||||
EntityRenderDispatcher renderMan = mc.getEntityRenderManager();
|
||||
|
||||
if (rendering) {
|
||||
renderMan.setRenderShadows(true);
|
||||
renderStaticDisguise(renderMan, entity);
|
||||
renderMan.setRenderShadows(false);
|
||||
|
||||
return true;
|
||||
} else {
|
||||
renderMan.setRenderShadows(renderMan.shouldRenderShadows() || usedPartialTick != 1);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void renderStaticDisguise(EntityRenderDispatcher renderMan, Entity entity) {
|
||||
Entity observer = mc.getCameraEntity();
|
||||
|
||||
double x = entity.x - observer.x;
|
||||
double y = entity.y - observer.y;
|
||||
double z = entity.z - observer.z;
|
||||
|
||||
renderDisguise(renderMan, entity, x, y, z);
|
||||
}
|
||||
|
||||
public boolean renderDisguiseToGui(IPlayer player) {
|
||||
SpellDisguise effect = player.getEffect(SpellDisguise.class, false);
|
||||
|
||||
if (effect == null || effect.getDead()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
EntityRenderDispatcher renderMan = mc.getEntityRenderManager();
|
||||
|
||||
if (renderMan.shouldRenderShadows()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Entity e = effect.getDisguise();
|
||||
|
||||
// Check for a disguise and render it in our place.
|
||||
if (e != null) {
|
||||
effect.update(player);
|
||||
|
||||
e.setCustomNameVisible(false);
|
||||
e.setInvisible(false);
|
||||
e.y = player.getOwner().y;
|
||||
|
||||
renderDisguise(renderMan, e, 0, 0, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void renderDisguise(EntityRenderDispatcher renderMan, Entity entity, double x, double y, double z) {
|
||||
rendering = false;
|
||||
renderMan.render(entity, x, y, z, 0, 1, false);
|
||||
rendering = true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package com.minelittlepony.unicopia.advancements;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import net.minecraft.advancement.PlayerAdvancementTracker;
|
||||
import net.minecraft.advancement.criterion.Criterion;
|
||||
import net.minecraft.advancement.criterion.CriterionConditions;
|
||||
|
||||
public abstract class AbstractCriterion<E extends AbstractCriterion.Entry<T>, T extends CriterionConditions> implements Criterion<T> {
|
||||
|
||||
protected final Map<PlayerAdvancementTracker, E> listeners = Maps.newHashMap();
|
||||
|
||||
@Override
|
||||
public void beginTrackingCondition(PlayerAdvancementTracker key, Criterion.ConditionsContainer<T> listener) {
|
||||
listeners.computeIfAbsent(key, this::createEntry).listeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endTrackingCondition(PlayerAdvancementTracker key, Criterion.ConditionsContainer<T> listener) {
|
||||
if (listeners.containsKey(key)) {
|
||||
E entry = listeners.get(key);
|
||||
|
||||
entry.listeners.remove(listener);
|
||||
if (entry.listeners.isEmpty()) {
|
||||
listeners.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endTracking(PlayerAdvancementTracker key) {
|
||||
if (listeners.containsKey(key)) {
|
||||
listeners.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract E createEntry(PlayerAdvancementTracker advancement);
|
||||
|
||||
protected static class Entry<T extends CriterionConditions> {
|
||||
protected final PlayerAdvancementTracker advancement;
|
||||
|
||||
protected final List<Criterion.ConditionsContainer<T>> listeners = Lists.newArrayList();
|
||||
|
||||
Entry(PlayerAdvancementTracker key) {
|
||||
advancement = key;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
package com.minelittlepony.unicopia.advancements;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import net.minecraft.advancements.ICriterionTrigger;
|
||||
import net.minecraft.advancements.PlayerAdvancements;
|
||||
import net.minecraft.advancements.critereon.AbstractCriterionInstance;
|
||||
|
||||
public abstract class AbstractTrigger<E extends AbstractTrigger.Entry<T>, T extends AbstractCriterionInstance> implements ICriterionTrigger<T> {
|
||||
|
||||
protected final Map<PlayerAdvancements, E> listeners = Maps.newHashMap();
|
||||
|
||||
@Override
|
||||
public void addListener(PlayerAdvancements key, Listener<T> listener) {
|
||||
listeners.computeIfAbsent(key, this::createEntry).listeners.add(listener);;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeListener(PlayerAdvancements key, Listener<T> listener) {
|
||||
if (listeners.containsKey(key)) {
|
||||
E entry = listeners.get(key);
|
||||
|
||||
entry.listeners.remove(listener);
|
||||
if (entry.listeners.isEmpty()) {
|
||||
listeners.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAllListeners(PlayerAdvancements key) {
|
||||
if (listeners.containsKey(key)) {
|
||||
listeners.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract E createEntry(PlayerAdvancements advancement);
|
||||
|
||||
protected static class Entry<T extends AbstractCriterionInstance> {
|
||||
protected final PlayerAdvancements advancement;
|
||||
|
||||
protected final List<Listener<T>> listeners = Lists.newArrayList();
|
||||
|
||||
Entry(PlayerAdvancements key) {
|
||||
advancement = key;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,30 +2,30 @@ package com.minelittlepony.unicopia.advancements;
|
|||
|
||||
import com.google.gson.JsonElement;
|
||||
|
||||
import net.minecraft.advancements.Advancement;
|
||||
import net.minecraft.advancements.PlayerAdvancements;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.WorldServer;
|
||||
import net.minecraft.advancement.Advancement;
|
||||
import net.minecraft.advancement.PlayerAdvancementTracker;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
/**
|
||||
* Predicate for testing whether a player has a previous advancement.
|
||||
* Allows for unlocking advancements in linear succession.
|
||||
*/
|
||||
public class AdvancementPredicate {
|
||||
class AdvancementPredicate {
|
||||
|
||||
public static AdvancementPredicate deserialize(JsonElement json) {
|
||||
return new AdvancementPredicate(json.getAsString());
|
||||
}
|
||||
|
||||
private final ResourceLocation id;
|
||||
private final Identifier id;
|
||||
|
||||
public AdvancementPredicate(String advancement) {
|
||||
this.id = new ResourceLocation(advancement);
|
||||
this.id = new Identifier(advancement);
|
||||
}
|
||||
|
||||
public boolean test(WorldServer world, PlayerAdvancements playerAdvancements) {
|
||||
Advancement advancement = world.getAdvancementManager().getAdvancement(id);
|
||||
public boolean test(ServerWorld world, PlayerAdvancementTracker tracker) {
|
||||
Advancement advancement = world.getServer().getAdvancementManager().get(id);
|
||||
|
||||
return advancement != null && playerAdvancements.getProgress(advancement).isDone();
|
||||
return advancement != null && tracker.getProgress(advancement).isDone();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
package com.minelittlepony.unicopia.advancements;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
import net.minecraft.advancement.PlayerAdvancementTracker;
|
||||
import net.minecraft.advancement.criterion.AbstractCriterionConditions;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
/**
|
||||
* Advantement trigger for the book of holding. It's an achievement to die so spectacularly! :D
|
||||
*/
|
||||
public class BOHDeathCriterion extends AbstractCriterion<BOHDeathCriterion.Entry, BOHDeathCriterion.Conditions> {
|
||||
// TODO: Need to register this
|
||||
public static final BOHDeathCriterion INSTANCE = new BOHDeathCriterion();
|
||||
|
||||
private static final Identifier ID = new Identifier("unicopia", "death_by_bag_of_holding");
|
||||
|
||||
@Override
|
||||
public Identifier getId() {
|
||||
return ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Conditions conditionsFromJson(JsonObject json, JsonDeserializationContext context) {
|
||||
return new Conditions(AdvancementPredicate.deserialize(json.get("advancement")));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Entry createEntry(PlayerAdvancementTracker advancement) {
|
||||
return new Entry(advancement);
|
||||
}
|
||||
|
||||
public void trigger(ServerPlayerEntity player) {
|
||||
PlayerAdvancementTracker key = player.getAdvancementManager();
|
||||
|
||||
Optional.ofNullable(listeners.get(key)).ifPresent(e -> {
|
||||
e.trigger((ServerWorld)player.world, key);
|
||||
});
|
||||
}
|
||||
|
||||
static class Conditions extends AbstractCriterionConditions {
|
||||
|
||||
private final AdvancementPredicate requirement;
|
||||
|
||||
public Conditions(AdvancementPredicate key) {
|
||||
super(ID);
|
||||
|
||||
requirement = key;
|
||||
}
|
||||
|
||||
public boolean test(ServerWorld world, PlayerAdvancementTracker stracker) {
|
||||
return requirement.test(world, stracker);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class Entry extends AbstractCriterion.Entry<BOHDeathCriterion.Conditions> {
|
||||
|
||||
Entry(PlayerAdvancementTracker key) {
|
||||
super(key);
|
||||
}
|
||||
|
||||
public void trigger(ServerWorld world, PlayerAdvancementTracker tracker) {
|
||||
listeners.stream()
|
||||
.filter(listener -> listener.getConditions().test(world, tracker))
|
||||
.forEach(winner -> winner.apply(advancement));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
package com.minelittlepony.unicopia.advancements;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
import net.minecraft.advancements.PlayerAdvancements;
|
||||
import net.minecraft.advancements.critereon.AbstractCriterionInstance;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.WorldServer;
|
||||
|
||||
/**
|
||||
* Advantement trigger for the book of holding. It's an achievement to die so spectacularly! :D
|
||||
*/
|
||||
public class BOHDeathTrigger extends AbstractTrigger<BOHDeathTrigger.Entry, BOHDeathTrigger.Instance> {
|
||||
|
||||
private static final ResourceLocation ID = new ResourceLocation("unicopia", "death_by_bag_of_holding");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getId() {
|
||||
return ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) {
|
||||
return new Instance(AdvancementPredicate.deserialize(json.get("advancement")));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Entry createEntry(PlayerAdvancements advancement) {
|
||||
return new Entry(advancement);
|
||||
}
|
||||
|
||||
public void trigger(EntityPlayerMP player) {
|
||||
PlayerAdvancements key = player.getAdvancements();
|
||||
|
||||
Optional.ofNullable(listeners.get(key)).ifPresent(e -> {
|
||||
e.trigger((WorldServer)player.world, key);
|
||||
});
|
||||
}
|
||||
|
||||
static class Instance extends AbstractCriterionInstance {
|
||||
|
||||
private final AdvancementPredicate requirement;
|
||||
|
||||
public Instance(AdvancementPredicate key) {
|
||||
super(ID);
|
||||
|
||||
requirement = key;
|
||||
}
|
||||
|
||||
public boolean test(WorldServer world, PlayerAdvancements playerAdvancements) {
|
||||
return requirement.test(world, playerAdvancements);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class Entry extends AbstractTrigger.Entry<BOHDeathTrigger.Instance> {
|
||||
|
||||
Entry(PlayerAdvancements key) {
|
||||
super(key);
|
||||
}
|
||||
|
||||
public void trigger(WorldServer world, PlayerAdvancements playerAdvancements) {
|
||||
listeners.stream()
|
||||
.filter(listener -> listener.getCriterionInstance().test(world, playerAdvancements))
|
||||
.forEach(winner -> winner.grantCriterion(advancement));;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package com.minelittlepony.unicopia.advancements;
|
||||
|
||||
import net.minecraft.advancements.CriteriaTriggers;
|
||||
|
||||
public class UAdvancements {
|
||||
public static final BOHDeathTrigger BOH_DEATH = new BOHDeathTrigger();
|
||||
|
||||
public static void init() {
|
||||
CriteriaTriggers.register(BOH_DEATH);
|
||||
}
|
||||
}
|
|
@ -4,55 +4,51 @@ import java.util.Random;
|
|||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.init.UItems;
|
||||
import com.minelittlepony.unicopia.UItems;
|
||||
|
||||
import net.minecraft.block.BlockCrops;
|
||||
import net.minecraft.block.properties.PropertyEnum;
|
||||
import net.minecraft.block.properties.PropertyInteger;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.CropBlock;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IStringSerializable;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.state.property.EnumProperty;
|
||||
import net.minecraft.state.property.IntProperty;
|
||||
import net.minecraft.util.StringIdentifiable;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
import net.minecraftforge.common.ForgeHooks;
|
||||
|
||||
public class BlockAlfalfa extends BlockCrops {
|
||||
public class BlockAlfalfa extends CropBlock {
|
||||
|
||||
public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 4);
|
||||
public static final PropertyEnum<Half> HALF = PropertyEnum.create("half", Half.class);
|
||||
public static final IntProperty AGE = IntProperty.of("age", 0, 4);
|
||||
public static final EnumProperty<Half> HALF = EnumProperty.of("half", Half.class);
|
||||
|
||||
private static final AxisAlignedBB[] BOUNDS = new AxisAlignedBB[] {
|
||||
new AxisAlignedBB(0, 0, 0, 1, 0.1, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 0.2, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 0.4, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 0.6, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 0.8, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 1, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 1.2, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 1.4, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 1.6, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 1.8, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 2, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 2.2, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 2.4, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 2.6, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 2.8, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, 3, 1)
|
||||
private static final Box[] BOUNDS = new Box[] {
|
||||
new Box(0, 0, 0, 1, 0.1, 1),
|
||||
new Box(0, 0, 0, 1, 0.2, 1),
|
||||
new Box(0, 0, 0, 1, 0.4, 1),
|
||||
new Box(0, 0, 0, 1, 0.6, 1),
|
||||
new Box(0, 0, 0, 1, 0.8, 1),
|
||||
new Box(0, 0, 0, 1, 1, 1),
|
||||
new Box(0, 0, 0, 1, 1.2, 1),
|
||||
new Box(0, 0, 0, 1, 1.4, 1),
|
||||
new Box(0, 0, 0, 1, 1.6, 1),
|
||||
new Box(0, 0, 0, 1, 1.8, 1),
|
||||
new Box(0, 0, 0, 1, 2, 1),
|
||||
new Box(0, 0, 0, 1, 2.2, 1),
|
||||
new Box(0, 0, 0, 1, 2.4, 1),
|
||||
new Box(0, 0, 0, 1, 2.6, 1),
|
||||
new Box(0, 0, 0, 1, 2.8, 1),
|
||||
new Box(0, 0, 0, 1, 3, 1)
|
||||
};
|
||||
|
||||
public BlockAlfalfa(String domain, String name) {
|
||||
setRegistryName(domain, name);
|
||||
setTranslationKey(name);
|
||||
|
||||
setDefaultState(getDefaultState().withProperty(HALF, Half.BOTTOM));
|
||||
setDefaultState(getDefaultState().with(HALF, Half.BOTTOM));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -61,7 +57,7 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected PropertyInteger getAgeProperty() {
|
||||
public IntProperty getAgeProperty() {
|
||||
return AGE;
|
||||
}
|
||||
|
||||
|
@ -71,7 +67,7 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected Item getSeed() {
|
||||
protected Item getSeedsItem() {
|
||||
return UItems.alfalfa_seeds;
|
||||
}
|
||||
|
||||
|
@ -81,37 +77,32 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
|
||||
public void onScheduledTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
checkAndDropBlock(world, pos, state);
|
||||
if (rand.nextInt(10) != 0) {
|
||||
|
||||
if (world.isAreaLoaded(pos, 1) && world.getLightFromNeighbors(pos.up()) >= 9) {
|
||||
if (canGrow(world, pos, state, false)) {
|
||||
float f = getGrowthChance(this, world, pos);
|
||||
|
||||
if(ForgeHooks.onCropsGrowPre(world, pos, state, rand.nextInt((int)(25 / f) + 1) == 0)) {
|
||||
if (world.isBlockLoaded(pos) && world.getLightLevel(pos.up()) >= 9) {
|
||||
if (canGrow(world, rand, pos, state)) {
|
||||
growUpwards(world, pos, state, 1);
|
||||
ForgeHooks.onCropsGrowPost(world, pos, state, world.getBlockState(pos));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canSustainBush(IBlockState state) {
|
||||
protected boolean canSustainBush(BlockState state) {
|
||||
return super.canSustainBush(state) || state.getBlock() == this;
|
||||
}
|
||||
|
||||
protected void growUpwards(World world, BlockPos pos, IBlockState state, int increase) {
|
||||
protected void growUpwards(World world, BlockPos pos, BlockState state, int increase) {
|
||||
boolean hasDown = world.getBlockState(pos.down()).getBlock() == this;
|
||||
boolean hasTrunk = world.getBlockState(pos.down(2)).getBlock() == this;
|
||||
boolean hasRoot = world.getBlockState(pos.down(3)).getBlock() == this;
|
||||
|
||||
if (state.getBlock() != this) {
|
||||
if (state.getBlock().isAir(state, world, pos)) {
|
||||
if (state.isAir()) {
|
||||
if (!(hasDown && hasTrunk && hasRoot)) {
|
||||
world.setBlockState(pos, withAge(increase).withProperty(HALF, Half.TOP));
|
||||
world.setBlockState(pos, withAge(increase).with(HALF, Half.TOP));
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
@ -130,17 +121,17 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
boolean hasUp = world.getBlockState(pos.up()).getBlock() == this;
|
||||
|
||||
if (hasDown && hasUp) {
|
||||
world.setBlockState(pos, withAge(age).withProperty(HALF, Half.MIDDLE));
|
||||
world.setBlockState(pos, withAge(age).with(HALF, Half.MIDDLE));
|
||||
} else if (hasUp) {
|
||||
world.setBlockState(pos, withAge(age).withProperty(HALF, Half.BOTTOM));
|
||||
world.setBlockState(pos, withAge(age).with(HALF, Half.BOTTOM));
|
||||
} else {
|
||||
world.setBlockState(pos, withAge(age).withProperty(HALF, Half.TOP));
|
||||
world.setBlockState(pos, withAge(age).with(HALF, Half.TOP));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
if (state.getValue(HALF) != Half.BOTTOM) {
|
||||
public Item getItemDropped(BlockState state, Random rand, int fortune) {
|
||||
if (state.get(HALF) != Half.BOTTOM) {
|
||||
return Items.AIR;
|
||||
}
|
||||
|
||||
|
@ -148,8 +139,8 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||
Random rand = world instanceof World ? ((World)world).rand : RANDOM;
|
||||
public void getDrops(NonNullList<ItemStack> drops, BlockView world, BlockPos pos, BlockState state, int fortune) {
|
||||
Random rand = world instanceof World ? ((World)world).random : RANDOM;
|
||||
|
||||
Item item = getItemDropped(state, rand, fortune);
|
||||
if (item != Items.AIR) {
|
||||
|
@ -162,40 +153,32 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int quantityDropped(IBlockState state, int fortune, Random random) {
|
||||
public int quantityDropped(BlockState state, int fortune, Random random) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBlockStay(World world, BlockPos pos, IBlockState state) {
|
||||
public boolean canBlockStay(World world, BlockPos pos, BlockState state) {
|
||||
return getHalf(state) != Half.BOTTOM || super.canBlockStay(world, pos, state);
|
||||
}
|
||||
|
||||
public void onPlayerDestroy(World worldIn, BlockPos pos, IBlockState state) {
|
||||
public void onPlayerDestroy(World worldIn, BlockPos pos, BlockState state) {
|
||||
breakConnectedBlocks(worldIn, pos, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) {
|
||||
public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) {
|
||||
breakConnectedBlocks(worldIn, pos, player);
|
||||
}
|
||||
|
||||
protected void breakConnectedBlocks(World worldIn, BlockPos pos, @Nullable EntityPlayer player) {
|
||||
IBlockState state = worldIn.getBlockState(pos);
|
||||
protected void breakConnectedBlocks(World worldIn, BlockPos pos, @Nullable PlayerEntity player) {
|
||||
BlockState state = worldIn.getBlockState(pos);
|
||||
|
||||
if (state.getBlock() != this) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (player != null && player.capabilities.isCreativeMode) {
|
||||
worldIn.setBlockToAir(pos);
|
||||
} else {
|
||||
if (worldIn.isRemote) {
|
||||
worldIn.setBlockToAir(pos);
|
||||
} else {
|
||||
worldIn.destroyBlock(pos, true);
|
||||
}
|
||||
}
|
||||
worldIn.breakBlock(pos, true);
|
||||
|
||||
Half half = getHalf(state);
|
||||
|
||||
|
@ -218,26 +201,25 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean canCollideCheck(IBlockState state, boolean hitIfLiquid) {
|
||||
public boolean canCollideCheck(BlockState state, boolean hitIfLiquid) {
|
||||
return getHalf(state) != Half.MIDDLE;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
public Box getBoundingBox(BlockState state, BlockView source, BlockPos pos) {
|
||||
return BOUNDS[Math.min(BOUNDS.length - 1, getFullAge(source, pos))].offset(getOffset(state, source, pos));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canGrow(World world, BlockPos pos, IBlockState state, boolean isClient) {
|
||||
public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) {
|
||||
Half half = getHalf(state);
|
||||
|
||||
if (half == Half.MIDDLE || (half == Half.TOP && world.getBlockState(pos.down()).getBlock() == this)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
IBlockState above = world.getBlockState(pos.up(1));
|
||||
IBlockState higher = world.getBlockState(pos.up(2));
|
||||
BlockState above = world.getBlockState(pos.up(1));
|
||||
BlockState higher = world.getBlockState(pos.up(2));
|
||||
|
||||
boolean iCanGrow = !isMaxAge(state);
|
||||
boolean aboveCanGrow = above.getBlock() != this || !isMaxAge(above);
|
||||
|
@ -247,13 +229,13 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void grow(World world, BlockPos pos, IBlockState state) {
|
||||
public void applyGrowth(World world, BlockPos pos, BlockState state) {
|
||||
growUpwards(world, pos, state, getBonemealAgeIncrease(world));
|
||||
}
|
||||
|
||||
protected BlockPos getTip(World world, BlockPos pos) {
|
||||
BlockPos above = pos.up();
|
||||
IBlockState state = world.getBlockState(above);
|
||||
BlockState state = world.getBlockState(above);
|
||||
|
||||
if (state.getBlock() == this) {
|
||||
return getTip(world, above);
|
||||
|
@ -262,35 +244,29 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
return pos;
|
||||
}
|
||||
|
||||
protected int getFullAge(IBlockAccess world, BlockPos pos) {
|
||||
IBlockState state = world.getBlockState(pos);
|
||||
protected int getFullAge(BlockView world, BlockPos pos) {
|
||||
BlockState state = world.getBlockState(pos);
|
||||
|
||||
int age = 0;
|
||||
|
||||
if (state.getBlock() == this) {
|
||||
age += state.getValue(getAgeProperty());
|
||||
|
||||
age += state.get(getAgeProperty());
|
||||
age += getFullAge(world, pos.up());
|
||||
}
|
||||
|
||||
return age;
|
||||
}
|
||||
|
||||
protected Half getHalf(IBlockState state) {
|
||||
return (Half)state.getValue(HALF);
|
||||
protected Half getHalf(BlockState state) {
|
||||
return state.get(HALF);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumPlantType getPlantType(IBlockAccess world, BlockPos pos) {
|
||||
return EnumPlantType.Crop;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
public BlockState getStateFromMeta(int meta) {
|
||||
int age = meta % (getMaxAge() + 1);
|
||||
int half = (int)Math.floor(meta / (getMaxAge() + 1)) % Half.values().length;
|
||||
|
||||
return withAge(age).withProperty(HALF, Half.values()[half]);
|
||||
return withAge(age).with(HALF, Half.values()[half]);
|
||||
}
|
||||
|
||||
// 0: age:0, half:0
|
||||
|
@ -310,14 +286,14 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
//14: age:4, half:2
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
public int getMetaFromState(BlockState state) {
|
||||
int age = getAge(state);
|
||||
int half = getHalf(state).ordinal();
|
||||
|
||||
return (half * (getMaxAge() + 1)) + age;
|
||||
}
|
||||
|
||||
public static enum Half implements IStringSerializable {
|
||||
public enum Half implements StringIdentifiable {
|
||||
TOP,
|
||||
MIDDLE,
|
||||
BOTTOM;
|
||||
|
@ -330,12 +306,14 @@ public class BlockAlfalfa extends BlockCrops {
|
|||
return this != BOTTOM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
return this == TOP ? "top" : this == MIDDLE ? "middle" : "bottom";
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this == TOP ? "top" : this == MIDDLE ? "middle" : "bottom";
|
||||
@Override
|
||||
public String asString() {
|
||||
return toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.init.UMaterials;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
|
||||
import net.minecraft.block.material.MapColor;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockChiselledChitin extends BlockDirected {
|
||||
|
||||
public BlockChiselledChitin(String domain, String name) {
|
||||
super(UMaterials.hive, domain, name);
|
||||
|
||||
setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
setHardness(50);
|
||||
setResistance(2000);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos) {
|
||||
return MapColor.BLACK;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public float getPlayerRelativeBlockHardness(IBlockState state, EntityPlayer player, World worldIn, BlockPos pos) {
|
||||
float hardness = super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
|
||||
|
||||
IPlayer iplayer = PlayerSpeciesList.instance().getPlayer(player);
|
||||
Race race = iplayer.getPlayerSpecies();
|
||||
|
||||
if (race == Race.CHANGELING) {
|
||||
hardness *= 80;
|
||||
} else if (race.canInteractWithClouds()) {
|
||||
hardness /= 4;
|
||||
} else if (race.canUseEarth()) {
|
||||
hardness *= 10;
|
||||
}
|
||||
|
||||
return hardness;
|
||||
}
|
||||
}
|
|
@ -1,113 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.init.UItems;
|
||||
import com.minelittlepony.unicopia.init.UMaterials;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.material.MapColor;
|
||||
import net.minecraft.block.properties.PropertyEnum;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.IStringSerializable;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockChitin extends Block {
|
||||
|
||||
public static final PropertyEnum<Covering> COVERING = PropertyEnum.create("covering", Covering.class);
|
||||
|
||||
public BlockChitin(String domain, String name) {
|
||||
super(UMaterials.hive);
|
||||
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
setDefaultState(blockState.getBaseState().withProperty(COVERING, Covering.UNCOVERED));
|
||||
setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
setHardness(50);
|
||||
setResistance(2000);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos) {
|
||||
return MapColor.BLACK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int quantityDropped(Random random) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
return UItems.chitin_shell;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public float getPlayerRelativeBlockHardness(IBlockState state, EntityPlayer player, World worldIn, BlockPos pos) {
|
||||
float hardness = super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
|
||||
|
||||
IPlayer iplayer = PlayerSpeciesList.instance().getPlayer(player);
|
||||
Race race = iplayer.getPlayerSpecies();
|
||||
|
||||
if (race == Race.CHANGELING) {
|
||||
hardness *= 80;
|
||||
} else if (race.canInteractWithClouds()) {
|
||||
hardness /= 4;
|
||||
} else if (race.canUseEarth()) {
|
||||
hardness *= 10;
|
||||
}
|
||||
|
||||
return hardness;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
IBlockState s = world.getBlockState(pos.up());
|
||||
Block block = s.getBlock();
|
||||
|
||||
boolean snowy = block == Blocks.SNOW || block == Blocks.SNOW_LAYER;
|
||||
boolean solid = (s.isFullBlock() && s.isFullCube()) || s.isSideSolid(world, pos.up(), EnumFacing.DOWN);
|
||||
|
||||
return state.withProperty(COVERING, snowy ? Covering.SNOW_COVERED : solid ? Covering.COVERED : Covering.UNCOVERED);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockStateContainer createBlockState() {
|
||||
return new BlockStateContainer(this, COVERING);
|
||||
}
|
||||
|
||||
public static enum Covering implements IStringSerializable {
|
||||
COVERED,
|
||||
UNCOVERED,
|
||||
SNOW_COVERED;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -6,9 +6,9 @@ import java.util.Random;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
import com.minelittlepony.unicopia.init.UBlocks;
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
import com.minelittlepony.unicopia.UBlocks;
|
||||
import com.minelittlepony.unicopia.item.ItemMoss;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.SoundType;
|
||||
|
@ -20,7 +20,7 @@ import net.minecraft.entity.player.EntityPlayer;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
@ -146,7 +146,7 @@ public class BlockCloud extends Block implements ICloudBlock, ITillable {
|
|||
}
|
||||
|
||||
@Deprecated
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
if (getCanInteract(state, entity)) {
|
||||
super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entity, p_185477_7_);
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ public class BlockCloud extends Block implements ICloudBlock, ITillable {
|
|||
|
||||
@Override
|
||||
public boolean canBeTilled(ItemStack hoe, EntityPlayer player, World world, IBlockState state, BlockPos pos) {
|
||||
return PlayerSpeciesList.instance().getPlayer(player).getPlayerSpecies().canInteractWithClouds()
|
||||
return SpeciesList.instance().getPlayer(player).getSpecies().canInteractWithClouds()
|
||||
&& ITillable.super.canBeTilled(hoe, player, world, state, pos);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ import net.minecraft.util.BlockRenderLayer;
|
|||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
@ -128,7 +128,7 @@ public class BlockCloudAnvil extends BlockAnvil implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Deprecated
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
if (getCanInteract(state, entity)) {
|
||||
super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entity, p_185477_7_);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import net.minecraft.block.state.IBlockState;
|
|||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
@ -22,28 +22,28 @@ public class BlockCloudBanister extends BlockCloudFence {
|
|||
public static final double d = 5/16D;
|
||||
public static final double h = 2/16D;
|
||||
|
||||
public static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(d, 0, l, l, h, 1);
|
||||
public static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0, 0, d, d, h, l);
|
||||
public static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(d, 0, 0, l, h, d);
|
||||
public static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(l, 0, d, 1, h, l);
|
||||
public static final Box SOUTH_AABB = new Box(d, 0, l, l, h, 1);
|
||||
public static final Box WEST_AABB = new Box(0, 0, d, d, h, l);
|
||||
public static final Box NORTH_AABB = new Box(d, 0, 0, l, h, d);
|
||||
public static final Box EAST_AABB = new Box(l, 0, d, 1, h, l);
|
||||
|
||||
public static final AxisAlignedBB[] BOUNDING_BOXES = new AxisAlignedBB[] {
|
||||
new AxisAlignedBB(d, 0, d, l, h, l),
|
||||
new AxisAlignedBB(d, 0, d, l, h, 1),
|
||||
new AxisAlignedBB(0, 0, d, l, h, l),
|
||||
new AxisAlignedBB(0, 0, d, l, h, 1),
|
||||
new AxisAlignedBB(d, 0, 0, l, h, l),
|
||||
new AxisAlignedBB(d, 0, 0, l, h, 1),
|
||||
new AxisAlignedBB(0, 0, 0, l, h, l),
|
||||
new AxisAlignedBB(0, 0, 0, l, h, 1),
|
||||
new AxisAlignedBB(d, 0, d, 1, h, l),
|
||||
new AxisAlignedBB(d, 0, d, 1, h, 1),
|
||||
new AxisAlignedBB(0, 0, d, 1, h, l),
|
||||
new AxisAlignedBB(0, 0, d, 1, h, 1),
|
||||
new AxisAlignedBB(d, 0, 0, 1, h, l),
|
||||
new AxisAlignedBB(d, 0, 0, 1, h, 1),
|
||||
new AxisAlignedBB(0, 0, 0, 1, h, l),
|
||||
new AxisAlignedBB(0, 0, 0, 1, h, 1)
|
||||
public static final Box[] BOUNDING_BOXES = new Box[] {
|
||||
new Box(d, 0, d, l, h, l),
|
||||
new Box(d, 0, d, l, h, 1),
|
||||
new Box(0, 0, d, l, h, l),
|
||||
new Box(0, 0, d, l, h, 1),
|
||||
new Box(d, 0, 0, l, h, l),
|
||||
new Box(d, 0, 0, l, h, 1),
|
||||
new Box(0, 0, 0, l, h, l),
|
||||
new Box(0, 0, 0, l, h, 1),
|
||||
new Box(d, 0, d, 1, h, l),
|
||||
new Box(d, 0, d, 1, h, 1),
|
||||
new Box(0, 0, d, 1, h, l),
|
||||
new Box(0, 0, d, 1, h, 1),
|
||||
new Box(d, 0, 0, 1, h, l),
|
||||
new Box(d, 0, 0, 1, h, 1),
|
||||
new Box(0, 0, 0, 1, h, l),
|
||||
new Box(0, 0, 0, 1, h, 1)
|
||||
};
|
||||
|
||||
public BlockCloudBanister(Material material, String domain, String name) {
|
||||
|
@ -73,7 +73,7 @@ public class BlockCloudBanister extends BlockCloudFence {
|
|||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void addCollisionBoxToList(IBlockState state, World world, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean isActualState) {
|
||||
public void addCollisionBoxToList(IBlockState state, World world, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean isActualState) {
|
||||
if (!getCanInteract(state, entity)) {
|
||||
return;
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ public class BlockCloudBanister extends BlockCloudFence {
|
|||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
public Box getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
state = state.getActualState(source, pos);
|
||||
return BOUNDING_BOXES[getBoundingBoxIdx(state)];
|
||||
}
|
||||
|
|
|
@ -5,19 +5,18 @@ import java.util.List;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
import com.minelittlepony.unicopia.init.UBlocks;
|
||||
import com.minelittlepony.unicopia.UBlocks;
|
||||
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.BlockRenderLayer;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Direction.Axis;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockCloudFarm extends UFarmland implements ICloudBlock {
|
||||
|
@ -29,12 +28,7 @@ public class BlockCloudFarm extends UFarmland implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isTranslucent(IBlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAir(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
public boolean isAir(BlockState state, IBlockAccess world, BlockPos pos) {
|
||||
return allowsFallingBlockToPass(state, world, pos);
|
||||
}
|
||||
|
||||
|
@ -44,21 +38,19 @@ public class BlockCloudFarm extends UFarmland implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) {
|
||||
|
||||
IBlockState beside = world.getBlockState(pos.offset(face));
|
||||
public boolean isSideInvisible(BlockState state, BlockState beside, Direction face) {
|
||||
|
||||
if (beside.getBlock() instanceof ICloudBlock) {
|
||||
ICloudBlock cloud = ((ICloudBlock)beside.getBlock());
|
||||
|
||||
if ((face == EnumFacing.DOWN || face == EnumFacing.UP || cloud == this)) {
|
||||
if ((face.getAxis() == Axis.Y || cloud == this)) {
|
||||
if (cloud.getCloudMaterialType(beside) == getCloudMaterialType(state)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return super.doesSideBlockRendering(state, world, pos, face);
|
||||
return super.isSideInvisible(state, beside, face);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -69,21 +61,21 @@ public class BlockCloudFarm extends UFarmland implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onLanded(World worldIn, Entity entity) {
|
||||
public void onEntityLand(BlockView world, Entity entity) {
|
||||
if (!applyRebound(entity)) {
|
||||
super.onLanded(worldIn, entity);
|
||||
super.onEntityLand(world, entity);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntityCollision(World w, BlockPos pos, IBlockState state, Entity entity) {
|
||||
public void onEntityCollision(BlockState state, World w, BlockPos pos, Entity entity) {
|
||||
if (!applyBouncyness(state, entity)) {
|
||||
super.onEntityCollision(w, pos, state, entity);
|
||||
super.onEntityCollision(state, w, pos, entity);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canEntityDestroy(IBlockState state, IBlockAccess world, BlockPos pos, Entity entity) {
|
||||
public boolean canEntityDestroy(BlockState state, BlockView world, BlockPos pos, Entity entity) {
|
||||
return getCanInteract(state, entity) && super.canEntityDestroy(state, world, pos, entity);
|
||||
}
|
||||
|
||||
|
@ -97,7 +89,7 @@ public class BlockCloudFarm extends UFarmland implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Deprecated
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
if (getCanInteract(state, entity)) {
|
||||
super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entity, p_185477_7_);
|
||||
}
|
||||
|
@ -105,21 +97,21 @@ public class BlockCloudFarm extends UFarmland implements ICloudBlock {
|
|||
|
||||
@Deprecated
|
||||
@Override
|
||||
public float getPlayerRelativeBlockHardness(IBlockState state, EntityPlayer player, World worldIn, BlockPos pos) {
|
||||
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
|
||||
if (CloudType.NORMAL.canInteract(player)) {
|
||||
return super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
|
||||
return super.calcBlockBreakingDelta(state, player, world, pos);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public CloudType getCloudMaterialType(IBlockState blockState) {
|
||||
public CloudType getCloudMaterialType(BlockState blockState) {
|
||||
return CloudType.NORMAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IBlockState getDroppedState(IBlockState state) {
|
||||
protected BlockState getDroppedState(BlockState state) {
|
||||
return UBlocks.normal_cloud.getDefaultState();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,22 +6,17 @@ import javax.annotation.Nullable;
|
|||
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
|
||||
import net.minecraft.block.BlockFence;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.BlockRenderLayer;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.FenceBlock;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockCloudFence extends BlockFence implements ICloudBlock {
|
||||
public class BlockCloudFence extends FenceBlock implements ICloudBlock {
|
||||
|
||||
private final CloudType variant;
|
||||
|
||||
|
@ -71,7 +66,7 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock {
|
|||
|
||||
@Override
|
||||
public BlockRenderLayer getRenderLayer() {
|
||||
return variant == CloudType.NORMAL ? BlockRenderLayer.TRANSLUCENT : super.getRenderLayer();
|
||||
return BlockRenderLayer.TRANSLUCENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -82,9 +77,9 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onLanded(World worldIn, Entity entity) {
|
||||
public void onEntityLand(BlockView world, Entity entity) {
|
||||
if (!applyRebound(entity)) {
|
||||
super.onLanded(worldIn, entity);
|
||||
super.onEntityLand(world, entity);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -96,9 +91,9 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onEntityCollision(World w, BlockPos pos, IBlockState state, Entity entity) {
|
||||
public void onEntityCollision(BlockState state, World w, BlockPos pos, Entity entity) {
|
||||
if (!applyBouncyness(state, entity)) {
|
||||
super.onEntityCollision(w, pos, state, entity);
|
||||
super.onEntityCollision(state, w, pos, entity);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,7 +103,7 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Deprecated
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean isActualState) {
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean isActualState) {
|
||||
if (getCanInteract(state, entity)) {
|
||||
super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entity, isActualState);
|
||||
}
|
||||
|
@ -116,9 +111,9 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock {
|
|||
|
||||
@Deprecated
|
||||
@Override
|
||||
public float getPlayerRelativeBlockHardness(IBlockState state, EntityPlayer player, World worldIn, BlockPos pos) {
|
||||
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
|
||||
if (CloudType.NORMAL.canInteract(player)) {
|
||||
return super.getPlayerRelativeBlockHardness(state, player, worldIn, pos);
|
||||
return super.calcBlockBreakingDelta(state, player, world, pos);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -6,20 +6,18 @@ import java.util.Random;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
import com.minelittlepony.unicopia.forgebullshit.FUF;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockStairs;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.block.StairsBlock;
|
||||
import net.minecraft.block.enums.BlockHalf;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.state.property.Properties;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class BlockCloudSlab<T extends Block & ICloudBlock> extends USlab<T> implements ICloudBlock {
|
||||
|
@ -30,19 +28,19 @@ public abstract class BlockCloudSlab<T extends Block & ICloudBlock> extends USla
|
|||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean isTopSolid(IBlockState state) {
|
||||
public boolean isTopSolid(BlockState state) {
|
||||
return getCloudMaterialType(state) == CloudType.ENCHANTED && super.isTopSolid(state);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@FUF(reason = "...Really?")
|
||||
public boolean isSideSolid(IBlockState base_state, IBlockAccess world, BlockPos pos, EnumFacing side) {
|
||||
public boolean isSideSolid(BlockState base_state, BlockAccess world, BlockPos pos, Direction side) {
|
||||
return getCloudMaterialType(base_state) == CloudType.ENCHANTED && super.isSideSolid(base_state, world, pos, side);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
if (getCanInteract(state, entity)) {
|
||||
super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entity, p_185477_7_);
|
||||
}
|
||||
|
@ -58,7 +56,7 @@ public abstract class BlockCloudSlab<T extends Block & ICloudBlock> extends USla
|
|||
}
|
||||
|
||||
@Override
|
||||
public CloudType getCloudMaterialType(IBlockState blockState) {
|
||||
public CloudType getCloudMaterialType(BlockState blockState) {
|
||||
return modelBlock.getCloudMaterialType(blockState);
|
||||
}
|
||||
|
||||
|
@ -78,32 +76,30 @@ public abstract class BlockCloudSlab<T extends Block & ICloudBlock> extends USla
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) {
|
||||
|
||||
IBlockState beside = world.getBlockState(pos.offset(face));
|
||||
public boolean isSideInvisible(BlockState state, BlockState beside, Direction face) {
|
||||
|
||||
if (beside.getBlock() instanceof ICloudBlock) {
|
||||
ICloudBlock cloud = ((ICloudBlock)beside.getBlock());
|
||||
|
||||
if (cloud.getCloudMaterialType(beside) == getCloudMaterialType(state)) {
|
||||
|
||||
EnumBlockHalf half = state.getValue(HALF);
|
||||
BlockHalf half = state.get(HALF);
|
||||
|
||||
if (beside.getBlock() instanceof BlockCloudStairs) {
|
||||
return beside.getValue(BlockStairs.HALF).ordinal() == state.getValue(HALF).ordinal()
|
||||
&& beside.getValue(BlockStairs.FACING) == face;
|
||||
return beside.get(StairsBlock.HALF).ordinal() == state.get(HALF).ordinal()
|
||||
&& beside.get(Properties.FACING) == face;
|
||||
}
|
||||
|
||||
if (face == EnumFacing.DOWN) {
|
||||
return half == EnumBlockHalf.BOTTOM;
|
||||
if (face == Direction.DOWN) {
|
||||
return half == BlockHalf.BOTTOM;
|
||||
}
|
||||
|
||||
if (face == EnumFacing.UP) {
|
||||
return half == EnumBlockHalf.TOP;
|
||||
if (face == Direction.UP) {
|
||||
return half == BlockHalf.TOP;
|
||||
}
|
||||
|
||||
if (beside.getBlock() == this) {
|
||||
return beside.getValue(HALF) == state.getValue(HALF);
|
||||
return beside.get(HALF) == state.get(HALF);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ import net.minecraft.block.state.BlockFaceShape;
|
|||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
@ -32,7 +32,7 @@ public class BlockCloudStairs extends UStairs implements ICloudBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) {
|
||||
if (getCanInteract(theState, entity)) {
|
||||
super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entity, p_185477_7_);
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ public class BlockDiamondDoor extends UDoor {
|
|||
@Override
|
||||
protected boolean onPowerStateChanged(World world, IBlockState state, BlockPos pos, boolean powered) {
|
||||
if (state.getValue(OPEN)) {
|
||||
world.setBlockState(pos, state.withProperty(OPEN, false), 2);
|
||||
world.setBlockState(pos, state.with(OPEN, false), 2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import net.minecraft.block.BlockDirectional;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.Mirror;
|
||||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockDirected extends BlockDirectional {
|
||||
|
||||
public BlockDirected(Material material, String domain, String name) {
|
||||
super(material);
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
|
||||
setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.UP));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState withRotation(IBlockState state, Rotation rot) {
|
||||
return state.withProperty(FACING, rot.rotate(state.getValue(FACING)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState withMirror(IBlockState state, Mirror mirror) {
|
||||
return state.withProperty(FACING, mirror.mirror(state.getValue(FACING)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
|
||||
return getDefaultState().withProperty(FACING, facing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
return getDefaultState().withProperty(FACING, EnumFacing.byIndex(meta));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
return state.getValue(FACING).getIndex();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockStateContainer createBlockState() {
|
||||
return new BlockStateContainer(this, FACING);
|
||||
}
|
||||
}
|
|
@ -33,7 +33,7 @@ public class BlockDutchDoor extends UDoor {
|
|||
|
||||
IBlockState upper = world.getBlockState(pos.up());
|
||||
if (upper.getBlock() == this && upper.getValue(OPEN) != powered) {
|
||||
world.setBlockState(pos.up(), upper.withProperty(OPEN, powered));
|
||||
world.setBlockState(pos.up(), upper.with(OPEN, powered));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -52,14 +52,14 @@ public class BlockDutchDoor extends UDoor {
|
|||
IBlockState other = world.getBlockState(pos.up());
|
||||
|
||||
if (other.getBlock() == this) {
|
||||
return state.withProperty(HINGE, other.getValue(HINGE))
|
||||
.withProperty(POWERED, other.getValue(POWERED));
|
||||
return state.with(HINGE, other.getValue(HINGE))
|
||||
.with(POWERED, other.getValue(POWERED));
|
||||
}
|
||||
} else {
|
||||
IBlockState other = world.getBlockState(pos.down());
|
||||
|
||||
if (other.getBlock() == this) {
|
||||
return state.withProperty(FACING, other.getValue(FACING));
|
||||
return state.with(FACING, other.getValue(FACING));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,15 +72,15 @@ public class BlockDutchDoor extends UDoor {
|
|||
boolean upper = (meta & 8) != 0;
|
||||
|
||||
IBlockState state = getDefaultState()
|
||||
.withProperty(HALF, upper ? EnumDoorHalf.UPPER : EnumDoorHalf.LOWER)
|
||||
.withProperty(OPEN, (meta & 4) != 0);
|
||||
.with(HALF, upper ? EnumDoorHalf.UPPER : EnumDoorHalf.LOWER)
|
||||
.with(OPEN, (meta & 4) != 0);
|
||||
|
||||
if (upper) {
|
||||
return state.withProperty(POWERED, (meta & 1) != 0)
|
||||
.withProperty(HINGE, (meta & 2) != 0 ? EnumHingePosition.RIGHT : EnumHingePosition.LEFT);
|
||||
return state.with(POWERED, (meta & 1) != 0)
|
||||
.with(HINGE, (meta & 2) != 0 ? EnumHingePosition.RIGHT : EnumHingePosition.LEFT);
|
||||
}
|
||||
|
||||
return state.withProperty(FACING, EnumFacing.byHorizontalIndex(meta & 3).rotateYCCW());
|
||||
return state.with(FACING, EnumFacing.byHorizontalIndex(meta & 3).rotateYCCW());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,250 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.function.Function;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockLeaves;
|
||||
import net.minecraft.block.BlockPlanks.EnumType;
|
||||
import net.minecraft.block.properties.PropertyBool;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.item.EnumDyeColor;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemDye;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome.TempCategory;
|
||||
|
||||
public class BlockFruitLeaves extends BlockLeaves implements IColourful {
|
||||
|
||||
public static final PropertyBool HEAVY = PropertyBool.create("heavy");
|
||||
|
||||
private final Block sapling;
|
||||
|
||||
private boolean hardy;
|
||||
|
||||
private int baseGrowthChance;
|
||||
private int customTint;
|
||||
|
||||
private Function<World, ItemStack> fruitProducer = w -> ItemStack.EMPTY;
|
||||
private Function<World, ItemStack> compostProducer = w -> ItemStack.EMPTY;
|
||||
|
||||
public BlockFruitLeaves(String domain, String name, Block sapling) {
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
|
||||
setDefaultState(blockState.getBaseState()
|
||||
.withProperty(HEAVY, false)
|
||||
.withProperty(CHECK_DECAY, true)
|
||||
.withProperty(DECAYABLE, true)
|
||||
);
|
||||
|
||||
this.sapling = sapling;
|
||||
}
|
||||
|
||||
public BlockFruitLeaves setHardy(boolean value) {
|
||||
hardy = value;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public BlockFruitLeaves setHarvestFruit(@Nonnull Function<World, ItemStack> producer) {
|
||||
fruitProducer = producer;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public BlockFruitLeaves setUnharvestFruit(@Nonnull Function<World, ItemStack> producer) {
|
||||
compostProducer = producer;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public BlockFruitLeaves setBaseGrowthChance(int chance) {
|
||||
baseGrowthChance = chance;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public BlockFruitLeaves setTint(int tint) {
|
||||
customTint = tint;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpaqueCube(IBlockState state) {
|
||||
return Blocks.LEAVES.getDefaultState().isOpaqueCube();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockRenderLayer getRenderLayer() {
|
||||
setGraphicsLevel(!Blocks.LEAVES.getDefaultState().isOpaqueCube());
|
||||
return super.getRenderLayer();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
|
||||
setGraphicsLevel(!Blocks.LEAVES.getDefaultState().isOpaqueCube());
|
||||
return super.shouldSideBeRendered(blockState, blockAccess, pos, side);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
return Item.getItemFromBlock(sapling);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
|
||||
if (PlayerSpeciesList.instance().getPlayer(player).getPlayerSpecies().canUseEarth()) {
|
||||
if (stack.isEmpty()) {
|
||||
|
||||
if (state.getValue(HEAVY)) {
|
||||
dropApple(world, pos, state, 0);
|
||||
world.setBlockState(pos, state.withProperty(HEAVY, false));
|
||||
}
|
||||
} else if (stack.getItem() instanceof ItemDye && EnumDyeColor.byDyeDamage(stack.getMetadata()) == EnumDyeColor.WHITE) {
|
||||
if (!state.getValue(HEAVY)) {
|
||||
world.setBlockState(pos, state.withProperty(HEAVY, true));
|
||||
|
||||
if (!world.isRemote) {
|
||||
world.playEvent(2005, pos, 0);
|
||||
}
|
||||
|
||||
if (!player.capabilities.isCreativeMode) {
|
||||
stack.shrink(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
|
||||
if (!world.isRemote && world.isAreaLoaded(pos, 1)) {
|
||||
if (state.getValue(DECAYABLE)) {
|
||||
int growthChance = getGrowthChance(world, pos, state);
|
||||
|
||||
if (!state.getValue(HEAVY) && (growthChance <= 0 || rand.nextInt(growthChance) == 0)) {
|
||||
world.setBlockState(pos, state.withProperty(HEAVY, true));
|
||||
} else {
|
||||
growthChance /= 10;
|
||||
|
||||
if (state.getValue(HEAVY) && (growthChance <= 0 || rand.nextInt(growthChance) == 0)) {
|
||||
dropApple(world, pos, state, 0);
|
||||
world.setBlockState(pos, state.withProperty(HEAVY, false));
|
||||
} else {
|
||||
super.updateTick(world, pos, state, rand);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected int getGrowthChance(World world, BlockPos pos, IBlockState state) {
|
||||
int chance = baseGrowthChance;
|
||||
|
||||
if (!hardy && !world.isDaytime()) {
|
||||
chance *= 40;
|
||||
}
|
||||
|
||||
if (world.getLight(pos) >= 4) {
|
||||
chance /= 3;
|
||||
}
|
||||
|
||||
TempCategory temp = world.getBiome(pos).getTempCategory();
|
||||
|
||||
if (!hardy && temp == TempCategory.COLD) {
|
||||
chance *= 1000;
|
||||
}
|
||||
|
||||
if (temp == TempCategory.WARM) {
|
||||
chance /= 100;
|
||||
}
|
||||
|
||||
if (temp == TempCategory.MEDIUM) {
|
||||
chance /= 50;
|
||||
}
|
||||
|
||||
return chance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCustomTint(IBlockState state, int tint) {
|
||||
return customTint;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dropApple(World world, BlockPos pos, IBlockState state, int chance) {
|
||||
if (state.getValue(HEAVY)) {
|
||||
Function<World, ItemStack> fruit = world.rand.nextInt(40) == 0 ? compostProducer : fruitProducer;
|
||||
spawnAsEntity(world, pos, fruit.apply(world));
|
||||
|
||||
world.playSound(null, pos, SoundEvents.ENTITY_ITEMFRAME_PLACE, SoundCategory.BLOCKS, 0.3F, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NonNullList<ItemStack> onSheared(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos, int fortune) {
|
||||
return NonNullList.withSize(1, new ItemStack(this, 1, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumType getWoodType(int meta) {
|
||||
return EnumType.OAK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
return getDefaultState()
|
||||
.withProperty(HEAVY, (meta & 1) != 0)
|
||||
.withProperty(DECAYABLE, (meta & 2) != 0)
|
||||
.withProperty(CHECK_DECAY, (meta & 4) != 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
int i = 0;
|
||||
|
||||
if (state.getValue(HEAVY)) {
|
||||
i |= 1;
|
||||
}
|
||||
|
||||
if (!state.getValue(DECAYABLE)) {
|
||||
i |= 2;
|
||||
}
|
||||
|
||||
if (state.getValue(CHECK_DECAY)) {
|
||||
i |= 4;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockStateContainer createBlockState() {
|
||||
return new BlockStateContainer(this, HEAVY, CHECK_DECAY, DECAYABLE);
|
||||
}
|
||||
}
|
|
@ -1,223 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
import com.minelittlepony.unicopia.init.UItems;
|
||||
import com.minelittlepony.unicopia.init.UParticles;
|
||||
import com.minelittlepony.unicopia.particle.Particles;
|
||||
|
||||
import net.minecraft.block.BlockTorch;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.properties.PropertyBool;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.EnumParticleTypes;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockGlowingGem extends BlockTorch implements ICloudBlock {
|
||||
|
||||
public static PropertyBool ON = PropertyBool.create("on");
|
||||
|
||||
private static final double A = 5/16D;
|
||||
private static final double B = 6/16D;
|
||||
|
||||
private static final double C = 10/16D;
|
||||
|
||||
// tiltedOffWall
|
||||
private static final double F = 10/16D;
|
||||
|
||||
// tiltedMinY
|
||||
private static final double E = 3/16D;
|
||||
|
||||
protected static final AxisAlignedBB STANDING_AABB = new AxisAlignedBB(
|
||||
7/16D, 0, 7/16D,
|
||||
9/16D, 1, 9/16D
|
||||
);
|
||||
protected static final AxisAlignedBB TORCH_NORTH_AABB = new AxisAlignedBB(
|
||||
B, E, F,
|
||||
C, 1, 1
|
||||
);
|
||||
protected static final AxisAlignedBB TORCH_SOUTH_AABB = new AxisAlignedBB(
|
||||
B, E, 0,
|
||||
C, 1, A
|
||||
);
|
||||
protected static final AxisAlignedBB TORCH_WEST_AABB = new AxisAlignedBB(
|
||||
F, E, B,
|
||||
1, 1, C
|
||||
);
|
||||
protected static final AxisAlignedBB TORCH_EAST_AABB = new AxisAlignedBB(
|
||||
0, E, B,
|
||||
A, 1, C
|
||||
);
|
||||
|
||||
public BlockGlowingGem(String domain, String name) {
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
|
||||
setHardness(0);
|
||||
setLightLevel(1);
|
||||
setSoundType(SoundType.GLASS);
|
||||
setTickRandomly(true);
|
||||
|
||||
setDefaultState(blockState.getBaseState()
|
||||
.withProperty(FACING, EnumFacing.UP)
|
||||
.withProperty(ON, true)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
|
||||
switch (state.getValue(FACING)) {
|
||||
case EAST: return TORCH_EAST_AABB;
|
||||
case WEST: return TORCH_WEST_AABB;
|
||||
case SOUTH: return TORCH_SOUTH_AABB;
|
||||
case NORTH: return TORCH_NORTH_AABB;
|
||||
default: return STANDING_AABB;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
|
||||
|
||||
if (!state.getValue(ON)) {
|
||||
ItemStack held = player.getHeldItem(hand);
|
||||
if (!held.isEmpty() && (held.getItem() == Items.FLINT_AND_STEEL || held.getItem() == Items.FIRE_CHARGE)) {
|
||||
|
||||
world.playSound(null, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
|
||||
world.setBlockState(pos, state.withProperty(ON, true));
|
||||
|
||||
if (held.getItem() == Items.FLINT_AND_STEEL) {
|
||||
held.damageItem(1, player);
|
||||
} else if (!player.capabilities.isCreativeMode) {
|
||||
held.shrink(1);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) {
|
||||
EnumFacing facing = state.getValue(FACING);
|
||||
|
||||
double x = pos.getX() + 0.5;
|
||||
double y = pos.getY() + 1;
|
||||
double z = pos.getZ() + 0.5;
|
||||
|
||||
double drop = 0.22D;
|
||||
double variance = 0.27D;
|
||||
|
||||
if (facing.getAxis().isHorizontal()) {
|
||||
facing = facing.getOpposite();
|
||||
|
||||
x += variance * facing.getXOffset();
|
||||
y += drop;
|
||||
z += variance * facing.getZOffset();
|
||||
}
|
||||
|
||||
if (state.getValue(ON)) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
Particles.instance().spawnParticle(UParticles.UNICORN_MAGIC, false,
|
||||
x - 0.3, y - 0.3, z - 0.3,
|
||||
rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
|
||||
}
|
||||
} else {
|
||||
world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x, y, z, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
|
||||
if (world.isRainingAt(pos)) {
|
||||
if (state.getValue(ON)) {
|
||||
world.playSound(null, pos, SoundEvents.BLOCK_REDSTONE_TORCH_BURNOUT, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
|
||||
world.setBlockState(pos, state.withProperty(ON, false));
|
||||
}
|
||||
} else {
|
||||
if (!state.getValue(ON)) {
|
||||
world.playSound(null, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
|
||||
world.setBlockState(pos, state.withProperty(ON, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getStrongPower(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) {
|
||||
return state.getValue(ON) && side == EnumFacing.DOWN ? state.getWeakPower(world, pos, side) : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeakPower(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) {
|
||||
return state.getValue(ON) && state.getValue(FACING) != side ? 12 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CloudType getCloudMaterialType(IBlockState blockState) {
|
||||
return CloudType.ENCHANTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||
drops.add(new ItemStack(Items.STICK));
|
||||
|
||||
Random rand = world instanceof World ? ((World)world).rand : RANDOM;
|
||||
|
||||
if (rand.nextInt(10) == 0) {
|
||||
drops.add(new ItemStack(UItems.spell));
|
||||
} else {
|
||||
drops.add(new ItemStack(UItems.curse));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public int getLightValue(IBlockState state) {
|
||||
if (state.getValue(ON)) {
|
||||
return super.getLightValue(state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
IBlockState iblockstate = this.getDefaultState();
|
||||
|
||||
int facing = (meta % 5) + 1;
|
||||
|
||||
return iblockstate
|
||||
.withProperty(FACING, EnumFacing.byIndex(facing))
|
||||
.withProperty(ON, meta > 5);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
int meta = Math.max(0, state.getValue(FACING).getIndex() - 1);
|
||||
if (state.getValue(ON)) {
|
||||
meta += EnumFacing.VALUES.length;
|
||||
}
|
||||
|
||||
return meta;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockStateContainer createBlockState() {
|
||||
return new BlockStateContainer(this, FACING, ON);
|
||||
}
|
||||
}
|
|
@ -6,56 +6,47 @@ import java.util.Random;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.Predicates;
|
||||
import com.minelittlepony.unicopia.init.UBlocks;
|
||||
import com.minelittlepony.unicopia.init.UMaterials;
|
||||
import com.minelittlepony.unicopia.init.USounds;
|
||||
import com.minelittlepony.unicopia.UBlocks;
|
||||
import com.minelittlepony.unicopia.UMaterials;
|
||||
import com.minelittlepony.unicopia.USounds;
|
||||
import com.minelittlepony.util.MagicalDamageSource;
|
||||
import com.minelittlepony.util.PosHelper;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.properties.PropertyEnum;
|
||||
import net.minecraft.block.properties.PropertyInteger;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.damage.DamageSource;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumParticleTypes;
|
||||
import net.minecraft.util.IStringSerializable;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.particle.ParticleTypes;
|
||||
import net.minecraft.state.property.EnumProperty;
|
||||
import net.minecraft.state.property.IntProperty;
|
||||
import net.minecraft.util.StringIdentifiable;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockGrowingCuccoon extends Block {
|
||||
|
||||
public static final DamageSource DAMAGE_SOURCE = new DamageSource("acid");
|
||||
public static final DamageSource DAMAGE_SOURCE = MagicalDamageSource.mundane("acid");
|
||||
|
||||
public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 7);
|
||||
public static final PropertyEnum<Shape> SHAPE = PropertyEnum.create("shape", Shape.class);
|
||||
public static final IntProperty AGE = IntProperty.of("age", 0, 7);
|
||||
public static final EnumProperty<Shape> SHAPE = EnumProperty.of("shape", Shape.class);
|
||||
|
||||
public static final AxisAlignedBB[] SHAFTS = new AxisAlignedBB[] {
|
||||
new AxisAlignedBB(7/16F, 0, 7/16F, 9/16F, 1, 7/16F),
|
||||
new AxisAlignedBB(6/16F, 0, 6/16F, 10/16F, 1, 10/16F),
|
||||
new AxisAlignedBB(5/16F, 0, 5/16F, 11/16F, 1, 11/16F),
|
||||
new AxisAlignedBB(4/16F, 0, 4/16F, 12/16F, 1, 12/16F)
|
||||
public static final Box[] SHAFTS = new Box[] {
|
||||
new Box(7/16F, 0, 7/16F, 9/16F, 1, 7/16F),
|
||||
new Box(6/16F, 0, 6/16F, 10/16F, 1, 10/16F),
|
||||
new Box(5/16F, 0, 5/16F, 11/16F, 1, 11/16F),
|
||||
new Box(4/16F, 0, 4/16F, 12/16F, 1, 12/16F)
|
||||
};
|
||||
public static final AxisAlignedBB[] BULBS = new AxisAlignedBB[] {
|
||||
new AxisAlignedBB(6/16F, 1/16F, 6/16F, 10/16F, 8/16F, 10/16F),
|
||||
new AxisAlignedBB(4/16F, 0, 4/16F, 12/16F, 9/16F, 12/16F),
|
||||
new AxisAlignedBB(3/16F, 0, 3/16F, 13/16F, 10/16F, 13/16F),
|
||||
new AxisAlignedBB(2/16F, 0, 2/16F, 14/16F, 12/16F, 14/16F),
|
||||
public static final Box[] BULBS = new Box[] {
|
||||
new Box(6/16F, 1/16F, 6/16F, 10/16F, 8/16F, 10/16F),
|
||||
new Box(4/16F, 0, 4/16F, 12/16F, 9/16F, 12/16F),
|
||||
new Box(3/16F, 0, 3/16F, 13/16F, 10/16F, 13/16F),
|
||||
new Box(2/16F, 0, 2/16F, 14/16F, 12/16F, 14/16F),
|
||||
};
|
||||
|
||||
public BlockGrowingCuccoon(String domain, String name) {
|
||||
|
@ -74,8 +65,8 @@ public class BlockGrowingCuccoon extends Block {
|
|||
useNeighborBrightness = true;
|
||||
|
||||
setDefaultState(getBlockState().getBaseState()
|
||||
.withProperty(AGE, 0)
|
||||
.withProperty(SHAPE, Shape.BULB));
|
||||
.with(AGE, 0)
|
||||
.with(SHAPE, Shape.BULB));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -106,7 +97,7 @@ public class BlockGrowingCuccoon extends Block {
|
|||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
public Box getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
return getBoundingBox(state, world, pos);
|
||||
}
|
||||
|
||||
|
@ -122,23 +113,23 @@ public class BlockGrowingCuccoon extends Block {
|
|||
return;
|
||||
}
|
||||
|
||||
int age = state.getValue(AGE);
|
||||
int age = state.get(AGE);
|
||||
|
||||
BlockPos below = pos.down();
|
||||
|
||||
if (world.isBlockLoaded(below)) {
|
||||
boolean spaceBelow = world.isAirBlock(below);
|
||||
|
||||
Shape shape = state.getValue(SHAPE);
|
||||
Shape shape = state.get(SHAPE);
|
||||
|
||||
if (shape == Shape.STRING && spaceBelow) {
|
||||
world.setBlockState(pos, state.withProperty(SHAPE, Shape.BULB).withProperty(AGE, age / 2));
|
||||
world.setBlockState(pos, state.with(SHAPE, Shape.BULB).with(AGE, age / 2));
|
||||
} else if (shape == Shape.BULB && !spaceBelow) {
|
||||
world.setBlockState(pos, state.withProperty(SHAPE, Shape.STRING).withProperty(AGE, age / 2));
|
||||
world.setBlockState(pos, state.with(SHAPE, Shape.STRING).with(AGE, age / 2));
|
||||
} else if (age >= 7) {
|
||||
if (rand.nextInt(12) == 0 && spaceBelow) {
|
||||
world.setBlockState(below, state.withProperty(AGE, age / 2));
|
||||
world.setBlockState(pos, getDefaultState().withProperty(AGE, age / 2).withProperty(SHAPE, Shape.STRING));
|
||||
world.setBlockState(below, state.with(AGE, age / 2));
|
||||
world.setBlockState(pos, getDefaultState().with(AGE, age / 2).with(SHAPE, Shape.STRING));
|
||||
world.playSound(null, pos, USounds.SLIME_ADVANCE, SoundCategory.BLOCKS, 1, 1);
|
||||
}
|
||||
} else {
|
||||
|
@ -163,14 +154,14 @@ public class BlockGrowingCuccoon extends Block {
|
|||
}
|
||||
|
||||
protected int getMaximumAge(World world, BlockPos pos, IBlockState state, boolean spaceBelow) {
|
||||
if (state.getValue(SHAPE) == Shape.STRING) {
|
||||
if (state.get(SHAPE) == Shape.STRING) {
|
||||
IBlockState higher = world.getBlockState(pos.up());
|
||||
|
||||
if (higher.getBlock() != this) {
|
||||
return 7;
|
||||
}
|
||||
|
||||
return Math.min(higher.getValue(AGE),
|
||||
return Math.min(higher.get(AGE),
|
||||
((BlockGrowingCuccoon)higher.getBlock()).getMaximumAge(world, pos.up(), higher, false) - 1
|
||||
);
|
||||
}
|
||||
|
@ -184,7 +175,7 @@ public class BlockGrowingCuccoon extends Block {
|
|||
|
||||
@Override
|
||||
public int quantityDropped(IBlockState state, int fortune, Random random) {
|
||||
return random.nextInt(3) == 0 ? state.getValue(AGE) : 0;
|
||||
return random.nextInt(3) == 0 ? state.get(AGE) : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -217,14 +208,14 @@ public class BlockGrowingCuccoon extends Block {
|
|||
|
||||
@Override
|
||||
public void onEntityCollision(World world, BlockPos pos, IBlockState state, Entity entity) {
|
||||
if (entity instanceof EntityLivingBase && !entity.isDead) {
|
||||
EntityLivingBase living = (EntityLivingBase)entity;
|
||||
if (entity instanceof LivingEntity && !entity.isDead) {
|
||||
LivingEntity living = (LivingEntity)entity;
|
||||
|
||||
if (!Predicates.BUGGY.test(living) && living.getHealth() > 0) {
|
||||
living.attackEntityFrom(DAMAGE_SOURCE, 1);
|
||||
living.setInWeb();
|
||||
|
||||
if (!world.isRemote) {
|
||||
if (!world.isClient) {
|
||||
if (living.getHealth() <= 0) {
|
||||
living.dropItem(Items.BONE, 3);
|
||||
|
||||
|
@ -274,44 +265,32 @@ public class BlockGrowingCuccoon extends Block {
|
|||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void addCollisionBoxToList(IBlockState state, World world, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean isActualState) {
|
||||
public void addCollisionBoxToList(IBlockState state, World world, BlockPos pos, Box entityBox, List<Box> collidingBoxes, @Nullable Entity entity, boolean isActualState) {
|
||||
if (!isActualState) {
|
||||
state = state.getActualState(world, pos);
|
||||
}
|
||||
|
||||
int age = state.getValue(AGE) / 2;
|
||||
int age = state.get(AGE) / 2;
|
||||
|
||||
Vec3d offset = state.getOffset(world, pos);
|
||||
|
||||
addCollisionBoxToList(pos, entityBox, collidingBoxes, SHAFTS[age % SHAFTS.length].offset(offset));
|
||||
|
||||
if (state.getValue(SHAPE) == Shape.BULB) {
|
||||
if (state.get(SHAPE) == Shape.BULB) {
|
||||
addCollisionBoxToList(pos, entityBox, collidingBoxes, BULBS[age % BULBS.length].offset(offset));
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
public Box getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
state = state.getActualState(source, pos);
|
||||
|
||||
if (state.getValue(SHAPE) == Shape.BULB) {
|
||||
return BULBS[state.getValue(AGE) / 2].offset(state.getOffset(source, pos));
|
||||
if (state.get(SHAPE) == Shape.BULB) {
|
||||
return BULBS[state.get(AGE) / 2].offset(state.getOffset(source, pos));
|
||||
}
|
||||
|
||||
return SHAFTS[state.getValue(AGE) / 2].offset(state.getOffset(source, pos));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
return getDefaultState()
|
||||
.withProperty(AGE, meta % 8)
|
||||
.withProperty(SHAPE, Shape.VALUES[(meta >> 3) % Shape.VALUES.length]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
return state.getValue(AGE) | (state.getValue(SHAPE).ordinal() << 3);
|
||||
return SHAFTS[state.get(AGE) / 2].offset(state.getOffset(source, pos));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -320,28 +299,29 @@ public class BlockGrowingCuccoon extends Block {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isLadder(IBlockState state, IBlockAccess world, BlockPos pos, EntityLivingBase entity) {
|
||||
public boolean isLadder(BlockState state, BlockView world, BlockPos pos, LivingEntity entity) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) {
|
||||
if (state.getValue(SHAPE) == Shape.BULB) {
|
||||
@Override
|
||||
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
if (state.get(SHAPE) == Shape.BULB) {
|
||||
if (rand.nextInt(8) == 0) {
|
||||
|
||||
AxisAlignedBB bounds = BULBS[state.getValue(AGE) / 2]
|
||||
Box bounds = BULBS[state.get(AGE) / 2]
|
||||
.offset(pos)
|
||||
.offset(state.getOffset(world, pos));
|
||||
.offset(state.getOffsetPos(world, pos));
|
||||
|
||||
double x = bounds.minX + (bounds.maxX - bounds.minX) * rand.nextFloat();
|
||||
double y = bounds.minY;
|
||||
double z = bounds.minZ + (bounds.maxZ - bounds.minZ) * rand.nextFloat();
|
||||
|
||||
world.spawnParticle(EnumParticleTypes.DRIP_LAVA, x, y, z, 0, 0, 0);
|
||||
world.addParticle(ParticleTypes.DRIPPING_LAVA, x, y, z, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static enum Shape implements IStringSerializable {
|
||||
enum Shape implements StringIdentifiable {
|
||||
BULB,
|
||||
STRING;
|
||||
|
||||
|
@ -349,11 +329,11 @@ public class BlockGrowingCuccoon extends Block {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
return asString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
public String asString() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,374 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.init.UBlocks;
|
||||
import com.minelittlepony.unicopia.init.UMaterials;
|
||||
import com.minelittlepony.unicopia.init.USounds;
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
import com.minelittlepony.util.PosHelper;
|
||||
import com.minelittlepony.util.shape.IShape;
|
||||
import com.minelittlepony.util.shape.Sphere;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockFalling;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.properties.PropertyEnum;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.item.EntityFallingBlock;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.EnumParticleTypes;
|
||||
import net.minecraft.util.IStringSerializable;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockHiveWall extends BlockFalling {
|
||||
|
||||
public static final PropertyEnum<State> STATE = PropertyEnum.create("state", State.class);
|
||||
public static final PropertyEnum<Axis> AXIS = PropertyEnum.create("axis", Axis.class);
|
||||
|
||||
private static final IShape shape = new Sphere(false, 1.5);
|
||||
|
||||
public BlockHiveWall(String domain, String name) {
|
||||
super(UMaterials.hive);
|
||||
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
|
||||
setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
setDefaultState(blockState.getBaseState().withProperty(STATE, State.GROWING).withProperty(AXIS, Axis.Y));
|
||||
setHardness(2);
|
||||
setSoundType(SoundType.SAND);
|
||||
setHarvestLevel("pickaxe", 1);
|
||||
setResistance(10);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
|
||||
|
||||
if (rand.nextInt(300) == 0) {
|
||||
world.playSound(null, pos, USounds.INSECT, SoundCategory.BLOCKS, 1, 1);
|
||||
}
|
||||
|
||||
State type = getState(state);
|
||||
|
||||
Axis axis = getAxis(state);
|
||||
|
||||
int matchedNeighbours = countNeighbours(world, pos);
|
||||
|
||||
if (type == State.GROWING) {
|
||||
if (testForAxis(world, pos, axis)) {
|
||||
world.setBlockState(pos, state.withProperty(STATE, State.STABLE));
|
||||
} else {
|
||||
Axis newAxis = axis;
|
||||
|
||||
for (Axis i : Axis.VALUES) {
|
||||
if (testForAxis(world, pos, i)) {
|
||||
newAxis = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (newAxis != axis) {
|
||||
world.setBlockState(pos, state.withProperty(AXIS, newAxis).withProperty(STATE, State.STABLE));
|
||||
} else if (rand.nextInt(10) == 0) {
|
||||
EnumFacing facing = axis.randomFacing(rand);
|
||||
|
||||
BlockPos other = pos.offset(facing);
|
||||
|
||||
if (canSpreadInto(world, other, axis)) {
|
||||
world.playSound(null, pos, USounds.SLIME_RETRACT, SoundCategory.BLOCKS, 1, 1);
|
||||
world.setBlockState(other, state);
|
||||
world.setBlockState(pos, state.withProperty(STATE, State.STABLE));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (type == State.DYING) {
|
||||
if (matchedNeighbours > 1 && matchedNeighbours < 17) {
|
||||
world.setBlockState(pos, state.withProperty(STATE, State.STABLE));
|
||||
} else {
|
||||
die(world, pos, rand);
|
||||
}
|
||||
} else {
|
||||
|
||||
if (pos.getX() % 3 == 0 && pos.getZ() % 4 == 0 && isEmptySpace(world, pos.down()) && UBlocks.cuccoon.canPlaceBlockAt(world, pos.down())) {
|
||||
world.setBlockState(pos.down(), UBlocks.cuccoon.getDefaultState());
|
||||
} else if (!testForAxis(world, pos, axis)) {
|
||||
world.setBlockState(pos, state.withProperty(STATE, State.GROWING));
|
||||
} else if (matchedNeighbours >= 27) {
|
||||
world.setBlockState(pos, state.withProperty(STATE, State.DYING));
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
world.scheduleUpdate(pos, this, tickRate(world));
|
||||
}
|
||||
|
||||
public State getState(IBlockState state) {
|
||||
return state.getValue(STATE);
|
||||
}
|
||||
|
||||
public Axis getAxis(IBlockState state) {
|
||||
return state.getValue(AXIS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockAdded(World world, BlockPos pos, IBlockState state) {
|
||||
if (state.getValue(STATE) != State.STABLE) {
|
||||
world.scheduleUpdate(pos, this, 10);
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean testForAxis(World world, BlockPos pos, Axis axis) {
|
||||
return !PosHelper.some(pos, p -> isEmptySpace(world, p), axis.getFacings());
|
||||
}
|
||||
|
||||
protected boolean isEmptySpace(World world, BlockPos pos) {
|
||||
|
||||
if (world.isAirBlock(pos)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
IBlockState state = world.getBlockState(pos);
|
||||
|
||||
return !(state.getMaterial().isLiquid()
|
||||
|| state.isBlockNormalCube()
|
||||
|| state.isNormalCube()
|
||||
|| state.isFullCube()
|
||||
|| state.isOpaqueCube());
|
||||
}
|
||||
|
||||
protected void die(World world, BlockPos pos, Random rand) {
|
||||
world.destroyBlock(pos, false);
|
||||
|
||||
PosHelper.all(pos, p -> {
|
||||
IBlockState s = world.getBlockState(p);
|
||||
|
||||
if (s.getBlock() == this) {
|
||||
notifyDying(world, p, s, rand);
|
||||
}
|
||||
}, EnumFacing.VALUES);
|
||||
}
|
||||
|
||||
protected void notifyDying(World world, BlockPos pos, IBlockState state, Random rand) {
|
||||
State oldState = state.getValue(STATE);
|
||||
State newState = oldState.downGrade();
|
||||
|
||||
if (newState != oldState) {
|
||||
world.setBlockState(pos, state.withProperty(STATE, newState));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntityWalk(World world, BlockPos pos, Entity entity) {
|
||||
if (entity instanceof EntityPlayer) {
|
||||
IPlayer player = PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity);
|
||||
|
||||
IBlockState state = world.getBlockState(pos);
|
||||
|
||||
if (player.getPlayerSpecies() != Race.CHANGELING) {
|
||||
if (!world.isRemote) {
|
||||
if (((isEmptySpace(world, pos.down()) || canFallThrough(world.getBlockState(pos.down()))) && pos.getY() >= 0)) {
|
||||
EntityFallingBlock faller = new EntityFallingBlock(world, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, state);
|
||||
onStartFalling(faller);
|
||||
world.spawnEntity(faller);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEndFalling(World world, BlockPos pos, IBlockState fallingState, IBlockState hitState) {
|
||||
world.destroyBlock(pos, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
|
||||
|
||||
if (hand == EnumHand.MAIN_HAND && playerIn.getHeldItem(hand).isEmpty()) {
|
||||
IPlayer player = PlayerSpeciesList.instance().getPlayer(playerIn);
|
||||
|
||||
if (player.getPlayerSpecies() == Race.CHANGELING) {
|
||||
retreat(world, pos);
|
||||
|
||||
PosHelper.adjacentNeighbours(pos).forEach(p -> {
|
||||
if (world.getBlockState(p).getBlock() == this) {
|
||||
retreat(world, p);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) {
|
||||
return getDefaultState().withProperty(AXIS, Axis.fromVanilla(facing.getAxis()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) {
|
||||
if (rand.nextInt(16) == 0) {
|
||||
Vec3d vel = shape.computePoint(rand);
|
||||
Vec3d vec = vel.add(pos.getX(), pos.getY(), pos.getZ());
|
||||
|
||||
world.spawnParticle(EnumParticleTypes.BLOCK_DUST,
|
||||
vec.x, vec.y, vec.z,
|
||||
vel.x, vel.y, vel.z,
|
||||
Block.getStateId(state));
|
||||
}
|
||||
}
|
||||
|
||||
public void retreat(World world, BlockPos pos) {
|
||||
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
world.playSound(null, pos, USounds.SLIME_RETRACT, SoundCategory.BLOCKS, 1, 1);
|
||||
}
|
||||
|
||||
protected int countNeighbours(World world, BlockPos pos) {
|
||||
int count = 0;
|
||||
for (BlockPos i : BlockPos.getAllInBoxMutable(pos.add(-1, -1, -1), pos.add(1, 1, 1))) {
|
||||
if (world.getBlockState(i).getBlock() == this) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
protected boolean exposed(World world, BlockPos pos) {
|
||||
return PosHelper.some(pos, p -> isEmptySpace(world, p), EnumFacing.VALUES);
|
||||
}
|
||||
|
||||
protected boolean canSpreadInto(World world, BlockPos pos, Axis axis) {
|
||||
if (world.isBlockLoaded(pos) && isEmptySpace(world, pos)) {
|
||||
boolean one = false;
|
||||
|
||||
for (EnumFacing facing : axis.getFacings()) {
|
||||
BlockPos op = pos.offset(facing);
|
||||
|
||||
if (world.getBlockState(op).getMaterial() == UMaterials.hive) {
|
||||
if (one) {
|
||||
return true;
|
||||
}
|
||||
|
||||
one = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
return getDefaultState()
|
||||
.withProperty(STATE, State.VALUES[meta % State.VALUES.length])
|
||||
.withProperty(AXIS, Axis.VALUES[(meta << 2) % Axis.VALUES.length]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
return getState(state).ordinal() | (getAxis(state).ordinal() >> 2);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockStateContainer createBlockState() {
|
||||
return new BlockStateContainer(this, STATE, AXIS);
|
||||
}
|
||||
|
||||
public static enum State implements IStringSerializable {
|
||||
GROWING,
|
||||
STABLE,
|
||||
DYING;
|
||||
|
||||
static final State[] VALUES = values();
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
public State upgrade() {
|
||||
switch (this) {
|
||||
case DYING: return STABLE;
|
||||
default: return GROWING;
|
||||
}
|
||||
}
|
||||
|
||||
public State downGrade() {
|
||||
switch (this) {
|
||||
case GROWING: return STABLE;
|
||||
default: return DYING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static enum Axis implements IStringSerializable {
|
||||
X(EnumFacing.Axis.X, EnumFacing.EAST, EnumFacing.WEST, EnumFacing.UP, EnumFacing.DOWN),
|
||||
Y(EnumFacing.Axis.Y, EnumFacing.EAST, EnumFacing.WEST, EnumFacing.NORTH, EnumFacing.SOUTH),
|
||||
Z(EnumFacing.Axis.Z, EnumFacing.NORTH, EnumFacing.SOUTH, EnumFacing.UP, EnumFacing.DOWN);
|
||||
|
||||
static final Axis[] VALUES = values();
|
||||
static final Map<EnumFacing.Axis, Axis> AXIS_MAP = Maps.newEnumMap(EnumFacing.Axis.class);
|
||||
|
||||
private final EnumFacing.Axis vanilla;
|
||||
private final EnumFacing[] facings;
|
||||
|
||||
static {
|
||||
for (Axis i : VALUES) {
|
||||
AXIS_MAP.put(i.vanilla, i);
|
||||
}
|
||||
}
|
||||
|
||||
Axis(EnumFacing.Axis vanilla, EnumFacing... facings) {
|
||||
this.vanilla = vanilla;
|
||||
this.facings = facings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
public EnumFacing randomFacing(Random rand) {
|
||||
return facings[rand.nextInt(facings.length)];
|
||||
}
|
||||
|
||||
public EnumFacing[] getFacings() {
|
||||
return facings;
|
||||
}
|
||||
|
||||
public static Axis fromVanilla(EnumFacing.Axis axis) {
|
||||
return AXIS_MAP.get(axis);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.BlockSnow;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.MapColor;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockSlimeLayer extends BlockSnow {
|
||||
|
||||
public BlockSlimeLayer(String domain, String name) {
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
|
||||
setSoundType(SoundType.SLIME);
|
||||
setCreativeTab(CreativeTabs.DECORATIONS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockRenderLayer getRenderLayer() {
|
||||
return BlockRenderLayer.TRANSLUCENT;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public Material getMaterial(IBlockState state) {
|
||||
return Material.CLAY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapColor getMapColor(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
return MapColor.GRASS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
return Items.SLIME_BALL;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public boolean isOpaqueCube(IBlockState state) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntityWalk(World world, BlockPos pos, Entity entity) {
|
||||
|
||||
float factor = getMotionFactor(world.getBlockState(pos));
|
||||
|
||||
entity.motionX *= factor;
|
||||
entity.motionY *= factor;
|
||||
entity.motionZ *= factor;
|
||||
}
|
||||
|
||||
protected float getMotionFactor(IBlockState state) {
|
||||
return 1/state.getValue(LAYERS);
|
||||
}
|
||||
}
|
|
@ -1,106 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemLead;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
import net.minecraftforge.common.IPlantable;
|
||||
|
||||
public class BlockStick extends Block implements IPlantable {
|
||||
|
||||
static final AxisAlignedBB BOUNDING_BOX = new AxisAlignedBB(
|
||||
7/16F, -1/16F, 7/16F,
|
||||
9/16F, 15/16F, 9/16F
|
||||
);
|
||||
|
||||
public BlockStick(String domain, String name) {
|
||||
super(Material.PLANTS);
|
||||
|
||||
setRegistryName(domain, name);
|
||||
setTranslationKey(name);
|
||||
setHardness(0.2F);
|
||||
setSoundType(SoundType.WOOD);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpaqueCube(IBlockState state) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public boolean isFullCube(IBlockState state) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
return BOUNDING_BOX.offset(state.getOffset(source, pos));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
return state.getBoundingBox(world, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumOffsetType getOffsetType() {
|
||||
return EnumOffsetType.XZ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
return Items.STICK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float x, float y, float z) {
|
||||
if (!world.isRemote) {
|
||||
return ItemLead.attachToFence(player, world, pos);
|
||||
}
|
||||
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
|
||||
return stack.getItem() == Items.LEAD || stack.isEmpty();
|
||||
}
|
||||
|
||||
public boolean canSustainPlant(IBlockAccess world, BlockPos pos, IPlantable plantable) {
|
||||
|
||||
pos = pos.down();
|
||||
|
||||
IBlockState state = world.getBlockState(pos);
|
||||
Block block = state.getBlock();
|
||||
|
||||
if (block instanceof BlockStick) {
|
||||
return ((BlockStick)block).canSustainPlant(world, pos, plantable);
|
||||
}
|
||||
|
||||
return block.canSustainPlant(state, world, pos, EnumFacing.UP, plantable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumPlantType getPlantType(IBlockAccess world, BlockPos pos) {
|
||||
return EnumPlantType.Crop;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getPlant(IBlockAccess world, BlockPos pos) {
|
||||
return getDefaultState();
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.BlockFalling;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
|
||||
public class BlockSugar extends BlockFalling {
|
||||
|
||||
public BlockSugar(String domain, String name) {
|
||||
super(Material.SAND);
|
||||
setTranslationKey(name);
|
||||
setRegistryName(domain, name);
|
||||
|
||||
setSoundType(SoundType.SAND);
|
||||
setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
setHardness(0.7F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int quantityDropped(Random random) {
|
||||
return 9;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
return Items.SUGAR;
|
||||
}
|
||||
}
|
|
@ -2,68 +2,61 @@ package com.minelittlepony.unicopia.block;
|
|||
|
||||
import java.util.Random;
|
||||
|
||||
import com.minelittlepony.unicopia.init.UItems;
|
||||
import com.minelittlepony.unicopia.UItems;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockCrops;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.properties.PropertyEnum;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.CropBlock;
|
||||
import net.minecraft.block.Fertilizable;
|
||||
import net.minecraft.entity.EntityContext;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.IStringSerializable;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.state.StateFactory;
|
||||
import net.minecraft.state.property.EnumProperty;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.StringIdentifiable;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.shape.VoxelShape;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
import net.minecraftforge.common.ForgeHooks;
|
||||
import net.minecraftforge.common.IPlantable;
|
||||
|
||||
public class BlockTomatoPlant extends BlockCrops {
|
||||
public class BlockTomatoPlant extends CropBlock {
|
||||
|
||||
public static final PropertyEnum<Type> TYPE = PropertyEnum.create("type", Type.class);
|
||||
public static final EnumProperty<Type> TYPE = EnumProperty.of("type", Type.class);
|
||||
|
||||
public BlockTomatoPlant(String domain, String name) {
|
||||
setRegistryName(domain, name);
|
||||
setTranslationKey(name);
|
||||
|
||||
setDefaultState(getDefaultState().withProperty(TYPE, Type.NORMAL));
|
||||
setDefaultState(getDefaultState().with(TYPE, Type.NORMAL));
|
||||
setHardness(0.2F);
|
||||
setSoundType(SoundType.WOOD);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
|
||||
return BlockStick.BOUNDING_BOX.offset(state.getOffset(source, pos));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
return state.getBoundingBox(world, pos);
|
||||
public VoxelShape getOutlineShape(BlockState state, BlockView source, BlockPos pos, EntityContext context) {
|
||||
Vec3d off = state.getOffsetPos(source, pos);
|
||||
return StickBlock.BOUNDING_BOX.offset(off.x, off.y, off.z);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockStateContainer createBlockState() {
|
||||
return new BlockStateContainer(this, TYPE, AGE);
|
||||
protected void appendProperties(StateFactory.Builder<Block, BlockState> builder) {
|
||||
super.appendProperties(builder);
|
||||
builder.add(TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumOffsetType getOffsetType() {
|
||||
return EnumOffsetType.XZ;
|
||||
public Block.OffsetType getOffsetType() {
|
||||
return Block.OffsetType.XZ;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Item getSeed() {
|
||||
protected Item getSeedsItem() {
|
||||
return UItems.tomato_seeds;
|
||||
}
|
||||
|
||||
|
@ -81,9 +74,9 @@ public class BlockTomatoPlant extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean canSustainPlant(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing direction, IPlantable plantable) {
|
||||
public boolean canSustainPlant(BlockState state, BlockView world, BlockPos pos, Direction direction, Fertilizable plantable) {
|
||||
|
||||
if (direction == EnumFacing.UP && state.getBlock() instanceof BlockTomatoPlant) {
|
||||
if (direction == Direction.UP && state.getBlock() instanceof BlockTomatoPlant) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -91,46 +84,37 @@ public class BlockTomatoPlant extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
|
||||
public void onScheduledTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
checkAndDropBlock(world, pos, state);
|
||||
|
||||
if (world.isAreaLoaded(pos, 1) && world.getLightFromNeighbors(pos.up()) >= 9) {
|
||||
if (world.isBlockLoaded(pos) && world.getLightLevel(pos.up()) >= 9) {
|
||||
int i = getAge(state);
|
||||
|
||||
if (i < getMaxAge()) {
|
||||
float f = getGrowthChance(this, world, pos);
|
||||
float f = getAvailableMoisture(this, world, pos);
|
||||
|
||||
if (ForgeHooks.onCropsGrowPre(world, pos, state, rand.nextInt((int)(25 / f) + 1) == 0)) {
|
||||
world.setBlockState(pos, state.withProperty(getAgeProperty(), i + 1), 2);
|
||||
|
||||
ForgeHooks.onCropsGrowPost(world, pos, state, world.getBlockState(pos));
|
||||
}
|
||||
world.setBlockState(pos, state.with(getAgeProperty(), i + 1), 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int quantityDropped(IBlockState state, int fortune, Random random) {
|
||||
public int quantityDropped(BlockState state, int fortune, Random random) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumPlantType getPlantType(IBlockAccess world, BlockPos pos) {
|
||||
return EnumPlantType.Crop;
|
||||
}
|
||||
public Item getItemDropped(BlockState state, Random rand, int fortune) {
|
||||
|
||||
@Override
|
||||
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
|
||||
|
||||
if (isMaxAge(state)) {
|
||||
return state.getValue(TYPE).getCrop();
|
||||
if (isMature(state)) {
|
||||
return state.get(TYPE).getCrop();
|
||||
}
|
||||
|
||||
return getSeed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||
public void getDrops(NonNullList<ItemStack> drops, WorldView world, BlockPos pos, BlockState state, int fortune) {
|
||||
Random rand = world instanceof World ? ((World)world).rand : RANDOM;
|
||||
|
||||
drops.add(new ItemStack(Items.STICK, 1, 0));
|
||||
|
@ -142,25 +126,25 @@ public class BlockTomatoPlant extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
|
||||
public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||
|
||||
if (hand == EnumHand.MAIN_HAND && isMaxAge(state)) {
|
||||
if (player.getHeldItem(hand).isEmpty()) {
|
||||
Type type = state.getValue(TYPE);
|
||||
if (hand == Hand.MAIN_HAND && isMature(state)) {
|
||||
if (player.getStackInHand(hand).isEmpty()) {
|
||||
Type type = state.get(TYPE);
|
||||
|
||||
int good = getAge(state);
|
||||
int rotten = world.rand.nextInt(good);
|
||||
int rotten = world.random.nextInt(good);
|
||||
|
||||
good -= rotten;
|
||||
|
||||
if (good > 0) {
|
||||
spawnAsEntity(world, pos, new ItemStack(type.getCrop(), good));
|
||||
dropStack(world, pos, new ItemStack(type.getCrop(), good));
|
||||
}
|
||||
if (rotten > 0) {
|
||||
spawnAsEntity(world, pos, new ItemStack(type.getWaste(), rotten));
|
||||
dropStack(world, pos, new ItemStack(type.getWaste(), rotten));
|
||||
}
|
||||
|
||||
world.setBlockState(pos, state.withProperty(getAgeProperty(), 0));
|
||||
world.setBlockState(pos, state.with(getAgeProperty(), 0));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -170,20 +154,20 @@ public class BlockTomatoPlant extends BlockCrops {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void grow(World worldIn, BlockPos pos, IBlockState state) {
|
||||
int age = Math.min(getAge(state) + getBonemealAgeIncrease(worldIn), getMaxAge());
|
||||
public void applyGrowth(World world, BlockPos pos, BlockState state) {
|
||||
int age = Math.min(getAge(state) + getGrowthAmount(world), getMaxAge());
|
||||
|
||||
worldIn.setBlockState(pos, state.withProperty(getAgeProperty(), age), 2);
|
||||
world.setBlockState(pos, state.with(getAgeProperty(), age), 2);
|
||||
}
|
||||
|
||||
public boolean plant(World world, BlockPos pos, IBlockState state) {
|
||||
public boolean plant(World world, BlockPos pos, BlockState state) {
|
||||
Block block = state.getBlock();
|
||||
|
||||
if (block instanceof BlockStick && ((BlockStick)block).canSustainPlant(world, pos, this)) {
|
||||
if (block instanceof StickBlock && ((StickBlock)block).canSustainPlant(world, pos, this)) {
|
||||
|
||||
world.setBlockState(pos, getPlacedState(world, pos, state).withProperty(getAgeProperty(), 1));
|
||||
world.setBlockState(pos, getPlacedState(world, pos, state).with(getAgeProperty(), 1));
|
||||
|
||||
SoundType sound = getSoundType(state, world, pos, null);
|
||||
BlockSoundGroup sound = getSoundGroup(state);
|
||||
|
||||
world.playSound(null, pos, sound.getPlaceSound(), SoundCategory.BLOCKS, sound.getVolume(), sound.getPitch() * 2);
|
||||
|
||||
|
@ -193,48 +177,34 @@ public class BlockTomatoPlant extends BlockCrops {
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
int age = meta % (getMaxAge() + 1);
|
||||
int half = meta >> 3;;
|
||||
|
||||
return withAge(age).withProperty(TYPE, Type.values()[half]);
|
||||
}
|
||||
|
||||
public IBlockState getPlacedState(World world, BlockPos pos, IBlockState state) {
|
||||
if (state.getBlock() instanceof BlockStick) {
|
||||
public BlockState getPlacedState(World world, BlockPos pos, BlockState state) {
|
||||
if (state.getBlock() instanceof StickBlock) {
|
||||
pos = pos.down();
|
||||
return getPlacedState(world, pos, world.getBlockState(pos));
|
||||
}
|
||||
|
||||
if (state.getBlock() instanceof BlockCloudFarm) {
|
||||
return getDefaultState().withProperty(TYPE, Type.CLOUDSDALE);
|
||||
return getDefaultState().with(TYPE, Type.CLOUDSDALE);
|
||||
}
|
||||
|
||||
if (state.getBlock() instanceof BlockTomatoPlant) {
|
||||
return getDefaultState().withProperty(TYPE, state.getValue(TYPE));
|
||||
return getDefaultState().with(TYPE, state.get(TYPE));
|
||||
}
|
||||
|
||||
return getDefaultState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
int age = getAge(state);
|
||||
int half = state.getValue(TYPE).ordinal();
|
||||
|
||||
return (half << 3) + age;
|
||||
}
|
||||
|
||||
public static enum Type implements IStringSerializable {
|
||||
public enum Type implements StringIdentifiable {
|
||||
NORMAL,
|
||||
CLOUDSDALE;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
return asString();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
@Override
|
||||
public String asString() {
|
||||
return this == NORMAL ? "normal" : "cloudsdale";
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
import com.minelittlepony.unicopia.UMaterials;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.MaterialColor;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemPlacementContext;
|
||||
import net.minecraft.state.StateFactory;
|
||||
import net.minecraft.state.property.Properties;
|
||||
import net.minecraft.util.BlockMirror;
|
||||
import net.minecraft.util.BlockRotation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.BlockView;
|
||||
|
||||
public class ChiselledChitinBlock extends Block {
|
||||
|
||||
public ChiselledChitinBlock(String domain, String name) {
|
||||
super(FabricBlockSettings.of(UMaterials.hive)
|
||||
.strength(50, 2000)
|
||||
.materialColor(MaterialColor.BLACK)
|
||||
.build()
|
||||
);
|
||||
setDefaultState(stateFactory.getDefaultState()
|
||||
.with(Properties.FACING, Direction.UP)
|
||||
);
|
||||
|
||||
// TODO:
|
||||
// setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState rotate(BlockState state, BlockRotation rot) {
|
||||
return state.with(Properties.FACING, rot.rotate(state.get(Properties.FACING)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||
return state.with(Properties.FACING, mirror.apply(state.get(Properties.FACING)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public BlockState getPlacementState(ItemPlacementContext context) {
|
||||
return getDefaultState().with(Properties.FACING, context.getPlayerFacing());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendProperties(StateFactory.Builder<Block, BlockState> builder) {
|
||||
builder.add(Properties.FACING);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView worldIn, BlockPos pos) {
|
||||
float hardness = super.calcBlockBreakingDelta(state, player, worldIn, pos);
|
||||
|
||||
IPlayer iplayer = SpeciesList.instance().getPlayer(player);
|
||||
Race race = iplayer.getSpecies();
|
||||
|
||||
if (race == Race.CHANGELING) {
|
||||
hardness *= 80;
|
||||
} else if (race.canInteractWithClouds()) {
|
||||
hardness /= 4;
|
||||
} else if (race.canUseEarth()) {
|
||||
hardness *= 10;
|
||||
}
|
||||
|
||||
return hardness;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
import com.minelittlepony.unicopia.UMaterials;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.MaterialColor;
|
||||
import net.minecraft.entity.EntityContext;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.state.StateFactory;
|
||||
import net.minecraft.state.property.EnumProperty;
|
||||
import net.minecraft.util.StringIdentifiable;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.IWorld;
|
||||
|
||||
public class ChitinBlock extends Block {
|
||||
|
||||
public static final EnumProperty<Covering> COVERING = EnumProperty.of("covering", Covering.class);
|
||||
|
||||
public ChitinBlock(String domain, String name) {
|
||||
super(FabricBlockSettings.of(UMaterials.hive)
|
||||
.hardness(50)
|
||||
.strength(2000, 2000)
|
||||
.materialColor(MaterialColor.BLACK)
|
||||
.build()
|
||||
);
|
||||
setDefaultState(stateFactory.getDefaultState().with(COVERING, Covering.UNCOVERED));
|
||||
|
||||
// TODO: drops:
|
||||
// UItems.chitin_shell x 3
|
||||
// setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
|
||||
float hardness = super.calcBlockBreakingDelta(state, player, world, pos);
|
||||
|
||||
IPlayer iplayer = SpeciesList.instance().getPlayer(player);
|
||||
Race race = iplayer.getSpecies();
|
||||
|
||||
if (race == Race.CHANGELING) {
|
||||
hardness *= 80;
|
||||
} else if (race.canInteractWithClouds()) {
|
||||
hardness /= 4;
|
||||
} else if (race.canUseEarth()) {
|
||||
hardness *= 10;
|
||||
}
|
||||
|
||||
return hardness;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState other, IWorld world, BlockPos pos, BlockPos otherPos) {
|
||||
if (direction == Direction.UP) {
|
||||
Block block = other.getBlock();
|
||||
|
||||
boolean snowy = block == Blocks.SNOW_BLOCK || block == Blocks.SNOW;
|
||||
boolean solid = (other.isOpaque() && other.isSimpleFullBlock(world, pos)) || Block.isFaceFullSquare(other.getCollisionShape(world, otherPos, EntityContext.absent()), Direction.DOWN);
|
||||
|
||||
return state.with(COVERING, snowy ? Covering.SNOW_COVERED : solid ? Covering.COVERED : Covering.UNCOVERED);
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendProperties(StateFactory.Builder<Block, BlockState> builder) {
|
||||
builder.add(COVERING);
|
||||
}
|
||||
|
||||
public enum Covering implements StringIdentifiable {
|
||||
COVERED,
|
||||
UNCOVERED,
|
||||
SNOW_COVERED;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return asString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String asString() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,177 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.function.Function;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.LeavesBlock;
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.DyeItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.state.StateFactory;
|
||||
import net.minecraft.state.property.BooleanProperty;
|
||||
import net.minecraft.util.DyeColor;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome.TemperatureGroup;
|
||||
|
||||
public class FruitLeavesBlock extends LeavesBlock implements IColourful {
|
||||
|
||||
public static final BooleanProperty HEAVY = BooleanProperty.of("heavy");
|
||||
|
||||
private boolean hardy;
|
||||
|
||||
private int baseGrowthChance;
|
||||
private int customTint;
|
||||
|
||||
private Function<World, ItemStack> fruitProducer = w -> ItemStack.EMPTY;
|
||||
private Function<World, ItemStack> compostProducer = w -> ItemStack.EMPTY;
|
||||
|
||||
public FruitLeavesBlock() {
|
||||
super(FabricBlockSettings.of(Material.LEAVES)
|
||||
.strength(0.2F, 0.2F)
|
||||
.ticksRandomly()
|
||||
.sounds(BlockSoundGroup.GRASS)
|
||||
.build()
|
||||
);
|
||||
|
||||
setDefaultState(stateFactory.getDefaultState()
|
||||
.with(HEAVY, false)
|
||||
.with(DISTANCE, 7)
|
||||
.with(PERSISTENT, false)
|
||||
);
|
||||
}
|
||||
|
||||
public FruitLeavesBlock hardy(boolean value) {
|
||||
hardy = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FruitLeavesBlock fruit(@Nonnull Function<World, ItemStack> producer) {
|
||||
fruitProducer = producer;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FruitLeavesBlock compost(@Nonnull Function<World, ItemStack> producer) {
|
||||
compostProducer = producer;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FruitLeavesBlock growthChance(int chance) {
|
||||
baseGrowthChance = chance;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FruitLeavesBlock tint(int tint) {
|
||||
customTint = tint;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||
ItemStack stack = player.getStackInHand(hand);
|
||||
|
||||
if (SpeciesList.instance().getPlayer(player).getSpecies().canUseEarth()) {
|
||||
if (stack.isEmpty()) {
|
||||
|
||||
if (state.get(HEAVY)) {
|
||||
dropContents(world, pos, state, 0);
|
||||
}
|
||||
} else if (stack.getItem() instanceof DyeItem && ((DyeItem)stack.getItem()).getColor() == DyeColor.WHITE) {
|
||||
if (!state.get(HEAVY)) {
|
||||
world.setBlockState(pos, state.with(HEAVY, true));
|
||||
|
||||
if (!world.isClient) {
|
||||
world.playGlobalEvent(2005, pos, 0);
|
||||
}
|
||||
|
||||
if (!player.abilities.creativeMode) {
|
||||
stack.decrement(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScheduledTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
if (!world.isClient && world.isBlockLoaded(pos) && !state.get(PERSISTENT)) {
|
||||
int growthChance = getGrowthChance(world, pos, state);
|
||||
|
||||
if (!state.get(HEAVY) && (growthChance <= 0 || rand.nextInt(growthChance) == 0)) {
|
||||
world.setBlockState(pos, state.with(HEAVY, true));
|
||||
} else {
|
||||
growthChance /= 10;
|
||||
|
||||
if (state.get(HEAVY) && (growthChance <= 0 || rand.nextInt(growthChance) == 0)) {
|
||||
dropContents(world, pos, state, 0);
|
||||
} else {
|
||||
super.onScheduledTick(state, world, pos, rand);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected int getGrowthChance(World world, BlockPos pos, BlockState state) {
|
||||
int chance = baseGrowthChance;
|
||||
|
||||
if (!hardy && !world.isDaylight()) {
|
||||
chance *= 40;
|
||||
}
|
||||
|
||||
if (world.getLightLevel(pos) >= 4) {
|
||||
chance /= 3;
|
||||
}
|
||||
|
||||
TemperatureGroup temp = world.getBiome(pos).getTemperatureGroup();
|
||||
|
||||
if (!hardy && temp == TemperatureGroup.COLD) {
|
||||
chance *= 1000;
|
||||
}
|
||||
|
||||
if (temp == TemperatureGroup.WARM) {
|
||||
chance /= 100;
|
||||
}
|
||||
|
||||
if (temp == TemperatureGroup.MEDIUM) {
|
||||
chance /= 50;
|
||||
}
|
||||
|
||||
return chance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCustomTint(BlockState state, int tint) {
|
||||
return customTint;
|
||||
}
|
||||
|
||||
protected void dropContents(World world, BlockPos pos, BlockState state, int chance) {
|
||||
Function<World, ItemStack> fruit = world.random.nextInt(40) == 0 ? compostProducer : fruitProducer;
|
||||
dropStack(world, pos, fruit.apply(world));
|
||||
|
||||
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_PLACE, SoundCategory.BLOCKS, 0.3F, 1);
|
||||
world.setBlockState(pos, state.with(HEAVY, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendProperties(StateFactory.Builder<Block, BlockState> builder) {
|
||||
super.appendProperties(builder);
|
||||
builder.add(HEAVY);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,194 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Random;
|
||||
import com.minelittlepony.unicopia.CloudType;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.block.TorchBlock;
|
||||
import net.minecraft.entity.EntityContext;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.particle.ParticleTypes;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.state.StateFactory;
|
||||
import net.minecraft.state.property.BooleanProperty;
|
||||
import net.minecraft.state.property.Properties;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.shape.VoxelShape;
|
||||
import net.minecraft.util.shape.VoxelShapes;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class GlowingGemBlock extends TorchBlock implements ICloudBlock {
|
||||
|
||||
public static BooleanProperty ON = BooleanProperty.of("on");
|
||||
|
||||
private static final double A = 5/16D;
|
||||
private static final double B = 6/16D;
|
||||
|
||||
private static final double C = 10/16D;
|
||||
|
||||
// tiltedOffWall
|
||||
private static final double F = 10/16D;
|
||||
|
||||
// tiltedMinY
|
||||
private static final double E = 3/16D;
|
||||
|
||||
protected static final VoxelShape STANDING_AABB = VoxelShapes.cuboid(new Box(
|
||||
7/16D, 0, 7/16D,
|
||||
9/16D, 1, 9/16D
|
||||
));
|
||||
protected static final VoxelShape TORCH_NORTH_AABB = VoxelShapes.cuboid(new Box(B, E, F, C, 1, 1));
|
||||
protected static final VoxelShape TORCH_SOUTH_AABB = VoxelShapes.cuboid(new Box(B, E, 0, C, 1, A));
|
||||
protected static final VoxelShape TORCH_WEST_AABB = VoxelShapes.cuboid(new Box(F, E, B, 1, 1, C));
|
||||
protected static final VoxelShape TORCH_EAST_AABB = VoxelShapes.cuboid(new Box(0, E, B, A, 1, C));
|
||||
|
||||
public GlowingGemBlock(String domain, String name) {
|
||||
super(FabricBlockSettings.of(Material.PART)
|
||||
.noCollision()
|
||||
.strength(0, 0)
|
||||
.ticksRandomly()
|
||||
.lightLevel(1)
|
||||
.sounds(BlockSoundGroup.GLASS)
|
||||
.build()
|
||||
);
|
||||
setDefaultState(stateFactory.getDefaultState()
|
||||
.with(Properties.FACING, Direction.UP)
|
||||
.with(ON, true)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getOutlineShape(BlockState state, BlockView source, BlockPos pos, EntityContext context) {
|
||||
switch (state.get(Properties.FACING)) {
|
||||
case EAST: return TORCH_EAST_AABB;
|
||||
case WEST: return TORCH_WEST_AABB;
|
||||
case SOUTH: return TORCH_SOUTH_AABB;
|
||||
case NORTH: return TORCH_NORTH_AABB;
|
||||
default: return STANDING_AABB;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||
|
||||
if (!state.get(ON)) {
|
||||
ItemStack held = player.getStackInHand(hand);
|
||||
if (!held.isEmpty() && (held.getItem() == Items.FLINT_AND_STEEL || held.getItem() == Items.FIRE_CHARGE)) {
|
||||
|
||||
world.playSound(null, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F);
|
||||
world.setBlockState(pos, state.with(ON, true));
|
||||
|
||||
if (held.getItem() == Items.FLINT_AND_STEEL) {
|
||||
held.damage(1, player, p -> p.sendToolBreakStatus(hand));
|
||||
} else if (!player.abilities.creativeMode) {
|
||||
held.decrement(1);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
Direction facing = state.get(Properties.FACING);
|
||||
|
||||
double x = pos.getX() + 0.5;
|
||||
double y = pos.getY() + 1;
|
||||
double z = pos.getZ() + 0.5;
|
||||
|
||||
double drop = 0.22D;
|
||||
double variance = 0.27D;
|
||||
|
||||
if (facing.getAxis().isHorizontal()) {
|
||||
facing = facing.getOpposite();
|
||||
|
||||
x += variance * facing.getOffsetX();
|
||||
y += drop;
|
||||
z += variance * facing.getOffsetZ();
|
||||
}
|
||||
|
||||
if (state.get(ON)) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
// TODO:
|
||||
// ParticleTypeRegistry.getTnstance().spawnParticle(UParticles.UNICORN_MAGIC, false,
|
||||
// x - 0.3, y - 0.3, z - 0.3,
|
||||
// rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
|
||||
}
|
||||
} else {
|
||||
world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScheduledTick(BlockState state, World world, BlockPos pos, Random random) {
|
||||
if (world.hasRain(pos)) {
|
||||
if (state.get(ON)) {
|
||||
world.playSound(null, pos, SoundEvents.BLOCK_REDSTONE_TORCH_BURNOUT, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F);
|
||||
world.setBlockState(pos, state.with(ON, false));
|
||||
}
|
||||
} else {
|
||||
if (!state.get(ON)) {
|
||||
world.playSound(null, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F);
|
||||
world.setBlockState(pos, state.with(ON, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction side) {
|
||||
return state.get(ON) && side == Direction.DOWN ? state.getWeakRedstonePower(world, pos, side) : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction side) {
|
||||
return state.get(ON) && state.get(Properties.FACING) != side ? 12 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CloudType getCloudMaterialType(BlockState blockState) {
|
||||
return CloudType.ENCHANTED;
|
||||
}
|
||||
|
||||
// TODO: this is a loot table now
|
||||
/*@Override
|
||||
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder context) {
|
||||
|
||||
Random rand = context.world instanceof World ? ((World)world).random : random;
|
||||
|
||||
if (rand.nextInt(10) == 0) {
|
||||
drops.add(new ItemStack(UItems.spell));
|
||||
} else {
|
||||
drops.add(new ItemStack(UItems.curse));
|
||||
}
|
||||
|
||||
return drops;
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public int getLuminance(BlockState state) {
|
||||
if (state.get(ON)) {
|
||||
return super.getLuminance(state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendProperties(StateFactory.Builder<Block, BlockState> builder) {
|
||||
builder.add(Properties.FACING).add(ON);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,366 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.SpeciesList;
|
||||
import com.minelittlepony.unicopia.UBlocks;
|
||||
import com.minelittlepony.unicopia.UMaterials;
|
||||
import com.minelittlepony.unicopia.USounds;
|
||||
import com.minelittlepony.unicopia.entity.player.IPlayer;
|
||||
import com.minelittlepony.util.PosHelper;
|
||||
import com.minelittlepony.util.shape.IShape;
|
||||
import com.minelittlepony.util.shape.Sphere;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.FallingBlock;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.FallingBlockEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemPlacementContext;
|
||||
import net.minecraft.particle.BlockStateParticleEffect;
|
||||
import net.minecraft.particle.ParticleTypes;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.state.StateFactory;
|
||||
import net.minecraft.state.property.EnumProperty;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.StringIdentifiable;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.ViewableWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class HiveWallBlock extends FallingBlock {
|
||||
|
||||
public static final EnumProperty<State> STATE = EnumProperty.of("state", State.class);
|
||||
public static final EnumProperty<Axis> AXIS = EnumProperty.of("axis", Axis.class);
|
||||
|
||||
private static final IShape shape = new Sphere(false, 1.5);
|
||||
|
||||
public HiveWallBlock(String domain, String name) {
|
||||
super(FabricBlockSettings.of(UMaterials.hive)
|
||||
.noCollision()
|
||||
.strength(10, 10)
|
||||
.hardness(2)
|
||||
.ticksRandomly()
|
||||
.lightLevel(1)
|
||||
.sounds(BlockSoundGroup.SAND)
|
||||
.build()
|
||||
);
|
||||
setDefaultState(stateFactory.getDefaultState()
|
||||
.with(STATE, State.GROWING).with(AXIS, Axis.Y)
|
||||
);
|
||||
|
||||
// TODO:
|
||||
// setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
|
||||
// setHarvestLevel("pickaxe", 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScheduledTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
|
||||
if (rand.nextInt(300) == 0) {
|
||||
world.playSound(null, pos, USounds.INSECT, SoundCategory.BLOCKS, 1, 1);
|
||||
}
|
||||
|
||||
State type = getState(state);
|
||||
|
||||
Axis axis = getAxis(state);
|
||||
|
||||
int matchedNeighbours = countNeighbours(world, pos);
|
||||
|
||||
if (type == State.GROWING) {
|
||||
if (testForAxis(world, pos, axis)) {
|
||||
world.setBlockState(pos, state.with(STATE, State.STABLE));
|
||||
} else {
|
||||
Axis newAxis = axis;
|
||||
|
||||
for (Axis i : Axis.VALUES) {
|
||||
if (testForAxis(world, pos, i)) {
|
||||
newAxis = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (newAxis != axis) {
|
||||
world.setBlockState(pos, state.with(AXIS, newAxis).with(STATE, State.STABLE));
|
||||
} else if (rand.nextInt(10) == 0) {
|
||||
Direction facing = axis.randomFacing(rand);
|
||||
|
||||
BlockPos other = pos.offset(facing);
|
||||
|
||||
if (canSpreadInto(world, other, axis)) {
|
||||
world.playSound(null, pos, USounds.SLIME_RETRACT, SoundCategory.BLOCKS, 1, 1);
|
||||
world.setBlockState(other, state);
|
||||
world.setBlockState(pos, state.with(STATE, State.STABLE));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (type == State.DYING) {
|
||||
if (matchedNeighbours > 1 && matchedNeighbours < 17) {
|
||||
world.setBlockState(pos, state.with(STATE, State.STABLE));
|
||||
} else {
|
||||
die(world, pos, rand);
|
||||
}
|
||||
} else {
|
||||
|
||||
if (pos.getX() % 3 == 0 && pos.getZ() % 4 == 0 && isEmptySpace(world, pos.down()) && UBlocks.cuccoon.canPlaceBlockAt(world, pos.down())) {
|
||||
world.setBlockState(pos.down(), UBlocks.cuccoon.getDefaultState());
|
||||
} else if (!testForAxis(world, pos, axis)) {
|
||||
world.setBlockState(pos, state.with(STATE, State.GROWING));
|
||||
} else if (matchedNeighbours >= 27) {
|
||||
world.setBlockState(pos, state.with(STATE, State.DYING));
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
world.getBlockTickScheduler().schedule(pos, this, getTickRate(world));
|
||||
}
|
||||
|
||||
public State getState(BlockState state) {
|
||||
return state.get(STATE);
|
||||
}
|
||||
|
||||
public Axis getAxis(BlockState state) {
|
||||
return state.get(AXIS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean uuuuh) {
|
||||
if (state.get(STATE) != State.STABLE) {
|
||||
super.onBlockAdded(state, world, pos, oldState, uuuuh);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTickRate(ViewableWorld view) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
protected boolean testForAxis(World world, BlockPos pos, Axis axis) {
|
||||
return !PosHelper.some(pos, p -> isEmptySpace(world, p), axis.getFacings());
|
||||
}
|
||||
|
||||
protected boolean isEmptySpace(World world, BlockPos pos) {
|
||||
|
||||
if (world.isAir(pos)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
BlockState state = world.getBlockState(pos);
|
||||
|
||||
return !(state.getMaterial().isLiquid()
|
||||
|| state.isFullOpaque(world, pos)
|
||||
|| state.isOpaque());
|
||||
}
|
||||
|
||||
protected void die(World world, BlockPos pos, Random rand) {
|
||||
world.breakBlock(pos, false);
|
||||
|
||||
PosHelper.all(pos, p -> {
|
||||
BlockState s = world.getBlockState(p);
|
||||
|
||||
if (s.getBlock() == this) {
|
||||
notifyDying(world, p, s, rand);
|
||||
}
|
||||
}, Direction.values());
|
||||
}
|
||||
|
||||
protected void notifyDying(World world, BlockPos pos, BlockState state, Random rand) {
|
||||
State oldState = state.get(STATE);
|
||||
State newState = oldState.downGrade();
|
||||
|
||||
if (newState != oldState) {
|
||||
world.setBlockState(pos, state.with(STATE, newState));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteppedOn(World world, BlockPos pos, Entity entity) {
|
||||
if (entity instanceof PlayerEntity) {
|
||||
IPlayer player = SpeciesList.instance().getPlayer((PlayerEntity)entity);
|
||||
|
||||
if (player.getSpecies() != Race.CHANGELING && !world.isClient) {
|
||||
if (((isEmptySpace(world, pos.down()) || canFallThrough(world.getBlockState(pos.down()))) && pos.getY() >= 0)) {
|
||||
FallingBlockEntity faller = new FallingBlockEntity(world, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, world.getBlockState(pos));
|
||||
configureFallingBlockEntity(faller);
|
||||
world.spawnEntity(faller);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLanding(World world, BlockPos pos, BlockState fallingState, BlockState hitState) {
|
||||
world.breakBlock(pos, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||
|
||||
if (hand == Hand.MAIN_HAND && player.getStackInHand(hand).isEmpty()) {
|
||||
IPlayer iplayer = SpeciesList.instance().getPlayer(player);
|
||||
|
||||
if (iplayer.getSpecies() == Race.CHANGELING) {
|
||||
retreat(world, pos);
|
||||
|
||||
PosHelper.adjacentNeighbours(pos).forEach(p -> {
|
||||
if (world.getBlockState(p).getBlock() == this) {
|
||||
retreat(world, p);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getPlacementState(ItemPlacementContext context) {
|
||||
return getDefaultState().with(AXIS, Axis.fromVanilla(context.getPlayerFacing().getAxis()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) {
|
||||
if (rand.nextInt(16) == 0) {
|
||||
Vec3d vel = shape.computePoint(rand);
|
||||
Vec3d vec = vel.add(pos.getX(), pos.getY(), pos.getZ());
|
||||
|
||||
world.addParticle(new BlockStateParticleEffect(ParticleTypes.BLOCK, state), vec.x, vec.y, vec.z, vel.x, vel.y, vel.z);
|
||||
}
|
||||
}
|
||||
|
||||
public void retreat(World world, BlockPos pos) {
|
||||
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
world.playSound(null, pos, USounds.SLIME_RETRACT, SoundCategory.BLOCKS, 1, 1);
|
||||
}
|
||||
|
||||
protected int countNeighbours(World world, BlockPos pos) {
|
||||
int count = 0;
|
||||
for (BlockPos i : BlockPos.iterate(pos.add(-1, -1, -1), pos.add(1, 1, 1))) {
|
||||
if (world.getBlockState(i).getBlock() == this) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
protected boolean exposed(World world, BlockPos pos) {
|
||||
return PosHelper.some(pos, p -> isEmptySpace(world, p), Direction.values());
|
||||
}
|
||||
|
||||
protected boolean canSpreadInto(World world, BlockPos pos, Axis axis) {
|
||||
if (world.isBlockLoaded(pos) && isEmptySpace(world, pos)) {
|
||||
boolean one = false;
|
||||
|
||||
for (Direction facing : axis.getFacings()) {
|
||||
BlockPos op = pos.offset(facing);
|
||||
|
||||
if (world.getBlockState(op).getMaterial() == UMaterials.hive) {
|
||||
if (one) {
|
||||
return true;
|
||||
}
|
||||
|
||||
one = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendProperties(StateFactory.Builder<Block, BlockState> builder) {
|
||||
builder.add(STATE).add(AXIS);
|
||||
}
|
||||
|
||||
public enum State implements StringIdentifiable {
|
||||
GROWING,
|
||||
STABLE,
|
||||
DYING;
|
||||
|
||||
static final State[] VALUES = values();
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return asString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String asString() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
public State upgrade() {
|
||||
switch (this) {
|
||||
case DYING: return STABLE;
|
||||
default: return GROWING;
|
||||
}
|
||||
}
|
||||
|
||||
public State downGrade() {
|
||||
switch (this) {
|
||||
case GROWING: return STABLE;
|
||||
default: return DYING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum Axis implements StringIdentifiable {
|
||||
X(Direction.Axis.X, Direction.EAST, Direction.WEST, Direction.UP, Direction.DOWN),
|
||||
Y(Direction.Axis.Y, Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH),
|
||||
Z(Direction.Axis.Z, Direction.NORTH, Direction.SOUTH, Direction.UP, Direction.DOWN);
|
||||
|
||||
static final Axis[] VALUES = values();
|
||||
static final Map<Direction.Axis, Axis> AXIS_MAP = Maps.newEnumMap(Direction.Axis.class);
|
||||
|
||||
private final Direction.Axis vanilla;
|
||||
private final Direction[] facings;
|
||||
|
||||
static {
|
||||
for (Axis i : VALUES) {
|
||||
AXIS_MAP.put(i.vanilla, i);
|
||||
}
|
||||
}
|
||||
|
||||
Axis(Direction.Axis vanilla, Direction... facings) {
|
||||
this.vanilla = vanilla;
|
||||
this.facings = facings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return asString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String asString() {
|
||||
return name().toLowerCase();
|
||||
}
|
||||
|
||||
public Direction randomFacing(Random rand) {
|
||||
return facings[rand.nextInt(facings.length)];
|
||||
}
|
||||
|
||||
public Direction[] getFacings() {
|
||||
return facings;
|
||||
}
|
||||
|
||||
public static Axis fromVanilla(Direction.Axis axis) {
|
||||
return AXIS_MAP.get(axis);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,32 +3,31 @@ package com.minelittlepony.unicopia.block;
|
|||
import com.minelittlepony.unicopia.CloudType;
|
||||
import com.minelittlepony.unicopia.Predicates;
|
||||
import com.minelittlepony.unicopia.UClient;
|
||||
import com.minelittlepony.unicopia.forgebullshit.FUF;
|
||||
import net.minecraft.block.BedBlock;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockBed;
|
||||
import net.minecraft.block.BlockChest;
|
||||
import net.minecraft.block.BlockFalling;
|
||||
import net.minecraft.block.BlockTorch;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.ChestBlock;
|
||||
import net.minecraft.block.FallingBlock;
|
||||
import net.minecraft.block.TorchBlock;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.entity.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface ICloudBlock {
|
||||
|
||||
CloudType getCloudMaterialType(IBlockState blockState);
|
||||
CloudType getCloudMaterialType(BlockState blockState);
|
||||
|
||||
default boolean handleRayTraceSpecialCases(World world, BlockPos pos, IBlockState state) {
|
||||
if (world.isRemote) {
|
||||
EntityPlayer player = UClient.instance().getPlayer();
|
||||
default boolean handleRayTraceSpecialCases(World world, BlockPos pos, BlockState state) {
|
||||
if (world.isClient) {
|
||||
PlayerEntity player = UClient.instance().getPlayer();
|
||||
|
||||
if (player.capabilities.isCreativeMode) {
|
||||
if (player.abilities.creativeMode) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -38,20 +37,21 @@ public interface ICloudBlock {
|
|||
|
||||
CloudType type = getCloudMaterialType(state);
|
||||
|
||||
ItemStack main = player.getHeldItemMainhand();
|
||||
ItemStack main = player.getMainHandStack();
|
||||
if (main.isEmpty()) {
|
||||
main = player.getHeldItemOffhand();
|
||||
main = player.getOffHandStack();
|
||||
}
|
||||
|
||||
if (!main.isEmpty() && main.getItem() instanceof ItemBlock) {
|
||||
Block block = ((ItemBlock)main.getItem()).getBlock();
|
||||
if (!main.isEmpty() && main.getItem() instanceof BlockItem) {
|
||||
Block block = ((BlockItem)main.getItem()).getBlock();
|
||||
BlockState heldState = block.getDefaultState();
|
||||
|
||||
if (block == null || block == Blocks.AIR) {
|
||||
if (block == null || block.isAir(heldState)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (block instanceof ICloudBlock) {
|
||||
CloudType other = ((ICloudBlock)block).getCloudMaterialType(block.getDefaultState());
|
||||
CloudType other = ((ICloudBlock)block).getCloudMaterialType(heldState);
|
||||
|
||||
if (other.canInteract(player)) {
|
||||
return false;
|
||||
|
@ -72,14 +72,14 @@ public interface ICloudBlock {
|
|||
}
|
||||
|
||||
default boolean isPlacementExcempt(Block block) {
|
||||
return block instanceof BlockTorch
|
||||
|| block instanceof BlockBed
|
||||
|| block instanceof BlockChest;
|
||||
return block instanceof TorchBlock
|
||||
|| block instanceof BedBlock
|
||||
|| block instanceof ChestBlock;
|
||||
}
|
||||
|
||||
default boolean applyLanding(Entity entity, float fallDistance) {
|
||||
if (!entity.isSneaking()) {
|
||||
entity.fall(fallDistance, 0);
|
||||
entity.handleFallDamage(fallDistance, 0);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -88,12 +88,17 @@ public interface ICloudBlock {
|
|||
}
|
||||
|
||||
default boolean applyRebound(Entity entity) {
|
||||
if (!entity.isSneaking() && entity.motionY < 0) {
|
||||
if (Math.abs(entity.motionY) >= 0.25) {
|
||||
entity.motionY = -entity.motionY * 1.2;
|
||||
|
||||
Vec3d vel = entity.getVelocity();
|
||||
double y = vel.y;
|
||||
|
||||
if (!entity.isSneaking() && y < 0) {
|
||||
if (Math.abs(y) >= 0.25) {
|
||||
y = -y * 1.2;
|
||||
} else {
|
||||
entity.motionY = 0;
|
||||
y = 0;
|
||||
}
|
||||
entity.setVelocity(vel.x, y, vel.z);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -101,13 +106,17 @@ public interface ICloudBlock {
|
|||
return false;
|
||||
}
|
||||
|
||||
default boolean applyBouncyness(IBlockState state, Entity entity) {
|
||||
default boolean applyBouncyness(BlockState state, Entity entity) {
|
||||
if (getCanInteract(state, entity)) {
|
||||
if (!entity.isSneaking() && Math.abs(entity.motionY) >= 0.25) {
|
||||
entity.motionY += 0.0155 * (entity.fallDistance < 1 ? 1 : entity.fallDistance);
|
||||
Vec3d vel = entity.getVelocity();
|
||||
double y = vel.y;
|
||||
|
||||
if (!entity.isSneaking() && Math.abs(y) >= 0.25) {
|
||||
y += 0.0155 * (entity.fallDistance < 1 ? 1 : entity.fallDistance);
|
||||
} else {
|
||||
entity.motionY = 0;
|
||||
y = 0;
|
||||
}
|
||||
entity.setVelocity(vel.x, y, vel.z);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -116,9 +125,9 @@ public interface ICloudBlock {
|
|||
}
|
||||
|
||||
|
||||
default boolean getCanInteract(IBlockState state, Entity e) {
|
||||
default boolean getCanInteract(BlockState state, Entity e) {
|
||||
if (getCloudMaterialType(state).canInteract(e)) {
|
||||
if (e instanceof EntityItem) {
|
||||
if (e instanceof ItemEntity) {
|
||||
// @FUF(reason = "There is no TickEvents.EntityTickEvent. Waiting on mixins...")
|
||||
e.setNoGravity(true);
|
||||
}
|
||||
|
@ -128,7 +137,7 @@ public interface ICloudBlock {
|
|||
return false;
|
||||
}
|
||||
|
||||
default boolean isDense(IBlockState blockState) {
|
||||
default boolean isDense(BlockState blockState) {
|
||||
return getCloudMaterialType(blockState) != CloudType.NORMAL;
|
||||
}
|
||||
|
||||
|
@ -139,14 +148,15 @@ public interface ICloudBlock {
|
|||
* @param pos The current position
|
||||
*
|
||||
* @return True to allow blocks to pass.
|
||||
*
|
||||
* @fuf Hacked until we can get mixins to implement a proper hook
|
||||
*/
|
||||
@FUF(reason = "Hacked until we can get mixins to implement a proper hook")
|
||||
default boolean allowsFallingBlockToPass(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
default boolean allowsFallingBlockToPass(BlockState state, BlockView world, BlockPos pos) {
|
||||
if (isDense(state)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Block above = world.getBlockState(pos.up()).getBlock();
|
||||
return !(above instanceof ICloudBlock) && above instanceof BlockFalling;
|
||||
return !(above instanceof ICloudBlock) && above instanceof FallingBlock;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface IColourful {
|
||||
int getCustomTint(IBlockState state, int tint);
|
||||
int getCustomTint(BlockState state, int tint);
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@ package com.minelittlepony.unicopia.block;
|
|||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
@ -16,9 +16,9 @@ public interface ITillable {
|
|||
* Gets the farmland/tilled state for this block when attacked by a hoe.
|
||||
*/
|
||||
@Nonnull
|
||||
IBlockState getFarmlandState(ItemStack hoe, EntityPlayer player, World world, IBlockState state, BlockPos pos);
|
||||
BlockState getFarmlandState(ItemStack hoe, PlayerEntity player, World world, BlockState state, BlockPos pos);
|
||||
|
||||
default boolean canBeTilled(ItemStack hoe, EntityPlayer player, World world, IBlockState state, BlockPos pos) {
|
||||
return world.isAirBlock(pos.up());
|
||||
default boolean canBeTilled(ItemStack hoe, PlayerEntity player, World world, BlockState state, BlockPos pos) {
|
||||
return world.isAir(pos.up());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.gen.feature.WorldGenAbstractTree;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface ITreeGen {
|
||||
WorldGenAbstractTree getTreeGen(World world, IBlockState state, boolean massive);
|
||||
WorldGenAbstractTree getTreeGen(World world, BlockState state, boolean massive);
|
||||
|
||||
default boolean canGrowMassive() {
|
||||
return false;
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.BlockRenderLayer;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.block.MaterialColor;
|
||||
import net.minecraft.block.SnowBlock;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class SlimeLayerBlock extends SnowBlock {
|
||||
|
||||
public SlimeLayerBlock(String domain, String name) {
|
||||
super(FabricBlockSettings.of(Material.CLAY)
|
||||
.sounds(BlockSoundGroup.SLIME)
|
||||
.materialColor(MaterialColor.GRASS)
|
||||
.build()
|
||||
);
|
||||
|
||||
// TODO:
|
||||
// drops Items.SLIME_BALL x1
|
||||
// setCreativeTab(CreativeTabs.DECORATIONS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockRenderLayer getRenderLayer() {
|
||||
return BlockRenderLayer.TRANSLUCENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteppedOn(World world, BlockPos pos, Entity entity) {
|
||||
float factor = getMotionFactor(world.getBlockState(pos));
|
||||
|
||||
entity.setVelocity(entity.getVelocity().multiply(factor));
|
||||
}
|
||||
|
||||
protected float getMotionFactor(BlockState state) {
|
||||
return 1/state.get(LAYERS);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
package com.minelittlepony.unicopia.block;
|
||||
|
||||
import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockRenderLayer;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.FarmlandBlock;
|
||||
import net.minecraft.block.Material;
|
||||
import net.minecraft.entity.EntityContext;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.item.LeadItem;
|
||||
import net.minecraft.sound.BlockSoundGroup;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.shape.VoxelShape;
|
||||
import net.minecraft.util.shape.VoxelShapes;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.ViewableWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class StickBlock extends Block {
|
||||
|
||||
static final VoxelShape BOUNDING_BOX = VoxelShapes.cuboid(new Box(
|
||||
7/16F, -1/16F, 7/16F,
|
||||
9/16F, 15/16F, 9/16F
|
||||
));
|
||||
|
||||
public StickBlock(String domain, String name) {
|
||||
super(FabricBlockSettings.of(Material.PLANT)
|
||||
.noCollision()
|
||||
.strength(0.2F, 0.2F)
|
||||
.ticksRandomly()
|
||||
.lightLevel(1)
|
||||
.sounds(BlockSoundGroup.WOOD)
|
||||
.build()
|
||||
);
|
||||
|
||||
// TODO:
|
||||
// drops Items.STICK x1
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockRenderLayer getRenderLayer() {
|
||||
return BlockRenderLayer.TRANSLUCENT;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public VoxelShape getOutlineShape(BlockState state, BlockView source, BlockPos pos, EntityContext context) {
|
||||
Vec3d off = state.getOffsetPos(source, pos);
|
||||
return BOUNDING_BOX.offset(off.x, off.y, off.z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block.OffsetType getOffsetType() {
|
||||
return Block.OffsetType.XZ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||
if (!world.isClient) {
|
||||
return LeadItem.attachHeldMobsToBlock(player, world, pos);
|
||||
}
|
||||
|
||||
ItemStack stack = player.getStackInHand(hand);
|
||||
|
||||
return stack.getItem() == Items.LEAD || stack.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlaceAt(BlockState state, ViewableWorld world, BlockPos pos) {
|
||||
Block block = state.getBlock();
|
||||
|
||||
return block instanceof StickBlock || block instanceof FarmlandBlock;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue