leviath 6 Опубликовано 1 декабря, 2018 Всем привет! Ребят помогите что нужно прописать чтобы после телепорта коммунити боард закрывался автоматно а не кидал на страницу телепортаций? точнее скажу сразу что со знанием java у меня полный 0 могу что то поменять методом тыка а вот что то самому написать это проблема ) ну и сам исходинк телепорта помогите плиз )) package l2s.game.communitybbs.Manager; import java.sql.ResultSet; import java.util.StringTokenizer; import java.util.logging.Logger; import javolution.text.TextBuilder; import l2s.Config; import l2s.database.FiltredPreparedStatement; import l2s.database.L2DatabaseFactory; import l2s.database.ThreadConnection; import l2s.database.utils.DbUtils; import l2s.extensions.scripts.Functions; import l2s.game.cache.Msg; import l2s.game.geodata.GeoEngine; import l2s.game.instancemanager.TownManager; import l2s.game.instancemanager.ZoneManager; import l2s.game.model.L2Zone.ZoneType; import l2s.game.model.ZoneInfo; import l2s.game.model.actor.L2Player; import l2s.game.model.entity.residence.Castle; import l2s.game.network.serverpackets.ShowBoard; import l2s.util.Files; import l2s.util.Location; public class TeleportBBSManager extends AbstractBBSManager { private final static Logger _log = Logger.getLogger(TeleportBBSManager.class.getName()); public static final class CBteleport { public int TpId = 0; // Teport loc ID public String TpName = ""; // Loc name public int PlayerId = 0; // charID public int xC = 0; // Location coords public int yC = 0; // public int zC = 0; // } @SuppressWarnings("synthetic-access") private static class SingletonHolder { protected static final TeleportBBSManager _instance = new TeleportBBSManager(); } public static TeleportBBSManager getInstance() { return SingletonHolder._instance; } public String points[][]; public void parsecmd(final String command, final L2Player player) { if(command.equals("_bbsteleport;")) showTp(player); else if(command.startsWith("_bbsteleport;delete;")) { final StringTokenizer stDell = new StringTokenizer(command, ";"); stDell.nextToken(); stDell.nextToken(); final int TpNameDell = Integer.parseInt(stDell.nextToken()); delTp(player, TpNameDell); showTp(player); } else if(command.startsWith("_bbsteleport;save;")) { final StringTokenizer stAdd = new StringTokenizer(command, ";"); stAdd.nextToken(); stAdd.nextToken(); String TpNameAdd = null; try { TpNameAdd = stAdd.nextToken(); } catch(final Exception e) { showTp(player); return; } AddTp(player, TpNameAdd.trim()); showTp(player); } else if(command.startsWith("_bbsteleport;teleport;")) { final StringTokenizer stGoTp = new StringTokenizer(command, " "); stGoTp.nextToken(); final int xTp = Integer.parseInt(stGoTp.nextToken()); final int yTp = Integer.parseInt(stGoTp.nextToken()); final int zTp = Integer.parseInt(stGoTp.nextToken()); final int priceTp = Integer.parseInt(stGoTp.nextToken()); goTp(player, xTp, yTp, zTp, priceTp); showTp(player); } else if(command.startsWith("_bbsteleport;player_teleport;")) { final StringTokenizer stGoTp = new StringTokenizer(command, " "); stGoTp.nextToken(); final int xTp = Integer.parseInt(stGoTp.nextToken()); final int yTp = Integer.parseInt(stGoTp.nextToken()); final int zTp = Integer.parseInt(stGoTp.nextToken()); goTp(player, xTp, yTp, zTp, -1); showTp(player); } else ShowBoard.notImplementedYet(player, command); } private void goTp(final L2Player player, final int xTp, final int yTp, final int zTp, final int priceTp) { if(player.isDead() || player.isAlikeDead() || player.isFlying() || player.isTerritoryFlagEquipped() || player.isInZone(ZoneType.no_escape) || player.inObserverMode()) { player.sendMessage("Телепортация невозможна"); return; } if(!Config.COMMUNITY_BOARD_TELEPORT_FIGHT) if(player.isInCombat() || player.isAttackingNow() || player.isCastingNow()) { player.sendMessage("Телепортация невозможна"); return; } // На оли тп нельзя) после регистрации тоже if(player.isInOlympiadMode() || player.getOlympiadGameId() != -1 || player.getTeam() != 0) { player.sendMessage("Телепортация невозможна вы на Олимпиадe"); return; } // Можно ли использовать в отражениях if(!Config.COMMUNITY_BOARD_TELEPORT_ALLOW_INSTANCE) if (player.getReflectionId() > 0) { player.sendMessage("Телепортация невозможна в Отражениях"); return; } if(!Config.COMMUNITY_BOARD_TELEPORT_ALLOW_PK) if(player.getKarma() > 0) { player.sendMessage("Телепортация невозможна для PK"); return; } if(!Config.COMMUNITY_BOARD_TELEPORT_NO_IS_IN_PEACE && !player.isInPeaceZone()) { player.sendMessage("Эта функция доступна только в Городе"); return; } if(priceTp > 0 && player.getAdena() < priceTp) { player.sendPacket(Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA); return; } // проверяем пользовательские телепорты if(priceTp == -1) { if(Functions.getItemCount(player, Config.COMMUNITY_BOARD_TELEPORT_ITEM) < Config.COMMUNITY_BOARD_TELEPORT_PRICE) { player.sendPacket(Msg.INCORRECT_ITEM_COUNT); return; } } // Можно ли телепортироваться в города, где идет осада if(!Config.COMMUNITY_BOARD_TELEPORT_IN_SIEGE_TOWN) { // Нельзя телепортироваться в города, где идет осада // изнаем, идет ли осада в ближайшем замке к точке телепортации final Castle castle = TownManager.getInstance().getClosestTown(xTp, yTp).getCastle(); if(castle != null && castle.getSiege().isInProgress()) { player.sendPacket(Msg.YOU_CANNOT_TELEPORT_TO_A_VILLAGE_THAT_IS_IN_A_SIEGE); return; } } if(!Config.COMMUNITY_BOARD_TELEPORT_IN_SIEGE_ZONE) if(isOnSiegeField() || isInZoneBattle() || isInZone(ZoneType.Siege)) { player.sendPacket(Msg.YOU_CANNOT_USE_MY_TELEPORTS_WHILE_PARTICIPATING_A_LARGE_SCALE_BATTLE_SUCH_AS_A_CASTLE_SIEGE); return; } else if(isOnSiegeField() || isInZoneBattle() || isInZone(ZoneType.Siege)) { player.sendPacket(Msg.YOU_CANNOT_USE_MY_TELEPORTS_WHILE_PARTICIPATING_A_LARGE_SCALE_BATTLE_SUCH_AS_A_CASTLE_SIEGE); return; } // Можно ли телепортироваться в зону, где идет осада if(!Config.COMMUNITY_BOARD_TELEPORT_IN_SIEGE_ZONE) if(ZoneManager.getInstance().checkIfInZone(ZoneType.Siege, xTp, yTp)) { player.sendPacket(Msg.YOU_CANNOT_TELEPORT_TO_A_VILLAGE_THAT_IS_IN_A_SIEGE); return; } else if(ZoneManager.getInstance().checkIfInZone(ZoneType.siege_residense, xTp, yTp)) { player.sendPacket(Msg.YOU_CANNOT_TELEPORT_TO_A_VILLAGE_THAT_IS_IN_A_SIEGE); return; } if(priceTp > 0) player.reduceAdena(priceTp, false); else if(priceTp == -1) Functions.removeItem(player, Config.COMMUNITY_BOARD_TELEPORT_ITEM, Config.COMMUNITY_BOARD_TELEPORT_PRICE); if(Config.COMMUNITY_BOARD_TELEPORT_RANDOM) { final Location pos = GeoEngine.findPointToStay(xTp, yTp, zTp, 50, 100); player.teleToLocation(pos); } //else { player.teleToLocation(xTp, yTp, zTp); } } private boolean isInZone(ZoneType siege) { // TODO Auto-generated method stub return false; } private boolean isInZoneBattle() { // TODO Auto-generated method stub return false; } private boolean isOnSiegeField() { // TODO Auto-generated method stub return false; } private void showTp(final L2Player player) { CBteleport tp; ThreadConnection con = null; FiltredPreparedStatement statement = null; ResultSet rs = null; try { con = L2DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("SELECT * FROM community_board_teleport WHERE charId=?;"); statement.setLong(1, player.getObjectId()); rs = statement.executeQuery(); final TextBuilder html = new TextBuilder(); html.append("<table width=220>"); while (rs.next()) { tp = new CBteleport(); tp.TpId = rs.getInt("TpId"); tp.TpName = rs.getString("name"); tp.PlayerId = rs.getInt("charId"); tp.xC = rs.getInt("xPos"); tp.yC = rs.getInt("yPos"); tp.zC = rs.getInt("zPos"); html.append("<tr>"); html.append("<td>"); html.append("<button value=\"" + tp.TpName + "\" action=\"bypass -h _bbsteleport;player_teleport; " + tp.xC + " " + tp.yC + " " + tp.zC + "\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"); html.append("</td>"); html.append("<td>"); html.append("<button value=\"Удалить\" action=\"bypass -h _bbsteleport;delete;" + tp.TpId + "\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"); html.append("</td>"); html.append("</tr>"); } html.append("</table>"); String content = Files.read(Config.BBS_HOME_DIR +"/50.htm", player); content = content.replace("%tp%", html.toString()); separateAndSend(content, player); } catch(final Exception e) { e.printStackTrace(); } finally { DbUtils.closeQuietly(con, statement, rs); } } private void delTp(final L2Player player, final int TpNameDell) { ThreadConnection conDel = null; FiltredPreparedStatement statementDel = null; try { conDel = L2DatabaseFactory.getInstance().getConnection(); statementDel = conDel.prepareStatement("DELETE FROM community_board_teleport WHERE charId=? AND TpId=?;"); statementDel.setInt(1, player.getObjectId()); statementDel.setInt(2, TpNameDell); statementDel.execute(); } catch(final Exception e) { _log.warning("data error on Delete Teleport: " + e); e.printStackTrace(); } finally { DbUtils.closeQuietly(conDel); } } private void AddTp(final L2Player player, final String TpNameAdd) { if(player.isDead() || player.isAlikeDead() || player.isCastingNow() || player.isAttackingNow() || player.inObserverMode()) { player.sendMessage("Сохранить закладку в вашем состоянии нельзя"); return; } if(player.isInCombat()) { player.sendMessage("Сохранить закладку в режиме боя нельзя"); return; } if(Config.COMMUNITY_BOARD_TELEPORT_ADDITIONAL_RULES) if(player.isInZone(ZoneInfo.ZONE_NO_SAVE_BOOKMARK)) { player.sendMessage("Сохранить закладку в вашем состоянии нельзя"); return; } if(TpNameAdd.equals("") || TpNameAdd.equals(null)) { player.sendMessage("Вы не ввели Имя закладки"); return; } ThreadConnection con = null; FiltredPreparedStatement statement = null; ResultSet rs = null; try { con = L2DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("SELECT COUNT(*) FROM community_board_teleport WHERE charId=?;"); statement.setLong(1, player.getObjectId()); rs = statement.executeQuery(); rs.next(); if(rs.getInt(1) <= Config.COMMUNITY_BOARD_TELEPORT_COUNT - 1) { statement = con.prepareStatement("SELECT COUNT(*) FROM community_board_teleport WHERE charId=? AND name=?;"); statement.setLong(1, player.getObjectId()); statement.setString(2, TpNameAdd); rs = statement.executeQuery(); rs.next(); if(rs.getInt(1) == 0) { statement = con.prepareStatement("INSERT INTO community_board_teleport (charId,xPos,yPos,zPos,name) VALUES(?,?,?,?,?)"); statement.setInt(1, player.getObjectId()); statement.setInt(2, player.getX()); statement.setInt(3, player.getY()); statement.setInt(4, player.getZ()); statement.setString(5, TpNameAdd); statement.execute(); } else { statement = con.prepareStatement("UPDATE community_board_teleport SET xPos=?, yPos=?, zPos=? WHERE charId=? AND name=?;"); statement.setInt(1, player.getObjectId()); statement.setInt(2, player.getX()); statement.setInt(3, player.getY()); statement.setInt(4, player.getZ()); statement.setString(5, TpNameAdd); statement.execute(); } } else player.sendMessage("Вы не можете сохранить более 10 закладок"); } catch(final Exception e) { e.printStackTrace(); } finally { DbUtils.closeQuietly(con, statement, rs); } } public void parsewrite(final String ar1, final String ar2, final String ar3, final String ar4, final String ar5, final L2Player activeChar) {} } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JunkyFunky 127 Опубликовано 1 декабря, 2018 goTp(player, xTp, yTp, zTp, -1); showTp(player); //это удаляем player.sendPacket(ShowBoard.CLOSE); // это добавляем 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
leviath 6 Опубликовано 1 декабря, 2018 20 минут назад, JunkyFunky сказал: goTp(player, xTp, yTp, zTp, -1); showTp(player); //это удаляем player.sendPacket(ShowBoard.CLOSE); // это добавляем Некактит (( Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 1 декабря, 2018 (изменено) 2 часа назад, leviath сказал: Всем привет! Ребят помогите что нужно прописать чтобы после телепорта коммунити боард закрывался автоматно а не кидал на страницу телепортаций? точнее скажу сразу что со знанием java у меня полный 0 могу что то поменять методом тыка а вот что то самому написать это проблема ) ну и сам исходинк телепорта помогите плиз )) здесь была куча говнокода Для начала я бы посоветовал используемый код выкинуть и даже не вспоминать о нем. И попросить кого-то написать нормальный. А того кто писал этот - гнать ссаными тряпками. Для понимающих - поглядите что происходит в методе showTp, вызываемом каждый раз, когда запрашивается "покажи список точек телепорта". Правильно - каждый раз метод лезет в бд... что уже является очень даже удобным местом для ддоса сервера. Неужели нельзя было додуматься до простейшего кэширования этих данных... Да и сам по себе код уязвимый - в команды teleport / player_ teleport легко можно подсунуть при помощи пакетхака к примеру любые координаты, которые спокойно будут приняты и будет произведена телепортация в них. В нормальных коммюнити телепортах координаты телепорта в ссылке передавать не принято - лучше отправлять просто ид-ключ для списка объявленных телепортов, по которому и будет определяться, куда телепортировать... или послать нафиг, если прислали ключ к несуществующей записи. Изменено 1 декабря, 2018 пользователем Gaikotsu Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
leviath 6 Опубликовано 1 декабря, 2018 33 минуты назад, Gaikotsu сказал: Для начала я бы посоветовал используемый код выкинуть и даже не вспоминать о нем. И попросить кого-то написать нормальный. А того кто писал этот - гнать ссаными тряпками. Для понимающих - поглядите что происходит в методе showTp, вызываемом каждый раз, когда запрашивается "покажи список точек телепорта". Правильно - каждый раз метод лезет в бд... что уже является очень даже удобным местом для ддоса сервера. Неужели нельзя было додуматься до простейшего кэширования этих данных... Да и сам по себе код уязвимый - в команды teleport / player_ teleport легко можно подсунуть при помощи пакетхака к примеру любые координаты, которые спокойно будут приняты и будет произведена телепортация в них. В нормальных коммюнити телепортах координаты телепорта в ссылке передавать не принято - лучше отправлять просто ид-ключ для списка объявленных телепортов, по которому и будет определяться, куда телепортировать... или послать нафиг, если прислали ключ к несуществующей записи. я полный 0 в Java, может да тут и есть дыра или как там её назвать) Если я попрошу кого-то чтобы мне исправили полностью код то естественно он скажет доплати, а потом типо давай я проверю у тебя еще может есть дыры и так почти во всей сборке )) Так что же мне делать в такой ситуаций купить сборку за 200к ? дык вне тоже дыры есть что с этого будет !! А вообще с сервером у меня проблем не было и с этим кодом сервер стоял пол года и не чаго не произошло. Скажем так не унываю, ну подумать отдал 5к зато окупилась в 30 раз. А так я вас не осуждаю а наоборот, спасибо что подсказали !!!! Покажу тому кто мне её продал посмотрим что ответят. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
lvlkoo 190 Опубликовано 1 декабря, 2018 2 часа назад, leviath сказал: Некактит Откройте ShowBoard, посмотрите что там за константы есть. Возможно она называется немного по другому. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
linolium 2 Опубликовано 1 декабря, 2018 Автор шоп можешь и бафера тоже переделывать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
leviath 6 Опубликовано 1 декабря, 2018 4 часа назад, JunkyFunky сказал: goTp(player, xTp, yTp, zTp, -1); showTp(player); //это удаляем player.sendPacket(ShowBoard.CLOSE); // это добавляем Спасибо огромное за помощь ! Тему можно закрыть. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 3 декабря, 2018 В 01.12.2018 в 16:31, leviath сказал: А вообще с сервером у меня проблем не было и с этим кодом сервер стоял пол года и не чаго не произошло. проблем нет просто потому-что у тебя статус Неуловимого Джо. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты