mirror of
https://github.com/Ellpeck/NaturesAura.git
synced 2024-11-26 21:28:35 +01:00
added the rod of shadows
This commit is contained in:
parent
c97a13f737
commit
c186976898
13 changed files with 169 additions and 15 deletions
|
@ -89,6 +89,16 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleDepth(boolean depth) {
|
||||||
|
NaturesAura.proxy.setParticleDepth(depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleSpawnRange(int range) {
|
||||||
|
NaturesAura.proxy.setParticleSpawnRange(range);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IMultiblock createMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers) {
|
public IMultiblock createMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers) {
|
||||||
return new Multiblock(name, pattern, rawMatchers);
|
return new Multiblock(name, pattern, rawMatchers);
|
||||||
|
|
|
@ -242,6 +242,24 @@ public final class NaturesAuraAPI {
|
||||||
*/
|
*/
|
||||||
void spawnParticleStream(float startX, float startY, float startZ, float endX, float endY, float endZ, float speed, int color, float scale);
|
void spawnParticleStream(float startX, float startY, float startZ, float endX, float endY, float endZ, float speed, int color, float scale);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets wether Nature's Aura particles that are spawned will be rendered
|
||||||
|
* with depth test enabled or not. Default value is true, please reset
|
||||||
|
* after changing.
|
||||||
|
*
|
||||||
|
* @param depth Wether depth test should be enabled or not
|
||||||
|
*/
|
||||||
|
void setParticleDepth(boolean depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the range that Nature's Aura particles that are spawned will
|
||||||
|
* have to have from the player at most to actually be spawned. Default
|
||||||
|
* value is 32, please reset after changing.
|
||||||
|
*
|
||||||
|
* @param range The range that particle spawning should have
|
||||||
|
*/
|
||||||
|
void setParticleSpawnRange(int range);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is used to create a custom multiblock from within the
|
* This method is used to create a custom multiblock from within the
|
||||||
* API. The multiblock will automatically be registered both to Nature's
|
* API. The multiblock will automatically be registered both to Nature's
|
||||||
|
|
|
@ -31,6 +31,16 @@ public class StubHooks implements NaturesAuraAPI.IInternalHooks {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleDepth(boolean depth) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleSpawnRange(int range) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IMultiblock createMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers) {
|
public IMultiblock createMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers) {
|
||||||
return new StubMultiblock();
|
return new StubMultiblock();
|
||||||
|
|
|
@ -72,7 +72,11 @@ public class ClientEvents {
|
||||||
String prefix = TextFormatting.GREEN + "[" + NaturesAura.MOD_NAME + "]" + TextFormatting.RESET + " ";
|
String prefix = TextFormatting.GREEN + "[" + NaturesAura.MOD_NAME + "]" + TextFormatting.RESET + " ";
|
||||||
List<String> left = event.getLeft();
|
List<String> left = event.getLeft();
|
||||||
left.add("");
|
left.add("");
|
||||||
left.add(prefix + "Particles: " + ParticleHandler.getParticleAmount());
|
|
||||||
|
int depth = ParticleHandler.getParticleAmount(true);
|
||||||
|
int noDepth = ParticleHandler.getParticleAmount(false);
|
||||||
|
left.add(prefix + "P: " + (depth + noDepth) + " (D: " + depth + " nD: " + noDepth + ")");
|
||||||
|
left.add(prefix + "PR: " + ParticleHandler.range + " PD: " + ParticleHandler.depthEnabled);
|
||||||
|
|
||||||
if (mc.player.capabilities.isCreativeMode) {
|
if (mc.player.capabilities.isCreativeMode) {
|
||||||
MutableInt amount = new MutableInt(IAuraChunk.DEFAULT_AURA);
|
MutableInt amount = new MutableInt(IAuraChunk.DEFAULT_AURA);
|
||||||
|
@ -82,8 +86,8 @@ public class ClientEvents {
|
||||||
amount.add(drainSpot);
|
amount.add(drainSpot);
|
||||||
});
|
});
|
||||||
NumberFormat format = NumberFormat.getInstance();
|
NumberFormat format = NumberFormat.getInstance();
|
||||||
left.add(prefix + "Aura: " + format.format(amount.intValue()) + " in " + spots.intValue() + " spots (range 35)");
|
left.add(prefix + "A: " + format.format(amount.intValue()) + " (S: " + spots.intValue() + ")");
|
||||||
left.add(prefix + "Type: " + IAuraType.forWorld(mc.world).getName());
|
left.add(prefix + "AT: " + IAuraType.forWorld(mc.world).getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mc.profiler.endSection();
|
mc.profiler.endSection();
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package de.ellpeck.naturesaura.items;
|
||||||
|
|
||||||
|
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.entity.EntityLiving;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.EnumActionResult;
|
||||||
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.EnumSkyBlock;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
public class ItemCaveFinder extends ItemImpl {
|
||||||
|
public ItemCaveFinder() {
|
||||||
|
super("cave_finder");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
|
||||||
|
ItemStack stack = playerIn.getHeldItem(handIn);
|
||||||
|
NaturesAuraAPI.IInternalHooks inst = NaturesAuraAPI.instance();
|
||||||
|
if (!inst.extractAuraFromPlayer(playerIn, 20000, worldIn.isRemote))
|
||||||
|
return new ActionResult<>(EnumActionResult.FAIL, stack);
|
||||||
|
if (worldIn.isRemote) {
|
||||||
|
inst.setParticleDepth(false);
|
||||||
|
inst.setParticleSpawnRange(64);
|
||||||
|
BlockPos pos = playerIn.getPosition();
|
||||||
|
int range = 30;
|
||||||
|
for (int x = -range; x <= range; x++)
|
||||||
|
for (int y = -range; y <= range; y++)
|
||||||
|
for (int z = -range; z <= range; z++) {
|
||||||
|
BlockPos offset = pos.add(x, y, z);
|
||||||
|
IBlockState state = worldIn.getBlockState(offset);
|
||||||
|
if (!state.getBlock().canCreatureSpawn(state, worldIn, offset, EntityLiving.SpawnPlacementType.ON_GROUND))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BlockPos offUp = offset.up();
|
||||||
|
IBlockState stateUp = worldIn.getBlockState(offUp);
|
||||||
|
if (stateUp.isBlockNormalCube() || stateUp.getMaterial().isLiquid())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int sky = worldIn.getLightFor(EnumSkyBlock.SKY, offUp);
|
||||||
|
int block = worldIn.getLightFor(EnumSkyBlock.BLOCK, offUp);
|
||||||
|
if (sky > 7 || block > 7)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
inst.spawnMagicParticle(
|
||||||
|
offset.getX() + 0.5F, offset.getY() + 1.5F, offset.getZ() + 0.5F,
|
||||||
|
0F, 0F, 0F, 0x992101, 2.5F, 20 * 30, 0F, false, true);
|
||||||
|
}
|
||||||
|
inst.setParticleDepth(true);
|
||||||
|
inst.setParticleSpawnRange(32);
|
||||||
|
|
||||||
|
playerIn.swingArm(handIn);
|
||||||
|
}
|
||||||
|
playerIn.getCooldownTracker().setCooldown(this, 20 * 30);
|
||||||
|
return new ActionResult<>(EnumActionResult.SUCCESS, stack);
|
||||||
|
}
|
||||||
|
}
|
|
@ -55,4 +55,5 @@ public final class ModItems {
|
||||||
public static final Item TOKEN_RAGE = new ItemImpl("token_rage");
|
public static final Item TOKEN_RAGE = new ItemImpl("token_rage");
|
||||||
public static final Item TOKEN_GRIEF = new ItemImpl("token_grief");
|
public static final Item TOKEN_GRIEF = new ItemImpl("token_grief");
|
||||||
public static final Item ENDER_ACCESS = new ItemEnderAccess();
|
public static final Item ENDER_ACCESS = new ItemEnderAccess();
|
||||||
|
public static final Item CAVE_FINDER = new ItemCaveFinder();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,12 @@ import java.util.function.Supplier;
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public final class ParticleHandler {
|
public final class ParticleHandler {
|
||||||
|
|
||||||
|
public static boolean depthEnabled = true;
|
||||||
|
public static int range = 32;
|
||||||
private static final List<Particle> PARTICLES = new ArrayList<>();
|
private static final List<Particle> PARTICLES = new ArrayList<>();
|
||||||
|
private static final List<Particle> PARTICLES_NO_DEPTH = new ArrayList<>();
|
||||||
|
|
||||||
public static void spawnParticle(Supplier<Particle> particle, double x, double y, double z, int range) {
|
public static void spawnParticle(Supplier<Particle> particle, double x, double y, double z) {
|
||||||
if (Minecraft.getMinecraft().player.getDistanceSq(x, y, z) <= range * range) {
|
if (Minecraft.getMinecraft().player.getDistanceSq(x, y, z) <= range * range) {
|
||||||
Minecraft mc = Minecraft.getMinecraft();
|
Minecraft mc = Minecraft.getMinecraft();
|
||||||
if (ModConfig.client.respectVanillaParticleSettings) {
|
if (ModConfig.client.respectVanillaParticleSettings) {
|
||||||
|
@ -35,16 +38,25 @@ public final class ParticleHandler {
|
||||||
double setting = ModConfig.client.particleAmount;
|
double setting = ModConfig.client.particleAmount;
|
||||||
if (setting < 1 && mc.world.rand.nextDouble() > setting)
|
if (setting < 1 && mc.world.rand.nextDouble() > setting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (depthEnabled)
|
||||||
PARTICLES.add(particle.get());
|
PARTICLES.add(particle.get());
|
||||||
|
else
|
||||||
|
PARTICLES_NO_DEPTH.add(particle.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateParticles() {
|
public static void updateParticles() {
|
||||||
for (int i = PARTICLES.size() - 1; i >= 0; i--) {
|
updateList(PARTICLES);
|
||||||
Particle particle = PARTICLES.get(i);
|
updateList(PARTICLES_NO_DEPTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void updateList(List<Particle> particles) {
|
||||||
|
for (int i = particles.size() - 1; i >= 0; i--) {
|
||||||
|
Particle particle = particles.get(i);
|
||||||
particle.onUpdate();
|
particle.onUpdate();
|
||||||
if (!particle.isAlive())
|
if (!particle.isAlive())
|
||||||
PARTICLES.remove(i);
|
particles.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +82,7 @@ public final class ParticleHandler {
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
GlStateManager.alphaFunc(516, 0.003921569F);
|
GlStateManager.alphaFunc(516, 0.003921569F);
|
||||||
GlStateManager.disableCull();
|
GlStateManager.disableCull();
|
||||||
|
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE);
|
||||||
|
|
||||||
GlStateManager.depthMask(false);
|
GlStateManager.depthMask(false);
|
||||||
|
|
||||||
|
@ -77,13 +90,18 @@ public final class ParticleHandler {
|
||||||
Tessellator tessy = Tessellator.getInstance();
|
Tessellator tessy = Tessellator.getInstance();
|
||||||
BufferBuilder buffer = tessy.getBuffer();
|
BufferBuilder buffer = tessy.getBuffer();
|
||||||
|
|
||||||
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE);
|
|
||||||
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP);
|
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP);
|
||||||
for (Particle particle : PARTICLES)
|
for (Particle particle : PARTICLES)
|
||||||
particle.renderParticle(buffer, player, partialTicks, x, xz, z, yz, xy);
|
particle.renderParticle(buffer, player, partialTicks, x, xz, z, yz, xy);
|
||||||
|
|
||||||
tessy.draw();
|
tessy.draw();
|
||||||
|
|
||||||
|
GlStateManager.disableDepth();
|
||||||
|
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP);
|
||||||
|
for (Particle particle : PARTICLES_NO_DEPTH)
|
||||||
|
particle.renderParticle(buffer, player, partialTicks, x, xz, z, yz, xy);
|
||||||
|
tessy.draw();
|
||||||
|
GlStateManager.enableDepth();
|
||||||
|
|
||||||
GlStateManager.enableCull();
|
GlStateManager.enableCull();
|
||||||
GlStateManager.depthMask(true);
|
GlStateManager.depthMask(true);
|
||||||
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
|
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
|
||||||
|
@ -94,13 +112,14 @@ public final class ParticleHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getParticleAmount() {
|
public static int getParticleAmount(boolean depth) {
|
||||||
return PARTICLES.size();
|
return depth ? PARTICLES.size() : PARTICLES_NO_DEPTH.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void clearParticles() {
|
public static void clearParticles() {
|
||||||
if (!PARTICLES.isEmpty()) {
|
if (!PARTICLES.isEmpty())
|
||||||
PARTICLES.clear();
|
PARTICLES.clear();
|
||||||
}
|
if (!PARTICLES_NO_DEPTH.isEmpty())
|
||||||
|
PARTICLES_NO_DEPTH.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -90,7 +90,17 @@ public class ClientProxy implements IProxy {
|
||||||
ParticleHandler.spawnParticle(() -> new ParticleMagic(Minecraft.getMinecraft().world,
|
ParticleHandler.spawnParticle(() -> new ParticleMagic(Minecraft.getMinecraft().world,
|
||||||
posX, posY, posZ,
|
posX, posY, posZ,
|
||||||
motionX, motionY, motionZ,
|
motionX, motionY, motionZ,
|
||||||
color, scale, maxAge, gravity, collision, fade), posX, posY, posZ, 32);
|
color, scale, maxAge, gravity, collision, fade), posX, posY, posZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleDepth(boolean depth) {
|
||||||
|
ParticleHandler.depthEnabled = depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleSpawnRange(int range) {
|
||||||
|
ParticleHandler.range = range;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -32,5 +32,9 @@ public interface IProxy {
|
||||||
|
|
||||||
void spawnMagicParticle(double posX, double posY, double posZ, double motionX, double motionY, double motionZ, int color, float scale, int maxAge, float gravity, boolean collision, boolean fade);
|
void spawnMagicParticle(double posX, double posY, double posZ, double motionX, double motionY, double motionZ, int color, float scale, int maxAge, float gravity, boolean collision, boolean fade);
|
||||||
|
|
||||||
|
void setParticleDepth(boolean depth);
|
||||||
|
|
||||||
|
void setParticleSpawnRange(int range);
|
||||||
|
|
||||||
void scheduleTask(Runnable runnable);
|
void scheduleTask(Runnable runnable);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,16 @@ public class ServerProxy implements IProxy {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleDepth(boolean depth) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParticleSpawnRange(int range) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void scheduleTask(Runnable runnable) {
|
public void scheduleTask(Runnable runnable) {
|
||||||
FMLCommonHandler.instance().getMinecraftServerInstance().addScheduledTask(runnable);
|
FMLCommonHandler.instance().getMinecraftServerInstance().addScheduledTask(runnable);
|
||||||
|
|
|
@ -91,6 +91,7 @@ item.naturesaura.token_rage.name=Token of Rage
|
||||||
item.naturesaura.token_sorrow.name=Token of Sorrow
|
item.naturesaura.token_sorrow.name=Token of Sorrow
|
||||||
item.naturesaura.token_terror.name=Token of Terror
|
item.naturesaura.token_terror.name=Token of Terror
|
||||||
item.naturesaura.ender_access.name=Ender Ocular
|
item.naturesaura.ender_access.name=Ender Ocular
|
||||||
|
item.naturesaura.cave_finder.name=Staff of Shadows
|
||||||
|
|
||||||
container.naturesaura.tree_ritual.name=Ritual of the Forest
|
container.naturesaura.tree_ritual.name=Ritual of the Forest
|
||||||
container.naturesaura.altar.name=Natural Altar Infusion
|
container.naturesaura.altar.name=Natural Altar Infusion
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "item/handheld",
|
||||||
|
"textures": {
|
||||||
|
"layer0": "naturesaura:items/cave_finder"
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 352 B |
Loading…
Reference in a new issue