aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kr
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/kr')
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java2
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonRoomEdit.java1
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/GeneralEditPane.java112
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoomMatchDisplayPane.java119
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoommatchingPane.java68
-rw-r--r--src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorNecron.java61
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/utils/MapUtils.java2
7 files changed, 364 insertions, 1 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java
index 6c072340..d39418bd 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java
@@ -87,6 +87,8 @@ public class CatacombDataProvider implements DungeonSpecificDataProvider {
return new BossfightProcessorLivid();
} else if (floor.equals("F6")) {
return new BossfightProcessorSadan();
+ } else if (floor.equals("F7")) {
+ return new BossfightProcessorNecron();
}
return null;
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonRoomEdit.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonRoomEdit.java
index e8c71fe9..d2c9abd9 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonRoomEdit.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonRoomEdit.java
@@ -37,6 +37,7 @@ public class GuiDungeonRoomEdit extends GuiScreen {
tabbedPane.addTab("Match", new RoomDataDisplayPane(room));
tabbedPane.addTab("Secrets", new SecretEditPane(room));
tabbedPane.addTab("Actions", new ActionDisplayPane(room));
+ tabbedPane.addTab("Test", new RoommatchingPane(room));
tabbedPane.addTab("Proc.Params", new ProcessorParameterEditPane(room));
this.tabbedPane = tabbedPane;
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/GeneralEditPane.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/GeneralEditPane.java
index 84b92d38..06cfca2e 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/GeneralEditPane.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/GeneralEditPane.java
@@ -2,13 +2,30 @@ package kr.syeyoung.dungeonsguide.roomedit.panes;
import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoomInfoRegistry;
+import kr.syeyoung.dungeonsguide.e;
import kr.syeyoung.dungeonsguide.roomedit.EditingContext;
import kr.syeyoung.dungeonsguide.roomedit.MPanel;
import kr.syeyoung.dungeonsguide.roomedit.elements.*;
import kr.syeyoung.dungeonsguide.roomprocessor.ProcessorFactory;
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import scala.collection.immutable.List;
import java.awt.*;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
+import java.util.UUID;
+import java.util.zip.GZIPOutputStream;
public class GeneralEditPane extends MPanel {
private DungeonRoom dungeonRoom;
@@ -22,6 +39,7 @@ public class GeneralEditPane extends MPanel {
private MButton save;
private MButton end;
+ private MButton schematic;
private MLabelAndElement roomProcessor;
@@ -97,6 +115,32 @@ public class GeneralEditPane extends MPanel {
add(end);
}
{
+ schematic = new MButton();
+ schematic.setText("Save Schematic");
+ schematic.setOnActionPerformed(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ NBTTagCompound nbtTagCompound2 = createNBT();
+ NBTTagCompound real = new NBTTagCompound();
+ real.setTag("Schematic", nbtTagCompound2);
+
+ File f=new File(e.getDungeonsGuide().getConfigDir(), "schematics/"+
+ dungeonRoom.getDungeonRoomInfo().getName()+"-"+dungeonRoom.getDungeonRoomInfo().getUuid().toString()+"-"+ UUID.randomUUID()+".schematic");
+
+ CompressedStreamTools.write(nbtTagCompound2, f);
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSaved to "+f.getName()));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ }
+ });
+ schematic.setBackgroundColor(Color.orange);
+ schematic.setBounds(new Rectangle(0,160,getBounds().width, 20));
+ add(schematic);
+ }
+ {
if (dungeonRoom.getDungeonRoomInfo().isRegistered()) return;
save = new MButton();
save.setText("Save RoomData");
@@ -123,5 +167,73 @@ public class GeneralEditPane extends MPanel {
if (save != null)
save.setBounds(new Rectangle(0,140,getBounds().width, 20));
end.setBounds(new Rectangle(1,120,getBounds().width-2, 20));
+ if (schematic != null)
+ schematic.setBounds(new Rectangle(0,160,getBounds().width, 20));
+ }
+
+ private NBTTagCompound createNBT() {
+ NBTTagCompound compound = new NBTTagCompound();
+ compound.setShort("Width", (short) (dungeonRoom.getMax().getX() - dungeonRoom.getMin().getX() + 1));
+ compound.setShort("Height", (short) 255);
+ compound.setShort("Length", (short) (dungeonRoom.getMax().getZ() - dungeonRoom.getMin().getZ() + 1));
+ int size =compound.getShort("Width") * compound.getShort("Height") * compound.getShort("Length");
+
+ byte[] blocks = new byte[size];
+ byte[] meta = new byte[size];
+ byte[] extra = new byte[size];
+ byte[] extranibble = new byte[(int) Math.ceil(size / 2.0)];
+
+ boolean extraEx = false;
+ NBTTagList tileEntitiesList = new NBTTagList();
+ for (int x = 0; x < compound.getShort("Width"); x++) {
+ for (int y = 0; y < compound.getShort("Height"); y++) {
+ for (int z = 0; z < compound.getShort("Length"); z++) {
+ int index = x + (y * compound.getShort("Length") + z) * compound.getShort("Width");
+ BlockPos pos = dungeonRoom.getRelativeBlockPosAt(x,y - 70,z);
+ IBlockState blockState = dungeonRoom.getContext().getWorld().getBlockState(pos);
+ boolean acc = dungeonRoom.canAccessRelative(x,z);
+ int id = Block.getIdFromBlock(blockState.getBlock());
+ blocks[index] = acc ? (byte) id : 0;
+ meta[index] = acc ? (byte) blockState.getBlock().getMetaFromState(blockState) : 0;
+ if ((extra[index] = (byte) ((acc ? id : 0) >> 8)) > 0) {
+ extraEx = true;
+ }
+
+ if (blockState.getBlock().hasTileEntity(blockState)) {
+ TileEntity tileEntity = dungeonRoom.getContext().getWorld().getTileEntity(pos);
+ try {
+ final NBTTagCompound tileEntityCompound = new NBTTagCompound();
+ tileEntity.writeToNBT(tileEntityCompound);
+ tileEntitiesList.appendTag(tileEntityCompound);
+ } catch (final Exception e) {
+ final BlockPos tePos = tileEntity.getPos();
+
+ blocks[index] = (byte) 7;
+ meta[index] = 0;
+ extra[index] = 0;
+ }
+ }
+ }
+ }
+ }
+ for (int i = 0; i < extranibble.length; i++) {
+ if (i * 2 + 1 < extra.length) {
+ extranibble[i] = (byte) ((extra[i * 2 + 0] << 4) | extra[i * 2 + 1]);
+ } else {
+ extranibble[i] = (byte) (extra[i * 2 + 0] << 4);
+ }
+ }
+
+
+ compound.setByteArray("Blocks", blocks);
+ compound.setByteArray("Data", meta);
+ compound.setString("Materials", "Classic");
+ if (extraEx) {
+ compound.setByteArray("AddBlocks", extranibble);
+ }
+ compound.setTag("Entities", new NBTTagList());
+ compound.setTag("TileEntities", tileEntitiesList);
+
+ return compound;
}
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoomMatchDisplayPane.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoomMatchDisplayPane.java
new file mode 100755
index 00000000..7188c8a7
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoomMatchDisplayPane.java
@@ -0,0 +1,119 @@
+package kr.syeyoung.dungeonsguide.roomedit.panes;
+
+import kr.syeyoung.dungeonsguide.config.guiconfig.FeatureEditPane;
+import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
+import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoomInfoRegistry;
+import kr.syeyoung.dungeonsguide.roomedit.MPanel;
+import kr.syeyoung.dungeonsguide.utils.ArrayUtils;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import scala.actors.threadpool.Arrays;
+
+import java.awt.*;
+import java.util.UUID;
+
+public class RoomMatchDisplayPane extends MPanel {
+
+ private int offsetX = 0;
+ private int offsetY = 0;
+
+ private DungeonRoom dungeonRoom;
+
+ private int[][] currentBlocks, targetBlocks;
+ public RoomMatchDisplayPane(DungeonRoom dungeonRoom, UUID uid, int rotation) {
+ this.dungeonRoom = dungeonRoom;
+
+ currentBlocks = dungeonRoom.getDungeonRoomInfo().getBlocks();
+ targetBlocks = DungeonRoomInfoRegistry.getByUUID(uid).getBlocks();
+ for (int i = 0; i < rotation; i++)
+ targetBlocks = ArrayUtils.rotateCounterClockwise(targetBlocks);
+ }
+
+ @Override
+ public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle clip) {
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+
+ int height = Math.max(currentBlocks.length, targetBlocks.length);
+ int width = Math.max(currentBlocks[0].length, targetBlocks[0].length);
+
+ // draw Axis;
+ Gui.drawRect(0,0,10,10,0x77777777);
+ clip(sr, clip.x + 10, clip.y, clip.width - 10, 10);
+ Gui.drawRect(0,0,getBounds().width, getBounds().height, 0x77777777);
+ for (int x = 0; x < width; x++) {
+ fr.drawString(x+"", x * 16 +10 + offsetX, 0, 0xFFFFFFFF);
+ }
+ clip(sr, clip.x, clip.y +10, 10, clip.height-10);
+ Gui.drawRect(0,0,getBounds().width, getBounds().height, 0x77777777);
+ for (int z = 0; z < height; z++) {
+ fr.drawString(z+"", 2, z * 16 + 10 + offsetY, 0xFFFFFFFF);
+ }
+
+ int hoverX = (relMousex0 - offsetX - 10) / 16;
+ int hoverY = (relMousey0 - offsetY - 10) / 16;
+ // draw Content
+ clip(sr, clip.x + 10, clip.y +10, clip.width - 10, clip.height - 10);
+ for (int z = 0; z < height; z++) {
+ for (int x = 0; x < width; x++) {
+ int data1;
+ try { data1 = currentBlocks[z][x]; } catch (Exception e) {
+ data1 = -2;
+ }
+ int data2;
+ try { data2 = targetBlocks[z][x]; } catch (Exception e) {
+ data2 = -2;
+ }
+
+ if (z == hoverY && x == hoverX) {
+ Gui.drawRect(x *16 +10+offsetX, z *16 +10 + offsetY, x *16 +26 +offsetX, z *16 +26 + offsetY, 0xAA505050);
+ }
+
+ if (data1 == data2) drawItemStack(new ItemStack(Item.getItemFromBlock(Block.getBlockById(data1)), 1), x * 16 +10 + offsetX, z *16 +10 + offsetY);
+ else if (data2 == -1 || data1 == -1) {
+ drawItemStack(new ItemStack(Item.getItemFromBlock(Block.getBlockById(data1 == -1 ? data2 : data1)), 1), x * 16 +10 + offsetX, z *16 +10 + offsetY);
+ fr.drawString("S", x *16 +10 + offsetX, z *16 +10 + offsetY,0xFFFFFF00);
+ } else {
+ fr.drawString("N", x *16 +10 + offsetX, z *16 +10 + offsetY,0xFFFF0000);
+ }
+ if (z == hoverY && x == hoverX) {
+ FeatureEditPane.drawHoveringText(Arrays.asList(new String[] {"Expected "+data2 +" But found "+data1}), relMousex0, relMousey0, fr);
+ }
+ }
+ }
+
+ }
+ private void drawItemStack(ItemStack stack, int x, int y)
+ {
+ Minecraft.getMinecraft().getRenderItem().renderItemAndEffectIntoGUI(stack, x, y);
+ }
+
+ @Override
+ public void resize(int parentWidth, int parentHeight) {
+ this.setBounds(new Rectangle(5,5,parentWidth-10,parentHeight-10));
+ }
+
+ private int lastX;
+ private int lastY;
+ @Override
+ public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) {
+ lastX = absMouseX;
+ lastY = absMouseY;
+ }
+
+ @Override
+ public void mouseClickMove(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int clickedMouseButton, long timeSinceLastClick) {
+ int dX = absMouseX - lastX;
+ int dY = absMouseY - lastY;
+ offsetX += dX;
+ offsetY += dY;
+ lastX = absMouseX;
+ lastY = absMouseY;
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoommatchingPane.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoommatchingPane.java
new file mode 100755
index 00000000..5369f40a
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoommatchingPane.java
@@ -0,0 +1,68 @@
+package kr.syeyoung.dungeonsguide.roomedit.panes;
+
+import kr.syeyoung.dungeonsguide.dungeon.actions.ActionChangeState;
+import kr.syeyoung.dungeonsguide.dungeon.actions.tree.ActionTree;
+import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
+import kr.syeyoung.dungeonsguide.roomedit.MPanel;
+import kr.syeyoung.dungeonsguide.roomedit.elements.MButton;
+import kr.syeyoung.dungeonsguide.roomedit.elements.MTextField;
+
+import java.awt.*;
+import java.util.UUID;
+
+public class RoommatchingPane extends MPanel {
+ private DungeonRoom dungeonRoom;
+
+ private RoomMatchDisplayPane displayPane;
+
+ private MTextField textField;
+ private MButton calculate;
+ public RoommatchingPane(final DungeonRoom dungeonRoom) {
+ this.dungeonRoom = dungeonRoom;
+
+ {
+ textField = new MTextField();
+ textField.setBounds(new Rectangle(0,0,getBounds().width - 100, 20));
+ add(textField);
+ }
+ {
+ calculate = new MButton();
+ calculate.setBounds(new Rectangle(getBounds().width - 100,0,100, 20));
+ calculate.setText("match");
+ calculate.setOnActionPerformed(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ remove(displayPane);
+
+ String text = textField.getText();
+ String target = text.split(":")[0];
+ String state = text.split(":")[1];
+
+ UUID uid = UUID.fromString(target);
+ int rotation = Integer.parseInt(state) % 4;
+
+
+ displayPane = new RoomMatchDisplayPane(dungeonRoom, uid, rotation);
+ displayPane.setBounds(new Rectangle(0,25,getBounds().width,getBounds().height-25));
+ add(displayPane);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ });
+ add(calculate);
+ }
+ }
+
+ @Override
+ public void resize(int parentWidth, int parentHeight) {
+ this.setBounds(new Rectangle(5,5,parentWidth-10,parentHeight-10));
+ }
+
+ @Override
+ public void onBoundsUpdate() {
+ textField.setBounds(new Rectangle(0,0,getBounds().width - 100, 20));
+ calculate.setBounds(new Rectangle(getBounds().width - 100,0,100, 20));
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorNecron.java b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorNecron.java
new file mode 100644
index 00000000..85277e76
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorNecron.java
@@ -0,0 +1,61 @@
+package kr.syeyoung.dungeonsguide.roomprocessor.bossfight;
+
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import net.minecraft.entity.item.EntityArmorStand;
+import net.minecraftforge.event.entity.living.LivingEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BossfightProcessorNecron extends GeneralBossfightProcessor {
+ public BossfightProcessorNecron() {
+ addPhase(PhaseData.builder()
+ .phase("start")
+ .signatureMsg("§r§c[BOSS] Bonzo§r§f: Gratz for making it this far, but I’m basically unbeatable.§r")
+ .nextPhase("fight-1").build()
+ );
+ addPhase(PhaseData.builder()
+ .phase("fight-1")
+ .signatureMsg("§r§c[BOSS] Bonzo§r§f: I can summon lots of undead! Check this out.§r")
+ .nextPhase("first-defeat").build()
+ );
+ addPhase(PhaseData.builder()
+ .phase("first-defeat")
+ .signatureMsg("§r§c[BOSS] Bonzo§r§f: Oh I'm dead!§r").signatureMsg("§r§c[BOSS] Bonzo§r§f: Hoho, looks like you killed me!§r")
+ .nextPhase("fight-2").build()
+ );
+ addPhase(PhaseData.builder()
+ .phase("fight-2")
+ .signatureMsg("§r§c[BOSS] Bonzo§r§f: Sike§r").signatureMsg("§r§c[BOSS] Bonzo§r§f: I can revive myself and become much stronger!§r")
+ .nextPhase("final-defeat").build()
+ );
+ addPhase(PhaseData.builder()
+ .phase("final-defeat")
+ .signatureMsg("§r§c[BOSS] Bonzo§r§f: Alright, maybe I'm just weak after all..§r").build()
+ );
+ }
+
+
+ @Override
+ public List<HealthData> getHealths() {
+ List<HealthData> healths = new ArrayList<HealthData>();
+ long health = 0;
+ if (bonzoStand != null) {
+ String name = TextUtils.stripColor(bonzoStand.getName());
+ String healthPart = name.split(" ")[2];
+ health = TextUtils.reverseFormat(healthPart.substring(0, healthPart.length() - 1));
+ }
+ healths.add(new HealthData("Bonzo", (int) health,250000 , this.getCurrentPhase().startsWith("fight-")));
+ return healths;
+ }
+
+ private EntityArmorStand bonzoStand;
+ @Override
+ // §e﴾ §c§lBonzo§r §e71k§c❤ §e﴿
+ // §e﴾ §c§lBonzo§r §a250k§c❤ §e﴿
+ public void onEntitySpawn(LivingEvent.LivingUpdateEvent updateEvent) {
+ if (updateEvent.entityLiving.getName().contains("❤") && updateEvent.entityLiving instanceof EntityArmorStand) {
+ System.out.println(updateEvent.entityLiving.getName());
+ }
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/utils/MapUtils.java b/src/main/java/kr/syeyoung/dungeonsguide/utils/MapUtils.java
index 78c605d4..ea08c8b6 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/utils/MapUtils.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/utils/MapUtils.java
@@ -19,7 +19,7 @@ public class MapUtils {
public static void record(byte[] colors, int x, int y, Color c) {
MapUtils.colors = colors;
- colorMasks[y *128 +x] = new Color(255, 255, 255, 50);
+ colorMasks[y *128 +x] = c;
}
public static byte getMapColorAt(byte[] colors, int x, int y) {