mirror of
https://github.com/GTNewHorizons/Botania.git
synced 2026-10-26 14:24:22 +00:00
Faster load (#89)
Co-authored-by: Alexdoru <57050655+Alexdoru@users.noreply.github.com>
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+31
-28
@@ -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
-25
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+22
-19
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+22
-26
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user