uwu
This commit is contained in:
		
					parent
					
						
							
								b0b395f068
							
						
					
				
			
			
				commit
				
					
						e46929b4b4
					
				
			
		
					 8 changed files with 260 additions and 148 deletions
				
			
		|  | @ -15,11 +15,16 @@ import org.bukkit.entity.Display; | |||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.util.Transformation; | ||||
| import org.joml.Vector2i; | ||||
| import org.joml.Vector3f; | ||||
| import com.google.common.base.Preconditions; | ||||
| import de.lunarakai.minecleaner.game.BoardSize; | ||||
| import de.lunarakai.minecleaner.game.Cell; | ||||
| import de.lunarakai.minecleaner.game.Cell.CellType; | ||||
| import de.lunarakai.minecleaner.game.Game; | ||||
| import de.lunarakai.minecleaner.game.Tile.TileType; | ||||
| import de.lunarakai.minecleaner.utils.MinecleanerHeads; | ||||
| import net.md_5.bungee.api.ChatColor; | ||||
| 
 | ||||
| public class MinecleanerArena { | ||||
|     private final MinecleanerPlugin plugin; | ||||
|  | @ -30,6 +35,7 @@ public class MinecleanerArena { | |||
|     private final BlockFace orientation; | ||||
|     private ArenaStatus arenaStatus = ArenaStatus.INACTIVE; | ||||
|     private UUID[] blockDisplays = new UUID[81]; // todo needs to be of size boardSizes[widthIndex] | ||||
|     private TileType[] currentMinecleaerTileTypesState; | ||||
|      | ||||
|     private Player currentPlayer; | ||||
|     private long currentGameStartTime; | ||||
|  | @ -163,6 +169,7 @@ public class MinecleanerArena { | |||
| 
 | ||||
|                 loc.set(location.getX() + 0.11 - (d1x * fz) / 3.0 + d0x * 0.501 + d1x * 1.847, location.getY() - 0.9725 + fxf / 3.0, location.getZ() + 0.45 - (d1z * fz) / 3.0 + d0z * 0.501 + d1z * 1.847); | ||||
| 
 | ||||
|                 // Todo: ItemDisplay für Köpfe | ||||
|                 Display blockDisplay = world.spawn(loc, BlockDisplay.class, blockdisplay -> { | ||||
|                     Transformation transformation = blockdisplay.getTransformation(); | ||||
|                     Transformation newTransform; | ||||
|  | @ -203,9 +210,20 @@ public class MinecleanerArena { | |||
|         arenaSection.set("blockdisplays", blockDisplays); | ||||
|     } | ||||
| 
 | ||||
|     private void setDiplayBlock(int x, int y, Material block) { | ||||
|         UUID blockDisplayId = blockDisplays[x + y *9]; | ||||
|         Entity blockDisplay = blockDisplayId != null ? location.getWorld().getEntity(blockDisplayId) : null; | ||||
|         if(blockDisplay instanceof BlockDisplay) { | ||||
|             BlockDisplay display = (BlockDisplay) blockDisplay; | ||||
|             display.setBlock(block.createBlockData()); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public void startNewGame() { | ||||
|         currentMinecleanerGame = new Game(); | ||||
|         currentMinecleanerGame = new Game(plugin, 9, 12); | ||||
|         currentMinecleanerGame.start(); | ||||
|         //currentMinecleaerTileTypes = currentMinecleanerGame.getMinecleanerPuzzle(widthIndex, widthIndex); | ||||
|         arenaStatus = ArenaStatus.PLAYING; | ||||
|     } | ||||
| 
 | ||||
|  | @ -219,6 +237,13 @@ public class MinecleanerArena { | |||
|     public void removePlayer() { | ||||
|         this.arenaStatus = ArenaStatus.INACTIVE; | ||||
|         this.currentPlayer = null; | ||||
|         this.currentMinecleanerGame = null; | ||||
|          | ||||
|         for(int x = 0; x < 9; x++) { | ||||
|             for(int y = 0; y < 9; y++) { | ||||
|                 setDiplayBlock(x, y, Material.BEDROCK); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // block displays dont get removed | ||||
|  | @ -228,7 +253,7 @@ public class MinecleanerArena { | |||
|             for(int fy = 0; fy < 9; fy++) { | ||||
|                 UUID blockDisplayUuid = blockDisplays[fx + fy * 9]; | ||||
|                 Entity blockDisplayEntity = blockDisplayUuid != null ? world.getEntity(blockDisplayUuid) : null; | ||||
|                 if(blockDisplayEntity instanceof Display blockDisplay) { | ||||
|                 if(blockDisplayEntity instanceof Display blockdisplay) { | ||||
|                     blockDisplayEntity.remove();  | ||||
|                 } | ||||
|             } | ||||
|  | @ -238,24 +263,137 @@ public class MinecleanerArena { | |||
|     public void flagCell(int x, int y) { | ||||
|         if(currentMinecleanerGame != null) { | ||||
|             int id = x + y * 9; | ||||
|             boolean unflaggedCell = currentMinecleanerGame.flag(x, y); | ||||
|             if(!unflaggedCell) { | ||||
| 
 | ||||
|             Cell cell = currentMinecleanerGame.getCell(x, y); | ||||
|             Player player = this.currentPlayer; | ||||
|             player.sendMessage(ChatColor.GOLD + "Cell: Pos(" + cell.position.x + "," + cell.position.y + "):" + " Is Flagged: " + cell.flagged + " ,Exploded: " | ||||
|                 + cell.exploded + " Is Revealed: " + cell.revealed + ", CellType: " + cell.getType()); | ||||
|             if(cell.getType() == CellType.Number) { | ||||
|                 player.sendMessage(ChatColor.GREEN + "  Number: " + cell.number); | ||||
|             } | ||||
| 
 | ||||
|             if(!cell.isRevealed() && !cell.isFlagged()) { | ||||
|                 // todo set flag head on block display | ||||
|             } else { | ||||
|                 currentMinecleanerGame.flag(x, y); | ||||
|                 setDiplayBlock(x, y, Material.ORANGE_CONCRETE); | ||||
|             } else if(!cell.isRevealed() && cell.isFlagged() ){ | ||||
|                 // todo set normal head on block display | ||||
|                 setDiplayBlock(x, y, Material.BEDROCK); | ||||
|             } else { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private boolean isRevealedCell(int x, int y) { | ||||
|         Cell cell = currentMinecleanerGame.getCell(x, y); | ||||
|         if(cell.revealed) { | ||||
|             return true; | ||||
|         }  | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public void revealCell(int x, int y) { | ||||
|         if(currentMinecleanerGame != null) { | ||||
|             int id = x + y * 9; | ||||
|             // todo check if cell is flagged already | ||||
|             //int id = x + y * 9; | ||||
|             Cell cell = currentMinecleanerGame.getCell(x, y); | ||||
|             Player player = this.currentPlayer; | ||||
|              | ||||
|             player.sendMessage(ChatColor.GOLD + "Cell: Pos(" + cell.position.x + "," + cell.position.y + "):" + " Is Flagged: " + cell.flagged + " ,Exploded: " | ||||
|                 + cell.exploded + " Is Revealed: " + cell.revealed + ", CellType: " + cell.getType()); | ||||
|              | ||||
|             if(cell.getType() == CellType.Number) { | ||||
|                 player.sendMessage(ChatColor.GREEN + "  Number: " + cell.number); | ||||
|             } | ||||
|              | ||||
|             currentMinecleanerGame.reveal(x, y); | ||||
|             setBlockForCellType(x, y, cell); | ||||
|              | ||||
| 
 | ||||
|             ArrayList<Cell> floodedCells = currentMinecleanerGame.getfloodedCells(); | ||||
|             if(floodedCells != null) { | ||||
|                 player.sendMessage(ChatColor.GREEN + "  Flooded Cells: [" + floodedCells.size() + "]"); | ||||
|              | ||||
|                 for(int i = 0; i < floodedCells.size(); i++) { | ||||
|                     Vector2i pos = floodedCells.get(i).position; | ||||
|                     player.sendMessage(ChatColor.GREEN + "  Cell(" + pos.x + pos.y + ")"); | ||||
|                     setBlockForCellType(pos.x, pos.y, floodedCells.get(i)); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|              | ||||
| 
 | ||||
|             // Todo: Logic for flood | ||||
|             // todo update block of blockdisplay | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void setBlockForCellType(int x, int y, Cell cell) { | ||||
|         switch (cell.getType()) { | ||||
|             case Empty: { | ||||
|                 if(!cell.isRevealed() || !cell.isFlagged() || !cell.isExploded()) {   | ||||
|                     setDiplayBlock(x, y, Material.GRAY_CONCRETE); | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|             case Number: { | ||||
|                 if(!cell.isRevealed() || !cell.isFlagged() || !cell.isExploded()) { | ||||
|                     switch(cell.number) { | ||||
|                         case 1: { | ||||
|                             setDiplayBlock(x, y, Material.LIME_CONCRETE_POWDER);  | ||||
|                             break; | ||||
|                         } | ||||
|                         case 2: { | ||||
|                             setDiplayBlock(x, y, Material.GREEN_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         case 3: { | ||||
|                             setDiplayBlock(x, y, Material.YELLOW_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         case 4: { | ||||
|                             setDiplayBlock(x, y, Material.ORANGE_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         case 5: { | ||||
|                             setDiplayBlock(x, y, Material.RED_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         case 6: { | ||||
|                             setDiplayBlock(x, y, Material.LIGHT_BLUE_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         case 7: { | ||||
|                             setDiplayBlock(x, y, Material.BLUE_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         case 8: { | ||||
|                             setDiplayBlock(x, y, Material.BLACK_CONCRETE_POWDER); | ||||
|                             break; | ||||
|                         } | ||||
|                         default: { | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|             case Mine: { | ||||
|                 if(cell.exploded) { | ||||
|                     setDiplayBlock(x, y, Material.YELLOW_CONCRETE); | ||||
|                 } | ||||
|                 setDiplayBlock(x, y, Material.TNT); | ||||
|                 break; | ||||
|             } | ||||
|             default: { | ||||
|                 // Invalid | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private int matchWidthIndexToActualWidth(int widthIndex) { | ||||
|         switch (widthIndex) { | ||||
|             case 0: | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ public class MinecleanerListener implements Listener { | |||
| 
 | ||||
|                         Player player = e.getPlayer(); | ||||
|                         //RayTraceResult rayTraceResult = player.getWorld().rayTraceBlocks(player.getEyeLocation(), player.getEyeLocation().getDirection(), 64.0); | ||||
|                         RayTraceResult r2 = player.rayTraceBlocks(64.0); | ||||
|                         RayTraceResult r2 = player.rayTraceBlocks(20.0); | ||||
| 
 | ||||
|                         //Location loc = e.getInteractionPoint().clone().subtract(arena.getLocation()).subtract(0.5, 0.5, 0.5); // null on left-click | ||||
| 
 | ||||
|  | @ -62,15 +62,17 @@ public class MinecleanerListener implements Listener { | |||
|                         if(r2 != null) { | ||||
|                             Vector hitPos = r2.getHitPosition(); | ||||
|                             //Vector hitPos = rayTraceResult.getHitPosition(); | ||||
|                             Location loc = player.getLocation().add(hitPos.subtract(arena.getLocation().toVector())).clone().subtract(arena.getLocation()).subtract(0.5, 0.5, 0.5); // substract 0.5, 0.5, 0.5 | ||||
|                             Vector substract = new Vector(0.5, 0.5, 0.5); | ||||
| 
 | ||||
|                             Location loc = hitPos.subtract(arena.getLocation().toVector()).subtract(substract).toLocation(player.getWorld()); //(0.5, 0.5, 0.5); // substract 0.5, 0.5, 0.5 | ||||
|                             double lx = loc.getX(); | ||||
|                             double ly = loc.getY(); | ||||
|                             double lz = loc.getZ(); | ||||
|                             player.sendMessage(ChatColor.GRAY + "lx: " + lx + " ,ly: " + ly + " ,lz: " + lz); | ||||
|                             double dy = ly + 2.5; // 1.5 | ||||
|                             player.sendMessage(ChatColor.GRAY + "dy: " + dy); | ||||
|                             double dz = -d1x * lx - d1z * lz + 2.0; // 1.5 | ||||
|                             player.sendMessage(ChatColor.GRAY + "dz: " + dz); | ||||
|                             //player.sendMessage(ChatColor.GRAY + "lx: " + lx + " ,ly: " + ly + " ,lz: " + lz); | ||||
|                             double dy = ly + 1.5; // 1.5 | ||||
|                             //player.sendMessage(ChatColor.GRAY + "dy: " + dy); | ||||
|                             double dz = -d1x * lx - d1z * lz + 1.5; // 1.5 | ||||
|                             //player.sendMessage(ChatColor.GRAY + "dz: " + dz); | ||||
| 
 | ||||
|                             double blockx = (dy / 3.0) * 9.0; | ||||
|                             double blockz = (dz / 3.0) * 9.0; | ||||
|  | @ -96,8 +98,8 @@ public class MinecleanerListener implements Listener { | |||
|                             } | ||||
|                             */ | ||||
| 
 | ||||
|                             player.sendMessage(ChatColor.GRAY + "blockx: " + blockx + " ,blockz: " + blockz); | ||||
|                             player.sendMessage(ChatColor.GRAY + "blockxInt: " + blockxInt + " ,blockzInt: " + blockzInt); | ||||
|                             //player.sendMessage(ChatColor.GRAY + "blockx: " + blockx + " ,blockz: " + blockz); | ||||
|                            // player.sendMessage(ChatColor.GRAY + "blockxInt: " + blockxInt + " ,blockzInt: " + blockzInt); | ||||
| 
 | ||||
|                             if (blockx >= 0.1 && blockx <= 0.9 && blockz >= 0.1 && blockz <= 0.9) { | ||||
|                                 boolean hasRightClicked = false; | ||||
|  | @ -107,7 +109,7 @@ public class MinecleanerListener implements Listener { | |||
|                                 // TODO Doesnt show messages for Cells: [ROW] [>5] (6, 7, 8 are missing) | ||||
| 
 | ||||
|                                 player.sendMessage("Arena click! " + blockxInt + " " + blockzInt + " Right Clicked: " + hasRightClicked); | ||||
|                                 //plugin.getManager().handleFieldClick(e.getPlayer(), blockxInt, blockzInt, hasRightClicked); | ||||
|                                 plugin.getManager().handleFieldClick(e.getPlayer(), blockxInt, blockzInt, hasRightClicked); | ||||
|                             } | ||||
|                         } | ||||
|                          | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import org.bukkit.entity.Player; | |||
| import org.bukkit.event.inventory.InventoryType; | ||||
| import org.bukkit.inventory.Inventory; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| import com.google.common.base.Preconditions; | ||||
| import de.iani.cubesidestats.api.PlayerStatistics; | ||||
| import de.iani.cubesidestats.api.PlayerStatisticsQueryKey; | ||||
|  | @ -86,6 +87,20 @@ public class MinecleanerManager { | |||
|         return confirmPlayingInventory; | ||||
|     } | ||||
| 
 | ||||
|     public void handleFieldClick(@NotNull Player player, int x, int y, boolean hasRightClicked) { | ||||
|         MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player); | ||||
|         Preconditions.checkArgument(arena != null, "player is in no arena"); | ||||
|         Preconditions.checkState(arena.getArenaStatus() == ArenaStatus.PLAYING, "not running"); | ||||
| 
 | ||||
|         if(hasRightClicked) { | ||||
|             // flag | ||||
|             arena.flagCell(x, y); | ||||
|         } else { | ||||
|             // reveal | ||||
|             arena.revealCell(x, y); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void getStatisticsForPlayer(OfflinePlayer player, Consumer<PlayerStatisticsData> callback) { | ||||
|         List<StatisticsQueryKey> keys = new ArrayList<>(); | ||||
|         PlayerStatistics pStatistics = plugin.getCubesideStatistics().getStatistics(player.getUniqueId()); | ||||
|  |  | |||
|  | @ -1,76 +0,0 @@ | |||
| package de.lunarakai.minecleaner; | ||||
| 
 | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.joml.Vector2d; | ||||
| import org.joml.Vector2i; | ||||
| 
 | ||||
| public class MinecleanerRayTrace { | ||||
|     MinecleanerPlugin plugin; | ||||
|      | ||||
|     Location arenaFieldCenterLocation; | ||||
|     Location playerEyeLocation; | ||||
| 
 | ||||
|     // get center of arena field -> define as (0,0) for now | ||||
|     // -> get clicked block | ||||
|     // --> get clicked cell on that block | ||||
|     // ---> get distance from clicked cell to arena center | ||||
|     // ----> do math idk?? | ||||
| 
 | ||||
|     /* Example on Board with Width Index 0 (9*9) | ||||
|      * | ||||
|      *  | ||||
|      *       |                                                                | | ||||
|      * ------|----------------------------------------------------------------|--  | ||||
|      * (8,x) | (8,0)  (8,1)  (8,2)  (8,3)  (8,4)  (8,5)  (8,6)  (8,7)  (8,8)  |  | ||||
|      *       |                                                                |   | ||||
|      * (7,x) | (7,0)  (7,1)  (7,2)  (7,3)  (7,4)  (7,5)  (7,6)  (7,7)  (7,8)  |  | ||||
|      *       |                                                                | | ||||
|      * (6,x) | (6,0)  (6,1)  (6,2)  (6,3)  (6,4)  (6,5)  (6,6)  (6,7)  (6,8)  |  | ||||
|      *       |                                                                | | ||||
|      * (5,x) | (5,0)  (5,1)  (5,2)  (5,3)  (5,4)  (5,5)  (5,6)  (5,7)  (5,8)  | | ||||
|      *       |                                                                | | ||||
|      * (4,x) | (4,0)  (4,1)  (4,2)  (4,3)  (4,4)  (4,5)  (4,6)  (4,7)  (4,8)  | | ||||
|      *       |                                                                | | ||||
|      * (3,x) | (3,0)  (3,1)  (3,2)  (3,3)  (3,4)  (3,5)  (3,6)  (3,7)  (3,8)  | | ||||
|      *       |                                                                | | ||||
|      * (2,x) | (2,0)  (2,1)  (2,2)  (2,3)  (2,4)  (2,5)  (2,6)  (2,7)  (2,8)  | | ||||
|      *       |                                                                | | ||||
|      * (1,x) | (1,0)  (1,1)  (1,2)  (1,3)  (1,4)  (1,5)  (1,6)  (1,7)  (1,8)  | | ||||
|      *       |                                                                | | ||||
|      * (0,x) | (0,0)  (0,1)  (0,2)  (0,3)  (0,4)  (0,5)  (0,6)  (0,7)  (0,8)  | | ||||
|      * ------|----------------------------------------------------------------|-- | ||||
|      *       | (y,0)  (y,1)  (y,2)  (y,3)  (y,4)  (y,5)  (y,6)  (y,7)  (y,8)  | | ||||
|      */ | ||||
| 
 | ||||
|     public MinecleanerRayTrace(MinecleanerPlugin plugin, MinecleanerArena arena, Player player) { | ||||
|         this.plugin = plugin; | ||||
|         this.playerEyeLocation = player.getEyeLocation(); | ||||
| 
 | ||||
|         arenaFieldCenterLocation = arena.getLocation().add(0.5, 0.5, 0.5); | ||||
|      | ||||
|     } | ||||
| 
 | ||||
|     public Vector2i getClickedCellPosition(Location rayTracedBlock) { | ||||
|         Vector2d fieldCenter = new Vector2d(4.0,4.0); | ||||
|         Vector2d blockVector = new Vector2d(rayTracedBlock.toVector().getX(), rayTracedBlock.toVector().getZ()); | ||||
| 
 | ||||
|         //double lengthblockVector = blockVector.length(); | ||||
|         double distanceBlockFromFieldCenter = fieldCenter.sub(blockVector).length(); | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         double distanceFieldCenterPlayerEyeLocation = returnDistanceBetweenTwoLocations(playerEyeLocation, arenaFieldCenterLocation); | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private double returnDistanceBetweenTwoLocations(Location loc1, Location loc2) { | ||||
|         double distance = loc1.distance(loc2); | ||||
|         return distance; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -1,6 +1,6 @@ | |||
| package de.lunarakai.minecleaner.game; | ||||
| 
 | ||||
| import org.joml.Vector3i; | ||||
| import org.joml.Vector2i; | ||||
| 
 | ||||
| public class Cell { | ||||
|     public enum CellType { | ||||
|  | @ -11,9 +11,10 @@ public class Cell { | |||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public Vector3i position; | ||||
|     public Vector2i position; | ||||
|     public CellType type; | ||||
|     public int number; | ||||
|      | ||||
|     public boolean revealed; | ||||
|     public boolean flagged; | ||||
|     public boolean exploded; | ||||
|  | @ -26,4 +27,26 @@ public class Cell { | |||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     public void setRevealed() { | ||||
|         this.revealed = true; | ||||
|     } | ||||
|     public boolean isRevealed() { | ||||
|         return revealed; | ||||
|     } | ||||
| 
 | ||||
|     public void setFlaggedState(boolean flag) { | ||||
|         this.flagged = flag; | ||||
|     } | ||||
|     public boolean isFlagged() { | ||||
|         return flagged; | ||||
|     } | ||||
| 
 | ||||
|     public void setExploded() { | ||||
|         this.exploded = true; | ||||
|     } | ||||
|     public boolean isExploded() { | ||||
|         return revealed; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -1,18 +1,32 @@ | |||
| package de.lunarakai.minecleaner.game; | ||||
| 
 | ||||
| import org.joml.Vector3i; | ||||
| import java.util.ArrayList; | ||||
| import org.joml.Vector2i; | ||||
| import de.lunarakai.minecleaner.MinecleanerPlugin; | ||||
| import de.lunarakai.minecleaner.utils.MathUtils; | ||||
| 
 | ||||
| public class Game { | ||||
|     public boolean gameover; | ||||
| 
 | ||||
|     private MinecleanerPlugin plugin;  | ||||
|     private int width; | ||||
|     private int height; | ||||
|     private int mineCount; | ||||
| 
 | ||||
|     public int width; | ||||
|     public int height; | ||||
|     private int mineCount = 10; | ||||
|     private Cell[][] state; | ||||
|     private boolean gameover; | ||||
|     private Board board; | ||||
|     private BoardSize boardSize; | ||||
|     private Tilemap tilemap; | ||||
|     private ArrayList<Cell> floodedCells; | ||||
| 
 | ||||
|     public Game(MinecleanerPlugin plugin, int width, int mineCount) { | ||||
|         this.plugin = plugin; | ||||
|         this.width = width; | ||||
|         this.height = width; | ||||
|         this.mineCount = mineCount; | ||||
| 
 | ||||
|         this.floodedCells = new ArrayList<>(); | ||||
|     } | ||||
| 
 | ||||
|     private void onValidate() { | ||||
|         mineCount = MathUtils.clamp(mineCount, 0, width*height); | ||||
|  | @ -20,15 +34,6 @@ public class Game { | |||
| 
 | ||||
|     public void start() { | ||||
|         board = new Board(); | ||||
| 
 | ||||
|         int[] _boardSizes = boardSize.boardSizes; | ||||
|         int[] _mineCounter = boardSize.mineCounter; | ||||
| 
 | ||||
|         int _boardSizeIndex = 0; | ||||
|         width = _boardSizes[_boardSizeIndex]; | ||||
|         height = _boardSizes[_boardSizeIndex]; | ||||
|         mineCount = _mineCounter[_boardSizeIndex]; | ||||
| 
 | ||||
|         newGame(); | ||||
|     } | ||||
| 
 | ||||
|  | @ -51,7 +56,7 @@ public class Game { | |||
|         for (int x = 0; x < width; x ++) { | ||||
|             for (int y = 0; y < height; y++) { | ||||
|                 Cell cell = new Cell(); | ||||
|                 cell.position = new Vector3i(x, 0, y); | ||||
|                 cell.position = new Vector2i(x, y); | ||||
|                 cell.setType(Cell.CellType.Empty); | ||||
|                 state[x][y] = cell; | ||||
|             } | ||||
|  | @ -99,6 +104,10 @@ public class Game { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public Tilemap getMinecleanerTilemap() { | ||||
|         return tilemap; | ||||
|     } | ||||
| 
 | ||||
|     private int countMines(int cellX, int cellY) { | ||||
|         int count = 0; | ||||
| 
 | ||||
|  | @ -119,78 +128,76 @@ public class Game { | |||
|         return count; | ||||
|     } | ||||
| 
 | ||||
|     public boolean flag(int x, int y) { | ||||
|         // TODO: Vector3 worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); <- Unity | ||||
|         //Vector3i cellPosition = null; // TODO board.tilemap.WorldToCell(worldPosition); <- Unity | ||||
|     public void flag(int x, int y) { | ||||
|         Cell cell = getCell(x, y); | ||||
| 
 | ||||
|         if (cell.getType() == Cell.CellType.Invalid || cell.revealed) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         boolean isFlaggedAlready = false; | ||||
|         if(cell.flagged) { | ||||
|             isFlaggedAlready = true; | ||||
|         if (cell.getType() == Cell.CellType.Invalid || cell.isRevealed()) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         cell.flagged = !cell.flagged; | ||||
|         state[x][y] = cell; | ||||
|         board.draw(state, tilemap); | ||||
|         return isFlaggedAlready; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     public boolean reveal(int x, int y) { | ||||
|         // TODO: Vector3 worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); <- Unity | ||||
|         //Vector3i cellPosition = null; // TODO board.tilemap.WorldToCell(worldPosition); <- Unity | ||||
|     public void reveal(int x, int y) { | ||||
|         Cell cell = getCell(x, y); | ||||
| 
 | ||||
|         if(cell.getType() == Cell.CellType.Invalid || cell.revealed || cell.flagged) { | ||||
|             return false; | ||||
|         if(cell.getType() == Cell.CellType.Invalid || cell.isRevealed() || cell.flagged) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         boolean hitMine = false; | ||||
|         //boolean hitMine = false; | ||||
| 
 | ||||
|         switch (cell.getType()) { | ||||
|             case Mine: | ||||
|             case Mine: { | ||||
|                 explode(cell); | ||||
|                 hitMine = true; | ||||
|                 break; | ||||
|             case Empty: | ||||
|             } | ||||
|             case Empty: { | ||||
|                 if(!floodedCells.isEmpty()) { | ||||
|                     floodedCells.clear(); | ||||
|                 } | ||||
|                 flood(cell); | ||||
|                 checkWinCondition(); | ||||
|                 break; | ||||
|             default: | ||||
|                 cell.revealed = true; | ||||
|             } | ||||
|             default: { | ||||
|                 cell.setRevealed(); | ||||
|                 state[x][y] = cell; | ||||
|                 checkWinCondition(); | ||||
|                 break; | ||||
|             } | ||||
|                  | ||||
|         } | ||||
|         board.draw(state, tilemap); | ||||
|         return hitMine; | ||||
|     } | ||||
| 
 | ||||
|     public void flood(Cell cell) { | ||||
|         if(cell.revealed) return; | ||||
|         if(cell.getType() == Cell.CellType.Mine || cell.getType() == Cell.CellType.Invalid) return; | ||||
|         if(cell.isRevealed()) return; | ||||
|         if(cell.getType() == Cell.CellType.Mine || cell.getType() == Cell.CellType.Invalid || cell.position != null) return; | ||||
| 
 | ||||
|         cell.revealed = true; | ||||
|         state[cell.position.x][cell.position.z] = cell; | ||||
|         cell.setRevealed(); | ||||
|         floodedCells.add(cell); | ||||
|         state[cell.position.x][cell.position.y] = cell; | ||||
| 
 | ||||
|          | ||||
|         if(cell.getType() == Cell.CellType.Empty) { | ||||
|             flood(getCell(cell.position.x -1, cell.position.z)); | ||||
|             flood(getCell(cell.position.x +1, cell.position.z)); | ||||
|             flood(getCell(cell.position.x, cell.position.z -1)); | ||||
|             flood(getCell(cell.position.x, cell.position.z +1)); | ||||
|             flood(getCell(cell.position.x -1, cell.position.y)); | ||||
|             flood(getCell(cell.position.x +1, cell.position.y)); | ||||
|             flood(getCell(cell.position.x, cell.position.y -1)); | ||||
|             flood(getCell(cell.position.x, cell.position.y +1)); | ||||
|         } | ||||
| 
 | ||||
|         // TODO return cellpos of flooded cell to update the block displays | ||||
|         // TODO: return cellpos of flooded cell to update the block displays | ||||
|     } | ||||
| 
 | ||||
|     private void explode(Cell cell) { | ||||
|         gameover = true; | ||||
|         cell.revealed = true; | ||||
|         cell.exploded = true; | ||||
|         state[cell.position.x][cell.position.z] = cell; | ||||
|         state[cell.position.x][cell.position.y] = cell; | ||||
| 
 | ||||
|         for (int x = 0; x < width; x++) { | ||||
|             for (int y = 0; y < height; y++) { | ||||
|  | @ -227,7 +234,7 @@ public class Game { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private Cell getCell(int x, int y) { | ||||
|     public Cell getCell(int x, int y) { | ||||
|         if(isValid(x,y)) { | ||||
|             return state[x][y]; | ||||
|         } else { | ||||
|  | @ -238,4 +245,8 @@ public class Game { | |||
|     private boolean isValid(int x, int y) { | ||||
|         return x >= 0 && x < width && y >= 0 && y < height; | ||||
|     } | ||||
| 
 | ||||
|     public ArrayList<Cell> getfloodedCells() { | ||||
|         return floodedCells; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ public class Tile { | |||
|         TileMine, | ||||
|         TileExploded, | ||||
|         TileFlag, | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public Tile.TileType tileType; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| package de.lunarakai.minecleaner.game; | ||||
| 
 | ||||
| import org.joml.Vector3i; | ||||
| import org.joml.Vector2i; | ||||
| 
 | ||||
| public class Tilemap { | ||||
| 
 | ||||
|  | @ -26,9 +26,9 @@ public class Tilemap { | |||
|         } | ||||
|     } | ||||
|     // Set method | ||||
|     public void setTile(Vector3i pos, Tile.TileType tileType) { | ||||
|     public void setTile(Vector2i pos, Tile.TileType tileType) { | ||||
|         int x = pos.x(); | ||||
|         int y = pos.z(); | ||||
|         int y = pos.y(); | ||||
| 
 | ||||
|         if (x >= 0 && x < tiles.length && y >= 0 && y < tiles[0].length) { | ||||
|             tiles[x][y].setTileType(tileType); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue