Посмотрите видео ниже, чтобы узнать, как установить наш сайт в виде веб-приложения на главном экране.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
В файле homeboard.java я включил только код буферизации; теперь я добавил и другие функции для розничной торговли. Вот исправленный код:
In the homeboard.java file, I only included the buffering code; Now I've added other features for retail. Here's the corrected code:
JavaScript:/* * Copyright (c) 2013 L2jMobius * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package handlers.communityboard; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.function.BiPredicate; import java.util.function.Predicate; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.cache.HtmCache; import org.l2jmobius.gameserver.config.custom.CommunityBoardConfig; import org.l2jmobius.gameserver.config.custom.PremiumSystemConfig; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.BuyListData; import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.data.xml.MultisellData; import org.l2jmobius.gameserver.data.xml.SkillData; import org.l2jmobius.gameserver.data.xml.SkillTreeData; import org.l2jmobius.gameserver.handler.CommunityBoardHandler; import org.l2jmobius.gameserver.handler.IParseBoardHandler; import org.l2jmobius.gameserver.managers.PcCafePointsManager; import org.l2jmobius.gameserver.managers.PremiumManager; import org.l2jmobius.gameserver.model.SkillLearn; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Summon; import org.l2jmobius.gameserver.model.actor.instance.Pet; import org.l2jmobius.gameserver.model.item.enums.ItemProcessType; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.serverpackets.ExBuySellList; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse; import org.l2jmobius.gameserver.network.serverpackets.ShowBoard; import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList; /** * Home board. * @author Zoey76, Mobius */ public class HomeBoard implements IParseBoardHandler { // SQL Queries private static final String COUNT_FAVORITES = "SELECT COUNT(*) AS favorites FROM `bbs_favorites` WHERE `playerId`=?"; private static final String NAVIGATION_PATH = "data/html/CommunityBoard/Custom/navigation.html"; private static final String[] COMMANDS = { "_bbshome", "_bbstop", }; private static final String[] CUSTOM_COMMANDS = { PremiumSystemConfig.PREMIUM_SYSTEM_ENABLED && CommunityBoardConfig.COMMUNITY_PREMIUM_SYSTEM_ENABLED ? "_bbspremium" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_MULTISELLS ? "_bbsexcmultisell" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_MULTISELLS ? "_bbsmultisell" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_MULTISELLS ? "_bbssell" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_TELEPORTS ? "_bbsteleport" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_BUFFS ? "_bbsbuff" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_HEAL ? "_bbsheal" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_DELEVEL ? "_bbsdelevel" : null, CommunityBoardConfig.COMMUNITYBOARD_ENABLE_BUFFS ? "_bbscancel" : null }; private static final BiPredicate<String, Player> COMBAT_CHECK = (command, player) -> { boolean commandCheck = false; for (String c : CUSTOM_COMMANDS) { if ((c != null) && command.startsWith(c)) { commandCheck = true; break; } } return commandCheck && (player.isCastingNow() || player.isInCombat() || player.isInDuel() || player.isInOlympiadMode() || player.isInsideZone(ZoneId.SIEGE) || player.isInsideZone(ZoneId.PVP) || (player.getPvpFlag() > 0) || player.isAlikeDead() || player.isOnEvent() || player.isInStoreMode()); }; private static final Predicate<Player> KARMA_CHECK = player -> CommunityBoardConfig.COMMUNITYBOARD_KARMA_DISABLED && (player.getReputation() < 0); @Override public String[] getCommandList() { final List<String> commands = new ArrayList<>(); commands.addAll(Arrays.asList(COMMANDS)); commands.addAll(Arrays.asList(CUSTOM_COMMANDS)); return commands.stream().filter(Objects::nonNull).toArray(String[]::new); } @Override public boolean onCommand(String command, Player player) { // Old custom conditions check move to here if (CommunityBoardConfig.COMMUNITYBOARD_COMBAT_DISABLED && COMBAT_CHECK.test(command, player)) { player.sendMessage("You can't use the Community Board right now."); return false; } if (KARMA_CHECK.test(player)) { player.sendMessage("Players with Karma cannot use the Community Board."); return false; } if (CommunityBoardConfig.COMMUNITYBOARD_PEACE_ONLY && !player.isInsideZone(ZoneId.PEACE)) { player.sendMessage("Community Board cannot be used out of peace zone."); return false; } String returnHtml = null; String navigation = null; if (CommunityBoardConfig.CUSTOM_CB_ENABLED) { navigation = HtmCache.getInstance().getHtm(player, NAVIGATION_PATH); } if (command.equals("_bbshome") || command.equals("_bbstop")) { final String customPath = CommunityBoardConfig.CUSTOM_CB_ENABLED ? "Custom/" : ""; CommunityBoardHandler.getInstance().addBypass(player, "Home", command); returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/" + customPath + "home.html"); if (!CommunityBoardConfig.CUSTOM_CB_ENABLED) { returnHtml = returnHtml.replace("%fav_count%", Integer.toString(getFavoriteCount(player))); returnHtml = returnHtml.replace("%region_count%", Integer.toString(getRegionCount(player))); returnHtml = returnHtml.replace("%clan_count%", Integer.toString(ClanTable.getInstance().getClanCount())); } } else if (command.startsWith("_bbstop;")) { final String customPath = CommunityBoardConfig.CUSTOM_CB_ENABLED ? "Custom/" : ""; final String path = command.replace("_bbstop;", ""); if ((path.length() > 0) && path.endsWith(".html")) { returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/" + customPath + path); } } else if (command.startsWith("_bbsmultisell")) { final String fullBypass = command.replace("_bbsmultisell;", ""); final String[] buypassOptions = fullBypass.split(","); final int multisellId = Integer.parseInt(buypassOptions[0]); final String page = buypassOptions[1]; returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/" + page + ".html"); MultisellData.getInstance().separateAndSend(multisellId, player, null, false); } else if (command.startsWith("_bbsexcmultisell")) { final String fullBypass = command.replace("_bbsexcmultisell;", ""); final String[] buypassOptions = fullBypass.split(","); final int multisellId = Integer.parseInt(buypassOptions[0]); final String page = buypassOptions[1]; returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/" + page + ".html"); MultisellData.getInstance().separateAndSend(multisellId, player, null, true); } else if (command.startsWith("_bbssell")) { final String page = command.replace("_bbssell;", ""); returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/" + page + ".html"); player.sendPacket(new ExBuySellList(BuyListData.getInstance().getBuyList(423), player, 0)); player.sendPacket(new ExBuySellList(player, false)); } else if (command.startsWith("_bbsteleport")) { final String teleBuypass = command.replace("_bbsteleport;", ""); if (player.getInventory().getInventoryItemCount(CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, -1) < CommunityBoardConfig.COMMUNITYBOARD_TELEPORT_PRICE) { player.sendMessage("Not enough currency!"); } else if (CommunityBoardConfig.COMMUNITY_AVAILABLE_TELEPORTS.get(teleBuypass) != null) { player.disableAllSkills(); player.sendPacket(new ShowBoard()); player.destroyItemByItemId(ItemProcessType.FEE, CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, CommunityBoardConfig.COMMUNITYBOARD_TELEPORT_PRICE, player, true); player.setInstanceById(0); player.teleToLocation(CommunityBoardConfig.COMMUNITY_AVAILABLE_TELEPORTS.get(teleBuypass), 0); ThreadPool.schedule(player::enableAllSkills, 3000); } } else if (command.startsWith("_bbsbuff")) { final String fullBypass = command.replace("_bbsbuff;", ""); final String[] buypassOptions = fullBypass.split(";"); final int buffCount = buypassOptions.length - 1; String page = buypassOptions[buffCount]; if (page.endsWith(".html")) { page = page.substring(0, page.length() - 5); } if (player.getInventory().getInventoryItemCount(CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, -1) < (CommunityBoardConfig.COMMUNITYBOARD_BUFF_PRICE * buffCount)) { player.sendMessage("Not enough currency!"); } else { player.destroyItemByItemId(ItemProcessType.FEE, CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, CommunityBoardConfig.COMMUNITYBOARD_BUFF_PRICE * buffCount, player, true); final Pet pet = player.getPet(); final List<Creature> targets = new ArrayList<>(4); targets.add(player); if (pet != null) { targets.add(pet); } player.getServitors().values().forEach(targets::add); for (int i = 0; i < buffCount; i++) { final String[] s = buypassOptions[i].split(","); final Skill skill = SkillData.getInstance().getSkill(Integer.parseInt(s[0]), Integer.parseInt(s[1])); if ((skill == null) || !CommunityBoardConfig.COMMUNITY_AVAILABLE_BUFFS.contains(skill.getId())) { continue; } for (Creature target : targets) { if (skill.isSharedWithSummon() || target.isPlayer()) { skill.applyEffects(player, target); if (CommunityBoardConfig.COMMUNITYBOARD_CAST_ANIMATIONS) { player.sendPacket(new MagicSkillUse(player, target, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay())); // not recommend broadcast // player.broadcastPacket(new MagicSkillUse(player, target, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay())); } } } } } returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/" + page + ".html"); } else if (command.startsWith("_bbsheal")) { String page = command.replace("_bbsheal;", ""); if (page.endsWith(".html")) { page = page.substring(0, page.length() - 5); } if (player.getInventory().getInventoryItemCount(CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, -1) < (CommunityBoardConfig.COMMUNITYBOARD_HEAL_PRICE)) { player.sendMessage("Not enough currency!"); } else { player.destroyItemByItemId(ItemProcessType.FEE, CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, CommunityBoardConfig.COMMUNITYBOARD_HEAL_PRICE, player, true); player.setCurrentHp(player.getMaxHp()); player.setCurrentMp(player.getMaxMp()); player.setCurrentCp(player.getMaxCp()); if (player.hasPet()) { player.getPet().setCurrentHp(player.getPet().getMaxHp()); player.getPet().setCurrentMp(player.getPet().getMaxMp()); player.getPet().setCurrentCp(player.getPet().getMaxCp()); } for (Summon summon : player.getServitors().values()) { summon.setCurrentHp(summon.getMaxHp()); summon.setCurrentMp(summon.getMaxMp()); summon.setCurrentCp(summon.getMaxCp()); } player.sendMessage("You used heal!"); } returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/" + page + ".html"); } else if (command.equals("_bbsdelevel")) { if (player.getInventory().getInventoryItemCount(CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, -1) < CommunityBoardConfig.COMMUNITYBOARD_DELEVEL_PRICE) { player.sendMessage("Not enough currency!"); } else if (player.getLevel() == 1) { player.sendMessage("You are at minimum level!"); } else { player.destroyItemByItemId(ItemProcessType.FEE, CommunityBoardConfig.COMMUNITYBOARD_CURRENCY, CommunityBoardConfig.COMMUNITYBOARD_DELEVEL_PRICE, player, true); final int newLevel = player.getLevel() - 1; player.setExp(ExperienceData.getInstance().getExpForLevel(newLevel)); player.getStat().setLevel(newLevel); player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp()); player.setCurrentCp(player.getMaxCp()); if (CommunityBoardConfig.COMMUNITYBOARD_DELEVEL_REMOVE_ABILITIES) { for (SkillLearn sk : SkillTreeData.getInstance().getAbilitySkillTree().values()) { final Skill skill = player.getKnownSkill(sk.getSkillId()); if (skill != null) { player.removeSkill(skill); } } player.setAbilityPointsUsed(0, true); player.sendPacket(new ExAcquireAPSkillList(player)); } player.broadcastUserInfo(); player.checkPlayerSkills(); // Adjust skills according to new level. returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/delevel/complete.html"); player.sendMessage("Your level is set to " + newLevel + "!"); } } else if (command.startsWith("_bbspremium")) { final String fullBypass = command.replace("_bbspremium;", ""); final String[] buypassOptions = fullBypass.split(","); final int premiumDays = Integer.parseInt(buypassOptions[0]); if ((premiumDays < 1) || (premiumDays > 30) || (player.getInventory().getInventoryItemCount(CommunityBoardConfig.COMMUNITY_PREMIUM_COIN_ID, -1) < (CommunityBoardConfig.COMMUNITY_PREMIUM_PRICE_PER_DAY * premiumDays))) { player.sendMessage("Not enough currency!"); } else { player.destroyItemByItemId(ItemProcessType.FEE, CommunityBoardConfig.COMMUNITY_PREMIUM_COIN_ID, CommunityBoardConfig.COMMUNITY_PREMIUM_PRICE_PER_DAY * premiumDays, player, true); PremiumManager.getInstance().addPremiumTime(player.getAccountName(), premiumDays, TimeUnit.DAYS); player.sendMessage("Your account will now have premium status until " + new SimpleDateFormat("dd.MM.yyyy HH:mm").format(PremiumManager.getInstance().getPremiumExpiration(player.getAccountName())) + "."); if (PremiumSystemConfig.PC_CAFE_RETAIL_LIKE) { PcCafePointsManager.getInstance().run(player); } returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/premium/thankyou.html"); } } else if (command.startsWith("_bbscancel")) { String page = command.replace("_bbscancel;", ""); if (page.endsWith(".html")) { page = page.substring(0, page.length() - 5); } player.stopAllEffectsExceptThoseThatLastThroughDeath(); if (player.hasPet()) { player.getPet().stopAllEffectsExceptThoseThatLastThroughDeath(); } for (Summon summon : player.getServitors().values()) { summon.stopAllEffectsExceptThoseThatLastThroughDeath(); } returnHtml = HtmCache.getInstance().getHtm(player, "data/html/CommunityBoard/Custom/" + page + ".html"); } if (returnHtml != null) { if (CommunityBoardConfig.CUSTOM_CB_ENABLED) { returnHtml = returnHtml.replace("%navigation%", navigation); } CommunityBoardHandler.separateAndSend(returnHtml, player); return true; } return false; } /** * Gets the Favorite links for the given player. * @param player the player * @return the favorite links count */ private static int getFavoriteCount(Player player) { int count = 0; try (Connection con = DatabaseFactory.getConnection(); PreparedStatement ps = con.prepareStatement(COUNT_FAVORITES)) { ps.setInt(1, player.getObjectId()); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { count = rs.getInt("favorites"); } } } catch (Exception e) { // LOG.warning(FavoriteBoard.class.getSimpleName() + ": Coudn't load favorites count for " + player); } return count; } /** * Gets the registered regions count for the given player. * @param player the player * @return the registered regions count */ private static int getRegionCount(Player player) { return 0; // TODO: Implement. } }