Faster load (#89)

Co-authored-by: Alexdoru <57050655+Alexdoru@users.noreply.github.com>
This commit is contained in:
boubou19andAlexdoru authored and GitHub committed 2025-07-17 05:10:15 +02:00
1 parent 26a8bd6a26
commit c72988e435
39 files changed
+1077 -1344

No files matched your search

@@ -28,10 +28,6 @@ public class KeyHandler {
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void key(InputEvent.KeyInputEvent event){
checkAndPerformKeyActions();
}
private void checkAndPerformKeyActions(){
if (keyToggleRingOfLoki.isPressed()){
toggleRingLoki();
}
@@ -43,7 +43,7 @@ public class BlockBifrost extends BlockModContainer<TileBifrost> implements ILex
setLightLevel(1F);
setBlockUnbreakable();
setStepSound(soundTypeGlass);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -82,16 +82,6 @@ public class BlockBifrost extends BlockModContainer<TileBifrost> implements ILex
return 0;
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:bifrost");
if(event.map.setTextureEntry("botania:bifrost", icon))
blockIcon = icon;
}
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister par1IconRegister) {
@@ -108,4 +98,15 @@ public class BlockBifrost extends BlockModContainer<TileBifrost> implements ILex
return LexiconData.rainbowRod;
}
public class EventHandler {
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:bifrost");
if(event.map.setTextureEntry("botania:bifrost", icon))
blockIcon = icon;
}
}
}
}
@@ -45,7 +45,7 @@ public class BlockEnchantedSoil extends BlockMod implements ILexiconable {
setHardness(0.6F);
setStepSound(soundTypeGrass);
setBlockName(LibBlockNames.ENCHANTED_SOIL);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -59,20 +59,6 @@ public class BlockEnchantedSoil extends BlockMod implements ILexiconable {
// NO-OP
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:enchantedSoil0");
if(event.map.setTextureEntry("botania:enchantedSoil0", icon))
blockIcon = icon;
icon = new InterpolatedIcon("botania:enchantedSoil1");
if(event.map.setTextureEntry("botania:enchantedSoil1", icon))
iconSide = icon;
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
@@ -99,4 +85,19 @@ public class BlockEnchantedSoil extends BlockMod implements ILexiconable {
return LexiconData.overgrowthSeed;
}
public class EventHandler{
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:enchantedSoil0");
if(event.map.setTextureEntry("botania:enchantedSoil0", icon))
blockIcon = icon;
icon = new InterpolatedIcon("botania:enchantedSoil1");
if(event.map.setTextureEntry("botania:enchantedSoil1", icon))
iconSide = icon;
}
}
}
}
@@ -44,7 +44,7 @@ public class BlockFelPumpkin extends BlockMod implements ILexiconable {
setBlockName(LibBlockNames.FEL_PUMPKIN);
setHardness(1F);
setStepSound(soundTypeWood);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -85,21 +85,22 @@ public class BlockFelPumpkin extends BlockMod implements ILexiconable {
blockIcon = Blocks.pumpkin.getIcon(2, 0);
}
@SubscribeEvent
public void onDrops(LivingDropsEvent event) {
if(event.entity instanceof EntityBlaze && event.entity.getEntityData().getBoolean(TAG_FEL_SPAWNED))
if(event.drops.isEmpty())
event.drops.add(new EntityItem(event.entity.worldObj, event.entity.posX, event.entity.posY, event.entity.posZ, new ItemStack(Items.blaze_powder, 6)));
else for(EntityItem item : event.drops) {
ItemStack stack = item.getEntityItem();
if(stack.getItem() == Items.blaze_rod)
item.setEntityItemStack(new ItemStack(Items.blaze_powder, stack.stackSize * 10));
}
}
@Override
public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon) {
return LexiconData.gardenOfGlass;
}
public static class EventHandler {
@SubscribeEvent
public void onDrops(LivingDropsEvent event) {
if(event.entity instanceof EntityBlaze && event.entity.getEntityData().getBoolean(TAG_FEL_SPAWNED))
if(event.drops.isEmpty())
event.drops.add(new EntityItem(event.entity.worldObj, event.entity.posX, event.entity.posY, event.entity.posZ, new ItemStack(Items.blaze_powder, 6)));
else for(EntityItem item : event.drops) {
ItemStack stack = item.getEntityItem();
if(stack.getItem() == Items.blaze_rod)
item.setEntityItemStack(new ItemStack(Items.blaze_powder, stack.stackSize * 10));
}
}
}
}
@@ -38,7 +38,7 @@ public class BlockGhostRail extends BlockRailBase implements ILexiconable {
public BlockGhostRail() {
super(true);
setCreativeTab(BotaniaCreativeTab.INSTANCE);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
setBlockName(LibBlockNames.GHOST_RAIL);
}
@@ -54,40 +54,42 @@ public class BlockGhostRail extends BlockRailBase implements ILexiconable {
blockIcon = IconHelper.forBlock(par1IconRegister, this);
}
@SubscribeEvent
public void onMinecartUpdate(MinecartUpdateEvent event) {
int x = MathHelper.floor_double(event.entity.posX);
int y = MathHelper.floor_double(event.entity.posY);
int z = MathHelper.floor_double(event.entity.posZ);
Block block = event.entity.worldObj.getBlock(x, y, z);
boolean air = block.isAir(event.entity.worldObj, x, y, z);
int floatTicks = event.entity.getEntityData().getInteger(TAG_FLOAT_TICKS);
if(block == this)
event.entity.getEntityData().setInteger(TAG_FLOAT_TICKS, 20);
else if(block instanceof BlockRailBase || block == ModBlocks.dreamwood) {
event.entity.getEntityData().setInteger(TAG_FLOAT_TICKS, 0);
if(floatTicks > 0)
event.entity.worldObj.playAuxSFX(2003, x, y, z, 0);
}
floatTicks = event.entity.getEntityData().getInteger(TAG_FLOAT_TICKS);
if(floatTicks > 0) {
Block blockBelow = event.entity.worldObj.getBlock(x, y - 1, z);
boolean airBelow = blockBelow.isAir(event.entity.worldObj, x, y - 1, z);
if(air && airBelow || !air && !airBelow)
event.entity.noClip = true;
event.entity.motionY = 0.2;
event.entity.motionX *= 1.4;
event.entity.motionZ *= 1.4;
event.entity.getEntityData().setInteger(TAG_FLOAT_TICKS, floatTicks - 1);
event.entity.worldObj.playAuxSFX(2000, x, y, z, 0);
} else event.entity.noClip = false;
}
@Override
public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon) {
return LexiconData.ghostRail;
}
public class EventHandler {
@SubscribeEvent
public void onMinecartUpdate(MinecartUpdateEvent event) {
int x = MathHelper.floor_double(event.entity.posX);
int y = MathHelper.floor_double(event.entity.posY);
int z = MathHelper.floor_double(event.entity.posZ);
Block block = event.entity.worldObj.getBlock(x, y, z);
boolean air = block.isAir(event.entity.worldObj, x, y, z);
int floatTicks = event.entity.getEntityData().getInteger(TAG_FLOAT_TICKS);
if(block == BlockGhostRail.this)
event.entity.getEntityData().setInteger(TAG_FLOAT_TICKS, 20);
else if(block instanceof BlockRailBase || block == ModBlocks.dreamwood) {
event.entity.getEntityData().setInteger(TAG_FLOAT_TICKS, 0);
if(floatTicks > 0)
event.entity.worldObj.playAuxSFX(2003, x, y, z, 0);
}
floatTicks = event.entity.getEntityData().getInteger(TAG_FLOAT_TICKS);
if(floatTicks > 0) {
Block blockBelow = event.entity.worldObj.getBlock(x, y - 1, z);
boolean airBelow = blockBelow.isAir(event.entity.worldObj, x, y - 1, z);
if(air && airBelow || !air && !airBelow)
event.entity.noClip = true;
event.entity.motionY = 0.2;
event.entity.motionX *= 1.4;
event.entity.motionZ *= 1.4;
event.entity.getEntityData().setInteger(TAG_FLOAT_TICKS, floatTicks - 1);
event.entity.worldObj.playAuxSFX(2000, x, y, z, 0);
} else event.entity.noClip = false;
}
}
}
@@ -60,8 +60,9 @@ public class BlockPistonRelay extends BlockMod implements IWandable, ILexiconabl
setResistance(10F);
setStepSound(soundTypeMetal);
MinecraftForge.EVENT_BUS.register(this);
FMLCommonHandler.instance().bus().register(this);
EventHandler handler = new EventHandler();
MinecraftForge.EVENT_BUS.register(handler);
FMLCommonHandler.instance().bus().register(handler);
}
@Override
@@ -140,16 +141,6 @@ public class BlockPistonRelay extends BlockMod implements IWandable, ILexiconabl
return true;
}
@SubscribeEvent
public void onWorldLoad(WorldEvent.Load event) {
WorldData.get(event.world);
}
@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
WorldData.get(event.world).markDirty();
}
public static class WorldData extends WorldSavedData {
private static final String ID = "PistonRelayPairs";
@@ -194,80 +185,6 @@ public class BlockPistonRelay extends BlockMod implements IWandable, ILexiconabl
}
}
@SubscribeEvent
public void tickEnd(TickEvent event) {
if(event.type == Type.SERVER && event.phase == Phase.END) {
List<String> coordsToCheckCopy = new ArrayList<>(coordsToCheck.keySet());
for(String s : coordsToCheckCopy) {
decrCoords(s);
if(checkedCoords.contains(s))
continue;
Block block = getBlockAt(s);
if(block == Blocks.piston_extension) {
int meta = getBlockMetaAt(s);
boolean sticky = (meta & 8) == 8;
ForgeDirection dir = ForgeDirection.getOrientation(meta & ~8);
MinecraftServer server = MinecraftServer.getServer();
if(server != null && getTimeInCoords(s) == 0) {
String newPos;
{
String[] tokens = s.split(":");
int worldId = Integer.parseInt(tokens[0]), x = Integer.parseInt(tokens[1]), y = Integer.parseInt(tokens[2]), z = Integer.parseInt(tokens[3]);
World world = server.worldServerForDimension(worldId);
if(world.isAirBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))
world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.pistonRelay);
else if(!world.isRemote) {
ItemStack stack = new ItemStack(ModBlocks.pistonRelay);
world.spawnEntityInWorld(new EntityItem(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, stack));
}
checkedCoords.add(s);
newPos = getCoordsAsString(world.provider.dimensionId, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
}
if(mappedPositions.containsKey(s)) {
String pos = mappedPositions.get(s);
String[] tokens = pos.split(":");
int worldId = Integer.parseInt(tokens[0]), x = Integer.parseInt(tokens[1]), y = Integer.parseInt(tokens[2]), z = Integer.parseInt(tokens[3]);
World world = server.worldServerForDimension(worldId);
Block srcBlock = world.getBlock(x, y, z);
int srcMeta = world.getBlockMetadata(x, y, z);
TileEntity tile = world.getTileEntity(x, y, z);
Material mat = srcBlock.getMaterial();
if(!sticky && tile == null && mat.getMaterialMobility() == 0 && srcBlock.getBlockHardness(world, x, y, z) != -1 && !srcBlock.isAir(world, x, y, z)) {
Material destMat = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).getMaterial();
if(world.isAirBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) || destMat.isReplaceable()) {
world.setBlock(x, y, z, Blocks.air);
world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, srcBlock, srcMeta, 1 | 2);
mappedPositions.put(s, getCoordsAsString(world.provider.dimensionId, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ));
}
}
pos = mappedPositions.get(s);
mappedPositions.remove(s);
mappedPositions.put(newPos, pos);
save(world);
}
}
}
}
}
// ConcurrentModificationException failsafe
ArrayList<String> remove = new ArrayList<>(removeThese);
for(String s : remove) {
coordsToCheck.remove(s);
if(checkedCoords.contains(s))
checkedCoords.remove(s);
}
removeThese.clear();
}
public void save(World world) {
WorldData data = WorldData.get(world);
if(data != null)
@@ -278,4 +195,90 @@ public class BlockPistonRelay extends BlockMod implements IWandable, ILexiconabl
public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon) {
return LexiconData.pistonRelay;
}
public class EventHandler {
@SubscribeEvent
public void onWorldLoad(WorldEvent.Load event) {
WorldData.get(event.world);
}
@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
WorldData.get(event.world).markDirty();
}
@SubscribeEvent
public void tickEnd(TickEvent event) {
if(event.type == Type.SERVER && event.phase == Phase.END) {
List<String> coordsToCheckCopy = new ArrayList<>(coordsToCheck.keySet());
for(String s : coordsToCheckCopy) {
decrCoords(s);
if(checkedCoords.contains(s))
continue;
Block block = getBlockAt(s);
if(block == Blocks.piston_extension) {
int meta = getBlockMetaAt(s);
boolean sticky = (meta & 8) == 8;
ForgeDirection dir = ForgeDirection.getOrientation(meta & ~8);
MinecraftServer server = MinecraftServer.getServer();
if(server != null && getTimeInCoords(s) == 0) {
String newPos;
{
String[] tokens = s.split(":");
int worldId = Integer.parseInt(tokens[0]), x = Integer.parseInt(tokens[1]), y = Integer.parseInt(tokens[2]), z = Integer.parseInt(tokens[3]);
World world = server.worldServerForDimension(worldId);
if(world.isAirBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))
world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.pistonRelay);
else if(!world.isRemote) {
ItemStack stack = new ItemStack(ModBlocks.pistonRelay);
world.spawnEntityInWorld(new EntityItem(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, stack));
}
checkedCoords.add(s);
newPos = getCoordsAsString(world.provider.dimensionId, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
}
if(mappedPositions.containsKey(s)) {
String pos = mappedPositions.get(s);
String[] tokens = pos.split(":");
int worldId = Integer.parseInt(tokens[0]), x = Integer.parseInt(tokens[1]), y = Integer.parseInt(tokens[2]), z = Integer.parseInt(tokens[3]);
World world = server.worldServerForDimension(worldId);
Block srcBlock = world.getBlock(x, y, z);
int srcMeta = world.getBlockMetadata(x, y, z);
TileEntity tile = world.getTileEntity(x, y, z);
Material mat = srcBlock.getMaterial();
if(!sticky && tile == null && mat.getMaterialMobility() == 0 && srcBlock.getBlockHardness(world, x, y, z) != -1 && !srcBlock.isAir(world, x, y, z)) {
Material destMat = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).getMaterial();
if(world.isAirBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) || destMat.isReplaceable()) {
world.setBlock(x, y, z, Blocks.air);
world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, srcBlock, srcMeta, 1 | 2);
mappedPositions.put(s, getCoordsAsString(world.provider.dimensionId, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ));
}
}
pos = mappedPositions.get(s);
mappedPositions.remove(s);
mappedPositions.put(newPos, pos);
save(world);
}
}
}
}
}
// ConcurrentModificationException failsafe
ArrayList<String> remove = new ArrayList<>(removeThese);
for(String s : remove) {
coordsToCheck.remove(s);
if(checkedCoords.contains(s))
checkedCoords.remove(s);
}
removeThese.clear();
}
}
}
@@ -49,7 +49,7 @@ public class BlockPrismarine extends BlockMod implements ILexiconable {
setResistance(10.0F);
setStepSound(soundTypeStone);
setBlockName(LibBlockNames.PRISMARINE);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -82,16 +82,6 @@ public class BlockPrismarine extends BlockMod implements ILexiconable {
icons[i] = IconHelper.forBlock(par1IconRegister, this, i);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:prismarine0");
if(event.map.setTextureEntry("botania:prismarine0", icon))
icons[0] = icon;
}
}
@Override
public IIcon getIcon(int par1, int par2) {
return icons[Math.min(TYPES - 1, par2)];
@@ -107,4 +97,16 @@ public class BlockPrismarine extends BlockMod implements ILexiconable {
public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon) {
return LexiconData.prismarine;
}
public class EventHandler {
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:prismarine0");
if(event.map.setTextureEntry("botania:prismarine0", icon))
icons[0] = icon;
}
}
}
}
@@ -36,17 +36,7 @@ public class BlockShimmerrock extends BlockMod implements ILexiconable {
setResistance(10.0F);
setStepSound(soundTypeStone);
setBlockName(LibBlockNames.SHIMMERROCK);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:shimmerrock");
if(event.map.setTextureEntry("botania:shimmerrock", icon))
blockIcon = icon;
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -60,4 +50,15 @@ public class BlockShimmerrock extends BlockMod implements ILexiconable {
return LexiconData.rainbowRod;
}
public class EventHandler {
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:shimmerrock");
if(event.map.setTextureEntry("botania:shimmerrock", icon))
blockIcon = icon;
}
}
}
}
@@ -35,17 +35,7 @@ public class BlockShimmerwoodPlanks extends BlockMod implements ILexiconable {
setHardness(2.0F);
setStepSound(soundTypeWood);
setBlockName(LibBlockNames.SHIMMERWOOD_PLANKS);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:shimmerwoodPlanks");
if(event.map.setTextureEntry("botania:shimmerwoodPlanks", icon))
blockIcon = icon;
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -59,4 +49,15 @@ public class BlockShimmerwoodPlanks extends BlockMod implements ILexiconable {
return LexiconData.rainbowRod;
}
public class EventHandler {
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:shimmerwoodPlanks");
if(event.map.setTextureEntry("botania:shimmerwoodPlanks", icon))
blockIcon = icon;
}
}
}
}
@@ -24,17 +24,7 @@ public class BlockBifrostPane extends BlockModPane {
public BlockBifrostPane() {
super(ModBlocks.bifrostPerm);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:bifrostPermPane");
if(event.map.setTextureEntry("botania:bifrostPermPane", icon))
iconTop = icon;
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -43,4 +33,16 @@ public class BlockBifrostPane extends BlockModPane {
// NO-OP
}
public class EventHandler {
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void loadTextures(TextureStitchEvent.Pre event) {
if(event.map.getTextureType() == 0) {
TextureAtlasSprite icon = new InterpolatedIcon("botania:bifrostPermPane");
if(event.map.setTextureEntry("botania:bifrostPermPane", icon))
iconTop = icon;
}
}
}
}
@@ -26,13 +26,7 @@ public class BlockRedStringInterceptor extends BlockRedString {
public BlockRedStringInterceptor() {
super(LibBlockNames.RED_STRING_INTERCEPTOR);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onInteract(PlayerInteractEvent event) {
if(event.action == Action.RIGHT_CLICK_BLOCK)
TileRedStringInterceptor.onInteract(event.entityPlayer, event.world, event.x, event.y, event.z);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -60,4 +54,12 @@ public class BlockRedStringInterceptor extends BlockRedString {
return new TileRedStringInterceptor();
}
public static class EventHandler {
@SubscribeEvent
public void onInteract(PlayerInteractEvent event) {
if(event.action == Action.RIGHT_CLICK_BLOCK)
TileRedStringInterceptor.onInteract(event.entityPlayer, event.world, event.x, event.y, event.z);
}
}
}
@@ -23,16 +23,18 @@ public class PotionAllure extends PotionMod {
public PotionAllure() {
super(ConfigHandler.potionIDAllure, LibPotionNames.ALLURE, false, 0x0034E4, 5);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@SubscribeEvent
public void onEntityUpdate(LivingUpdateEvent event) {
EntityLivingBase e = event.entityLiving;
if(e instanceof EntityPlayer && hasEffect(e)) {
EntityFishHook hook = ((EntityPlayer) e).fishEntity;
if(hook != null)
hook.onUpdate();
public class EventHandler{
@SubscribeEvent
public void onEntityUpdate(LivingUpdateEvent event) {
EntityLivingBase e = event.entityLiving;
if(e instanceof EntityPlayer && hasEffect(e)) {
EntityFishHook hook = ((EntityPlayer) e).fishEntity;
if(hook != null)
hook.onUpdate();
}
}
}
@@ -10,9 +10,6 @@
*/
package vazkii.botania.common.brew.potion;
import java.util.List;
import java.util.stream.Collectors;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.common.MinecraftForge;
@@ -29,20 +26,21 @@ public class PotionBloodthirst extends PotionMod {
public PotionBloodthirst() {
super(ConfigHandler.potionIDBloodthirst, LibPotionNames.BLOODTHIRST, false, 0xC30000, 3);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@SubscribeEvent
public void onSpawn(LivingSpawnEvent.CheckSpawn event) {
if (event.getResult() != Result.ALLOW && event.entityLiving instanceof IMob) {
double rangeSq = RANGE * RANGE;
List<EntityPlayer> players = (List<EntityPlayer>) event.world.playerEntities.stream()
.filter(player -> ((EntityPlayer) player).getDistanceSq(event.x, event.y, event.z) <= rangeSq)
.map(player -> (EntityPlayer) player)
.collect(Collectors.toList());
for (EntityPlayer player : players) {
if(hasEffect(player) && !hasEffect(player, ModPotions.emptiness)) {
event.setResult(Result.ALLOW);
return;
public class EventHandler {
@SubscribeEvent
public void onSpawn(LivingSpawnEvent.CheckSpawn event) {
if (event.getResult() != Result.ALLOW && event.entityLiving instanceof IMob) {
double rangeSq = RANGE * RANGE;
for (Object o : event.world.playerEntities) {
EntityPlayer player = (EntityPlayer) o;
if (player.getDistanceSq(event.x, event.y, event.z) <= rangeSq
&& hasEffect(player) && !hasEffect(player, ModPotions.emptiness)) {
event.setResult(Result.ALLOW);
return;
}
}
}
}
@@ -10,9 +10,6 @@
*/
package vazkii.botania.common.brew.potion;
import java.util.List;
import java.util.stream.Collectors;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.common.MinecraftForge;
@@ -28,21 +25,21 @@ public class PotionEmptiness extends PotionMod {
public PotionEmptiness() {
super(ConfigHandler.potionIDEmptiness, LibPotionNames.EMPTINESS, false, 0xFACFFF, 2);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@SubscribeEvent
public void onSpawn(LivingSpawnEvent.CheckSpawn event) {
if (event.getResult() != Result.ALLOW && event.entityLiving instanceof IMob) {
double rangeSq = RANGE * RANGE;
List<EntityPlayer> players = (List<EntityPlayer>) event.world.playerEntities.stream()
.filter(player -> ((EntityPlayer) player).getDistanceSq(event.x, event.y, event.z) <= rangeSq)
.map(player -> (EntityPlayer) player)
.collect(Collectors.toList());
for (EntityPlayer player : players) {
if (hasEffect(player)) {
event.setResult(Result.DENY);
return;
public class EventHandler {
@SubscribeEvent
public void onSpawn(LivingSpawnEvent.CheckSpawn event) {
if (event.getResult() != Result.ALLOW && event.entityLiving instanceof IMob) {
double rangeSq = RANGE * RANGE;
for (Object o : event.world.playerEntities) {
EntityPlayer player = (EntityPlayer) o;
if (player.getDistanceSq(event.x, event.y, event.z) <= rangeSq
&& hasEffect(player)) {
event.setResult(Result.DENY);
return;
}
}
}
}
@@ -21,14 +21,16 @@ public class PotionFeatherfeet extends PotionMod {
public PotionFeatherfeet() {
super(ConfigHandler.potionIDFeatherfeet, LibPotionNames.FEATHER_FEET, false, 0x26ADFF, 1);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@SubscribeEvent
public void onEntityUpdate(LivingUpdateEvent event) {
EntityLivingBase e = event.entityLiving;
if(hasEffect(e))
e.fallDistance = 2.5F;
public class EventHandler {
@SubscribeEvent
public void onEntityUpdate(LivingUpdateEvent event) {
EntityLivingBase e = event.entityLiving;
if(hasEffect(e))
e.fallDistance = 2.5F;
}
}
}
@@ -22,16 +22,18 @@ public class PotionSoulCross extends PotionMod {
public PotionSoulCross() {
super(ConfigHandler.potionIDSoulCross, LibPotionNames.SOUL_CROSS, false, 0x47453d, 0);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@SubscribeEvent
public void onEntityKill(LivingDeathEvent event) {
Entity e = event.source.getEntity();
if(e != null && e instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) e;
if(hasEffect(living))
living.heal(event.entityLiving.getMaxHealth() / 20);
public class EventHandler {
@SubscribeEvent
public void onEntityKill(LivingDeathEvent event) {
Entity e = event.source.getEntity();
if(e != null && e instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) e;
if(hasEffect(living))
living.heal(event.entityLiving.getMaxHealth() / 20);
}
}
}
@@ -81,8 +81,9 @@ public class ItemCraftingHalo extends ItemMod implements ICraftAchievement {
public ItemCraftingHalo() {
this(LibItemNames.CRAFTING_HALO);
MinecraftForge.EVENT_BUS.register(this);
FMLCommonHandler.instance().bus().register(this);
EventHandler handler = new EventHandler();
MinecraftForge.EVENT_BUS.register(handler);
FMLCommonHandler.instance().bus().register(handler);
}
public ItemCraftingHalo(String name) {
@@ -300,18 +301,6 @@ public class ItemCraftingHalo extends ItemMod implements ICraftAchievement {
ItemNBTHelper.setCompound(stack, TAG_STORED_RECIPE_PREFIX + pos, getLastCraftingCompound(stack, false));
}
@SubscribeEvent
public void onItemCrafted(ItemCraftedEvent event) {
if(!(event.craftMatrix instanceof InventoryCraftingHalo))
return;
for(int i = 0; i < event.player.inventory.getSizeInventory(); i++) {
ItemStack stack = event.player.inventory.getStackInSlot(i);
if(stack != null && stack.getItem() instanceof ItemCraftingHalo)
saveRecipeToStack(event, stack);
}
}
private void saveRecipeToStack(ItemCraftedEvent event, ItemStack stack) {
NBTTagCompound cmp = new NBTTagCompound();
NBTTagCompound cmp1 = new NBTTagCompound();
@@ -391,15 +380,6 @@ public class ItemCraftingHalo extends ItemMod implements ICraftAchievement {
ItemNBTHelper.setFloat(stack, TAG_ROTATION_BASE, rotation);
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onRenderWorldLast(RenderWorldLastEvent event) {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
ItemStack stack = player.getCurrentEquippedItem();
if(stack != null && stack.getItem() instanceof ItemCraftingHalo)
render(stack, player, event.partialTicks);
}
@SideOnly(Side.CLIENT)
public void render(ItemStack stack, EntityPlayer player, float partialTicks) {
Minecraft mc = Minecraft.getMinecraft();
@@ -605,4 +585,27 @@ public class ItemCraftingHalo extends ItemMod implements ICraftAchievement {
return ModAchievements.craftingHaloCraft;
}
public class EventHandler{
@SubscribeEvent
public void onItemCrafted(ItemCraftedEvent event) {
if(!(event.craftMatrix instanceof InventoryCraftingHalo))
return;
for(int i = 0; i < event.player.inventory.getSizeInventory(); i++) {
ItemStack stack = event.player.inventory.getStackInSlot(i);
if(stack != null && stack.getItem() instanceof ItemCraftingHalo)
saveRecipeToStack(event, stack);
}
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onRenderWorldLast(RenderWorldLastEvent event) {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
ItemStack stack = player.getCurrentEquippedItem();
if(stack != null && stack.getItem() instanceof ItemCraftingHalo)
render(stack, player, event.partialTicks);
}
}
}
@@ -62,7 +62,7 @@ public class ItemGrassSeeds extends ItemMod implements IFloatingFlowerVariant {
super();
setUnlocalizedName(LibItemNames.GRASS_SEEDS);
setHasSubtypes(true);
FMLCommonHandler.instance().bus().register(this);
FMLCommonHandler.instance().bus().register(new EventHandler());
}
@Override
@@ -170,28 +170,6 @@ public class ItemGrassSeeds extends ItemMod implements IFloatingFlowerVariant {
return true;
}
@SubscribeEvent
public void onTickEnd(TickEvent.WorldTickEvent event) {
// Block swapper updates should only occur on the server
if(event.world.isRemote)
return;
if(event.phase == Phase.END) {
int dim = event.world.provider.dimensionId;
if(blockSwappers.containsKey(dim)) {
Set<BlockSwapper> swappers = blockSwappers.get(dim);
Iterator<BlockSwapper> iter = swappers.iterator();
while(iter.hasNext()) {
BlockSwapper next = iter.next();
if(next == null || !next.tick())
iter.remove();
}
}
}
}
/**
* Adds a grass seed block swapper to the world at the provided positiona
* and with the provided meta (which designates the type of the grass
@@ -374,4 +352,23 @@ public class ItemGrassSeeds extends ItemMod implements IFloatingFlowerVariant {
return ISLAND_TYPES[Math.min(stack.getItemDamage(), ISLAND_TYPES.length - 1)];
}
public static class EventHandler {
@SubscribeEvent
public void onTickEnd(TickEvent.WorldTickEvent event) {
// Block swapper updates should only occur on the server
if(event.world.isRemote)
return;
if(event.phase == Phase.END) {
int dim = event.world.provider.dimensionId;
if(blockSwappers.containsKey(dim)) {
Set<BlockSwapper> swappers = blockSwappers.get(dim);
swappers.removeIf(next -> next == null || !next.tick());
}
}
}
}
}
@@ -41,63 +41,66 @@ public class ItemKeepIvy extends ItemMod {
setUnlocalizedName(LibItemNames.KEEP_IVY);
GameRegistry.addRecipe(new KeepIvyRecipe());
RecipeSorter.register("botania:keepIvy", KeepIvyRecipe.class, Category.SHAPELESS, "");
MinecraftForge.EVENT_BUS.register(this);
FMLCommonHandler.instance().bus().register(this);
EventHandler handler = new EventHandler();
MinecraftForge.EVENT_BUS.register(handler);
FMLCommonHandler.instance().bus().register(handler);
}
@SubscribeEvent
public void onPlayerDrops(PlayerDropsEvent event) {
List<EntityItem> keeps = new ArrayList<>();
for(EntityItem item : event.drops) {
ItemStack stack = item.getEntityItem();
if(stack != null && ItemNBTHelper.detectNBT(stack) && ItemNBTHelper.getBoolean(stack, TAG_KEEP, false))
keeps.add(item);
}
if(keeps.size() > 0) {
event.drops.removeAll(keeps);
NBTTagCompound cmp = new NBTTagCompound();
cmp.setInteger(TAG_DROP_COUNT, keeps.size());
int i = 0;
for(EntityItem keep : keeps) {
ItemStack stack = keep.getEntityItem();
NBTTagCompound cmp1 = new NBTTagCompound();
stack.writeToNBT(cmp1);
cmp.setTag(TAG_DROP_PREFIX + i, cmp1);
i++;
public static class EventHandler {
@SubscribeEvent
public void onPlayerDrops(PlayerDropsEvent event) {
List<EntityItem> keeps = new ArrayList<>();
for (EntityItem item : event.drops) {
ItemStack stack = item.getEntityItem();
if (stack != null && ItemNBTHelper.detectNBT(stack) && ItemNBTHelper.getBoolean(stack, TAG_KEEP, false))
keeps.add(item);
}
NBTTagCompound data = event.entityPlayer.getEntityData();
if(!data.hasKey(EntityPlayer.PERSISTED_NBT_TAG))
data.setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound());
if (!keeps.isEmpty()) {
event.drops.removeAll(keeps);
NBTTagCompound persist = data.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG);
persist.setTag(TAG_PLAYER_KEPT_DROPS, cmp);
}
}
@SubscribeEvent
public void onPlayerRespawn(PlayerRespawnEvent event) {
NBTTagCompound data = event.player.getEntityData();
if(data.hasKey(EntityPlayer.PERSISTED_NBT_TAG)) {
NBTTagCompound cmp = data.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG);
NBTTagCompound cmp1 = cmp.getCompoundTag(TAG_PLAYER_KEPT_DROPS);
NBTTagCompound cmp = new NBTTagCompound();
cmp.setInteger(TAG_DROP_COUNT, keeps.size());
int count = cmp1.getInteger(TAG_DROP_COUNT);
for(int i = 0; i < count; i++) {
NBTTagCompound cmp2 = cmp1.getCompoundTag(TAG_DROP_PREFIX + i);
ItemStack stack = ItemStack.loadItemStackFromNBT(cmp2);
if(stack != null) {
ItemStack copy = stack.copy();
ItemNBTHelper.setBoolean(copy, TAG_KEEP, false);
event.player.inventory.addItemStackToInventory(copy);
int i = 0;
for (EntityItem keep : keeps) {
ItemStack stack = keep.getEntityItem();
NBTTagCompound cmp1 = new NBTTagCompound();
stack.writeToNBT(cmp1);
cmp.setTag(TAG_DROP_PREFIX + i, cmp1);
i++;
}
}
cmp.setTag(TAG_PLAYER_KEPT_DROPS, new NBTTagCompound());
NBTTagCompound data = event.entityPlayer.getEntityData();
if (!data.hasKey(EntityPlayer.PERSISTED_NBT_TAG))
data.setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound());
NBTTagCompound persist = data.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG);
persist.setTag(TAG_PLAYER_KEPT_DROPS, cmp);
}
}
@SubscribeEvent
public void onPlayerRespawn(PlayerRespawnEvent event) {
NBTTagCompound data = event.player.getEntityData();
if (data.hasKey(EntityPlayer.PERSISTED_NBT_TAG)) {
NBTTagCompound cmp = data.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG);
NBTTagCompound cmp1 = cmp.getCompoundTag(TAG_PLAYER_KEPT_DROPS);
int count = cmp1.getInteger(TAG_DROP_COUNT);
for (int i = 0; i < count; i++) {
NBTTagCompound cmp2 = cmp1.getCompoundTag(TAG_DROP_PREFIX + i);
ItemStack stack = ItemStack.loadItemStackFromNBT(cmp2);
if (stack != null) {
ItemStack copy = stack.copy();
ItemNBTHelper.setBoolean(copy, TAG_KEEP, false);
event.player.inventory.addItemStackToInventory(copy);
}
}
cmp.setTag(TAG_PLAYER_KEPT_DROPS, new NBTTagCompound());
}
}
}
@@ -33,16 +33,18 @@ public class ItemRegenIvy extends ItemMod {
setUnlocalizedName(LibItemNames.REGEN_IVY);
GameRegistry.addRecipe(new RegenIvyRecipe());
RecipeSorter.register("botania:regenIvy", RegenIvyRecipe.class, Category.SHAPELESS, "");
FMLCommonHandler.instance().bus().register(this);
FMLCommonHandler.instance().bus().register(new EventHandler());
}
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onTick(PlayerTickEvent event) {
if(event.phase == Phase.END && !event.player.worldObj.isRemote)
for(int i = 0; i < event.player.inventory.getSizeInventory(); i++) {
ItemStack stack = event.player.inventory.getStackInSlot(i);
if(stack != null && ItemNBTHelper.detectNBT(stack) && ItemNBTHelper.getBoolean(stack, TAG_REGEN, false) && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, event.player, MANA_PER_DAMAGE, true))
stack.setItemDamage(stack.getItemDamage() - 1);
}
public static class EventHandler {
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onTick(PlayerTickEvent event) {
if(event.phase == Phase.END && !event.player.worldObj.isRemote)
for(int i = 0; i < event.player.inventory.getSizeInventory(); i++) {
ItemStack stack = event.player.inventory.getStackInSlot(i);
if(stack != null && ItemNBTHelper.detectNBT(stack) && ItemNBTHelper.getBoolean(stack, TAG_REGEN, false) && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, event.player, MANA_PER_DAMAGE, true))
stack.setItemDamage(stack.getItemDamage() - 1);
}
}
}
}
@@ -45,7 +45,7 @@ public class ItemVirus extends ItemMod {
public ItemVirus() {
setUnlocalizedName(LibItemNames.VIRUS);
setHasSubtypes(true);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -70,19 +70,6 @@ public class ItemVirus extends ItemMod {
return false;
}
@SubscribeEvent
public void onLivingHurt(LivingHurtEvent event) {
EntityLivingBase entity = event.entityLiving;
if(entity.ridingEntity != null && entity.ridingEntity instanceof EntityLivingBase)
entity = (EntityLivingBase) entity.ridingEntity;
if(entity instanceof EntityHorse && event.source == DamageSource.fall) {
EntityHorse horse = (EntityHorse) entity;
if((horse.getHorseType() == 3 || horse.getHorseType() == 4) && horse.isTame())
event.setCanceled(true);
}
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs tab, List list) {
@@ -113,4 +100,19 @@ public class ItemVirus extends ItemMod {
icons[i] = IconHelper.forItem(par1IconRegister, this, i);
}
public static class EventHandler{
@SubscribeEvent
public void onLivingHurt(LivingHurtEvent event) {
EntityLivingBase entity = event.entityLiving;
if(entity.ridingEntity instanceof EntityLivingBase)
entity = (EntityLivingBase) entity.ridingEntity;
if(entity instanceof EntityHorse && event.source == DamageSource.fall) {
EntityHorse horse = (EntityHorse) entity;
if((horse.getHorseType() == 3 || horse.getHorseType() == 4) && horse.isTame())
event.setCanceled(true);
}
}
}
}
@@ -27,50 +27,7 @@ public abstract class ItemBagBase extends ItemMod {
public ItemBagBase(String name) {
setUnlocalizedName(name);
setMaxStackSize(1);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onPickupItem(EntityItemPickupEvent event) {
ItemStack stack = event.item.getEntityItem();
if(stack.getItem() == Item.getItemFromBlock(getValidPickUp()) && stack.stackSize > 0) {
int color = stack.getItemDamage();
if(color > 15)
return;
for(int i = 0; i < event.entityPlayer.inventory.getSizeInventory(); i++) {
if(i == event.entityPlayer.inventory.currentItem)
continue; // prevent item deletion
ItemStack invStack = event.entityPlayer.inventory.getStackInSlot(i);
if(invStack != null && invStack.getItem() == this) {
ItemStack[] bagInv = loadStacks(invStack);
ItemStack stackAt = bagInv[color];
boolean didChange = false;
if(stackAt == null) {
bagInv[color] = stack.copy();
stack.stackSize = 0;
didChange = true;
} else {
int stackAtSize = stackAt.stackSize;
int stackSize = stack.stackSize;
int spare = 64 - stackAtSize;
int pass = Math.min(spare, stackSize);
if(pass > 0) {
stackAt.stackSize += pass;
stack.stackSize -= pass;
didChange = true;
}
}
if(didChange)
setStacks(invStack, bagInv);
}
if(stack.stackSize == 0)
return;
}
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -148,4 +105,49 @@ public abstract class ItemBagBase extends ItemMod {
protected abstract Block getValidPickUp();
protected abstract int getGuiID();
public class EventHandler{
@SubscribeEvent
public void onPickupItem(EntityItemPickupEvent event) {
ItemStack stack = event.item.getEntityItem();
if(stack.getItem() == Item.getItemFromBlock(getValidPickUp()) && stack.stackSize > 0) {
int color = stack.getItemDamage();
if(color > 15)
return;
for(int i = 0; i < event.entityPlayer.inventory.getSizeInventory(); i++) {
if(i == event.entityPlayer.inventory.currentItem)
continue; // prevent item deletion
ItemStack invStack = event.entityPlayer.inventory.getStackInSlot(i);
if(invStack != null && invStack.getItem() == ItemBagBase.this) {
ItemStack[] bagInv = loadStacks(invStack);
ItemStack stackAt = bagInv[color];
boolean didChange = false;
if(stackAt == null) {
bagInv[color] = stack.copy();
stack.stackSize = 0;
didChange = true;
} else {
int stackAtSize = stackAt.stackSize;
int stackSize = stack.stackSize;
int spare = 64 - stackAtSize;
int pass = Math.min(spare, stackSize);
if(pass > 0) {
stackAt.stackSize += pass;
stack.stackSize -= pass;
didChange = true;
}
}
if(didChange)
setStacks(invStack, bagInv);
}
if(stack.stackSize == 0)
return;
}
}
}
}
}
@@ -50,7 +50,7 @@ public class ItemTerrasteelHelm extends ItemTerrasteelArmor implements IManaDisc
public ItemTerrasteelHelm() {
this(LibItemNames.TERRASTEEL_HELM);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
public ItemTerrasteelHelm(String name) {
@@ -130,34 +130,37 @@ public class ItemTerrasteelHelm extends ItemTerrasteelArmor implements IManaDisc
}
}
@SubscribeEvent
public void onEntityAttacked(LivingHurtEvent event) {
Entity attacker = event.source.getEntity();
if(attacker instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) attacker;
if(hasArmorSet(player)) {
boolean crit = player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(Potion.blindness) && player.ridingEntity == null;
ItemStack stack = player.inventory.armorItemInSlot(3);
if(crit && stack != null && stack.getItem() instanceof ItemTerrasteelHelm) {
boolean ahrim = hasAncientWill(stack, 0);
boolean dharok = hasAncientWill(stack, 1);
boolean guthan = hasAncientWill(stack, 2);
boolean torag = hasAncientWill(stack, 3);
boolean verac = hasAncientWill(stack, 4);
boolean karil = hasAncientWill(stack, 5);
public class EventHandler {
if(ahrim)
event.entityLiving.addPotionEffect(new PotionEffect(Potion.weakness.id, 20, 1));
if(dharok)
event.ammount *= 1F + (1F - player.getHealth() / player.getMaxHealth()) * 0.5F;
if(guthan)
player.heal(event.ammount * 0.25F);
if(torag)
event.entityLiving.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 60, 1));
if(verac)
event.source.setDamageBypassesArmor();
if(karil)
event.entityLiving.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 1));
@SubscribeEvent
public void onEntityAttacked(LivingHurtEvent event) {
Entity attacker = event.source.getEntity();
if (attacker instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) attacker;
if (hasArmorSet(player)) {
boolean crit = player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(Potion.blindness) && player.ridingEntity == null;
ItemStack stack = player.inventory.armorItemInSlot(3);
if (crit && stack != null && stack.getItem() instanceof ItemTerrasteelHelm) {
boolean ahrim = hasAncientWill(stack, 0);
boolean dharok = hasAncientWill(stack, 1);
boolean guthan = hasAncientWill(stack, 2);
boolean torag = hasAncientWill(stack, 3);
boolean verac = hasAncientWill(stack, 4);
boolean karil = hasAncientWill(stack, 5);
if (ahrim)
event.entityLiving.addPotionEffect(new PotionEffect(Potion.weakness.id, 20, 1));
if (dharok)
event.ammount *= 1F + (1F - player.getHealth() / player.getMaxHealth()) * 0.5F;
if (guthan)
player.heal(event.ammount * 0.25F);
if (torag)
event.entityLiving.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 60, 1));
if (verac)
event.source.setDamageBypassesArmor();
if (karil)
event.entityLiving.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 1));
}
}
}
}
@@ -46,42 +46,7 @@ public class ItemDivaCharm extends ItemBauble implements IManaUsingItem, IBauble
public ItemDivaCharm() {
super(LibItemNames.DIVA_CHARM);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onEntityDamaged(LivingHurtEvent event) {
if(event.source.getEntity() instanceof EntityPlayer && event.entityLiving instanceof EntityLiving && !event.entityLiving.worldObj.isRemote && Math.random() < 0.6F) {
EntityPlayer player = (EntityPlayer) event.source.getEntity();
ItemStack amulet = PlayerHandler.getPlayerBaubles(player).getStackInSlot(0);
if(amulet != null && amulet.getItem() == this) {
final int cost = 250;
if(ManaItemHandler.requestManaExact(amulet, player, cost, false)) {
final int range = 20;
List<IMob> mobs = player.worldObj.getEntitiesWithinAABB(IMob.class, AxisAlignedBB.getBoundingBox(event.entity.posX - range, event.entity.posY - range, event.entity.posZ - range, event.entity.posX + range, event.entity.posY + range, event.entity.posZ + range));
if(mobs.size() > 1) {
if(SubTileHeiseiDream.brainwashEntity((EntityLiving) event.entityLiving, mobs)) {
if(event.entityLiving instanceof EntityCreeper)
ReflectionHelper.setPrivateValue(EntityCreeper.class, (EntityCreeper) event.entityLiving, 2, LibObfuscation.TIME_SINCE_IGNITED);
event.entityLiving.heal(event.entityLiving.getMaxHealth());
if(event.entityLiving.isDead)
event.entityLiving.isDead = false;
ManaItemHandler.requestManaExact(amulet, player, cost, true);
player.worldObj.playSoundAtEntity(player, "botania:divaCharm", 1F, 1F);
double x = event.entityLiving.posX;
double y = event.entityLiving.posY;
double z = event.entityLiving.posZ;
for(int i = 0; i < 50; i++)
Botania.proxy.sparkleFX(event.entityLiving.worldObj, x + Math.random() * event.entityLiving.width, y + Math.random() * event.entityLiving.height, z + Math.random() * event.entityLiving.width, 1F, 1F, 0.25F, 1F, 3);
}
}
}
}
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -113,4 +78,40 @@ public class ItemDivaCharm extends ItemBauble implements IManaUsingItem, IBauble
}
}
public class EventHandler {
@SubscribeEvent
public void onEntityDamaged(LivingHurtEvent event) {
if(event.source.getEntity() instanceof EntityPlayer && event.entityLiving instanceof EntityLiving && !event.entityLiving.worldObj.isRemote && Math.random() < 0.6F) {
EntityPlayer player = (EntityPlayer) event.source.getEntity();
ItemStack amulet = PlayerHandler.getPlayerBaubles(player).getStackInSlot(0);
if(amulet != null && amulet.getItem() == ItemDivaCharm.this) {
final int cost = 250;
if(ManaItemHandler.requestManaExact(amulet, player, cost, false)) {
final int range = 20;
List<IMob> mobs = player.worldObj.getEntitiesWithinAABB(IMob.class, AxisAlignedBB.getBoundingBox(event.entity.posX - range, event.entity.posY - range, event.entity.posZ - range, event.entity.posX + range, event.entity.posY + range, event.entity.posZ + range));
if(mobs.size() > 1) {
if(SubTileHeiseiDream.brainwashEntity((EntityLiving) event.entityLiving, mobs)) {
if(event.entityLiving instanceof EntityCreeper)
ReflectionHelper.setPrivateValue(EntityCreeper.class, (EntityCreeper) event.entityLiving, 2, LibObfuscation.TIME_SINCE_IGNITED);
event.entityLiving.heal(event.entityLiving.getMaxHealth());
if(event.entityLiving.isDead)
event.entityLiving.isDead = false;
ManaItemHandler.requestManaExact(amulet, player, cost, true);
player.worldObj.playSoundAtEntity(player, "botania:divaCharm", 1F, 1F);
double x = event.entityLiving.posX;
double y = event.entityLiving.posY;
double z = event.entityLiving.posZ;
for(int i = 0; i < 50; i++)
Botania.proxy.sparkleFX(event.entityLiving.worldObj, x + Math.random() * event.entityLiving.width, y + Math.random() * event.entityLiving.height, z + Math.random() * event.entityLiving.width, 1F, 1F, 0.25F, 1F, 3);
}
}
}
}
}
}
}
}
@@ -89,8 +89,9 @@ public class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaub
public ItemFlightTiara() {
super(LibItemNames.FLIGHT_TIARA);
MinecraftForge.EVENT_BUS.register(this);
FMLCommonHandler.instance().bus().register(this);
EventHandler handler = new EventHandler();
MinecraftForge.EVENT_BUS.register(handler);
FMLCommonHandler.instance().bus().register(handler);
setHasSubtypes(true);
}
@@ -218,103 +219,6 @@ public class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaub
}
}
@SubscribeEvent
public void updatePlayerFlyStatus(LivingUpdateEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
ItemStack tiara = PlayerHandler.getPlayerBaubles(player).getStackInSlot(0);
int left = ItemNBTHelper.getInt(tiara, TAG_TIME_LEFT, MAX_FLY_TIME);
if(playersWithFlight.contains(playerStr(player))) {
if(shouldPlayerHaveFlight(player)) {
player.capabilities.allowFlying = true;
if(player.capabilities.isFlying) {
if(!player.worldObj.isRemote)
ManaItemHandler.requestManaExact(tiara, player, getCost(tiara, left), true);
else if(Math.abs(player.motionX) > 0.1 || Math.abs(player.motionZ) > 0.1) {
double x = event.entityLiving.posX - 0.5;
double y = event.entityLiving.posY - 1.7;
double z = event.entityLiving.posZ - 0.5;
player.getGameProfile().getName();
float r = 1F;
float g = 1F;
float b = 1F;
switch(tiara.getItemDamage()) {
case 2 : {
r = 0.1F;
g = 0.1F;
b = 0.1F;
break;
}
case 3 : {
r = 0F;
g = 0.6F;
break;
}
case 4 : {
g = 0.3F;
b = 0.3F;
break;
}
case 5 : {
r = 0.6F;
g = 0F;
b = 0.6F;
break;
}
case 6 : {
r = 0.4F;
g = 0F;
b = 0F;
break;
}
case 7 : {
r = 0.2F;
g = 0.6F;
b = 0.2F;
break;
}
case 8 : {
r = 0.85F;
g = 0.85F;
b = 0F;
break;
}
case 9 : {
r = 0F;
b = 0F;
break;
}
}
for(int i = 0; i < 2; i++)
Botania.proxy.sparkleFX(event.entityLiving.worldObj, x + Math.random() * event.entityLiving.width, y + Math.random() * 0.4, z + Math.random() * event.entityLiving.width, r, g, b, 2F * (float) Math.random(), 20);
}
}
} else {
if(!player.capabilities.isCreativeMode) {
player.capabilities.allowFlying = false;
player.capabilities.isFlying = false;
player.capabilities.disableDamage = false;
}
playersWithFlight.remove(playerStr(player));
}
} else if(shouldPlayerHaveFlight(player)) {
playersWithFlight.add(playerStr(player));
player.capabilities.allowFlying = true;
}
}
}
@SubscribeEvent
public void playerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) {
String username = event.player.getGameProfile().getName();
playersWithFlight.remove(username + ":false");
playersWithFlight.remove(username + ":true");
}
public static String playerStr(EntityPlayer player) {
return player.getGameProfile().getName() + ":" + player.worldObj.isRemote;
}
@@ -549,4 +453,104 @@ public class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaub
return stack.getItemDamage() == 1 ? ModAchievements.tiaraWings : null;
}
public class EventHandler{
@SubscribeEvent
public void updatePlayerFlyStatus(LivingUpdateEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
ItemStack tiara = PlayerHandler.getPlayerBaubles(player).getStackInSlot(0);
int left = ItemNBTHelper.getInt(tiara, TAG_TIME_LEFT, MAX_FLY_TIME);
if(playersWithFlight.contains(playerStr(player))) {
if(shouldPlayerHaveFlight(player)) {
player.capabilities.allowFlying = true;
if(player.capabilities.isFlying) {
if(!player.worldObj.isRemote)
ManaItemHandler.requestManaExact(tiara, player, getCost(tiara, left), true);
else if(Math.abs(player.motionX) > 0.1 || Math.abs(player.motionZ) > 0.1) {
double x = event.entityLiving.posX - 0.5;
double y = event.entityLiving.posY - 1.7;
double z = event.entityLiving.posZ - 0.5;
player.getGameProfile().getName();
float r = 1F;
float g = 1F;
float b = 1F;
switch(tiara.getItemDamage()) {
case 2 : {
r = 0.1F;
g = 0.1F;
b = 0.1F;
break;
}
case 3 : {
r = 0F;
g = 0.6F;
break;
}
case 4 : {
g = 0.3F;
b = 0.3F;
break;
}
case 5 : {
r = 0.6F;
g = 0F;
b = 0.6F;
break;
}
case 6 : {
r = 0.4F;
g = 0F;
b = 0F;
break;
}
case 7 : {
r = 0.2F;
g = 0.6F;
b = 0.2F;
break;
}
case 8 : {
r = 0.85F;
g = 0.85F;
b = 0F;
break;
}
case 9 : {
r = 0F;
b = 0F;
break;
}
}
for(int i = 0; i < 2; i++)
Botania.proxy.sparkleFX(event.entityLiving.worldObj, x + Math.random() * event.entityLiving.width, y + Math.random() * 0.4, z + Math.random() * event.entityLiving.width, r, g, b, 2F * (float) Math.random(), 20);
}
}
} else {
if(!player.capabilities.isCreativeMode) {
player.capabilities.allowFlying = false;
player.capabilities.isFlying = false;
player.capabilities.disableDamage = false;
}
playersWithFlight.remove(playerStr(player));
}
} else if(shouldPlayerHaveFlight(player)) {
playersWithFlight.add(playerStr(player));
player.capabilities.allowFlying = true;
}
}
}
@SubscribeEvent
public void playerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) {
String username = event.player.getGameProfile().getName();
playersWithFlight.remove(username + ":false");
playersWithFlight.remove(username + ":true");
}
}
}
@@ -38,24 +38,7 @@ public class ItemGoldenLaurel extends ItemBauble implements IBaubleRender {
public ItemGoldenLaurel() {
super(LibItemNames.GOLDEN_LAUREL);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onPlayerDeath(LivingDeathEvent event) {
if(event.entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entity;
ItemStack amulet = PlayerHandler.getPlayerBaubles(player).getStackInSlot(0);
if(amulet != null && amulet.getItem() == this) {
event.setCanceled(true);
player.setHealth(player.getMaxHealth());
player.addPotionEffect(new PotionEffect(Potion.resistance.id, 300, 6));
player.addChatMessage(new ChatComponentTranslation("botaniamisc.savedByLaurel"));
player.worldObj.playSoundAtEntity(player, "botania:goldenLaurel", 1F, 0.3F);
PlayerHandler.getPlayerBaubles(player).setInventorySlotContents(0, null);
}
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -85,4 +68,23 @@ public class ItemGoldenLaurel extends ItemBauble implements IBaubleRender {
ItemRenderer.renderItemIn2D(Tessellator.instance, f1, f2, f, f3, itemIcon.getIconWidth(), itemIcon.getIconHeight(), 1F / 32F);
}
}
public class EventHandler{
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onPlayerDeath(LivingDeathEvent event) {
if(event.entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entity;
ItemStack amulet = PlayerHandler.getPlayerBaubles(player).getStackInSlot(0);
if(amulet != null && amulet.getItem() == ItemGoldenLaurel.this) {
event.setCanceled(true);
player.setHealth(player.getMaxHealth());
player.addPotionEffect(new PotionEffect(Potion.resistance.id, 300, 6));
player.addChatMessage(new ChatComponentTranslation("botaniamisc.savedByLaurel"));
player.worldObj.playSoundAtEntity(player, "botania:goldenLaurel", 1F, 0.3F);
PlayerHandler.getPlayerBaubles(player).setInventorySlotContents(0, null);
}
}
}
}
}
@@ -45,32 +45,13 @@ public class ItemHolyCloak extends ItemBauble implements IBaubleRender {
public ItemHolyCloak() {
this(LibItemNames.HOLY_CLOAK);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
public ItemHolyCloak(String name) {
super(name);
}
@SubscribeEvent
public void onPlayerDamage(LivingHurtEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
InventoryBaubles baubles = PlayerHandler.getPlayerBaubles(player);
ItemStack belt = baubles.getStackInSlot(3);
if(belt != null && belt.getItem() instanceof ItemHolyCloak && !isInEffect(belt)) {
ItemHolyCloak cloak = (ItemHolyCloak) belt.getItem();
int cooldown = getCooldown(belt);
// Used to prevent StackOverflows with mobs that deal damage when damaged
setInEffect(belt, true);
if(cooldown == 0 && cloak.effectOnDamage(event, player, belt))
setCooldown(belt, cloak.getCooldownTime(belt));
setInEffect(belt, false);
}
}
}
@Override
public void onWornTick(ItemStack stack, EntityLivingBase player) {
int cooldown = getCooldown(stack);
@@ -143,5 +124,26 @@ public class ItemHolyCloak extends ItemBauble implements IBaubleRender {
}
}
public static class EventHandler{
@SubscribeEvent
public void onPlayerDamage(LivingHurtEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
InventoryBaubles baubles = PlayerHandler.getPlayerBaubles(player);
ItemStack belt = baubles.getStackInSlot(3);
if(belt != null && belt.getItem() instanceof ItemHolyCloak && !isInEffect(belt)) {
ItemHolyCloak cloak = (ItemHolyCloak) belt.getItem();
int cooldown = getCooldown(belt);
// Used to prevent StackOverflows with mobs that deal damage when damaged
setInEffect(belt, true);
if(cooldown == 0 && cloak.effectOnDamage(event, player, belt))
setCooldown(belt, cloak.getCooldownTime(belt));
setInEffect(belt, false);
}
}
}
}
}
@@ -54,7 +54,7 @@ public class ItemMagnetRing extends ItemBauble {
public ItemMagnetRing() {
this(LibItemNames.MAGNET_RING, 6);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
public ItemMagnetRing(String name, int range) {
@@ -75,18 +75,6 @@ public class ItemMagnetRing extends ItemBauble {
return getCooldown(stack) <= 0 ? itemIcon : iconOff;
}
@SubscribeEvent
public void onTossItem(ItemTossEvent event) {
InventoryBaubles inv = PlayerHandler.getPlayerBaubles(event.player);
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack stack = inv.getStackInSlot(i);
if(stack != null && stack.getItem() instanceof ItemMagnetRing) {
setCooldown(stack, 100);
BotaniaAPI.internalHandler.sendBaubleUpdatePacket(event.player, i);
}
}
}
@Override
public void onWornTick(ItemStack stack, EntityLivingBase player) {
super.onWornTick(stack, player);
@@ -166,5 +154,17 @@ public class ItemMagnetRing extends ItemBauble {
return BaubleType.RING;
}
public static class EventHandler{
@SubscribeEvent
public void onTossItem(ItemTossEvent event) {
InventoryBaubles inv = PlayerHandler.getPlayerBaubles(event.player);
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack stack = inv.getStackInSlot(i);
if(stack != null && stack.getItem() instanceof ItemMagnetRing) {
setCooldown(stack, 100);
BotaniaAPI.internalHandler.sendBaubleUpdatePacket(event.player, i);
}
}
}
}
}
@@ -55,7 +55,7 @@ public class ItemTravelBelt extends ItemBauble implements IBaubleRender, IManaUs
public ItemTravelBelt() {
this(LibItemNames.TRAVEL_BELT, 0.035F, 0.2F, 2F);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
public ItemTravelBelt(String name, float speed, float jump, float fallBuffer) {
@@ -70,41 +70,6 @@ public class ItemTravelBelt extends ItemBauble implements IBaubleRender, IManaUs
return BaubleType.BELT;
}
@SubscribeEvent
public void updatePlayerStepStatus(LivingUpdateEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
String s = playerStr(player);
ItemStack belt = PlayerHandler.getPlayerBaubles(player).getStackInSlot(3);
if(playersWithStepup.contains(s)) {
if(shouldPlayerHaveStepup(player)) {
ItemTravelBelt beltItem = (ItemTravelBelt) belt.getItem();
if((player.onGround || player.capabilities.isFlying) && player.moveForward > 0F && !player.isInsideOfMaterial(Material.water)) {
float speed = beltItem.getSpeed(belt);
player.moveFlying(0F, 1F, player.capabilities.isFlying ? speed : speed);
beltItem.onMovedTick(belt, player);
if(player.ticksExisted % COST_INTERVAL == 0)
ManaItemHandler.requestManaExact(belt, player, COST, true);
} else beltItem.onNotMovingTick(belt, player);
if(player.isSneaking())
player.stepHeight = 0.50001F; // Not 0.5F because that is the default
else player.stepHeight = 1F;
} else {
player.stepHeight = 0.5F;
playersWithStepup.remove(s);
}
} else if(shouldPlayerHaveStepup(player)) {
playersWithStepup.add(s);
player.stepHeight = 1F;
}
}
}
public float getSpeed(ItemStack stack) {
return speed;
}
@@ -117,31 +82,11 @@ public class ItemTravelBelt extends ItemBauble implements IBaubleRender, IManaUs
// NO-OP
}
@SubscribeEvent
public void onPlayerJump(LivingJumpEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
ItemStack belt = PlayerHandler.getPlayerBaubles(player).getStackInSlot(3);
if(belt != null && belt.getItem() instanceof ItemTravelBelt && ManaItemHandler.requestManaExact(belt, player, COST, false)) {
player.motionY += ((ItemTravelBelt) belt.getItem()).jump;
player.fallDistance = -((ItemTravelBelt) belt.getItem()).fallBuffer;
}
}
}
private boolean shouldPlayerHaveStepup(EntityPlayer player) {
ItemStack armor = PlayerHandler.getPlayerBaubles(player).getStackInSlot(3);
return armor != null && armor.getItem() instanceof ItemTravelBelt && ManaItemHandler.requestManaExact(armor, player, COST, false);
}
@SubscribeEvent
public void playerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) {
String username = event.player.getGameProfile().getName();
playersWithStepup.remove(username + ":false");
playersWithStepup.remove(username + ":true");
}
public static String playerStr(EntityPlayer player) {
return player.getGameProfile().getName() + ":" + player.worldObj.isRemote;
}
@@ -173,4 +118,60 @@ public class ItemTravelBelt extends ItemBauble implements IBaubleRender, IManaUs
return true;
}
public class EventHandler{
@SubscribeEvent
public void updatePlayerStepStatus(LivingUpdateEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
String s = playerStr(player);
ItemStack belt = PlayerHandler.getPlayerBaubles(player).getStackInSlot(3);
if(playersWithStepup.contains(s)) {
if(shouldPlayerHaveStepup(player)) {
ItemTravelBelt beltItem = (ItemTravelBelt) belt.getItem();
if((player.onGround || player.capabilities.isFlying) && player.moveForward > 0F && !player.isInsideOfMaterial(Material.water)) {
float speed = beltItem.getSpeed(belt);
player.moveFlying(0F, 1F, player.capabilities.isFlying ? speed : speed);
beltItem.onMovedTick(belt, player);
if(player.ticksExisted % COST_INTERVAL == 0)
ManaItemHandler.requestManaExact(belt, player, COST, true);
} else beltItem.onNotMovingTick(belt, player);
if(player.isSneaking())
player.stepHeight = 0.50001F; // Not 0.5F because that is the default
else player.stepHeight = 1F;
} else {
player.stepHeight = 0.5F;
playersWithStepup.remove(s);
}
} else if(shouldPlayerHaveStepup(player)) {
playersWithStepup.add(s);
player.stepHeight = 1F;
}
}
}
@SubscribeEvent
public void onPlayerJump(LivingJumpEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
ItemStack belt = PlayerHandler.getPlayerBaubles(player).getStackInSlot(3);
if(belt != null && belt.getItem() instanceof ItemTravelBelt && ManaItemHandler.requestManaExact(belt, player, COST, false)) {
player.motionY += ((ItemTravelBelt) belt.getItem()).jump;
player.fallDistance = -((ItemTravelBelt) belt.getItem()).fallBuffer;
}
}
}
@SubscribeEvent
public void playerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) {
String username = event.player.getGameProfile().getName();
playersWithStepup.remove(username + ":false");
playersWithStepup.remove(username + ":true");
}
}
}
@@ -28,13 +28,7 @@ public class ItemGlassPick extends ItemManasteelPick {
public ItemGlassPick() {
super(MATERIAL, LibItemNames.GLASS_PICK);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onBlockDrops(HarvestDropsEvent event) {
if(event.harvester != null && event.block != null && event.drops.isEmpty() && event.harvester.getCurrentEquippedItem() != null && event.harvester.getCurrentEquippedItem().getItem() == this && event.block.getMaterial() == Material.glass && event.block.canSilkHarvest(event.world, event.harvester, event.x, event.y, event.z, event.blockMetadata))
event.drops.add(new ItemStack(event.block, 1, event.blockMetadata));
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -52,4 +46,14 @@ public class ItemGlassPick extends ItemManasteelPick {
return 0;
}
public class EventHandler{
@SubscribeEvent
public void onBlockDrops(HarvestDropsEvent event) {
if (event.harvester != null && event.block != null && event.drops.isEmpty() && event.harvester.getCurrentEquippedItem() != null
&& event.harvester.getCurrentEquippedItem().getItem() == ItemGlassPick.this && event.block.getMaterial() == Material.glass
&& event.block.canSilkHarvest(event.world, event.harvester, event.x, event.y, event.z, event.blockMetadata)) {
event.drops.add(new ItemStack(event.block, 1, event.blockMetadata));
}
}
}
}
@@ -26,40 +26,41 @@ public class ItemElementiumAxe extends ItemManasteelAxe {
public ItemElementiumAxe() {
super(BotaniaAPI.elementiumToolMaterial, LibItemNames.ELEMENTIUM_AXE);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
// Thanks to SpitefulFox for the drop rates
// https://github.com/SpitefulFox/ForbiddenMagic/blob/master/src/com/spiteful/forbidden/FMEventHandler.java
@SubscribeEvent
public void onEntityDrops(LivingDropsEvent event) {
if(event.recentlyHit && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) {
ItemStack weapon = ((EntityPlayer) event.source.getEntity()).getCurrentEquippedItem();
if(weapon != null && weapon.getItem() == this) {
Random rand = event.entity.worldObj.rand;
int looting = EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, weapon);
if(event.entityLiving instanceof EntitySkeleton && rand.nextInt(26) <= 3 + looting)
addDrop(event, new ItemStack(Items.skull, 1, ((EntitySkeleton)event.entityLiving).getSkeletonType()));
else if(event.entityLiving instanceof EntityZombie && !(event.entityLiving instanceof EntityPigZombie) && rand.nextInt(26) <= 2 + 2 * looting)
addDrop(event, new ItemStack(Items.skull, 1, 2));
else if(event.entityLiving instanceof EntityCreeper && rand.nextInt(26) <= 2 + 2 * looting)
addDrop(event, new ItemStack(Items.skull, 1, 4));
else if(event.entityLiving instanceof EntityPlayer && rand.nextInt(11) <= 1 + looting) {
ItemStack stack = new ItemStack(Items.skull, 1, 3);
ItemNBTHelper.setString(stack, "SkullOwner", ((EntityPlayer)event.entityLiving).getCommandSenderName());
addDrop(event, stack);
} else if(event.entityLiving instanceof EntityDoppleganger && rand.nextInt(13) < 1 + looting)
addDrop(event, new ItemStack(ModItems.gaiaHead));
}
}
}
private void addDrop(LivingDropsEvent event, ItemStack drop) {
EntityItem entityitem = new EntityItem(event.entityLiving.worldObj, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, drop);
entityitem.delayBeforeCanPickup = 10;
event.drops.add(entityitem);
}
public class EventHandler{
@SubscribeEvent
public void onEntityDrops(LivingDropsEvent event) {
if(event.recentlyHit && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) {
ItemStack weapon = ((EntityPlayer) event.source.getEntity()).getCurrentEquippedItem();
if(weapon != null && weapon.getItem() == ItemElementiumAxe.this) {
Random rand = event.entity.worldObj.rand;
int looting = EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, weapon);
if(event.entityLiving instanceof EntitySkeleton && rand.nextInt(26) <= 3 + looting)
addDrop(event, new ItemStack(Items.skull, 1, ((EntitySkeleton)event.entityLiving).getSkeletonType()));
else if(event.entityLiving instanceof EntityZombie && !(event.entityLiving instanceof EntityPigZombie) && rand.nextInt(26) <= 2 + 2 * looting)
addDrop(event, new ItemStack(Items.skull, 1, 2));
else if(event.entityLiving instanceof EntityCreeper && rand.nextInt(26) <= 2 + 2 * looting)
addDrop(event, new ItemStack(Items.skull, 1, 4));
else if(event.entityLiving instanceof EntityPlayer && rand.nextInt(11) <= 1 + looting) {
ItemStack stack = new ItemStack(Items.skull, 1, 3);
ItemNBTHelper.setString(stack, "SkullOwner", ((EntityPlayer)event.entityLiving).getCommandSenderName());
addDrop(event, stack);
} else if(event.entityLiving instanceof EntityDoppleganger && rand.nextInt(13) < 1 + looting)
addDrop(event, new ItemStack(ModItems.gaiaHead));
}
}
}
}
}
@@ -16,27 +16,9 @@ public class ItemElementiumPick extends ItemManasteelPick {
public ItemElementiumPick() {
super(BotaniaAPI.elementiumToolMaterial, LibItemNames.ELEMENTIUM_PICK);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@SubscribeEvent
public void onHarvestDrops(HarvestDropsEvent event) {
if(event.harvester != null) {
ItemStack stack = event.harvester.getCurrentEquippedItem();
if(stack != null && (stack.getItem() == this || stack.getItem() == ModItems.terraPick && ItemTerraPick.isTipped(stack))) {
for(int i = 0; i < event.drops.size(); i++) {
ItemStack drop = event.drops.get(i);
if(drop != null) {
Block block = Block.getBlockFromItem(drop.getItem());
if(block != null){
if(isDisposable(block) || (isSemiDisposable(block) && !event.harvester.isSneaking()))
event.drops.remove(i);
}
}
}
}
}
}
public static boolean isDisposable(Block block) {
for(int id : OreDictionary.getOreIDs(new ItemStack(block))) {
@@ -55,4 +37,25 @@ public class ItemElementiumPick extends ItemManasteelPick {
}
return false;
}
public class EventHandler{
@SubscribeEvent
public void onHarvestDrops(HarvestDropsEvent event) {
if(event.harvester != null) {
ItemStack stack = event.harvester.getCurrentEquippedItem();
if(stack != null && (stack.getItem() == ItemElementiumPick.this || stack.getItem() == ModItems.terraPick && ItemTerraPick.isTipped(stack))) {
for(int i = 0; i < event.drops.size(); i++) {
ItemStack drop = event.drops.get(i);
if(drop != null) {
Block block = Block.getBlockFromItem(drop.getItem());
if(block != null){
if(isDisposable(block) || (isSemiDisposable(block) && !event.harvester.isSneaking()))
event.drops.remove(i);
}
}
}
}
}
}
}
}
@@ -80,7 +80,7 @@ public class ItemTerraAxe extends ItemManasteelAxe implements ISequentialBreaker
public ItemTerraAxe() {
super(BotaniaAPI.terrasteelToolMaterial, LibItemNames.TERRA_AXE);
FMLCommonHandler.instance().bus().register(this);
FMLCommonHandler.instance().bus().register(new EventHandler());
}
@Override
@@ -133,31 +133,6 @@ public class ItemTerraAxe extends ItemManasteelAxe implements ISequentialBreaker
return false;
}
@SubscribeEvent
public void onTickEnd(TickEvent.WorldTickEvent event) {
// Block Swapping ticking should only occur on the server
if(event.world.isRemote)
return;
if(event.phase == Phase.END) {
int dim = event.world.provider.dimensionId;
if(blockSwappers.containsKey(dim)) {
Set<BlockSwapper> swappers = blockSwappers.get(dim);
// Iterate through all of our swappers, removing any
// which no longer need to tick.
Iterator<BlockSwapper> swapper = swappers.iterator();
while(swapper.hasNext()) {
BlockSwapper next = swapper.next();
// If a null sneaks in or the swapper is done, remove it
if(next == null || !next.tick())
swapper.remove();
}
}
}
}
/**
* Adds a new block swapper to the provided world as the provided player.
* Block swappers are only added on the server, and a marker instance
@@ -411,4 +386,25 @@ public class ItemTerraAxe extends ItemManasteelAxe implements ISequentialBreaker
}
}
public static class EventHandler{
@SubscribeEvent
public void onTickEnd(TickEvent.WorldTickEvent event) {
// Block Swapping ticking should only occur on the server
if(event.world.isRemote)
return;
if(event.phase == Phase.END) {
int dim = event.world.provider.dimensionId;
if(blockSwappers.containsKey(dim)) {
Set<BlockSwapper> swappers = blockSwappers.get(dim);
// Iterate through all of our swappers, removing any
// which no longer need to tick.
// If a null sneaks in or the swapper is done, remove it
swappers.removeIf(next -> next == null || !next.tick());
}
}
}
}
}
@@ -59,35 +59,7 @@ public class ItemManaResource extends ItemMod implements IFlowerComponent, IElve
super();
setUnlocalizedName(LibItemNames.MANA_RESOURCE);
setHasSubtypes(true);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onPlayerInteract(PlayerInteractEvent event) {
boolean rightEvent = event.action == Action.RIGHT_CLICK_AIR;
ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
boolean correctStack = stack != null && stack.getItem() == Items.glass_bottle;
boolean ender = event.world.provider.dimensionId == 1;
if(rightEvent && correctStack && ender) {
MovingObjectPosition pos = ToolCommons.raytraceFromEntity(event.world, event.entityPlayer, false, 5F);
if(pos == null) {
ItemStack stack1 = new ItemStack(this, 1, 15);
event.entityPlayer.addStat(ModAchievements.enderAirMake, 1);
if(!event.entityPlayer.inventory.addItemStackToInventory(stack1))
event.entityPlayer.dropPlayerItemWithRandomChoice(stack1, true);
stack.stackSize--;
if(stack.stackSize == 0)
event.entityPlayer.inventory.setInventorySlotContents(event.entityPlayer.inventory.currentItem, null);
if(event.world.isRemote)
event.entityPlayer.swingItem();
else event.world.playSoundAtEntity(event.entityPlayer, "random.pop", 0.5F, 1F);
}
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -188,4 +160,34 @@ public class ItemManaResource extends ItemMod implements IFlowerComponent, IElve
return stack.getItemDamage() == 4 ? ModAchievements.terrasteelPickup : null;
}
public class EventHandler {
@SubscribeEvent
public void onPlayerInteract(PlayerInteractEvent event) {
boolean rightEvent = event.action == Action.RIGHT_CLICK_AIR;
ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
boolean correctStack = stack != null && stack.getItem() == Items.glass_bottle;
boolean ender = event.world.provider.dimensionId == 1;
if(rightEvent && correctStack && ender) {
MovingObjectPosition pos = ToolCommons.raytraceFromEntity(event.world, event.entityPlayer, false, 5F);
if(pos == null) {
ItemStack stack1 = new ItemStack(ItemManaResource.this, 1, 15);
event.entityPlayer.addStat(ModAchievements.enderAirMake, 1);
if(!event.entityPlayer.inventory.addItemStackToInventory(stack1))
event.entityPlayer.dropPlayerItemWithRandomChoice(stack1, true);
stack.stackSize--;
if(stack.stackSize == 0)
event.entityPlayer.inventory.setInventorySlotContents(event.entityPlayer.inventory.currentItem, null);
if(event.world.isRemote)
event.entityPlayer.swingItem();
else event.world.playSoundAtEntity(event.entityPlayer, "random.pop", 0.5F, 1F);
}
}
}
}
}
@@ -49,30 +49,7 @@ public class ItemAesirRing extends ItemRelicBauble implements IExtendedWireframe
super(LibItemNames.AESIR_RING);
GameRegistry.addRecipe(new AesirRingRecipe());
RecipeSorter.register("botania:aesirRing", AesirRingRecipe.class, Category.SHAPELESS, "");
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onDropped(ItemTossEvent event) {
if(event.entityItem != null && event.entityItem.getEntityItem() != null && !event.entityItem.worldObj.isRemote) {
ItemStack stack = event.entityItem.getEntityItem();
if(stack.getItem() != null && stack.getItem() == this) {
event.entityItem.setDead();
String user = getSoulbindUsername(stack);
for(Item item : new Item[] { ModItems.thorRing, ModItems.lokiRing, ModItems.odinRing }) {
ItemStack stack1 = new ItemStack(item);
bindToUsername(user, stack1);
EntityItem entity = new EntityItem(event.entityItem.worldObj, event.entityItem.posX, event.entityItem.posY, event.entityItem.posZ, stack1);
entity.motionX = event.entityItem.motionX;
entity.motionY = event.entityItem.motionY;
entity.motionZ = event.entityItem.motionZ;
entity.age = event.entityItem.age;
entity.delayBeforeCanPickup = event.entityItem.delayBeforeCanPickup;
entity.worldObj.spawnEntityInWorld(entity);
}
}
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -119,4 +96,28 @@ public class ItemAesirRing extends ItemRelicBauble implements IExtendedWireframe
return ModAchievements.relicAesirRing;
}
public class EventHandler {
@SubscribeEvent
public void onDropped(ItemTossEvent event) {
if(event.entityItem != null && event.entityItem.getEntityItem() != null && !event.entityItem.worldObj.isRemote) {
ItemStack stack = event.entityItem.getEntityItem();
if(stack.getItem() != null && stack.getItem() == ItemAesirRing.this) {
event.entityItem.setDead();
String user = getSoulbindUsername(stack);
for(Item item : new Item[] { ModItems.thorRing, ModItems.lokiRing, ModItems.odinRing }) {
ItemStack stack1 = new ItemStack(item);
bindToUsername(user, stack1);
EntityItem entity = new EntityItem(event.entityItem.worldObj, event.entityItem.posX, event.entityItem.posY, event.entityItem.posZ, stack1);
entity.motionX = event.entityItem.motionX;
entity.motionY = event.entityItem.motionY;
entity.motionZ = event.entityItem.motionZ;
entity.age = event.entityItem.age;
entity.delayBeforeCanPickup = event.entityItem.delayBeforeCanPickup;
entity.worldObj.spawnEntityInWorld(entity);
}
}
}
}
}
}
@@ -125,315 +125,4 @@ public class ItemFlugelEye extends ItemRelic implements ICoordBoundItem, IManaUs
public boolean usesMana(ItemStack stack) {
return true;
}
/*
// Code from the older iteration of this item:
private static final ResourceLocation glowTexture = new ResourceLocation(LibResources.MISC_GLOW_CYAN);
private static final int SEGMENTS = 12;
private static final MultiversePosition FALLBACK_POSITION = new MultiversePosition(0, -1, 0, 0);
private static final String TAG_EQUIPPED = "equipped";
private static final String TAG_ROTATION_BASE = "rotationBase";
private static final String TAG_WARP_PREFIX = "warp";
private static final String TAG_POS_X = "posX";
private static final String TAG_POS_Y = "posY";
private static final String TAG_POS_Z = "posZ";
private static final String TAG_DIMENSION = "dim";
private static final String TAG_FIRST_TICK = "firstTick";
IIcon[] signs;
public ItemFlugelEye() {
super(LibItemNames.FLUGEL_EYE);
MinecraftForge.EVENT_BUS.register(this);
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
super.registerIcons(par1IconRegister);
signs = new IIcon[12];
for(int i = 0; i < 12; i++)
signs[i] = IconHelper.forName(par1IconRegister, "sign" + i);
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if(isRightPlayer(player, stack)) {
int segment = getSegmentLookedAt(stack, player);
MultiversePosition pos = getWarpPoint(stack, segment);
if(pos.isValid()) {
if(pos.dim == world.provider.dimensionId && player instanceof EntityPlayerMP) {
((EntityPlayerMP) player).playerNetServerHandler.setPlayerLocation(pos.x, pos.y, pos.z, player.rotationYaw, player.rotationPitch);
world.playSoundAtEntity(player, "mob.endermen.portal", 1F, 1F);
}
} else setWarpPoint(stack, segment, player.posX, player.posY, player.posZ, world.provider.dimensionId);
}
return stack;
}
@Override
public boolean onEntitySwing(EntityLivingBase player, ItemStack stack) {
if(player.isSneaking() && player instanceof EntityPlayer && isRightPlayer((EntityPlayer) player, stack)) {
int segment = getSegmentLookedAt(stack, player);
MultiversePosition pos = getWarpPoint(stack, segment);
if(pos.isValid()) {
setWarpPoint(stack, segment, 0, -1, 0, 0);
return true;
}
}
return false;
}
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int pos, boolean equipped) {
super.onUpdate(stack, world, entity, pos, equipped);
boolean eqLastTick = wasEquipped(stack);
boolean firstTick = isFirstTick(stack);
if(eqLastTick != equipped)
setEquipped(stack, equipped);
if((!equipped || firstTick) && entity instanceof EntityLivingBase) {
int angles = 360;
int segAngles = angles / SEGMENTS;
float shift = segAngles / 2;
setRotationBase(stack, getCheckingAngle((EntityLivingBase) entity) - shift);
if(firstTick)
tickFirst(stack);
}
}
private static int getSegmentLookedAt(ItemStack stack, EntityLivingBase player) {
float yaw = getCheckingAngle(player, getRotationBase(stack));
int angles = 360;
int segAngles = angles / SEGMENTS;
for(int seg = 0; seg < SEGMENTS; seg++) {
float calcAngle = (float) seg * segAngles;
if(yaw >= calcAngle && yaw < calcAngle + segAngles)
return seg;
}
return 0;
}
private static float getCheckingAngle(EntityLivingBase player) {
return getCheckingAngle(player, 0F);
}
// Screw the way minecraft handles rotation
// Really...
private static float getCheckingAngle(EntityLivingBase player, float base) {
float yaw = MathHelper.wrapAngleTo180_float(player.rotationYaw) + 90F;
int angles = 360;
int segAngles = angles / SEGMENTS;
float shift = segAngles / 2;
if(yaw < 0)
yaw = 180F + (180F + yaw);
yaw -= 360F - base;
float angle = 360F - yaw + shift;
if(angle < 0)
angle = 360F + angle;
return angle;
}
public static boolean isFirstTick(ItemStack stack) {
return ItemNBTHelper.getBoolean(stack, TAG_FIRST_TICK, true);
}
public static void tickFirst(ItemStack stack) {
ItemNBTHelper.setBoolean(stack, TAG_FIRST_TICK, false);
}
public static boolean wasEquipped(ItemStack stack) {
return ItemNBTHelper.getBoolean(stack, TAG_EQUIPPED, false);
}
public static void setEquipped(ItemStack stack, boolean equipped) {
ItemNBTHelper.setBoolean(stack, TAG_EQUIPPED, equipped);
}
public static float getRotationBase(ItemStack stack) {
return ItemNBTHelper.getFloat(stack, TAG_ROTATION_BASE, 0F);
}
public static void setRotationBase(ItemStack stack, float rotation) {
ItemNBTHelper.setFloat(stack, TAG_ROTATION_BASE, rotation);
}
public static void setWarpPoint(ItemStack stack, int warp, double x, double y, double z, int dim) {
NBTTagCompound cmp = new NBTTagCompound();
cmp.setDouble(TAG_POS_X, x);
cmp.setDouble(TAG_POS_Y, y);
cmp.setDouble(TAG_POS_Z, z);
cmp.setInteger(TAG_DIMENSION, dim);
ItemNBTHelper.setCompound(stack, TAG_WARP_PREFIX + warp, cmp);
}
public static MultiversePosition getWarpPoint(ItemStack stack, int warp) {
NBTTagCompound cmp = ItemNBTHelper.getCompound(stack, TAG_WARP_PREFIX + warp, true);
if(cmp == null)
return FALLBACK_POSITION;
double x = cmp.getDouble(TAG_POS_X);
double y = cmp.getDouble(TAG_POS_Y);
double z = cmp.getDouble(TAG_POS_Z);
int dim = cmp.getInteger(TAG_DIMENSION);
return new MultiversePosition(x, y, z, dim);
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onRenderWorldLast(RenderWorldLastEvent event) {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
ItemStack stack = player.getCurrentEquippedItem();
if(stack != null && stack.getItem() == this)
render(stack, player, event.partialTicks);
}
@SideOnly(Side.CLIENT)
public void render(ItemStack stack, EntityPlayer player, float partialTicks) {
Minecraft mc = Minecraft.getMinecraft();
Tessellator tess = Tessellator.instance;
Tessellator.renderingWorldRenderer = false;
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
float alpha = ((float) Math.sin((ClientTickHandler.ticksInGame + partialTicks) * 0.2F) * 0.5F + 0.5F) * 0.4F + 0.3F;
double posX = player.prevPosX + (player.posX - player.prevPosX) * partialTicks;
double posY = player.prevPosY + (player.posY - player.prevPosY) * partialTicks;
double posZ = player.prevPosZ + (player.posZ - player.prevPosZ) * partialTicks;
GL11.glTranslated(posX - RenderManager.renderPosX, posY - RenderManager.renderPosY, posZ - RenderManager.renderPosZ);
float base = getRotationBase(stack);
int angles = 360;
int segAngles = angles / SEGMENTS;
float shift = base - segAngles / 2;
float u = 1F;
float v = 0.25F;
float s = 3F;
float m = 0.8F;
float y = v * s * 2;
float y0 = 0;
int segmentLookedAt = getSegmentLookedAt(stack, player);
for(int seg = 0; seg < SEGMENTS; seg++) {
boolean inside = false;
float rotationAngle = (seg + 0.5F) * segAngles + shift;
if(segmentLookedAt == seg)
inside = true;
GL11.glPushMatrix();
GL11.glRotatef(rotationAngle, 0F, 1F, 0F);
GL11.glTranslatef(s * m, -0.75F, 0F);
mc.renderEngine.bindTexture(TextureMap.locationItemsTexture);
GL11.glScalef(0.75F, 0.75F, 0.75F);
GL11.glTranslatef(0F, 0F, 0.5F);
IIcon icon = signs[seg];
GL11.glRotatef(90F, 0F, 1F, 0F);
GL11.glColor4f(1F, 1F, 1F, getWarpPoint(stack, seg).isValid() ? 1F : 0.2F);
float f = icon.getMinU();
float f1 = icon.getMaxU();
float f2 = icon.getMinV();
float f3 = icon.getMaxV();
ItemRenderer.renderItemIn2D(Tessellator.instance, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 1F / 16F);
GL11.glColor3f(1F, 1F, 1F);
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glRotatef(180F, 1F, 0F, 0F);
float a = alpha;
if(inside) {
a += 0.3F;
y0 = -y;
}
if(seg % 2 == 0)
GL11.glColor4f(0.6F, 0.6F, 0.6F, a);
else GL11.glColor4f(1F, 1F, 1F, a);
mc.renderEngine.bindTexture(glowTexture);
tess.startDrawingQuads();
for(int i = 0; i < segAngles; i++) {
float ang = i + seg * segAngles + shift;
double xp = Math.cos(ang * Math.PI / 180F) * s;
double zp = Math.sin(ang * Math.PI / 180F) * s;
tess.addVertexWithUV(xp * m, y, zp * m, u, v);
tess.addVertexWithUV(xp, y0, zp, u, 0);
xp = Math.cos((ang + 1) * Math.PI / 180F) * s;
zp = Math.sin((ang + 1) * Math.PI / 180F) * s;
tess.addVertexWithUV(xp, y0, zp, 0, 0);
tess.addVertexWithUV(xp * m, y, zp * m, 0, v);
}
y0 = 0;
tess.draw();
GL11.glPopMatrix();
}
GL11.glPopMatrix();
}
@SideOnly(Side.CLIENT)
public static void renderHUD(ScaledResolution resolution, EntityPlayer player, ItemStack stack) {
Minecraft.getMinecraft();
int slot = getSegmentLookedAt(stack, player);
MultiversePosition pos = getWarpPoint(stack, slot);
FontRenderer font = Minecraft.getMinecraft().fontRenderer;
String s = StatCollector.translateToLocal("botania.sign" + slot);
font.drawStringWithShadow(s, resolution.getScaledWidth() / 2 - font.getStringWidth(s) / 2, resolution.getScaledHeight() / 2 - 55, 0xFFD409);
if(pos.isValid()) {
int dist = (int) vazkii.botania.common.core.helper.MathHelper.pointDistanceSpace(pos.x, pos.y, pos.z, player.posX, player.posY - 1.6, player.posZ);
s = dist == 1 ? StatCollector.translateToLocal("botaniamisc.blockAway") : String.format(StatCollector.translateToLocal("botaniamisc.blocksAway"), dist);
font.drawStringWithShadow(s, resolution.getScaledWidth() / 2 - font.getStringWidth(s) / 2, resolution.getScaledHeight() / 2 - 40, 0x9999FF);
s = StatCollector.translateToLocal("botaniamisc.clickToTeleport");
font.drawStringWithShadow(s, resolution.getScaledWidth() / 2 - font.getStringWidth(s) / 2, resolution.getScaledHeight() / 2 - 30, 0xFFFFFF);
s = StatCollector.translateToLocal("botaniamisc.clickToRemoveWarp");
font.drawStringWithShadow(s, resolution.getScaledWidth() / 2 - font.getStringWidth(s) / 2, resolution.getScaledHeight() / 2 - 20, 0xFFFFFF);
} else {
s = StatCollector.translateToLocal("botaniamisc.unboundWarp");
font.drawStringWithShadow(s, resolution.getScaledWidth() / 2 - font.getStringWidth(s) / 2, resolution.getScaledHeight() / 2 - 40, 0xFFFFFF);
s = StatCollector.translateToLocal("botaniamisc.clickToAddWarp");
font.drawStringWithShadow(s, resolution.getScaledWidth() / 2 - font.getStringWidth(s) / 2, resolution.getScaledHeight() / 2 - 30, 0xFFFFFF);
}
}
private static class MultiversePosition {
public final double x, y, z;
public final int dim;
public MultiversePosition(double x, double y, double z, int dim) {
this.x = x;
this.y = y;
this.z = z;
this.dim = dim;
}
boolean isValid() {
return y > 0;
}
}
*/
}
@@ -81,189 +81,7 @@ public class ItemLokiRing extends ItemRelicBauble implements IExtendedWireframeC
public ItemLokiRing() {
super(LibItemNames.LOKI_RING);
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent event) {
EntityPlayer player = event.getPlayer();
int x = event.x;
int y = event.y;
int z = event.z;
int side = event.blockMetadata;
ItemStack stack = player.getCurrentEquippedItem();
if(stack == null) return;
Item item = player.getCurrentEquippedItem().getItem();
breakOnAllCursors(player, item, stack, x, y, z, side);
}
@SubscribeEvent
public void onPlayerInteract(PlayerInteractEvent event) {
if(recursion) return;
EntityPlayer player = event.entityPlayer;
ItemStack lokiRing = getLokiRing(player);
if (lokiRing == null || player.worldObj.isRemote)
return;
ItemStack heldItemStack = player.getCurrentEquippedItem();
ChunkCoordinates originCoords = getOriginPos(lokiRing);
MovingObjectPosition lookPos = ToolCommons.raytraceFromEntity(player.worldObj, player, true, 10F);
List<LokiCursor> cursors = getCursorList(lokiRing);
int cursorCount = cursors.size();
//I don`t think mana for placing should be cruel , so I just made graph with funny line
int cost = (int)(50*Math.sin(0.04* cursorCount)+cursorCount+120+20*Math.cos(0.2*cursorCount));
if (heldItemStack == null && event.action == Action.RIGHT_CLICK_BLOCK && player.isSneaking() && isRingEnabled(lokiRing)) {
if(originCoords.posY == -1 && lookPos != null) {
setOriginPos(lokiRing, lookPos.blockX, lookPos.blockY, lookPos.blockZ);
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
} else if(lookPos != null) {
if(originCoords.posX == lookPos.blockX && originCoords.posY == lookPos.blockY && originCoords.posZ == lookPos.blockZ) {
clearMasterCursor(lokiRing);
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
} else {
addCursor : {
int relX = lookPos.blockX - originCoords.posX;
int relY = lookPos.blockY - originCoords.posY;
int relZ = lookPos.blockZ - originCoords.posZ;
for(LokiCursor cursor : cursors)
if(cursor.getX() == relX && cursor.getY() == relY && cursor.getZ() == relZ) {
cursors.remove(cursor);
setCursorList(lokiRing, cursors);
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
break addCursor;
}
addCursor(lokiRing, relX, relY, relZ, getRingMirrorMode(lokiRing) );
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
}
}
}
} else if (heldItemStack != null && event.action == Action.RIGHT_CLICK_BLOCK && lookPos != null && isRingEnabled(lokiRing)) {
if(!ManaItemHandler.requestManaExact(lokiRing, player, cost, true)){
if(player instanceof EntityPlayerMP){
vazkii.botania.common.network.PacketHandler.INSTANCE.sendTo(new PacketLokiHudNotificationAck(HUD_MESSAGE.INSUFFICIENT_MANA),(EntityPlayerMP) player);
}
else
{
renderHUDNotification(HUD_MESSAGE.INSUFFICIENT_MANA);
}
return;
}
recursion = true;
double oldPosX = player.posX;
double oldPosY = player.posY;
double oldPosZ = player.posZ;
float oldPitch = player.rotationPitch;
float oldYaw = player.rotationYaw;
int masterOffsetX = originCoords.posY == -1 ? 0 :lookPos.blockX - originCoords.posX;
int masterOffsetY = originCoords.posY == -1 ? 0 :lookPos.blockY - originCoords.posY;
int masterOffsetZ = originCoords.posY == -1 ? 0 :lookPos.blockZ - originCoords.posZ;
double playerOffsetX = player.posX - originCoords.posX;
double playerOffsetY = player.posY - originCoords.posY;
double playerOffsetZ = player.posZ - originCoords.posZ;
for(LokiCursor cursor : cursors) {
int x = lookPos.blockX + cursor.getX();
int y = lookPos.blockY + cursor.getY();
int z = lookPos.blockZ + cursor.getZ();
if(cursor.isMirrorX()){
x -= 2*masterOffsetX;
}
if(cursor.isMirrorY()){
y -= 2*masterOffsetY;
}
if(cursor.isMirrorZ()){
z -= 2*masterOffsetZ;
}
if (player.worldObj.isAirBlock(x, y, z) ) {
continue;
}
player.posX = cursor.getX()+oldPosX;
player.posY = cursor.getY()+oldPosY;
player.posZ = cursor.getZ()+oldPosZ;
player.rotationYaw = oldYaw;
if(cursor.isMirrorX()){
player.posX -= 2*playerOffsetX;
player.rotationYaw = player.rotationYaw * (-1);
}
if(cursor.isMirrorY()){
player.posY -= 2*playerOffsetY;
player.rotationPitch = oldPitch * (-1);
}
if(cursor.isMirrorZ()){
player.posZ -= 2*playerOffsetZ;
player.rotationYaw = 180 - (Math.abs(player.rotationYaw));
if(oldYaw < 0){
player.rotationYaw *= -1;
}
}
float hitX = (float) (lookPos.hitVec.xCoord - lookPos.blockX);
float hitY = (float) (lookPos.hitVec.yCoord - lookPos.blockY);
float hitZ = (float) (lookPos.hitVec.zCoord - lookPos.blockZ);
if(cursor.isMirrorX()){
hitX = 1-hitX;
}
if(cursor.isMirrorY()){
hitY = 1-hitY;
}
if(cursor.isMirrorZ()){
hitZ = 1-hitZ;
}
int hitSide = lookPos.sideHit;
if(cursor.isMirrorX() && (hitSide == ForgeDirection.EAST.ordinal() || hitSide == ForgeDirection.WEST.ordinal()) ){
hitSide = hitSide ^ 1;
}
if(cursor.isMirrorY() && (hitSide == ForgeDirection.DOWN.ordinal() || hitSide == ForgeDirection.UP.ordinal()) ){
hitSide = hitSide ^ 1;
}
if(cursor.isMirrorZ() && (hitSide == ForgeDirection.NORTH.ordinal() || hitSide == ForgeDirection.SOUTH.ordinal()) ){
hitSide = hitSide ^ 1;
}
Item item = heldItemStack.getItem();
Block markedBlock = player.worldObj.getBlock(x, y, z);
boolean wasActivated = markedBlock.onBlockActivated(player.worldObj, x, y, z, player, hitSide, hitX,hitY,hitZ);
if (heldItemStack.stackSize == 0 ) {
event.setCanceled(true);
break;
}
if (!wasActivated) {
item.onItemUse(player.capabilities.isCreativeMode ? heldItemStack.copy() : heldItemStack, player, player.worldObj, x, y, z, hitSide, (float) lookPos.hitVec.xCoord - x, (float) lookPos.hitVec.yCoord - y, (float) lookPos.hitVec.zCoord - z);
if(heldItemStack.stackSize == 0) {
event.setCanceled(true);
break;
}
}
}
recursion = false;
player.posX = oldPosX;
player.posY = oldPosY;
player.posZ = oldPosZ;
player.rotationPitch = oldPitch;
player.rotationYaw = oldYaw;
}
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
public static void setMode(ItemStack stack, boolean state) {
@@ -688,6 +506,188 @@ public class ItemLokiRing extends ItemRelicBauble implements IExtendedWireframeC
}
}
public class EventHandler{
@SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent event) {
EntityPlayer player = event.getPlayer();
int x = event.x;
int y = event.y;
int z = event.z;
int side = event.blockMetadata;
ItemStack stack = player.getCurrentEquippedItem();
if(stack == null) return;
Item item = player.getCurrentEquippedItem().getItem();
breakOnAllCursors(player, item, stack, x, y, z, side);
}
@SubscribeEvent
public void onPlayerInteract(PlayerInteractEvent event) {
if(recursion) return;
EntityPlayer player = event.entityPlayer;
ItemStack lokiRing = getLokiRing(player);
if (lokiRing == null || player.worldObj.isRemote)
return;
ItemStack heldItemStack = player.getCurrentEquippedItem();
ChunkCoordinates originCoords = getOriginPos(lokiRing);
MovingObjectPosition lookPos = ToolCommons.raytraceFromEntity(player.worldObj, player, true, 10F);
List<LokiCursor> cursors = getCursorList(lokiRing);
int cursorCount = cursors.size();
//I don`t think mana for placing should be cruel , so I just made graph with funny line
int cost = (int)(50*Math.sin(0.04* cursorCount)+cursorCount+120+20*Math.cos(0.2*cursorCount));
if (heldItemStack == null && event.action == Action.RIGHT_CLICK_BLOCK && player.isSneaking() && isRingEnabled(lokiRing)) {
if(originCoords.posY == -1 && lookPos != null) {
setOriginPos(lokiRing, lookPos.blockX, lookPos.blockY, lookPos.blockZ);
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
} else if(lookPos != null) {
if(originCoords.posX == lookPos.blockX && originCoords.posY == lookPos.blockY && originCoords.posZ == lookPos.blockZ) {
clearMasterCursor(lokiRing);
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
} else {
addCursor : {
int relX = lookPos.blockX - originCoords.posX;
int relY = lookPos.blockY - originCoords.posY;
int relZ = lookPos.blockZ - originCoords.posZ;
for(LokiCursor cursor : cursors)
if(cursor.getX() == relX && cursor.getY() == relY && cursor.getZ() == relZ) {
cursors.remove(cursor);
setCursorList(lokiRing, cursors);
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
break addCursor;
}
addCursor(lokiRing, relX, relY, relZ, getRingMirrorMode(lokiRing) );
if(player instanceof EntityPlayerMP)
syncLokiRing(player);
}
}
}
} else if (heldItemStack != null && event.action == Action.RIGHT_CLICK_BLOCK && lookPos != null && isRingEnabled(lokiRing)) {
if(!ManaItemHandler.requestManaExact(lokiRing, player, cost, true)){
if(player instanceof EntityPlayerMP){
vazkii.botania.common.network.PacketHandler.INSTANCE.sendTo(new PacketLokiHudNotificationAck(HUD_MESSAGE.INSUFFICIENT_MANA),(EntityPlayerMP) player);
}
else
{
renderHUDNotification(HUD_MESSAGE.INSUFFICIENT_MANA);
}
return;
}
recursion = true;
double oldPosX = player.posX;
double oldPosY = player.posY;
double oldPosZ = player.posZ;
float oldPitch = player.rotationPitch;
float oldYaw = player.rotationYaw;
int masterOffsetX = originCoords.posY == -1 ? 0 :lookPos.blockX - originCoords.posX;
int masterOffsetY = originCoords.posY == -1 ? 0 :lookPos.blockY - originCoords.posY;
int masterOffsetZ = originCoords.posY == -1 ? 0 :lookPos.blockZ - originCoords.posZ;
double playerOffsetX = player.posX - originCoords.posX;
double playerOffsetY = player.posY - originCoords.posY;
double playerOffsetZ = player.posZ - originCoords.posZ;
for(LokiCursor cursor : cursors) {
int x = lookPos.blockX + cursor.getX();
int y = lookPos.blockY + cursor.getY();
int z = lookPos.blockZ + cursor.getZ();
if(cursor.isMirrorX()){
x -= 2*masterOffsetX;
}
if(cursor.isMirrorY()){
y -= 2*masterOffsetY;
}
if(cursor.isMirrorZ()){
z -= 2*masterOffsetZ;
}
if (player.worldObj.isAirBlock(x, y, z) ) {
continue;
}
player.posX = cursor.getX()+oldPosX;
player.posY = cursor.getY()+oldPosY;
player.posZ = cursor.getZ()+oldPosZ;
player.rotationYaw = oldYaw;
if(cursor.isMirrorX()){
player.posX -= 2*playerOffsetX;
player.rotationYaw = player.rotationYaw * (-1);
}
if(cursor.isMirrorY()){
player.posY -= 2*playerOffsetY;
player.rotationPitch = oldPitch * (-1);
}
if(cursor.isMirrorZ()){
player.posZ -= 2*playerOffsetZ;
player.rotationYaw = 180 - (Math.abs(player.rotationYaw));
if(oldYaw < 0){
player.rotationYaw *= -1;
}
}
float hitX = (float) (lookPos.hitVec.xCoord - lookPos.blockX);
float hitY = (float) (lookPos.hitVec.yCoord - lookPos.blockY);
float hitZ = (float) (lookPos.hitVec.zCoord - lookPos.blockZ);
if(cursor.isMirrorX()){
hitX = 1-hitX;
}
if(cursor.isMirrorY()){
hitY = 1-hitY;
}
if(cursor.isMirrorZ()){
hitZ = 1-hitZ;
}
int hitSide = lookPos.sideHit;
if(cursor.isMirrorX() && (hitSide == ForgeDirection.EAST.ordinal() || hitSide == ForgeDirection.WEST.ordinal()) ){
hitSide = hitSide ^ 1;
}
if(cursor.isMirrorY() && (hitSide == ForgeDirection.DOWN.ordinal() || hitSide == ForgeDirection.UP.ordinal()) ){
hitSide = hitSide ^ 1;
}
if(cursor.isMirrorZ() && (hitSide == ForgeDirection.NORTH.ordinal() || hitSide == ForgeDirection.SOUTH.ordinal()) ){
hitSide = hitSide ^ 1;
}
Item item = heldItemStack.getItem();
Block markedBlock = player.worldObj.getBlock(x, y, z);
boolean wasActivated = markedBlock.onBlockActivated(player.worldObj, x, y, z, player, hitSide, hitX,hitY,hitZ);
if (heldItemStack.stackSize == 0 ) {
event.setCanceled(true);
break;
}
if (!wasActivated) {
item.onItemUse(player.capabilities.isCreativeMode ? heldItemStack.copy() : heldItemStack, player, player.worldObj, x, y, z, hitSide, (float) lookPos.hitVec.xCoord - x, (float) lookPos.hitVec.yCoord - y, (float) lookPos.hitVec.zCoord - z);
if(heldItemStack.stackSize == 0) {
event.setCanceled(true);
break;
}
}
}
recursion = false;
player.posX = oldPosX;
player.posY = oldPosY;
player.posZ = oldPosZ;
player.rotationPitch = oldPitch;
player.rotationYaw = oldYaw;
}
}
}
}
@@ -41,7 +41,7 @@ public class ItemOdinRing extends ItemRelicBauble {
public ItemOdinRing() {
super(LibItemNames.ODIN_RING);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
damageNegations.add(DamageSource.drown.damageType);
damageNegations.add(DamageSource.fall.damageType);
@@ -61,15 +61,6 @@ public class ItemOdinRing extends ItemRelicBauble {
player.extinguish();
}
@SubscribeEvent
public void onPlayerAttacked(LivingAttackEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
if(getOdinRing(player) != null && damageNegations.contains(event.source.damageType))
event.setCanceled(true);
}
}
@Override
public BaubleType getBaubleType(ItemStack arg0) {
return BaubleType.RING;
@@ -105,5 +96,15 @@ public class ItemOdinRing extends ItemRelicBauble {
attributes.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(getBaubleUUID(stack), "Bauble modifier", 20, 0));
}
public static class EventHandler{
@SubscribeEvent
public void onPlayerAttacked(LivingAttackEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
if(getOdinRing(player) != null && damageNegations.contains(event.source.damageType))
event.setCanceled(true);
}
}
}
}
@@ -64,7 +64,7 @@ public class ItemExchangeRod extends ItemMod implements IManaUsingItem, IWirefra
public ItemExchangeRod() {
setMaxStackSize(1);
setUnlocalizedName(LibItemNames.EXCHANGE_ROD);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
@Override
@@ -105,17 +105,6 @@ public class ItemExchangeRod extends ItemMod implements IManaUsingItem, IWirefra
return false;
}
@SubscribeEvent
public void onLeftClick(PlayerInteractEvent event) {
if(event.action == Action.LEFT_CLICK_BLOCK) {
ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
if(stack != null && stack.getItem() == this && canExchange(stack) && ManaItemHandler.requestManaExactForTool(stack, event.entityPlayer, COST, false)) {
if(exchange(event.world, event.entityPlayer, event.x, event.y, event.z, stack, getBlock(stack), getBlockMeta(stack)))
ManaItemHandler.requestManaExactForTool(stack, event.entityPlayer, COST, true);
}
}
}
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int something, boolean somethingelse) {
if(!canExchange(stack) || !(entity instanceof EntityPlayer))
@@ -427,4 +416,16 @@ public class ItemExchangeRod extends ItemMod implements IManaUsingItem, IWirefra
return null;
}
public class EventHandler{
@SubscribeEvent
public void onLeftClick(PlayerInteractEvent event) {
if(event.action == Action.LEFT_CLICK_BLOCK) {
ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
if(stack != null && stack.getItem() == ItemExchangeRod.this && canExchange(stack) && ManaItemHandler.requestManaExactForTool(stack, event.entityPlayer, COST, false)) {
if(exchange(event.world, event.entityPlayer, event.x, event.y, event.z, stack, getBlock(stack), getBlockMeta(stack)))
ManaItemHandler.requestManaExactForTool(stack, event.entityPlayer, COST, true);
}
}
}
}
}