mirror of
https://github.com/GTNewHorizons/ThaumicHorizons.git
synced 2026-10-26 22:53:47 +00:00
Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b198bd8568 | ||
|
|
5ebd91e844 | ||
|
|
0612173fc6 | ||
|
|
cfd2910120 | ||
|
|
f619f97928 | ||
|
|
f542637140 | ||
|
|
23469f5e5b | ||
|
|
c1730a50d9 |
No files matched your search
+4
-3
@@ -1,9 +1,10 @@
|
||||
// Add your dependencies here
|
||||
|
||||
dependencies {
|
||||
api('com.github.GTNewHorizons:Baubles-Expanded:2.2.11-GTNH:dev')
|
||||
|
||||
api('com.github.GTNewHorizons:Baubles-Expanded:2.2.21-GTNH:dev')
|
||||
api('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev')
|
||||
|
||||
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.409:dev') {transitive = false}
|
||||
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.548:dev') {transitive = false}
|
||||
|
||||
runtimeOnlyNonPublishable('com.github.GTNewHorizons:AspectRecipeIndex:1.1.0:dev')
|
||||
}
|
||||
+1
-3
@@ -158,9 +158,7 @@ public class TileEtherealShardRender extends TileEntitySpecialRenderer {
|
||||
}
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1f);
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.getMessage());
|
||||
} finally {
|
||||
} catch (Exception ignored) {} finally {
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -503,10 +503,10 @@ public class ThaumicHorizons {
|
||||
ROD_CRYSTAL = new WandRod(
|
||||
"disposable",
|
||||
250,
|
||||
null,
|
||||
new ItemStack(Blocks.bedrock),
|
||||
99,
|
||||
new ResourceLocation("thaumichorizons", "textures/models/crystalRod.png"));
|
||||
CAP_CRYSTAL = new WandCap("disposable", 0.9F, null, 99);
|
||||
CAP_CRYSTAL = new WandCap("disposable", 0.9F, new ItemStack(Blocks.bedrock), 99);
|
||||
CAP_CRYSTAL.setTexture(new ResourceLocation("thaumichorizons", "textures/models/crystalCap.png"));
|
||||
ROD_CRYSTAL.setGlowing(true);
|
||||
blockSynthNode = new BlockSyntheticNode();
|
||||
|
||||
+85
-315
@@ -1,7 +1,3 @@
|
||||
//
|
||||
// Decompiled by Procyon v0.5.30
|
||||
//
|
||||
|
||||
package com.kentington.thaumichorizons.common.blocks;
|
||||
|
||||
import java.util.Random;
|
||||
@@ -81,28 +77,16 @@ public class BlockGatewayPortal extends Block {
|
||||
if (world.getBlock(x + 1, y, z) == ThaumicHorizons.blockGateway) {
|
||||
slotZ = z;
|
||||
switch (md) {
|
||||
case 6 -> {
|
||||
slotX = x + 1;
|
||||
}
|
||||
case 7 -> {
|
||||
slotX = x;
|
||||
}
|
||||
case 9 -> {
|
||||
slotX = x - 1;
|
||||
}
|
||||
case 6 -> slotX = x + 1;
|
||||
case 7 -> slotX = x;
|
||||
case 9 -> slotX = x - 1;
|
||||
}
|
||||
} else {
|
||||
slotX = x;
|
||||
switch (md) {
|
||||
case 6 -> {
|
||||
slotZ = z + 1;
|
||||
}
|
||||
case 7 -> {
|
||||
slotZ = z;
|
||||
}
|
||||
case 9 -> {
|
||||
slotZ = z - 1;
|
||||
}
|
||||
case 6 -> slotZ = z + 1;
|
||||
case 7 -> slotZ = z;
|
||||
case 9 -> slotZ = z - 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -151,307 +135,93 @@ public class BlockGatewayPortal extends Block {
|
||||
|| world.getBlock(x + 1, y, z) == ThaumicHorizons.blockPortal
|
||||
|| world.getBlock(x - 1, y, z) == ThaumicHorizons.blockGateway
|
||||
|| world.getBlock(x - 1, y, z) == ThaumicHorizons.blockPortal;
|
||||
Label_0410: {
|
||||
switch (world.getBlockMetadata(x, y, z)) {
|
||||
case 0 -> {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 2 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerTR;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 3 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerTL;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerTL;
|
||||
}
|
||||
case 5 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerTR;
|
||||
}
|
||||
default -> {
|
||||
return this.leftSide(isXAligned, side);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 1, 2, 3 -> {
|
||||
return this.leftSide(isXAligned, side);
|
||||
}
|
||||
case 4 -> {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
case 2 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerBR;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 3 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerBL;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerBL;
|
||||
}
|
||||
case 5 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerBR;
|
||||
}
|
||||
default -> {
|
||||
break Label_0410;
|
||||
}
|
||||
}
|
||||
}
|
||||
case 5 -> {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 2 -> {
|
||||
if (isXAligned) return this.topR;
|
||||
return this.stone;
|
||||
}
|
||||
case 3 -> {
|
||||
if (isXAligned) return this.topL;
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
if (!isXAligned) return this.topL;
|
||||
return this.stone;
|
||||
}
|
||||
case 5 -> {
|
||||
if (!isXAligned) return this.topR;
|
||||
return this.stone;
|
||||
}
|
||||
default -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
}
|
||||
}
|
||||
case 6, 7, 9 -> {
|
||||
return this.bottomSide(isXAligned, side);
|
||||
}
|
||||
case 8 -> {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 2 -> {
|
||||
if (isXAligned) return this.topL;
|
||||
return this.stone;
|
||||
}
|
||||
case 3 -> {
|
||||
if (isXAligned) return this.topR;
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
if (!isXAligned) return this.topR;
|
||||
return this.stone;
|
||||
}
|
||||
case 5 -> {
|
||||
if (!isXAligned) return this.topL;
|
||||
return this.stone;
|
||||
}
|
||||
default -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
}
|
||||
}
|
||||
case 10 -> {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 2 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerTL;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 3 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerTR;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerTR;
|
||||
}
|
||||
case 5 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerTL;
|
||||
}
|
||||
default -> {
|
||||
return this.rightSide(isXAligned, side);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 11, 12, 13 -> {
|
||||
return this.rightSide(isXAligned, side);
|
||||
}
|
||||
case 14 -> {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
case 2 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerBL;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 3 -> {
|
||||
if (isXAligned) {
|
||||
return this.CornerBR;
|
||||
}
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerBR;
|
||||
}
|
||||
case 5 -> {
|
||||
if (isXAligned) {
|
||||
return this.stone;
|
||||
}
|
||||
return this.CornerBL;
|
||||
}
|
||||
default -> {
|
||||
break Label_0410;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return this.lapiz;
|
||||
return switch (world.getBlockMetadata(x, y, z)) {
|
||||
case 0 -> switch (side) {
|
||||
case 0 -> this.lapiz;
|
||||
case 1 -> this.stone;
|
||||
case 2 -> isXAligned ? this.CornerTR : this.stone;
|
||||
case 3 -> isXAligned ? this.CornerTL : this.stone;
|
||||
case 4 -> isXAligned ? this.stone : this.CornerTL;
|
||||
case 5 -> isXAligned ? this.stone : this.CornerTR;
|
||||
default -> this.leftSide(isXAligned, side);
|
||||
};
|
||||
case 1, 2, 3 -> this.leftSide(isXAligned, side);
|
||||
case 4 -> switch (side) {
|
||||
case 0 -> this.stone;
|
||||
case 1 -> this.lapiz;
|
||||
case 2 -> isXAligned ? this.CornerBR : this.stone;
|
||||
case 3 -> isXAligned ? this.CornerBL : this.stone;
|
||||
case 4 -> isXAligned ? this.stone : this.CornerBL;
|
||||
case 5 -> isXAligned ? this.stone : this.CornerBR;
|
||||
default -> this.lapiz;
|
||||
};
|
||||
case 5 -> switch (side) {
|
||||
case 0 -> this.lapiz;
|
||||
case 1 -> this.stone;
|
||||
case 2 -> isXAligned ? this.topR : this.stone;
|
||||
case 3 -> isXAligned ? this.topL : this.stone;
|
||||
case 4 -> isXAligned ? this.stone : this.topL;
|
||||
case 5 -> isXAligned ? this.stone : this.topR;
|
||||
default -> this.lapiz;
|
||||
};
|
||||
case 6, 7, 9 -> this.bottomSide(isXAligned, side);
|
||||
case 8 -> switch (side) {
|
||||
case 0 -> this.lapiz;
|
||||
case 1 -> this.stone;
|
||||
case 2 -> isXAligned ? this.topL : this.stone;
|
||||
case 3 -> isXAligned ? this.topR : this.stone;
|
||||
case 4 -> isXAligned ? this.stone : this.topR;
|
||||
case 5 -> isXAligned ? this.stone : this.topL;
|
||||
default -> this.lapiz;
|
||||
};
|
||||
case 10 -> switch (side) {
|
||||
case 0 -> this.lapiz;
|
||||
case 1 -> this.stone;
|
||||
case 2 -> isXAligned ? this.CornerTL : this.stone;
|
||||
case 3 -> isXAligned ? this.CornerTR : this.stone;
|
||||
case 4 -> isXAligned ? this.stone : this.CornerTR;
|
||||
case 5 -> isXAligned ? this.stone : this.CornerTL;
|
||||
default -> this.rightSide(isXAligned, side);
|
||||
};
|
||||
case 11, 12, 13 -> this.rightSide(isXAligned, side);
|
||||
case 14 -> switch (side) {
|
||||
case 0 -> this.stone;
|
||||
case 1 -> this.lapiz;
|
||||
case 2 -> isXAligned ? this.CornerBL : this.stone;
|
||||
case 3 -> isXAligned ? this.CornerBR : this.stone;
|
||||
case 4 -> isXAligned ? this.stone : this.CornerBR;
|
||||
case 5 -> isXAligned ? this.stone : this.CornerBL;
|
||||
default -> this.lapiz;
|
||||
};
|
||||
default -> this.lapiz;
|
||||
};
|
||||
}
|
||||
|
||||
IIcon leftSide(final boolean xAligned, final int side) {
|
||||
if (xAligned) {
|
||||
switch (side) {
|
||||
case 2 -> {
|
||||
return this.R;
|
||||
}
|
||||
case 3 -> {
|
||||
return this.L;
|
||||
}
|
||||
case 4 -> {
|
||||
return this.stone;
|
||||
}
|
||||
default -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch (side) {
|
||||
case 2 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
return this.L;
|
||||
}
|
||||
case 5 -> {
|
||||
return this.R;
|
||||
}
|
||||
default -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
}
|
||||
}
|
||||
return switch (side) {
|
||||
case 2 -> xAligned ? this.R : this.stone;
|
||||
case 3 -> xAligned ? this.L : this.lapiz;
|
||||
case 4 -> xAligned ? this.stone : this.L;
|
||||
case 5 -> xAligned ? this.lapiz : this.R;
|
||||
default -> this.lapiz;
|
||||
};
|
||||
}
|
||||
|
||||
IIcon rightSide(final boolean xAligned, final int side) {
|
||||
if (xAligned) {
|
||||
switch (side) {
|
||||
case 2 -> {
|
||||
return this.L;
|
||||
}
|
||||
case 3 -> {
|
||||
return this.R;
|
||||
}
|
||||
case 5 -> {
|
||||
return this.stone;
|
||||
}
|
||||
default -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch (side) {
|
||||
case 3 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 4 -> {
|
||||
return this.R;
|
||||
}
|
||||
case 5 -> {
|
||||
return this.L;
|
||||
}
|
||||
default -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
}
|
||||
}
|
||||
return switch (side) {
|
||||
case 2 -> xAligned ? this.L : this.lapiz;
|
||||
case 3 -> xAligned ? this.R : this.stone;
|
||||
case 4 -> xAligned ? this.lapiz : this.R;
|
||||
case 5 -> xAligned ? this.stone : this.L;
|
||||
default -> this.lapiz;
|
||||
};
|
||||
}
|
||||
|
||||
IIcon bottomSide(final boolean xAligned, final int side) {
|
||||
switch (side) {
|
||||
case 0 -> {
|
||||
return this.stone;
|
||||
}
|
||||
case 1 -> {
|
||||
return this.lapiz;
|
||||
}
|
||||
default -> {
|
||||
return this.B;
|
||||
}
|
||||
}
|
||||
return switch (side) {
|
||||
case 0 -> this.stone;
|
||||
case 1 -> this.lapiz;
|
||||
default -> this.B;
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -45,10 +45,10 @@ public class ContainerCase extends Container {
|
||||
new SlotLimitedByClass(ILens.class, this.input, a, 37 + a % 6 * 18, 51 + a / 6 * 18));
|
||||
}
|
||||
this.bindPlayerInventory(iinventory);
|
||||
if (!par2World.isRemote) {
|
||||
try {
|
||||
((InventoryCase) this.input).stackList = ((ItemLensCase) this.pouch.getItem()).getInventory(this.pouch);
|
||||
} catch (Exception ignored) {}
|
||||
if (!par2World.isRemote && this.pouch != null
|
||||
&& this.pouch.getItem() instanceof ItemLensCase lensCase
|
||||
&& this.input instanceof InventoryCase inv) {
|
||||
inv.stackList = lensCase.getInventory(this.pouch);
|
||||
}
|
||||
this.onCraftMatrixChanged(this.input);
|
||||
}
|
||||
|
||||
@@ -162,10 +162,8 @@ public class EntityGolemTH extends EntityGolemBase {
|
||||
this.getNavigator().setAvoidsWater(
|
||||
this.getGolemTHType() != EnumGolemTHType.ROCK && this.getGolemTHType() != EnumGolemTHType.METAL
|
||||
&& this.getGolemTHType() != EnumGolemTHType.REDSTONE);
|
||||
int bonus = 0;
|
||||
try {
|
||||
bonus = (this.getGolemDecoration().contains("H") ? 5 : 0);
|
||||
} catch (Exception ignored) {}
|
||||
final String decor = this.getGolemDecoration();
|
||||
final int bonus = decor == null ? 0 : (decor.contains("H") ? 5 : 0);
|
||||
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.getGolemTHType().health + bonus);
|
||||
return true;
|
||||
}
|
||||
@@ -667,10 +665,8 @@ public class EntityGolemTH extends EntityGolemBase {
|
||||
this.action = 6;
|
||||
} else if (par1 == 5) {
|
||||
this.healing = 5;
|
||||
int bonus = 0;
|
||||
try {
|
||||
bonus = (this.getGolemDecoration().contains("H") ? 5 : 0);
|
||||
} catch (Exception ignored) {}
|
||||
final String decor = this.getGolemDecoration();
|
||||
final int bonus = decor == null ? 0 : (decor.contains("H") ? 5 : 0);
|
||||
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.type.health + bonus);
|
||||
} else if (par1 == 6) {
|
||||
this.leftArm = 5;
|
||||
|
||||
-4
@@ -85,10 +85,6 @@ public class ItemLensOrderEntropy extends Item implements ILens {
|
||||
try {
|
||||
text = stack.getDisplayName();
|
||||
} catch (Exception ignored) {}
|
||||
} else if (stack.getItem() != null) {
|
||||
try {
|
||||
text = stack.getItem().getItemStackDisplayName(stack);
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
}
|
||||
if (scan.type == 2) {
|
||||
|
||||
@@ -957,8 +957,11 @@ public class EventHandlerEntity {
|
||||
|
||||
@SubscribeEvent
|
||||
public void golemDies(final LivingDeathEvent event) {
|
||||
if (event.entity instanceof EntityGolemTH) {
|
||||
((EntityGolemTH) event.entity).die();
|
||||
if (event.entity.worldObj.isRemote) {
|
||||
return;
|
||||
}
|
||||
if (event.entity instanceof EntityGolemTH golem) {
|
||||
golem.die();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@ import net.minecraft.client.settings.KeyBinding;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.potion.Potion;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.util.ChatStyle;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
@@ -32,6 +33,8 @@ import thaumcraft.api.nodes.IRevealer;
|
||||
|
||||
public class THKeyHandler {
|
||||
|
||||
private static final ChatStyle INFUSION_MESSAGE = new ChatStyle().setColor(EnumChatFormatting.GRAY).setItalic(true);
|
||||
|
||||
public KeyBinding keyV;
|
||||
public KeyBinding keyM;
|
||||
public KeyBinding keyC;
|
||||
@@ -48,10 +51,19 @@ public class THKeyHandler {
|
||||
public static long lastPressV;
|
||||
|
||||
public THKeyHandler() {
|
||||
this.keyV = new KeyBinding("Change Arcane Lens", Keyboard.KEY_NONE, "Thaumcraft");
|
||||
this.keyM = new KeyBinding("Activate Morphic Fingers", Keyboard.KEY_NONE, "Thaumcraft");
|
||||
this.keyC = new KeyBinding("Toggle Spider Climb", Keyboard.KEY_NONE, "Thaumcraft");
|
||||
this.keyX = new KeyBinding("Toggle Chameleon Skin", Keyboard.KEY_NONE, "Thaumcraft");
|
||||
this.keyV = new KeyBinding(
|
||||
"thaumichorizons.key.arcane_lens",
|
||||
Keyboard.KEY_NONE,
|
||||
"thaumichorizons.keybind_group");
|
||||
this.keyM = new KeyBinding(
|
||||
"thaumichorizons.key.morphic_fingers",
|
||||
Keyboard.KEY_NONE,
|
||||
"thaumichorizons.keybind_group");
|
||||
this.keyC = new KeyBinding(
|
||||
"thaumichorizons.key.spider_climb",
|
||||
Keyboard.KEY_NONE,
|
||||
"thaumichorizons.keybind_group");
|
||||
this.keyX = new KeyBinding("thaumichorizons.key.chameleon", Keyboard.KEY_NONE, "thaumichorizons.keybind_group");
|
||||
this.keyPressedM = false;
|
||||
this.keyPressedC = false;
|
||||
this.keyPressedX = false;
|
||||
@@ -65,158 +77,122 @@ public class THKeyHandler {
|
||||
@SideOnly(Side.CLIENT)
|
||||
@SubscribeEvent
|
||||
public void playerTick(final TickEvent.PlayerTickEvent event) {
|
||||
if (event.side == Side.SERVER) {
|
||||
return;
|
||||
}
|
||||
if (event.phase == TickEvent.Phase.START) {
|
||||
if (this.keyV.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
final EntityPlayer player = event.player;
|
||||
if (player != null) {
|
||||
if (!this.keyPressedV) {
|
||||
THKeyHandler.lastPressV = System.currentTimeMillis();
|
||||
THKeyHandler.radialLock = false;
|
||||
}
|
||||
if (!THKeyHandler.radialLock && player.inventory.armorItemInSlot(3) != null
|
||||
&& player.inventory.armorItemInSlot(3).getItem() instanceof IRevealer) {
|
||||
if (player.isSneaking()) {
|
||||
PacketHandler.INSTANCE.sendToServer(new PacketLensChangeToServer(player, "REMOVE"));
|
||||
} else {
|
||||
THKeyHandler.radialActive = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.keyPressedV = true;
|
||||
}
|
||||
} else {
|
||||
THKeyHandler.radialActive = false;
|
||||
if (this.keyPressedV) {
|
||||
if (event.side != Side.CLIENT || event.phase != TickEvent.Phase.START || event.player == null) return;
|
||||
|
||||
final EntityPlayer player = event.player;
|
||||
final EntityInfusionProperties infusions = (EntityInfusionProperties) player
|
||||
.getExtendedProperties("CreatureInfusion");
|
||||
|
||||
if (this.keyV.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
if (!this.keyPressedV) {
|
||||
THKeyHandler.lastPressV = System.currentTimeMillis();
|
||||
THKeyHandler.radialLock = false;
|
||||
}
|
||||
this.keyPressedV = false;
|
||||
}
|
||||
if (this.keyM.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
final EntityPlayer player = event.player;
|
||||
if (player != null) {
|
||||
if (!this.keyPressedM) {
|
||||
THKeyHandler.lastPressM = System.currentTimeMillis();
|
||||
}
|
||||
if (((EntityInfusionProperties) player.getExtendedProperties("CreatureInfusion"))
|
||||
.hasPlayerInfusion(2) && !this.keyPressedM) {
|
||||
player.openGui(
|
||||
ThaumicHorizons.instance,
|
||||
9,
|
||||
player.worldObj,
|
||||
(int) player.posX,
|
||||
(int) player.posY,
|
||||
(int) player.posZ);
|
||||
PacketHandler.INSTANCE.sendToServer(new PacketFingersToServer(player, player.dimension));
|
||||
}
|
||||
if (!THKeyHandler.radialLock && player.inventory.armorItemInSlot(3) != null
|
||||
&& player.inventory.armorItemInSlot(3).getItem() instanceof IRevealer) {
|
||||
if (player.isSneaking()) {
|
||||
PacketHandler.INSTANCE.sendToServer(new PacketLensChangeToServer(player, "REMOVE"));
|
||||
} else {
|
||||
THKeyHandler.radialActive = true;
|
||||
}
|
||||
this.keyPressedM = true;
|
||||
}
|
||||
} else {
|
||||
if (this.keyPressedM) {
|
||||
this.keyPressedV = true;
|
||||
}
|
||||
} else {
|
||||
THKeyHandler.radialActive = false;
|
||||
if (this.keyPressedV) {
|
||||
THKeyHandler.lastPressV = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedV = false;
|
||||
}
|
||||
|
||||
if (this.keyM.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
if (!this.keyPressedM) {
|
||||
THKeyHandler.lastPressM = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedM = false;
|
||||
}
|
||||
if (this.keyC.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
final EntityPlayer player = event.player;
|
||||
if (player != null) {
|
||||
if (!this.keyPressedC) {
|
||||
THKeyHandler.lastPressC = System.currentTimeMillis();
|
||||
}
|
||||
if (((EntityInfusionProperties) player.getExtendedProperties("CreatureInfusion"))
|
||||
.hasPlayerInfusion(9) && !this.keyPressedC) {
|
||||
((EntityInfusionProperties) player.getExtendedProperties(
|
||||
"CreatureInfusion")).toggleClimb = !((EntityInfusionProperties) player
|
||||
.getExtendedProperties("CreatureInfusion")).toggleClimb;
|
||||
if (((EntityInfusionProperties) player
|
||||
.getExtendedProperties("CreatureInfusion")).toggleClimb) {
|
||||
player.addChatMessage(
|
||||
new ChatComponentText(
|
||||
EnumChatFormatting.ITALIC + ""
|
||||
+ EnumChatFormatting.GRAY
|
||||
+ "Spider Climb disabled."));
|
||||
} else {
|
||||
player.addChatMessage(
|
||||
new ChatComponentText(
|
||||
EnumChatFormatting.ITALIC + ""
|
||||
+ EnumChatFormatting.GRAY
|
||||
+ "Spider Climb enabled."));
|
||||
}
|
||||
PacketHandler.INSTANCE
|
||||
.sendToServer(new PacketToggleClimbToServer(player, player.dimension));
|
||||
}
|
||||
}
|
||||
this.keyPressedC = true;
|
||||
if (infusions.hasPlayerInfusion(2) && !this.keyPressedM) {
|
||||
player.openGui(
|
||||
ThaumicHorizons.instance,
|
||||
9,
|
||||
player.worldObj,
|
||||
(int) player.posX,
|
||||
(int) player.posY,
|
||||
(int) player.posZ);
|
||||
PacketHandler.INSTANCE.sendToServer(new PacketFingersToServer(player, player.dimension));
|
||||
}
|
||||
} else {
|
||||
if (this.keyPressedC) {
|
||||
this.keyPressedM = true;
|
||||
}
|
||||
} else {
|
||||
if (this.keyPressedM) {
|
||||
THKeyHandler.lastPressM = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedM = false;
|
||||
}
|
||||
|
||||
if (this.keyC.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
if (!this.keyPressedC) {
|
||||
THKeyHandler.lastPressC = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedC = false;
|
||||
}
|
||||
if (this.keyX.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
final EntityPlayer player = event.player;
|
||||
if (player != null) {
|
||||
if (!this.keyPressedX) {
|
||||
THKeyHandler.lastPressX = System.currentTimeMillis();
|
||||
}
|
||||
if (((EntityInfusionProperties) player.getExtendedProperties("CreatureInfusion"))
|
||||
.hasPlayerInfusion(10) && !this.keyPressedX) {
|
||||
((EntityInfusionProperties) player.getExtendedProperties(
|
||||
"CreatureInfusion")).toggleInvisible = !((EntityInfusionProperties) player
|
||||
.getExtendedProperties("CreatureInfusion")).toggleInvisible;
|
||||
if (((EntityInfusionProperties) player
|
||||
.getExtendedProperties("CreatureInfusion")).toggleInvisible) {
|
||||
player.removePotionEffectClient(Potion.invisibility.id);
|
||||
player.setInvisible(false);
|
||||
player.addChatMessage(
|
||||
new ChatComponentText(
|
||||
EnumChatFormatting.ITALIC + ""
|
||||
+ EnumChatFormatting.GRAY
|
||||
+ "Chameleon Skin disabled."));
|
||||
} else {
|
||||
final PotionEffect effect = new PotionEffect(
|
||||
Potion.invisibility.id,
|
||||
Integer.MAX_VALUE,
|
||||
0,
|
||||
true);
|
||||
effect.setCurativeItems(new ArrayList<>());
|
||||
player.addPotionEffect(effect);
|
||||
player.setInvisible(true);
|
||||
player.addChatMessage(
|
||||
new ChatComponentText(
|
||||
EnumChatFormatting.ITALIC + ""
|
||||
+ EnumChatFormatting.GRAY
|
||||
+ "Chameleon Skin enabled."));
|
||||
}
|
||||
PacketHandler.INSTANCE
|
||||
.sendToServer(new PacketToggleInvisibleToServer(player, player.dimension));
|
||||
}
|
||||
if (infusions.hasPlayerInfusion(9) && !this.keyPressedC) {
|
||||
infusions.toggleClimb = !infusions.toggleClimb;
|
||||
if (infusions.toggleClimb) {
|
||||
player.addChatMessage(
|
||||
new ChatComponentTranslation("selfInfusions.spiderClimb.disable")
|
||||
.setChatStyle(INFUSION_MESSAGE));
|
||||
} else {
|
||||
player.addChatMessage(
|
||||
new ChatComponentTranslation("selfInfusions.spiderClimb.enable")
|
||||
.setChatStyle(INFUSION_MESSAGE));
|
||||
}
|
||||
this.keyPressedX = true;
|
||||
PacketHandler.INSTANCE.sendToServer(new PacketToggleClimbToServer(player, player.dimension));
|
||||
}
|
||||
} else {
|
||||
if (this.keyPressedX) {
|
||||
this.keyPressedC = true;
|
||||
}
|
||||
} else {
|
||||
if (this.keyPressedC) {
|
||||
THKeyHandler.lastPressC = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedC = false;
|
||||
}
|
||||
|
||||
if (this.keyX.getIsKeyPressed()) {
|
||||
if (FMLClientHandler.instance().getClient().inGameHasFocus) {
|
||||
if (!this.keyPressedX) {
|
||||
THKeyHandler.lastPressX = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedX = false;
|
||||
if (infusions.hasPlayerInfusion(10) && !this.keyPressedX) {
|
||||
infusions.toggleInvisible = !infusions.toggleInvisible;
|
||||
if (infusions.toggleInvisible) {
|
||||
player.removePotionEffectClient(Potion.invisibility.id);
|
||||
player.setInvisible(false);
|
||||
player.addChatMessage(
|
||||
new ChatComponentTranslation("selfInfusions.chameleonSkin.disable")
|
||||
.setChatStyle(INFUSION_MESSAGE));
|
||||
} else {
|
||||
final PotionEffect effect = new PotionEffect(
|
||||
Potion.invisibility.id,
|
||||
Integer.MAX_VALUE,
|
||||
0,
|
||||
true);
|
||||
effect.setCurativeItems(new ArrayList<>());
|
||||
player.addPotionEffect(effect);
|
||||
player.setInvisible(true);
|
||||
player.addChatMessage(
|
||||
new ChatComponentTranslation("selfInfusions.chameleonSkin.enable")
|
||||
.setChatStyle(INFUSION_MESSAGE));
|
||||
}
|
||||
PacketHandler.INSTANCE.sendToServer(new PacketToggleInvisibleToServer(player, player.dimension));
|
||||
}
|
||||
this.keyPressedX = true;
|
||||
}
|
||||
} else {
|
||||
if (this.keyPressedX) {
|
||||
THKeyHandler.lastPressX = System.currentTimeMillis();
|
||||
}
|
||||
this.keyPressedX = false;
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
THKeyHandler.lastPressM = 0L;
|
||||
THKeyHandler.lastPressC = 0L;
|
||||
THKeyHandler.lastPressX = 0L;
|
||||
THKeyHandler.radialActive = false;
|
||||
THKeyHandler.radialLock = false;
|
||||
THKeyHandler.lastPressV = 0L;
|
||||
}
|
||||
}
|
||||
@@ -30,8 +30,14 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
int progress;
|
||||
static final int PROGRESS_MAX = 9600;
|
||||
public int souls;
|
||||
static final int MAX_SOULS = 16;
|
||||
int essentia;
|
||||
static final int ESSENTIA_MAX = 4000;
|
||||
// Threshold for drawing more essentia (3 MIND aspects * 1000 each)
|
||||
static final int ESSENTIA_DRAW_THRESHOLD = 3000;
|
||||
static final int ESSENTIA_PER_ASPECT = 1000;
|
||||
static final int SUCTION_PRESSURE = 128;
|
||||
static final double PLAYER_REACH_SQ = 64.0;
|
||||
public float rota;
|
||||
public int forging;
|
||||
|
||||
@@ -83,8 +89,8 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
public void addSoulBits(final int bits) {
|
||||
this.progress += bits;
|
||||
this.essentia -= bits;
|
||||
if (this.progress >= 9600) {
|
||||
this.progress -= 9600;
|
||||
while (this.progress >= PROGRESS_MAX) {
|
||||
this.progress -= PROGRESS_MAX;
|
||||
++this.souls;
|
||||
}
|
||||
this.forging = 3;
|
||||
@@ -94,12 +100,12 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
|
||||
@Override
|
||||
public boolean canAcceptSouls() {
|
||||
return this.essentia > 0 && this.souls < 16;
|
||||
return this.essentia > 0 && this.souls < MAX_SOULS;
|
||||
}
|
||||
|
||||
public void updateEntity() {
|
||||
super.updateEntity();
|
||||
if (this.essentia < 3000) {
|
||||
if (this.essentia < ESSENTIA_DRAW_THRESHOLD) {
|
||||
this.drawEssentia();
|
||||
}
|
||||
if (this.forging > 0) {
|
||||
@@ -113,7 +119,7 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
|
||||
public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
|
||||
return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this
|
||||
&& p_70300_1_.getDistanceSq(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5) <= 64.0;
|
||||
&& p_70300_1_.getDistanceSq(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5) <= PLAYER_REACH_SQ;
|
||||
}
|
||||
|
||||
void drawEssentia() {
|
||||
@@ -158,12 +164,12 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
if (this.essentia <= 0) {
|
||||
return null;
|
||||
}
|
||||
return new AspectList().add(Aspect.MIND, (int) Math.ceil(this.essentia / 1000.0f));
|
||||
return new AspectList().add(Aspect.MIND, (int) Math.ceil(this.essentia / (float) ESSENTIA_PER_ASPECT));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAspects(final AspectList aspects) {
|
||||
this.essentia = aspects.getAmount(Aspect.MIND) * 1000;
|
||||
this.essentia = aspects.getAmount(Aspect.MIND) * ESSENTIA_PER_ASPECT;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -188,7 +194,7 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
|
||||
@Override
|
||||
public boolean doesContainerContainAmount(final Aspect tag, final int amount) {
|
||||
return tag.getTag().equals(Aspect.MIND.getTag()) && this.essentia / 1000 >= amount;
|
||||
return tag.getTag().equals(Aspect.MIND.getTag()) && this.essentia / ESSENTIA_PER_ASPECT >= amount;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -199,7 +205,7 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
@Override
|
||||
public int containerContains(final Aspect tag) {
|
||||
if (tag.getTag().equals(Aspect.MIND.getTag())) {
|
||||
return this.essentia / 1000;
|
||||
return this.essentia / ESSENTIA_PER_ASPECT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -229,7 +235,7 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
|
||||
@Override
|
||||
public int getSuctionAmount(final ForgeDirection face) {
|
||||
return (this.essentia < 3000) ? 128 : 0;
|
||||
return (this.essentia < ESSENTIA_DRAW_THRESHOLD) ? SUCTION_PRESSURE : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -239,8 +245,8 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
|
||||
@Override
|
||||
public int addEssentia(final Aspect aspect, final int amount, final ForgeDirection face) {
|
||||
if (this.essentia < 3000) {
|
||||
this.essentia += 1000;
|
||||
if (this.essentia < ESSENTIA_DRAW_THRESHOLD) {
|
||||
this.essentia += ESSENTIA_PER_ASPECT;
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
return 1;
|
||||
@@ -255,7 +261,7 @@ public class TileSoulforge extends TileThaumcraft implements ISoulReceiver, IEss
|
||||
|
||||
@Override
|
||||
public int getEssentiaAmount(final ForgeDirection face) {
|
||||
return this.essentia / 1000;
|
||||
return this.essentia / ESSENTIA_PER_ASPECT;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -78,6 +78,45 @@ import thaumcraft.common.tiles.TilePedestal;
|
||||
|
||||
public class TileVat extends TileThaumcraft implements IAspectContainer, IEssentiaTransport, ISidedInventory {
|
||||
|
||||
// Timers and progress values (in ticks)
|
||||
private static final int CLONE_PROGRESS = 800;
|
||||
private static final int COUNT_DELAY = 10;
|
||||
private static final int HEAL_ASPECT_COOLDOWN = 40;
|
||||
private static final int LIFE_ASPECT_COOLDOWN = 50;
|
||||
private static final int EFFIGY_PROGRESS = 80;
|
||||
private static final int BLOOD_SAMPLE_INITIAL_PROGRESS = 40;
|
||||
private static final int INFUSER_SOUND_INTERVAL = 65;
|
||||
private static final int CRAFTCOUNT_WIND_DOWN_MAX = 50;
|
||||
private static final int INSTABILITY_EFFECT_CHANCE = 200;
|
||||
private static final int INSTABILITY_CRAFT_CHANCE = 500;
|
||||
private static final int INSTABILITY_INCREASE_CHANCE_BASE = 100;
|
||||
private static final int MAX_INSTABILITY = 25;
|
||||
|
||||
// Healing amounts
|
||||
private static final float STRONG_HEAL_AMOUNT = 8.0f;
|
||||
private static final float WEAK_HEAL_AMOUNT = 4.0f;
|
||||
|
||||
// Essentia costs
|
||||
private static final int EFFIGY_ESSENTIA_AMOUNT = 8;
|
||||
private static final int BLOOD_SAMPLE_LIFE_COST = 4;
|
||||
private static final int VIS_DRAIN_AMOUNT = 100;
|
||||
|
||||
// Instability damage divisor
|
||||
private static final float INSTABILITY_DAMAGE_DIVISOR = 10.0f;
|
||||
|
||||
// Pedestal search radius
|
||||
private static final int PEDESTAL_SEARCH_HORIZONTAL = 12;
|
||||
private static final int PEDESTAL_SEARCH_Y_DOWN = 5;
|
||||
private static final int PEDESTAL_SEARCH_Y_UP = 10;
|
||||
private static final int PEDESTAL_SYMMETRY_RANGE = 8;
|
||||
|
||||
// Self-infusion slots
|
||||
private static final int SELF_INFUSION_SLOTS = 12;
|
||||
private static final float SELF_INFUSION_INITIAL_HEALTH = 20.0f;
|
||||
|
||||
// Particle count for infuser effects
|
||||
private static final int INFUSER_PARTICLE_COUNT = 25;
|
||||
|
||||
public int mode;
|
||||
AspectList myEssentia;
|
||||
AspectList essentiaDemanded;
|
||||
@@ -86,7 +125,6 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
public ItemStack nutrients;
|
||||
public int progress;
|
||||
private EntityLivingBase entityContained;
|
||||
public final int CLONE_TIME = 800;
|
||||
public int[] selfInfusions;
|
||||
public float selfInfusionHealth;
|
||||
private final ArrayList<ChunkCoordinates> pedestals;
|
||||
@@ -105,7 +143,6 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
public int count;
|
||||
public int craftCount;
|
||||
public float startUp;
|
||||
private final int countDelay;
|
||||
ArrayList<ItemStack> ingredients;
|
||||
public HashMap<String, SourceFX> sourceFX;
|
||||
private NBTTagCompound entityNBTObj = null;
|
||||
@@ -119,8 +156,8 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
this.sample = null;
|
||||
this.nutrients = null;
|
||||
this.entityContained = null;
|
||||
this.selfInfusions = new int[12];
|
||||
this.selfInfusionHealth = 20.0f;
|
||||
this.selfInfusions = new int[SELF_INFUSION_SLOTS];
|
||||
this.selfInfusionHealth = SELF_INFUSION_INITIAL_HEALTH;
|
||||
this.pedestals = new ArrayList<>();
|
||||
this.dangerCount = 0;
|
||||
this.checkSurroundings = true;
|
||||
@@ -136,7 +173,6 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
this.itemCount = 0;
|
||||
this.count = 0;
|
||||
this.craftCount = 0;
|
||||
this.countDelay = 10;
|
||||
this.ingredients = new ArrayList<>();
|
||||
this.sourceFX = new HashMap<>();
|
||||
}
|
||||
@@ -196,7 +232,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
this.mode = 0;
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.selfInfusions = new int[12];
|
||||
this.selfInfusions = new int[SELF_INFUSION_SLOTS];
|
||||
--possibleJar.stackSize;
|
||||
}
|
||||
} else {
|
||||
@@ -273,22 +309,22 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
if (this.getEntityContained().getHealth() < this.getEntityContained().getMaxHealth()) {
|
||||
if (this.getEntityContained().getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) {
|
||||
if (this.myEssentia.getAmount(Aspect.HEAL) > 0 && this.progress <= 0) {
|
||||
this.getEntityContained().heal(8.0f);
|
||||
this.getEntityContained().heal(STRONG_HEAL_AMOUNT);
|
||||
this.myEssentia.remove(Aspect.HEAL, 1);
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.progress += 40;
|
||||
this.progress += HEAL_ASPECT_COOLDOWN;
|
||||
}
|
||||
if (this.getEntityContained().getHealth() < this.getEntityContained().getMaxHealth()
|
||||
&& this.essentiaDemanded.getAmount(Aspect.HEAL) < 1) {
|
||||
this.essentiaDemanded.add(Aspect.HEAL, 1);
|
||||
}
|
||||
if (this.myEssentia.getAmount(Aspect.LIFE) > 0 && this.progress <= 0) {
|
||||
this.getEntityContained().heal(4.0f);
|
||||
this.getEntityContained().heal(WEAK_HEAL_AMOUNT);
|
||||
this.myEssentia.remove(Aspect.LIFE, 1);
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.progress += 50;
|
||||
this.progress += LIFE_ASPECT_COOLDOWN;
|
||||
}
|
||||
if (this.getEntityContained().getHealth() < this.getEntityContained().getMaxHealth()
|
||||
&& this.essentiaDemanded.getAmount(Aspect.LIFE) < 1) {
|
||||
@@ -296,22 +332,22 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
}
|
||||
} else {
|
||||
if (this.myEssentia.getAmount(Aspect.UNDEAD) > 0 && this.progress <= 0) {
|
||||
this.getEntityContained().heal(8.0f);
|
||||
this.getEntityContained().heal(STRONG_HEAL_AMOUNT);
|
||||
this.myEssentia.remove(Aspect.UNDEAD, 1);
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.progress += 40;
|
||||
this.progress += HEAL_ASPECT_COOLDOWN;
|
||||
}
|
||||
if (this.getEntityContained().getHealth() < this.getEntityContained().getMaxHealth()
|
||||
&& this.essentiaDemanded.getAmount(Aspect.UNDEAD) < 1) {
|
||||
this.essentiaDemanded.add(Aspect.UNDEAD, 1);
|
||||
}
|
||||
if (this.myEssentia.getAmount(Aspect.DEATH) > 0 && this.progress <= 0) {
|
||||
this.getEntityContained().heal(4.0f);
|
||||
this.getEntityContained().heal(WEAK_HEAL_AMOUNT);
|
||||
this.myEssentia.remove(Aspect.DEATH, 1);
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.progress += 50;
|
||||
this.progress += LIFE_ASPECT_COOLDOWN;
|
||||
}
|
||||
if (this.getEntityContained().getHealth() < this.getEntityContained().getMaxHealth()
|
||||
&& this.essentiaDemanded.getAmount(Aspect.DEATH) < 1) {
|
||||
@@ -355,13 +391,14 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
}
|
||||
} else if (this.sample != null && this.sample.getItem() == ThaumicHorizons.itemCorpseEffigy) {
|
||||
this.mode = 3;
|
||||
this.essentiaDemanded = new AspectList().add(Aspect.LIFE, 8).add(Aspect.HEAL, 8);
|
||||
this.progress = 80;
|
||||
this.essentiaDemanded = new AspectList().add(Aspect.LIFE, EFFIGY_ESSENTIA_AMOUNT)
|
||||
.add(Aspect.HEAL, EFFIGY_ESSENTIA_AMOUNT);
|
||||
this.progress = EFFIGY_PROGRESS;
|
||||
this.markDirty();
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
} else if (this.sample != null && this.nutrients != null) {
|
||||
this.mode = 1;
|
||||
this.essentiaDemanded = new AspectList().add(Aspect.LIFE, 4);
|
||||
this.essentiaDemanded = new AspectList().add(Aspect.LIFE, BLOOD_SAMPLE_LIFE_COST);
|
||||
if (this.sample.getItem() == ThaumicHorizons.itemSyringeBloodSample && this.sample.hasTagCompound()
|
||||
&& this.sample.stackTagCompound.getCompoundTag("critter") != null
|
||||
&& this.sample.stackTagCompound.getCompoundTag("critter").getCompoundTag("ForgeData") != null) {
|
||||
@@ -378,7 +415,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
}
|
||||
}
|
||||
}
|
||||
this.progress = 40;
|
||||
this.progress = BLOOD_SAMPLE_INITIAL_PROGRESS;
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.markDirty();
|
||||
}
|
||||
@@ -415,7 +452,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
if (this.nutrients.stackSize <= 0) {
|
||||
this.nutrients = null;
|
||||
}
|
||||
this.progress = 800;
|
||||
this.progress = CLONE_PROGRESS;
|
||||
this.essentiaDemanded = new AspectList();
|
||||
this.myEssentia = new AspectList();
|
||||
if (this.getEntityContained() == null) {
|
||||
@@ -437,7 +474,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
if (this.checkSurroundings) {
|
||||
this.checkSurroundings = false;
|
||||
this.getSurroundings();
|
||||
} else if (this.count % this.countDelay == 0) {
|
||||
} else if (this.count % COUNT_DELAY == 0) {
|
||||
this.craftCycle();
|
||||
this.markDirty();
|
||||
}
|
||||
@@ -463,7 +500,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
Thaumcraft.proxy.blockSparkle(this.worldObj, this.xCoord, this.yCoord - 2, this.zCoord, 16720418, 20);
|
||||
Thaumcraft.proxy.blockSparkle(this.worldObj, this.xCoord, this.yCoord - 1, this.zCoord, 16720418, 20);
|
||||
this.mode = 4;
|
||||
this.selfInfusionHealth = 20.0f;
|
||||
this.selfInfusionHealth = SELF_INFUSION_INITIAL_HEALTH;
|
||||
this.sample = null;
|
||||
this.essentiaDemanded = new AspectList();
|
||||
this.myEssentia = new AspectList();
|
||||
@@ -673,78 +710,75 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
private void getSurroundings() {
|
||||
final ArrayList<ChunkCoordinates> stuff = new ArrayList<>();
|
||||
this.pedestals.clear();
|
||||
try {
|
||||
for (int xx = -12; xx <= 12; ++xx) {
|
||||
for (int zz = -12; zz <= 12; ++zz) {
|
||||
boolean skip = false;
|
||||
for (int yy = -5; yy <= 10; ++yy) {
|
||||
if (xx != 0 || zz != 0) {
|
||||
final int x = this.xCoord + xx;
|
||||
final int y = this.yCoord - yy;
|
||||
final int z = this.zCoord + zz;
|
||||
final TileEntity te = this.worldObj.getTileEntity(x, y, z);
|
||||
if (!skip && yy > 0
|
||||
&& Math.abs(xx) <= 8
|
||||
&& Math.abs(zz) <= 8
|
||||
&& te instanceof TilePedestal) {
|
||||
this.pedestals.add(new ChunkCoordinates(x, y, z));
|
||||
skip = true;
|
||||
} else {
|
||||
final Block bi = this.worldObj.getBlock(x, y, z);
|
||||
if (bi == Blocks.skull
|
||||
|| (bi instanceof IInfusionStabiliser && ((IInfusionStabiliser) bi)
|
||||
.canStabaliseInfusion(this.getWorldObj(), x, y, z))) {
|
||||
stuff.add(new ChunkCoordinates(x, y, z));
|
||||
}
|
||||
for (int xx = -PEDESTAL_SEARCH_HORIZONTAL; xx <= PEDESTAL_SEARCH_HORIZONTAL; ++xx) {
|
||||
for (int zz = -PEDESTAL_SEARCH_HORIZONTAL; zz <= PEDESTAL_SEARCH_HORIZONTAL; ++zz) {
|
||||
boolean skip = false;
|
||||
for (int yy = -PEDESTAL_SEARCH_Y_DOWN; yy <= PEDESTAL_SEARCH_Y_UP; ++yy) {
|
||||
if (xx != 0 || zz != 0) {
|
||||
final int x = this.xCoord + xx;
|
||||
final int y = this.yCoord - yy;
|
||||
final int z = this.zCoord + zz;
|
||||
final TileEntity te = this.worldObj.getTileEntity(x, y, z);
|
||||
if (!skip && yy > 0
|
||||
&& Math.abs(xx) <= PEDESTAL_SYMMETRY_RANGE
|
||||
&& Math.abs(zz) <= PEDESTAL_SYMMETRY_RANGE
|
||||
&& te instanceof TilePedestal) {
|
||||
this.pedestals.add(new ChunkCoordinates(x, y, z));
|
||||
skip = true;
|
||||
} else {
|
||||
final Block bi = this.worldObj.getBlock(x, y, z);
|
||||
if (bi == Blocks.skull || (bi instanceof IInfusionStabiliser
|
||||
&& ((IInfusionStabiliser) bi).canStabaliseInfusion(this.getWorldObj(), x, y, z))) {
|
||||
stuff.add(new ChunkCoordinates(x, y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.symmetry = 0;
|
||||
for (final ChunkCoordinates cc : this.pedestals) {
|
||||
boolean items = false;
|
||||
final int x2 = this.xCoord - cc.posX;
|
||||
final int z2 = this.zCoord - cc.posZ;
|
||||
TileEntity te2 = this.worldObj.getTileEntity(cc.posX, cc.posY, cc.posZ);
|
||||
if (te2 instanceof TilePedestal) {
|
||||
this.symmetry += 2;
|
||||
if (((TilePedestal) te2).getStackInSlot(0) != null) {
|
||||
++this.symmetry;
|
||||
items = true;
|
||||
}
|
||||
}
|
||||
final int xx2 = this.xCoord + x2;
|
||||
final int zz2 = this.zCoord + z2;
|
||||
te2 = this.worldObj.getTileEntity(xx2, cc.posY, zz2);
|
||||
if (te2 instanceof TilePedestal) {
|
||||
this.symmetry -= 2;
|
||||
if (((TilePedestal) te2).getStackInSlot(0) == null || !items) {
|
||||
continue;
|
||||
}
|
||||
--this.symmetry;
|
||||
}
|
||||
this.symmetry = 0;
|
||||
for (final ChunkCoordinates cc : this.pedestals) {
|
||||
boolean items = false;
|
||||
final int x2 = this.xCoord - cc.posX;
|
||||
final int z2 = this.zCoord - cc.posZ;
|
||||
TileEntity te2 = this.worldObj.getTileEntity(cc.posX, cc.posY, cc.posZ);
|
||||
if (te2 instanceof TilePedestal) {
|
||||
this.symmetry += 2;
|
||||
if (((TilePedestal) te2).getStackInSlot(0) != null) {
|
||||
++this.symmetry;
|
||||
items = true;
|
||||
}
|
||||
}
|
||||
float sym = 0.0f;
|
||||
for (final ChunkCoordinates cc2 : stuff) {
|
||||
final boolean items2 = false;
|
||||
final int x = this.xCoord - cc2.posX;
|
||||
final int z3 = this.zCoord - cc2.posZ;
|
||||
Block bi2 = this.worldObj.getBlock(cc2.posX, cc2.posY, cc2.posZ);
|
||||
if (bi2 == Blocks.skull || (bi2 instanceof IInfusionStabiliser && ((IInfusionStabiliser) bi2)
|
||||
.canStabaliseInfusion(this.getWorldObj(), cc2.posX, cc2.posY, cc2.posZ))) {
|
||||
sym += 0.1f;
|
||||
}
|
||||
final int xx3 = this.xCoord + x;
|
||||
final int zz3 = this.zCoord + z3;
|
||||
bi2 = this.worldObj.getBlock(xx3, cc2.posY, zz3);
|
||||
if (bi2 == Blocks.skull || (bi2 instanceof IInfusionStabiliser && ((IInfusionStabiliser) bi2)
|
||||
.canStabaliseInfusion(this.getWorldObj(), cc2.posX, cc2.posY, cc2.posZ))) {
|
||||
sym -= 0.2f;
|
||||
final int xx2 = this.xCoord + x2;
|
||||
final int zz2 = this.zCoord + z2;
|
||||
te2 = this.worldObj.getTileEntity(xx2, cc.posY, zz2);
|
||||
if (te2 instanceof TilePedestal) {
|
||||
this.symmetry -= 2;
|
||||
if (((TilePedestal) te2).getStackInSlot(0) == null || !items) {
|
||||
continue;
|
||||
}
|
||||
--this.symmetry;
|
||||
}
|
||||
this.symmetry += (int) sym;
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
float sym = 0.0f;
|
||||
for (final ChunkCoordinates cc2 : stuff) {
|
||||
final boolean items2 = false;
|
||||
final int x = this.xCoord - cc2.posX;
|
||||
final int z3 = this.zCoord - cc2.posZ;
|
||||
Block bi2 = this.worldObj.getBlock(cc2.posX, cc2.posY, cc2.posZ);
|
||||
if (bi2 == Blocks.skull || (bi2 instanceof IInfusionStabiliser && ((IInfusionStabiliser) bi2)
|
||||
.canStabaliseInfusion(this.getWorldObj(), cc2.posX, cc2.posY, cc2.posZ))) {
|
||||
sym += 0.1f;
|
||||
}
|
||||
final int xx3 = this.xCoord + x;
|
||||
final int zz3 = this.zCoord + z3;
|
||||
bi2 = this.worldObj.getBlock(xx3, cc2.posY, zz3);
|
||||
if (bi2 == Blocks.skull || (bi2 instanceof IInfusionStabiliser && ((IInfusionStabiliser) bi2)
|
||||
.canStabaliseInfusion(this.getWorldObj(), cc2.posX, cc2.posY, cc2.posZ))) {
|
||||
sym -= 0.2f;
|
||||
}
|
||||
}
|
||||
this.symmetry += (int) sym;
|
||||
}
|
||||
|
||||
private void doEffects() {
|
||||
@@ -752,7 +786,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
if (this.craftCount == 0) {
|
||||
this.worldObj
|
||||
.playSound(this.xCoord, this.yCoord, this.zCoord, "thaumcraft:infuserstart", 0.5f, 1.0f, false);
|
||||
} else if (this.craftCount % 65 == 0) {
|
||||
} else if (this.craftCount % INFUSER_SOUND_INTERVAL == 0) {
|
||||
this.worldObj.playSound(this.xCoord, this.yCoord, this.zCoord, "thaumcraft:infuser", 0.5f, 1.0f, false);
|
||||
}
|
||||
++this.craftCount;
|
||||
@@ -764,15 +798,15 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
0.5f + this.worldObj.rand.nextFloat() * 0.2f,
|
||||
0.1f,
|
||||
0.7f + this.worldObj.rand.nextFloat() * 0.3f,
|
||||
25,
|
||||
INFUSER_PARTICLE_COUNT,
|
||||
-0.03f);
|
||||
} else if (this.craftCount > 0) {
|
||||
this.craftCount -= 2;
|
||||
if (this.craftCount < 0) {
|
||||
this.craftCount = 0;
|
||||
}
|
||||
if (this.craftCount > 50) {
|
||||
this.craftCount = 50;
|
||||
if (this.craftCount > CRAFTCOUNT_WIND_DOWN_MAX) {
|
||||
this.craftCount = CRAFTCOUNT_WIND_DOWN_MAX;
|
||||
}
|
||||
}
|
||||
if (this.mode == 2 && this.startUp != 1.0f) {
|
||||
@@ -858,7 +892,8 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
this.sourceFX.put(fxk, fx);
|
||||
}
|
||||
}
|
||||
if (this.mode == 2 && this.instability > 0 && this.worldObj.rand.nextInt(200) <= this.instability) {
|
||||
if (this.mode == 2 && this.instability > 0
|
||||
&& this.worldObj.rand.nextInt(INSTABILITY_EFFECT_CHANCE) <= this.instability) {
|
||||
Thaumcraft.proxy.nodeBolt(
|
||||
this.worldObj,
|
||||
this.xCoord + 0.5f,
|
||||
@@ -871,7 +906,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
}
|
||||
|
||||
public void craftCycle() {
|
||||
if (this.instability > 0 && this.worldObj.rand.nextInt(500) <= this.instability) {
|
||||
if (this.instability > 0 && this.worldObj.rand.nextInt(INSTABILITY_CRAFT_CHANCE) <= this.instability) {
|
||||
switch (this.worldObj.rand.nextInt(21)) {
|
||||
case 0, 2, 10, 13 -> {
|
||||
this.inEvEjectItem(0);
|
||||
@@ -920,24 +955,40 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
if (this.instability > 0 && this.entityContained != null) {
|
||||
float visDrawn = 999.0f;
|
||||
if (!this.worldObj.isRemote) {
|
||||
float temp = VisNetHandler
|
||||
.drainVis(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, Aspect.EARTH, 100);
|
||||
float temp = VisNetHandler.drainVis(
|
||||
this.worldObj,
|
||||
this.xCoord,
|
||||
this.yCoord + 1,
|
||||
this.zCoord,
|
||||
Aspect.EARTH,
|
||||
VIS_DRAIN_AMOUNT);
|
||||
if (temp < visDrawn) {
|
||||
visDrawn = temp;
|
||||
}
|
||||
temp = VisNetHandler
|
||||
.drainVis(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, Aspect.WATER, 100);
|
||||
temp = VisNetHandler.drainVis(
|
||||
this.worldObj,
|
||||
this.xCoord,
|
||||
this.yCoord + 1,
|
||||
this.zCoord,
|
||||
Aspect.WATER,
|
||||
VIS_DRAIN_AMOUNT);
|
||||
if (temp < visDrawn) {
|
||||
visDrawn = temp;
|
||||
}
|
||||
temp = VisNetHandler
|
||||
.drainVis(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, Aspect.ORDER, 100);
|
||||
temp = VisNetHandler.drainVis(
|
||||
this.worldObj,
|
||||
this.xCoord,
|
||||
this.yCoord + 1,
|
||||
this.zCoord,
|
||||
Aspect.ORDER,
|
||||
VIS_DRAIN_AMOUNT);
|
||||
if (temp < visDrawn) {
|
||||
visDrawn = temp;
|
||||
}
|
||||
}
|
||||
this.getEntityContained()
|
||||
.setHealth(this.getEntityContained().getHealth() - this.instability / 10.0f / (5.0f + visDrawn));
|
||||
this.getEntityContained().setHealth(
|
||||
this.getEntityContained().getHealth()
|
||||
- this.instability / INSTABILITY_DAMAGE_DIVISOR / (5.0f + visDrawn));
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
if (this.getEntityContained().getHealth() <= 0.0f) {
|
||||
this.killSubject();
|
||||
@@ -946,23 +997,38 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
} else if (this.instability > 0) {
|
||||
float visDrawn = 999.0f;
|
||||
if (!this.worldObj.isRemote) {
|
||||
float temp = VisNetHandler
|
||||
.drainVis(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, Aspect.EARTH, 100);
|
||||
float temp = VisNetHandler.drainVis(
|
||||
this.worldObj,
|
||||
this.xCoord,
|
||||
this.yCoord + 1,
|
||||
this.zCoord,
|
||||
Aspect.EARTH,
|
||||
VIS_DRAIN_AMOUNT);
|
||||
if (temp < visDrawn) {
|
||||
visDrawn = temp;
|
||||
}
|
||||
temp = VisNetHandler
|
||||
.drainVis(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, Aspect.WATER, 100);
|
||||
temp = VisNetHandler.drainVis(
|
||||
this.worldObj,
|
||||
this.xCoord,
|
||||
this.yCoord + 1,
|
||||
this.zCoord,
|
||||
Aspect.WATER,
|
||||
VIS_DRAIN_AMOUNT);
|
||||
if (temp < visDrawn) {
|
||||
visDrawn = temp;
|
||||
}
|
||||
temp = VisNetHandler
|
||||
.drainVis(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, Aspect.ORDER, 100);
|
||||
temp = VisNetHandler.drainVis(
|
||||
this.worldObj,
|
||||
this.xCoord,
|
||||
this.yCoord + 1,
|
||||
this.zCoord,
|
||||
Aspect.ORDER,
|
||||
VIS_DRAIN_AMOUNT);
|
||||
if (temp < visDrawn) {
|
||||
visDrawn = temp;
|
||||
}
|
||||
}
|
||||
this.selfInfusionHealth -= this.instability / 10.0f / (5.0f + visDrawn);
|
||||
this.selfInfusionHealth -= this.instability / INSTABILITY_DAMAGE_DIVISOR / (5.0f + visDrawn);
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
if (this.selfInfusionHealth <= 0.0f) {
|
||||
this.killSubject();
|
||||
@@ -982,11 +1048,12 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
this.markDirty();
|
||||
return;
|
||||
}
|
||||
if (this.worldObj.rand.nextInt(100 - this.recipeInstability * 3) == 0) {
|
||||
if (this.worldObj.rand.nextInt(INSTABILITY_INCREASE_CHANCE_BASE - this.recipeInstability * 3)
|
||||
== 0) {
|
||||
++this.instability;
|
||||
}
|
||||
if (this.instability > 25) {
|
||||
this.instability = 25;
|
||||
if (this.instability > MAX_INSTABILITY) {
|
||||
this.instability = MAX_INSTABILITY;
|
||||
}
|
||||
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||||
this.markDirty();
|
||||
@@ -1354,7 +1421,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
this.nutrients = ItemStack.loadItemStackFromNBT(nbttagcompound.getCompoundTag("nutrients"));
|
||||
this.selfInfusions = nbttagcompound.getIntArray("selfInfusions");
|
||||
if (this.selfInfusions.length == 0) {
|
||||
this.selfInfusions = new int[12];
|
||||
this.selfInfusions = new int[SELF_INFUSION_SLOTS];
|
||||
}
|
||||
this.selfInfusionHealth = nbttagcompound.getFloat("selfInfusionHealth");
|
||||
}
|
||||
@@ -1515,7 +1582,7 @@ public class TileVat extends TileThaumcraft implements IAspectContainer, IEssent
|
||||
}
|
||||
}
|
||||
}
|
||||
this.selfInfusions = new int[12];
|
||||
this.selfInfusions = new int[SELF_INFUSION_SLOTS];
|
||||
this.setEntityContained(null);
|
||||
this.mode = 0;
|
||||
this.currentlySucking = null;
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
itemGroup.thaumichorizons=Thaumic Horizons
|
||||
|
||||
thaumichorizons.keybind_group=Thaumic Horizons
|
||||
thaumichorizons.key.arcane_lens=Change Arcane Lens
|
||||
thaumichorizons.key.morphic_fingers=Activate Morphic Fingers
|
||||
thaumichorizons.key.spider_climb=Toggle Spider Climb
|
||||
thaumichorizons.key.chameleon=Toggle Chameleon Skin
|
||||
|
||||
thaumichorizons.noJar=You need an empty warded jar to capture a creature!
|
||||
thaumichorizons.setBeacon=Soul beacon set!
|
||||
thaumichorizons.startSitting=is waiting.
|
||||
@@ -55,6 +61,11 @@ selfInfusions.warpedTumor=Self: Warped Tumor
|
||||
selfInfusions.spiderClimb=Self: Spider Climb
|
||||
selfInfusions.chameleonSkin=Self: Chameleon Skin
|
||||
|
||||
selfInfusions.spiderClimb.enable=Spider Climb enabled.
|
||||
selfInfusions.spiderClimb.disable=Spider Climb disabled.
|
||||
selfInfusions.chameleonSkin.enable=Chameleon Skin enabled.
|
||||
selfInfusions.chameleonSkin.disable=Chameleon Skin disabled.
|
||||
|
||||
###ENTITIES###
|
||||
|
||||
entity.ThaumicHorizons.PrimedAlchemite.name=Primed Alchemite
|
||||
|
||||
Reference in new issue
Block a user