Dimensional Rifts are instanced party dungeons tied to the Seven Signs system. Parties enter progressively challenging rooms filled with monsters, culminating in boss encounters. Rifts require Dimensional Fragments as entry currency and provide experience, loot, and contribution to the Seven Signs event.
Dimensional Rifts are only accessible during specific Seven Signs periods and require coordinated party play.
Minimum Party Size: Configurable (default: 2-5 players)
Level Range: All members must be within level range for rift type
Location: All members must be in the waiting room zone
Entry Item: Dimensional Fragments (Item ID: 7079)
Source: DimensionalRiftManager.java:59-289
private static final int DIMENSIONAL_FRAGMENT_ITEM_ID = 7079;if (party.getMemberCount() < GeneralConfig.RIFT_MIN_PARTY_SIZE) { final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); html.setFile(player, "data/html/seven_signs/rift/SmallParty.htm"); html.replace("%npc_name%", npc.getName()); html.replace("%count%", Integer.toString(GeneralConfig.RIFT_MIN_PARTY_SIZE)); player.sendPacket(html); return;}
private void loadRooms() { try (Connection con = DatabaseFactory.getConnection(); Statement s = con.createStatement(); ResultSet rs = s.executeQuery("SELECT * FROM dimensional_rift") ) { while (rs.next()) { final byte type = rs.getByte("type"); final byte room_id = rs.getByte("room_id"); // Coords related final int xMin = rs.getInt("xMin"); final int xMax = rs.getInt("xMax"); final int yMin = rs.getInt("yMin"); final int yMax = rs.getInt("yMax"); final int z1 = rs.getInt("zMin"); final int z2 = rs.getInt("zMax"); final int xT = rs.getInt("xT"); final int yT = rs.getInt("yT"); final int zT = rs.getInt("zT"); final boolean isBossRoom = rs.getByte("boss") > 0; if (!_rooms.containsKey(type)) { _rooms.put(type, new HashMap<>(9)); } _rooms.get(type).put(room_id, new DimensionalRiftRoom(type, room_id, xMin, xMax, yMin, yMax, z1, z2, xT, yT, zT, isBossRoom) ); } } LOGGER.info(getClass().getSimpleName() + ": Loaded " + typeSize + " room types with " + roomSize + " rooms.");}
public synchronized void start(Player player, byte type, Npc npc) { boolean canPass = true; if (!player.isInParty()) { showHtmlFile(player, "data/html/seven_signs/rift/NoParty.htm", npc); return; } final Party party = player.getParty(); if (party.getLeaderObjectId() != player.getObjectId()) { showHtmlFile(player, "data/html/seven_signs/rift/NotPartyLeader.htm", npc); return; } if (party.isInDimensionalRift()) { handleCheat(player, npc); return; } if (party.getMemberCount() < GeneralConfig.RIFT_MIN_PARTY_SIZE) { // Show small party error return; } // Check if rift type is full if (!isAllowedEnter(type)) { player.sendMessage("Rift is full. Try later."); return; } // Validate all members are in waiting room for (Player p : party.getMembers()) { if (!checkIfInPeaceZone(p.getX(), p.getY(), p.getZ())) { canPass = false; } } if (!canPass) { showHtmlFile(player, "data/html/seven_signs/rift/NotInWaitingRoom.htm", npc); return; } // Consume dimensional fragments // Create rift instance // Teleport party}
public boolean checkIfInRiftZone(int x, int y, int z, boolean ignorePeaceZone) { if (ignorePeaceZone) { return _rooms.get((byte) 0).get((byte) 1).checkIfInZone(x, y, z); } return _rooms.get((byte) 0).get((byte) 1).checkIfInZone(x, y, z) && !_rooms.get((byte) 0).get((byte) 0).checkIfInZone(x, y, z);}public boolean checkIfInPeaceZone(int x, int y, int z) { return _rooms.get((byte) 0).get((byte) 0).checkIfInZone(x, y, z);}