Onisim 0 Опубликовано 8 апреля, 2016 (изменено) Здраствуйте уважаемые форумчане! Столкнулся с проблемой, не могу добавить кнопку для баффа пета. Кто может помочь в этом вопросе, буду очень благодарен. Скрипт прилагается. package l2s.game.communitybbs.Manager;import gnu.trove.iterator.TIntIntIterator;import gnu.trove.list.array.TIntArrayList;import gnu.trove.map.hash.TIntIntHashMap;import gnu.trove.map.hash.TIntObjectHashMap;import gnu.trove.procedure.TIntIntProcedure;import java.io.File;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import java.util.logging.Level;import java.util.logging.Logger;import javax.xml.parsers.DocumentBuilderFactory;import l2s.Config;import l2s.commons.threading.RunnableImpl;import l2s.database.FiltredPreparedStatement;import l2s.database.FiltredStatement;import l2s.database.L2DatabaseFactory;import l2s.database.ThreadConnection;import l2s.database.utils.DbUtils;import l2s.extensions.listeners.collections.MethodCollection;import l2s.extensions.listeners.engine.MethodInvokeListener;import l2s.extensions.listeners.events.MethodEvent;import l2s.extensions.multilang.CustomMessage;import l2s.extensions.scripts.Functions;import l2s.game.L2GameThreadPools;import l2s.game.cache.Msg;import l2s.game.event.L2EventType;import l2s.game.instancemanager.TownManager;import l2s.game.model.EffectList;import l2s.game.model.L2Effect;import l2s.game.model.L2Skill;import l2s.game.model.L2Zone.ZoneType;import l2s.game.model.actor.L2Playable;import l2s.game.model.actor.L2Player;import l2s.game.model.entity.olympiad.Olympiad;import l2s.game.model.entity.residence.Residence;import l2s.game.model.entity.siege.Siege;import l2s.game.network.CustomSystemMessageId;import l2s.game.network.serverpackets.ShowBoard;import l2s.game.tables.SkillTable;import l2s.game.taskmanager.EffectTaskManager;import l2s.util.Files;import l2s.util.IllegalPlayerAction;import l2s.util.StringUtil;import l2s.util.Util;import l2s.util.XMLUtil;import org.w3c.dom.Document;import org.w3c.dom.Node;public class BuffBBSManager extends AbstractBBSManager{private static final Logger _log = Logger.getLogger(AbstractBBSManager.class.getName());private static final class BuffGroupTask extends RunnableImpl{private final L2Playable target;private final List skills;private BuffGroupTask(final L2Playable target, final List skills){this.target = target;this.skills = skills;}@Overridepublic void runImpl() throws Exception{target.setMassUpdating(true);for(final L2Skill skill : skills)if(skill != null){final int level = _allBuffs.get(skill.getId()); // скил для бафа должен быть в списке созданных администраторомif(level > 0 && level == skill.getLevel())skill.getEffectsSelf(target, Config.COMMUNITY_BOARD_BUFFER_ALT_TIME);}target.setMassUpdating(false);target.updateStats();target.updateEffectIcons();}@Overrideprotected Logger getLogger(){return _log;}}/*** Делает автобафф после смерти*/private final static class AutoBuffListener implements MethodInvokeListener{@Overridepublic boolean accept(final MethodEvent event){if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF || !Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF_ATTACK_STOP || event.getOwner() == null)return false;return event.getMethodName().equalsIgnoreCase(MethodCollection.AutoBuff);}@Overridepublic final void methodInvoked(final MethodEvent e){autoBuff((L2Player) e.getOwner(), e);}public void autoBuff(final L2Player player, final MethodEvent e){if(chekConditionListener(player)){player.setCommunityLastTime();final int type = (Integer) e.getArgs()[0];switch (type){case 1: // Окончание действия эффекта{if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF_EFFECT_EXIT)return;final ArrayList buffs = getSkillsForBuff(player);// считаем стоимость бафа исходя из количества баффовfinal long price = buffs.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[player.getLevel() - 1];// если денег на баф не хватате)if(price > 0 && player.getAdena() < price)return;if(price > 0)player.reduceAdena(price, false);startBuffGroup(player, buffs, " Player");break;}case 2: // Окончание атаки{if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF_ATTACK_STOP)return;final ArrayList buffs = getSkillsForBuff(player);// считаем стоимость бафа исходя из количества баффовfinal long price = buffs.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[player.getLevel() - 1];// если денег на баф не хватате)if(price > 0 && player.getAdena() < price)return;if(price > 0)player.reduceAdena(price, false);startBuffGroup(player, buffs, " Player");break;}case 3: // Делает автобафф после смерти{if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF_AFTER_DEATH)return;final ArrayList buffs = getSkillsForBuff(player);// считаем стоимость бафа исходя из количества баффовfinal long price = buffs.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[player.getLevel() - 1];// если денег на баф не хватате)if(price > 0 && player.getAdena() < price)return;if(price > 0)player.reduceAdena(price, false);startBuffGroup(player, buffs, " Player");break;}}}}}private static final ArrayList getSkillsForBuff(final L2Player player){final ArrayList buffs = new ArrayList();// ищем скилы баффов которых нетуouter: for(final L2Skill skill : player.getCommunityBuffs()){for(final L2Effect ef : player.getEffectList().getEffects())if(EffectList.checkEffect(ef, skill))continue outer;buffs.add(skill);}return buffs;}private static final int MAX_SKILLS_ON_PAGE = 27;private static final int MAX_SKILLS_IN_SCHEME = Config.COMMUNITY_BOARD_BUFFER_MAX_SKILLS_IN_SCHEME; // макс количество бафов в схеме/** количество колонок */private static final int cols_number = 3;/** баф */private static final int TYPE_BUFF = 1;/** удаление из группы */private static final int TYPE_DELETE = 2;/** добавление в группу */private static final int TYPE_ADD = 3;private static final TIntObjectHashMap> _buffs = new TIntObjectHashMap>();private static final TIntIntHashMap _allBuffs = new TIntIntHashMap();private static final TIntArrayList available_skills = new TIntArrayList();@SuppressWarnings("synthetic-access")private static class SingletonHolder{protected static final BuffBBSManager _instance = new BuffBBSManager();}public static BuffBBSManager getInstance(){return SingletonHolder._instance;}public BuffBBSManager(){load();_log.info("CommunityBuffer: load " + _buffs.size() + " groups, " + _allBuffs.size() + " skills");}private void load(){final File localFile = new File("./config/CommunityBufferConfig.xml");if(!localFile.exists()){System.out.println("File CommunityBufferConfig.xml not found!");return;}Document localDocument = null;try{final DocumentBuilderFactory localDocumentBuilderFactory = DocumentBuilderFactory.newInstance();localDocumentBuilderFactory.setValidating(false);localDocumentBuilderFactory.setIgnoringComments(true);localDocument = localDocumentBuilderFactory.newDocumentBuilder().parse(localFile);}catch(final Exception e1){e1.printStackTrace();}try{parseFile(localDocument);}catch(final Exception e){e.printStackTrace();}}public final int getSkillHashCode(final int skillId, final int skillLevel){return skillId * 1021 + skillLevel;}public final boolean isAvailable(final int skillId, final int skillLevel){return available_skills.binarySearch(getSkillHashCode(skillId, skillLevel)) >= 0;}private void parseFile(final Document doc){for(Node il = doc.getFirstChild(); il != null; il = il.getNextSibling())if("list".equalsIgnoreCase(il.getNodeName()))for(Node area = il.getFirstChild(); area != null; area = area.getNextSibling())if("buffPackage".equalsIgnoreCase(area.getNodeName())){final int id = XMLUtil.getAttributeIntValue(area, "id", 0);final ArrayList skills = new ArrayList();for(Node buff = area.getFirstChild(); buff != null; buff = buff.getNextSibling())if("buff".equalsIgnoreCase(buff.getNodeName())){final int skillId = XMLUtil.getAttributeIntValue(buff, "skillID", 0);final int skillLevel = XMLUtil.getAttributeIntValue(buff, "skillLevel", 0);final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLevel);if(skill == null)continue;skills.add(skill);_allBuffs.put(skillId, skillLevel);if(!available_skills.contains(getSkillHashCode(skillId, skillLevel)))available_skills.add(getSkillHashCode(skillId, skillLevel));if(SkillTable.getInstance().getBaseLevel(skillId) < skillLevel)_log.info("skillId: " + skillId + " maxlevel = " + SkillTable.getInstance().getBaseLevel(skillId) + " current = " + skillLevel);}_buffs.put(id, skills);}final ArrayList skills = new ArrayList(_allBuffs.size());_allBuffs.forEachEntry(new TIntIntProcedure(){@Overridepublic boolean execute(final int id, final int level){skills.add(SkillTable.getInstance().getInfo(id, level));return true;}});_buffs.put(0, skills);// Sorting for binarySearchavailable_skills.sort();}@Overridepublic void parsecmd(final String command, final L2Player activeChar){final String[] commands = command.split(";");if(commands.length == 0)return;if(commands[0].equals("_bbsbuff") && commands.length == 1)showBuffIndexPage(activeChar);else if(commands[1].equalsIgnoreCase("buff")){int skill_id = 0, skill_level = 0;try{skill_id = Integer.parseInt(commands[2]);skill_level = Integer.parseInt(commands[3]);}catch(final Exception e){}if(skill_id > 0 && skill_level > 0)buffOne(activeChar, skill_id, skill_level);}else if(commands[1].equalsIgnoreCase("buff_scheme")){int scheme_id = -1;String target = null;try{scheme_id = Integer.parseInt(commands[2]);target = commands[3];}catch(final Exception e){}if(scheme_id >= 0 && target != null)buffGroup(activeChar, scheme_id, target);}else if(commands[1].equalsIgnoreCase("bufffixedgrp")){final int scheme_id = Integer.parseInt(commands[2]);final String target = commands[3];buffFixedGroup(activeChar, scheme_id, target);}else if(commands[1].equalsIgnoreCase("create_scheme")){if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_SAVE_RESTOR){ShowBoard.disabled(activeChar);return;}String group_name_add = null;try{group_name_add = commands[2];}catch(final Exception e){showBuffIndexPage(activeChar);return;}createScheme(activeChar, group_name_add.trim());showBuffIndexPage(activeChar);}else if(commands[1].equalsIgnoreCase("delete_scheme")){final int scheme_id = Integer.parseInt(commands[2]);deleteScheme(activeChar, scheme_id);showBuffIndexPage(activeChar);}else if(commands[1].equalsIgnoreCase("use")){if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_SAVE_RESTOR){ShowBoard.disabled(activeChar);return;}final int scheme_id = Integer.parseInt(commands[2]);final int page = Integer.parseInt(commands[3]);showBuffGroup(activeChar, scheme_id, page);}else if(commands[1].equalsIgnoreCase("usefixed")){final int scheme_id = Integer.parseInt(commands[2]);final int page = Integer.parseInt(commands[3]);showFixedBuffGroup(activeChar, scheme_id, page);}else if(commands[1].equalsIgnoreCase("edit_scheme")){final int scheme_id = Integer.parseInt(commands[2]);final int page = Integer.parseInt(commands[3]);editScheme(activeChar, scheme_id, page);}else if(commands[1].equalsIgnoreCase("show_available_skills")){final int scheme_id = Integer.parseInt(commands[2]);final int page = Integer.parseInt(commands[3]);showAvailableSkill(activeChar, scheme_id, page);}else if(commands[1].equalsIgnoreCase("add_skill")){final int scheme_id = Integer.parseInt(commands[2]);final int skill_id = Integer.parseInt(commands[3]);final int skill_level = Integer.parseInt(commands[4]);final int page = Integer.parseInt(commands[5]);addSkill(activeChar, scheme_id, skill_id, skill_level);// показываем группу из которой добавлялиshowAvailableSkill(activeChar, scheme_id, page);}else if(commands[1].equalsIgnoreCase("delete_skill")){final int scheme_id = Integer.parseInt(commands[2]);final int skill_id = Integer.parseInt(commands[3]);final int page = Integer.parseInt(commands[4]);deleteSkill(activeChar, scheme_id, skill_id);// показываем скилы которорые уже есть, для удаленияeditScheme(activeChar, scheme_id, page);}else if(commands[1].equalsIgnoreCase("start_autobuff")){final int scheme_id = Integer.parseInt(commands[2]);Integer fix_scheme_id = null;try{fix_scheme_id = Integer.parseInt(commands[3]);}catch(final NumberFormatException e){}final int price = Integer.parseInt(commands[4]);startAutoBuff(activeChar, scheme_id, fix_scheme_id, price);}else if(commands[1].equalsIgnoreCase("stop_autobuff")){final int scheme_id = Integer.parseInt(commands[2]);Integer fix_scheme_id = null;try{fix_scheme_id = Integer.parseInt(commands[3]);}catch(final NumberFormatException e){}stopAutoBuff(activeChar, scheme_id, fix_scheme_id);}else if(commands[1].equalsIgnoreCase("restoreCP")){restoreCP(activeChar);if(activeChar.getPvpFlag() > 0){activeChar.sendMessage("Нельзя использовать пока вы Флагнуты");return;}}else if(commands[1].equalsIgnoreCase("restoreHP")){restoreHP(activeChar);if(activeChar.getPvpFlag() > 0){activeChar.sendMessage("Нельзя использовать пока вы Флагнуты");return;}}else if(commands[1].equalsIgnoreCase("restoreMP")){restoreMP(activeChar);if(activeChar.getPvpFlag() > 0){activeChar.sendMessage("Нельзя использовать пока вы Флагнуты");return;}}else if(commands[1].equalsIgnoreCase("cancel")){cancel(activeChar);if(activeChar.getPvpFlag() > 0){activeChar.sendMessage("Нельзя использовать пока вы Флагнуты");return;}}}/*** Бафаем гриппу баффов составленную администратором сервера.* Формируется переменная со списком всех баффов из группы и передается в startBuffGroup*/private void buffFixedGroup(final L2Player activeChar, final int group_id, final String target){try{if(chekCondition(activeChar)){// получаем список доступных скилов для данной группыfinal ArrayList skills = _buffs.get(group_id);if(skills != null){final int price = skills.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1];if(price > 0 && activeChar.getAdena() < price){activeChar.sendPacket(Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA);return;}if(price > 0)activeChar.reduceAdena(price, false);startBuffGroup(activeChar, skills, target);}}}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: buffFixedGroup() error: ", e);}}/*** Бафаем группу баффов сохранённую игроком.* Формируется переменная со списком всех баффов из группы и передается в startBuffGroup** @param activeChar* - тот кто запускает* @param groupId* - номер группы* @param target* - цель для баффа*/private void buffGroup(final L2Player activeChar, final int groupId, final String target){try{if(chekCondition(activeChar)){// получаем список доступных скилов для данной схемыfinal ArrayList skillIds = getUsersBuffs(activeChar.getObjectId(), groupId);// считаем ценуfinal int price = skillIds.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1];if(price > 0 && activeChar.getAdena() < price){activeChar.sendPacket(Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA);return;}if(price > 0)activeChar.reduceAdena(price, true);startBuffGroup(activeChar, skillIds, target);}}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: buffGroup() error: ", e);}}/*** Запуск баффа для группы (общий метод)** @param activeChar* - тот кто бафает* @param target* - цель для бафа* @param allbuff* - список всех баффов из группы. Значение устанавливается в методах buffGroup и buffFixedGroup*/private static final void startBuffGroup(final L2Player activeChar, final List skills, final String target){if(activeChar == null || skills == null || skills.isEmpty())return;if(target.startsWith("Player"))applyEffect(activeChar, skills);else if(target.startsWith("Pet") && activeChar.getPet() != null)applyEffect(activeChar.getPet(), skills);}/*** Бафаем один бафф** @param activeChar* - кого бафаем* @param skillId* - ID скила* @param skillLvl* - уровень скила*/private void buffOne(final L2Player activeChar, final int skillId, final int skillLvl){if(!chekCondition(activeChar))return;if(!isAvailable(skillId, skillLvl)){Util.handleIllegalPlayerAction(activeChar, "BuffBBSManager[639]", "buff illegal skill", IllegalPlayerAction.CRITICAL);return;}final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);if(skill == null)return;final int price = Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1];if(price > 0 && activeChar.getAdena() < price){activeChar.sendPacket(Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA);return;}if(price > 0)activeChar.reduceAdena(price, true);activeChar.getPlayer().setCommunityBuffTime(250);L2GameThreadPools.getInstance().scheduleGeneral(new Buff(skill, activeChar), 250);}/** Удаляем скилл из набора. */private void deleteSkill(final L2Player activeChar, final int group_id, final int skill_id){ThreadConnection con = null;FiltredPreparedStatement statement = null;try{con = L2DatabaseFactory.getInstance().getConnection();statement = con.prepareStatement("DELETE FROM community_buffs_group_skills WHERE group_id=? AND skill_id=? AND object_id=?");statement.setInt(1, group_id);statement.setInt(2, skill_id);statement.setInt(3, activeChar.getObjectId());statement.execute();}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: deleteBuffFromGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement);}}/** Добавляем бафф в набор. */private void addSkill(final L2Player activeChar, final int group_id, final int skill_id, final int skill_lvl){ThreadConnection con = null;FiltredPreparedStatement statement = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();// получем сколько сейчас в группе у игрока баффовstatement = con.prepareStatement("SELECT COUNT(*) FROM community_buffs_group_skills WHERE object_id=? AND group_id=?");statement.setInt(1, activeChar.getObjectId());statement.setInt(2, group_id);rs = statement.executeQuery();rs.next();if(rs.getInt(1) < MAX_SKILLS_IN_SCHEME){statement = con.prepareStatement("INSERT INTO community_buffs_group_skills (`group_id`,`object_id`,`skill_id`,`skill_level`,`buff_time`) VALUES(?,?,?,?,?)");statement.setInt(1, group_id);statement.setInt(2, activeChar.getObjectId());statement.setInt(3, skill_id);statement.setInt(4, skill_lvl);statement.setLong(5, System.currentTimeMillis());statement.execute();}elseactiveChar.sendMessage("Набор не может содержать более " + MAX_SKILLS_IN_SCHEME + " баффов");}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: addBuffInGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement, rs);}}/** Отображаем список скилов которые можно добавить в схему, с учётом уже имеющихся в схеме скилов */private void showAvailableSkill(final L2Player activeChar, final int group_id, final int page){ThreadConnection con = null;FiltredPreparedStatement statement = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();// получаем данные схемы игрока (скилы игрока)statement = con.prepareStatement("SELECT `s`.`skill_id`, `g`.`group_name` FROM `community_buffs_group_skills` `s` LEFT JOIN `community_buffs_group` `g` ON (`s`.`object_id` = `g`.`objectId` AND `s`.`group_id` = `g`.`groupId`) WHERE `object_id` = ? AND `group_id` = ?");statement.setInt(1, activeChar.getObjectId());statement.setInt(2, group_id);rs = statement.executeQuery();String group_name = null;// создаём список, в котором будут храниться id скилов которые есть у игрокаfinal ArrayList exist_skillIds = new ArrayList();while (rs.next()){if(group_name == null)group_name = rs.getString("group_name");exist_skillIds.add(rs.getInt("skill_id"));}List skillIds = new ArrayList();// ищем скилы которых ещё нет в группе, которые можно добавитьfor(final TIntIntIterator iter = _allBuffs.iterator(); iter.hasNext() {iter.advance();// если такого скила нету, то добавляемif(!exist_skillIds.contains(iter.key()))skillIds.add(new int[] { iter.key(), iter.value() });}final int numpages = getNumPages(skillIds.size());// обрезаем под размеры (макс количество на страницу)skillIds = getSkills(skillIds, page);final StringBuilder html = StringUtil.startAppend(600, buildTable(skillIds, TYPE_ADD, group_id, page, "Уровень"));final StringBuilder htmltoppanel = StringUtil.startAppend(600, "");StringUtil.append(htmltoppanel, "[]>[]> ", activeChar.isLangRus() ? "Редактирование" : "Edit", ": ", group_name, " StringUtil.append(htmltoppanel, page_list(numpages, page, group_id, "show_available_skills"));String content = Files.read(Config.BBS_HOME_DIR +"/buffer-list.htm", activeChar);content = content.replace("%buffgrptoppanel%", htmltoppanel.toString());content = content.replace("%buffgrp%", html.toString());content = content.replace("%price%", "" + Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1]);separateAndSend(content, activeChar);StringUtil.recycle(html);StringUtil.recycle(htmltoppanel);}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: editAddBuffInGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement, rs);}}/*** Открывает страницу редактора набора. Список уже имеющихся баффов в наборе. Которые можно удалить!*/private void editScheme(final L2Player activeChar, final int group_id, final int page){ThreadConnection con = null;FiltredPreparedStatement statement = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();statement = con.prepareStatement("SELECT `s`.`skill_id`, `s`.`skill_level`, `g`.`group_name` FROM `community_buffs_group_skills` `s` LEFT JOIN `community_buffs_group` `g` ON (`s`.`object_id` = `g`.`objectId` AND `s`.`group_id` = `g`.`groupId`) WHERE `object_id`=? AND `group_id` = ?");statement.setInt(1, activeChar.getObjectId());statement.setInt(2, group_id);rs = statement.executeQuery();String group_name = null;List skillIds = new ArrayList();while (rs.next()){if(group_name == null)group_name = rs.getString("group_name");skillIds.add(new int[] { rs.getInt("skill_id"), rs.getInt("skill_level") });}final int numpages = getNumPages(skillIds.size());// обрезаем под размеры (макс количество на страницу)skillIds = getSkills(skillIds, page);final StringBuilder html_skills = StringUtil.startAppend(500, buildTable(skillIds, TYPE_DELETE, group_id, page, "Уровень"));final StringBuilder htmltoppanel = StringUtil.startAppend(500, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, " ", activeChar.isLangRus() ? "Редактирование" : "Edit", ": ", group_name, " StringUtil.append(htmltoppanel, page_list(numpages, page, group_id, "edit_scheme"));String content = Files.read(Config.BBS_HOME_DIR +"/buffer-list.htm", activeChar);content = content.replace("%buffgrptoppanel%", htmltoppanel.toString());content = content.replace("%buffgrp%", html_skills.toString());content = content.replace("%price%", "" + Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1]);separateAndSend(content, activeChar);StringUtil.recycle(html_skills);StringUtil.recycle(htmltoppanel);}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: editBuffGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement, rs);}}/*** Показываем страницу фиксированной группы.* Группа составляется администратором и не может быть отредактированна игроком.*/private void showFixedBuffGroup(final L2Player activeChar, final int groupId, final int page){try{List buffs = new ArrayList(_buffs.get(groupId));final long price = buffs.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1];final int numpages = getNumPages(buffs.size());// обрезаем под размеры (макс количество на страницу)buffs = getSkills(buffs, page);final StringBuilder html = StringUtil.startAppend(600, buildTable2(buffs, TYPE_BUFF, 0, page, "Уровень"));final StringBuilder htmltoppanel = StringUtil.startAppend(600, "", "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");if(Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF)if(!activeChar.isCommunityAutoBuff())StringUtil.append(htmltoppanel, "");elseStringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");if(activeChar.getPet() != null){StringUtil.append(htmltoppanel, "");if(numpages <= 1){StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");}StringUtil.append(htmltoppanel, "");}StringUtil.append(htmltoppanel, " [Все: ", price, " aden]", " Себе: ");StringUtil.append(htmltoppanel, page_list(numpages, page, groupId, "usefixed"));String content = Files.read(Config.BBS_HOME_DIR +"/buffer-list.htm", activeChar);content = content.replace("%buffgrptoppanel%", htmltoppanel.toString());content = content.replace("%buffgrp%", html.toString());content = content.replace("%price%", "" + Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1]);separateAndSend(content, activeChar);StringUtil.recycle(html);StringUtil.recycle(htmltoppanel);}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: showFixedBuffGroup() error: ", e);}finally{}}/*** Показываем страницу группы*/private void showBuffGroup(final L2Player activeChar, final int group_id, final int page){ThreadConnection con = null;FiltredPreparedStatement statement = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();statement = con.prepareStatement("SELECT `s`.`skill_id`, `s`.`skill_level`, `g`.`group_name` FROM `community_buffs_group_skills` `s` LEFT JOIN `community_buffs_group` `g` ON (`s`.`object_id` = `g`.`objectId` AND `s`.`group_id` = `g`.`groupId`) WHERE `object_id`=? AND `group_id` = ? ORDER BY `buff_time` ASC");statement.setInt(1, activeChar.getObjectId());statement.setInt(2, group_id);rs = statement.executeQuery();String group_name = null;List buffIds = new ArrayList();while (rs.next()){if(group_name == null)group_name = rs.getString("group_name");buffIds.add(new int[] { rs.getInt("skill_id"), rs.getInt("skill_level") });}final int price = buffIds.size() * Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_PRICE_MOD_GRP * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1];final int numpages = getNumPages(buffIds.size());// обрезаем под размеры (макс количество на страницу)buffIds = getSkills(buffIds, page);final StringBuilder html = StringUtil.startAppend(500, buildTable(buffIds, TYPE_BUFF, group_id, page, "Уровень"));final StringBuilder htmltoppanel = StringUtil.startAppend(300, "");StringUtil.append(htmltoppanel, "");if(Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF)if(!activeChar.isCommunityAutoBuff())StringUtil.append(htmltoppanel, "");elseStringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");if(activeChar.getPet() != null){StringUtil.append(htmltoppanel, "");StringUtil.append(htmltoppanel, "");}StringUtil.append(htmltoppanel, " ", group_name, " [Все: ", price, " aden] Себе: Питомец: StringUtil.append(htmltoppanel, page_list(numpages, page, group_id, "use"));String content = Files.read(Config.BBS_HOME_DIR +"/buffer-list.htm", activeChar);content = content.replace("%buffgrptoppanel%", htmltoppanel.toString());content = content.replace("%buffgrp%", html.toString());content = content.replace("%price%", "" + Config.COMMUNITY_BOARD_BUFFER_PRICE_ONE * Config.COMMUNITY_BOARD_BUFFER_LVL_MOD[activeChar.getLevel() - 1]);separateAndSend(content, activeChar);StringUtil.recycle(html);StringUtil.recycle(htmltoppanel);}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: showBuffGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement, rs);}}/*** Удаляем группу баффов.*/private void deleteScheme(final L2Player activeChar, final int group_id){ThreadConnection con = null;FiltredStatement statement = null;try{con = L2DatabaseFactory.getInstance().getConnection();// Удаляем группу бафов.statement = con.createStatement();statement.executeUpdate("DELETE FROM community_buffs_group WHERE objectId=" + activeChar.getObjectId() + " AND groupId=" + group_id);DbUtils.closeQuietly(statement);// Удаляем баффы которые были в удаляемой группе.statement = con.createStatement();statement.executeUpdate("DELETE FROM community_buffs_group_skills WHERE object_id=" + activeChar.getObjectId() + " AND group_id=" + group_id);DbUtils.closeQuietly(statement);}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: deleteBuffGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement);}}/*** Создаем группу баффов.** @param*/private void createScheme(final L2Player activeChar, String group_name){if(group_name.equals("") || group_name.equals(null)){activeChar.sendPacket(CustomSystemMessageId.L2CB_BUFFER_NOT_ENTER_SCHEME_NAME.getPacket());return;}// обрезаем пробелы)group_name = group_name.trim();ThreadConnection con = null;FiltredPreparedStatement statement = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();// Получаем кол-во групп текущего чара из таблицы и если кол-во их не превышает установленное добавляем новую.statement = con.prepareStatement("SELECT COUNT(*) FROM community_buffs_group WHERE objectId=?");statement.setLong(1, activeChar.getObjectId());rs = statement.executeQuery();rs.next();if(rs.getInt(1) <= 4){// Проверяем существует ли группа с именем которое передано в параметреstatement = con.prepareStatement("SELECT COUNT(*) FROM community_buffs_group WHERE objectId=? AND group_name=?");statement.setLong(1, activeChar.getObjectId());statement.setString(2, group_name);rs = statement.executeQuery();rs.next();if(rs.getInt(1) == 0){// Если группы нет, создаем.statement = con.prepareStatement("INSERT INTO community_buffs_group (objectId,group_name) VALUES(?,?)");statement.setInt(1, activeChar.getObjectId());statement.setString(2, group_name);statement.execute();statement.close();}else// надо ли это?{}}elseactiveChar.sendPacket(CustomSystemMessageId.L2CB_BUFFER_CANT_SAVE_MORE_THAN_4_SCHEME.getPacket());}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: addBuffGroup() error: ", e);}finally{DbUtils.closeQuietly(con, statement, rs);}}/*** Показываем чару первую страницу баффера со списком его персональных групп.*/private void showBuffIndexPage(final L2Player activeChar){ThreadConnection con = null;FiltredPreparedStatement st = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();st = con.prepareStatement("SELECT * FROM community_buffs_group WHERE objectId=?");st.setLong(1, activeChar.getObjectId());rs = st.executeQuery();final StringBuilder html = StringUtil.startAppend(400, "");int group_id;String group_name;while (rs.next()){group_id = rs.getInt("groupId");group_name = rs.getString("group_name");StringUtil.append(html, "");}StringUtil.append(html, " ");StringUtil.append(html, "StringUtil.append(html, " ");String content = Files.read(Config.BBS_HOME_DIR +"/buffer.htm", activeChar);content = content.replace("%buffgrps%", html.toString());separateAndSend(content, activeChar);StringUtil.recycle(html);}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: showBuffIndexPage() error: ", e);}finally{DbUtils.closeQuietly(con, st, rs);}}/*** Строит страничку для отображения скилов: для бафа, для удаления, для добавления** @param skill_ids* - список бафов* @param type* - тип отображаемой таблицы: 1 - баф, 2 - удаление из группы, 3 - добавление в группу.* @param scheme_id* @param levelString* TODO* @param cols_number* - количество колонок* @return*/private String buildTable(final List skill_ids, final int type, final int scheme_id, final int page, final String levelString){L2Skill skill;String bottom = null;final StringBuilder res = StringUtil.startAppend(400, "");final int rows = (int) Math.ceil((double) skill_ids.size() / cols_number);int c = 0;for(int i = 0; i < rows; i++){StringUtil.append(res, "");for(int j = 0; j < cols_number; j++){if(skill_ids.size() > c){final int skill_id = skill_ids.get©[0];final int skill_level = skill_ids.get©[1];skill = SkillTable.getInstance().getInfo(skill_id, skill_level);if(skill == null){_log.warning("BuffBBSManager: buildTable - skill[" + skill_id + "], group " + scheme_id + " is NULL!");c++;continue;}switch (type){case TYPE_BUFF:// баф{bottom = StringUtil.concat("");break;}case TYPE_DELETE:// удаление из группы{bottom = StringUtil.concat("");break;}case TYPE_ADD:// добавление в группу{bottom = StringUtil.concat("");break;}}StringUtil.append(res, "");}elseStringUtil.append(res, "");c++;}StringUtil.append(res, "");}StringUtil.append(res, " ", skill.getName(), " ", levelString, ": ", skill_level, " []> ");return res.toString();}/*** Строит страничку для отображения скилов: для бафа, для удаления, для добавления** @param skills* - список бафов* @param type* - тип отображаемой таблицы: 1 - баф, 2 - удаление из группы, 3 - добавление в группу.* @param scheme_id* @param levelString* TODO* @param cols_number* - количество колонок* @return*/private String buildTable2(final List skills, final int type, final int scheme_id, final int page, final String levelString){String bottom = null;final StringBuilder res = StringUtil.startAppend(400, "");final int rows = (int) Math.ceil((double) skills.size() / cols_number);int c = 0;for(int i = 0; i < rows; i++){StringUtil.append(res, "");for(int j = 0; j < cols_number; j++){if(skills.size() > c){final L2Skill skill = skills.get©;if(skill == null){_log.warning("BuffBBSManager: skill in group " + scheme_id + " is NULL!");c++;continue;}switch (type){case TYPE_BUFF:// баф{bottom = StringUtil.concat("");break;}case TYPE_DELETE:// удаление из группы{bottom = StringUtil.concat("");break;}case TYPE_ADD:// добавление в группу{bottom = StringUtil.concat("");break;}}StringUtil.append(res, "");}elseStringUtil.append(res, "");c++;}StringUtil.append(res, "");}StringUtil.append(res, " ", skill.getName(), " ", levelString, ": ", skill.getLevel(), " []>[]>[]> ");return res.toString();}private String page_list(final double numpages, final int cur_page, final int scheme_id, final String bypass){if(numpages == 1)return null;final StringBuilder navpage = StringUtil.startAppend(200, "");for(int page = 1; page <= numpages; page++)if(page == cur_page)StringUtil.append(navpage, "");elseStringUtil.append(navpage, "");StringUtil.append(navpage, " ", page, " return navpage.toString();}private final static List getSkills(List scheme_skills, final int page){final int offset = MAX_SKILLS_ON_PAGE * (page - 1);// обрезаем под размеры (макс количество на страницу)if(scheme_skills.size() > MAX_SKILLS_ON_PAGE){final int maxIndex = Math.min(scheme_skills.size(), MAX_SKILLS_ON_PAGE * page);scheme_skills = scheme_skills.subList(offset, maxIndex);}return scheme_skills;}private final static int getNumPages(final int size){return (int) Math.ceil((double) size / MAX_SKILLS_ON_PAGE);}private static final boolean chekCondition(final L2Player activeChar){if(activeChar == null || !activeChar.isConnected() || activeChar.isInOfflineMode() || activeChar.isLogoutStarted() || activeChar.getCommunityBuffTime() > System.currentTimeMillis())return false;if(activeChar.isDead() || activeChar.isAlikeDead() || activeChar.isCastingNow() || activeChar.isInCombat() || activeChar.isAttackingNow() || activeChar.isFlying() || activeChar.isCombatFlagEquipped() || activeChar.isInZone(ZoneType.no_escape)){activeChar.sendMessage(new CustomMessage("common.notAvailable", activeChar));return false;}// Проверяем на время через сколько разрешить баф , после смертиif (Config.CHECK_DEATH_TIME && System.currentTimeMillis() < activeChar._deathtime + Config.CHECK_DEATH_TIME_VAL ){activeChar.sendMessage("Нельзя накладывать баффы после смерти в течении " + Config.CHECK_DEATH_TIME_VAL /1000 +" секунд(ы). Осталось секунд : " + (activeChar._deathtime + Config.CHECK_DEATH_TIME_VAL - System.currentTimeMillis()) / 1000);return false;}if(Config.COMMUNITY_BOARD_BUFFER_ALLOW_PK && activeChar.getKarma() > 0){activeChar.sendMessage("Нельзя использовать пока вы ПК");return false;}if(Config.COMMUNITY_BOARD_BUFFER_ALLOW_FLAG && activeChar.getPvpFlag() > 0){activeChar.sendMessage("Нельзя использовать пока вы Флагнуты");return false;}if((activeChar.isInOlympiadMode() || activeChar.getOlympiadGameId() != -1 || Olympiad.isRegisteredInComp(activeChar)) && !Config.COMMUNITY_BOARD_BUFFER_ALLOW_OLYMPIAD){activeChar.sendMessage("Нельзя использовать пока вы на Олимпиаде");return false;}if(activeChar.isTransformed() && !activeChar.getTransform().isDefaultActionListTransform() && !Config.COMMUNITY_BOARD_BUFFER_ALLOW_TRANSFORM){activeChar.sendMessage("Нельзя использовать пока вы в Трансвормации");return false;}// Проверяем по уровнюif(activeChar.getLevel() > Config.COMMUNITY_BOARD_BUFFER_MAX_LVL || activeChar.getLevel() < Config.COMMUNITY_BOARD_BUFFER_MIN_LVL){activeChar.sendPacket(CustomSystemMessageId.L2CB_BUFFER_YOUR_LEVEL_NOT_ALLOWED.getPacket());return false;}// нельзя использовать в отраженияхif(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_INSTANCE && activeChar.getReflectionId() > 0){activeChar.sendMessage("Нельзя использовать в отражениях");return false;}if(!Config.COMMUNITY_BOARD_BUFFER_NO_IS_IN_PEACE && !activeChar.isInPeaceZone()){activeChar.sendMessage("Эта функция доступна только в Городе");return false;}if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_EVENT && activeChar.isInEvent(L2EventType.NONE)){activeChar.sendPacket(CustomSystemMessageId.L2CB_BUFFER_DISABLE_IN_EVENT.getPacket());return false;}// Можно ли юзать бафера во время осады?if(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_SIEGE){final Residence residence = TownManager.getInstance().getClosestTown(activeChar).getCastle();final Siege siege = residence.getSiege();if(siege != null && siege.isInProgress()){activeChar.sendPacket(CustomSystemMessageId.L2CB_BUFFER_DISABLE_IN_SIEGE.getPacket());return false;}}return true;}/*** Метод для проверки условий для слушателей** @param activeChar* @return*/private static final boolean chekConditionListener(final L2Player activeChar){if(activeChar == null || !activeChar.isConnected() || activeChar.isInOfflineMode() || activeChar.isLogoutStarted() || !Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF)return false;if(!activeChar.isCommunityAutoBuff() || activeChar.getCommunityLastTime() + 1000 > System.currentTimeMillis())return false;// не работает когда игрок мертв/притворятся мертвым/кастует/в бою/атакует/на олимпиаде/зарегистрирован на олимпиадуif(activeChar.isDead() || activeChar.isAlikeDead() || activeChar.isCastingNow() || activeChar.isAttackingNow() || activeChar.isInOlympiadMode() || activeChar.getOlympiadGameId() != -1 || Olympiad.isRegisteredInComp(activeChar))return false;// Проверяем по уровнюif(activeChar.getLevel() > Config.COMMUNITY_BOARD_BUFFER_MAX_LVL || activeChar.getLevel() < Config.COMMUNITY_BOARD_BUFFER_MIN_LVL)return false;// не работает когда у игрока флаг ТВ/флаг Фортов/Проклятое оружиеif(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_OTHER && (activeChar.isCombatFlagEquipped() || activeChar.isTerritoryFlagEquipped() || activeChar.isCursedWeaponEquipped()))return false;// Можно ли использовать в отраженияхif(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_INSTANCE && activeChar.getReflectionId() > 0)return false;// Можно ли использовать на ивентахif(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_EVENT && activeChar.isInEvent(L2EventType.NONE))return false;// Можно ли использовать во время осадыif(!Config.COMMUNITY_BOARD_BUFFER_ALLOW_SIEGE){final Residence residence = TownManager.getInstance().getClosestTown(activeChar).getCastle();final Siege siege = residence.getSiege();if(siege != null && siege.isInProgress())return false;}return true;}private void restoreCP(final L2Player activeChar){if(activeChar.getCurrentCp() == activeChar.getMaxCp())return;else if (activeChar.getPvpFlag() > 0)return;if(chekCondition(activeChar))if(Functions.getItemCount(activeChar, Config.COMMUNITY_BOARD_RESTORE_CP_ITEMID) >= Config.COMMUNITY_BOARD_RESTORE_CP_ITEMCOUNT){Functions.removeItem(activeChar, Config.COMMUNITY_BOARD_RESTORE_CP_ITEMID, Config.COMMUNITY_BOARD_RESTORE_CP_ITEMCOUNT);activeChar.setCurrentCp(activeChar.getMaxCp());}elseactiveChar.sendPacket(Msg.INCORRECT_ITEM_COUNT);}private void restoreHP(final L2Player activeChar){if(activeChar.getCurrentHp() == activeChar.getMaxHp())return;else if (activeChar.getPvpFlag() > 0)return;if(chekCondition(activeChar))if(Functions.getItemCount(activeChar, Config.COMMUNITY_BOARD_RESTORE_HP_ITEMID) >= Config.COMMUNITY_BOARD_RESTORE_HP_ITEMCOUNT){Functions.removeItem(activeChar, Config.COMMUNITY_BOARD_RESTORE_HP_ITEMID, Config.COMMUNITY_BOARD_RESTORE_HP_ITEMCOUNT);activeChar.setCurrentHp(activeChar.getMaxHp(), false);activeChar.getPvpFlag();}elseactiveChar.sendPacket(Msg.INCORRECT_ITEM_COUNT);}private void restoreMP(final L2Player activeChar){if(activeChar.getCurrentMp() == activeChar.getMaxMp())return;else if (activeChar.getPvpFlag() > 0)return;if(chekCondition(activeChar))if(Functions.getItemCount(activeChar, Config.COMMUNITY_BOARD_RESTORE_MP_ITEMID) >= Config.COMMUNITY_BOARD_RESTORE_MP_ITEMCOUNT){Functions.removeItem(activeChar, Config.COMMUNITY_BOARD_RESTORE_MP_ITEMID, Config.COMMUNITY_BOARD_RESTORE_MP_ITEMCOUNT);activeChar.setCurrentMp(activeChar.getMaxMp());}elseactiveChar.sendPacket(Msg.INCORRECT_ITEM_COUNT);}private void cancel(final L2Player activeChar){if(activeChar.getEffectList().isEmpty())return;else if (activeChar.getPvpFlag() > 0)return;if(chekCondition(activeChar))if(Functions.getItemCount(activeChar, Config.COMMUNITY_BOARD_RESTORE_CANCEL_ITEMID) >= Config.COMMUNITY_BOARD_RESTORE_CANCEL_ITEMCOUNT){Functions.removeItem(activeChar, Config.COMMUNITY_BOARD_RESTORE_CANCEL_ITEMID, Config.COMMUNITY_BOARD_RESTORE_CANCEL_ITEMCOUNT);if(Config.COMMUNITY_BOARD_RESTORE_CANCEL_POSITIVE){activeChar.setMassUpdating(true);L2Skill s;for(final L2Effect e : activeChar.getEffectList().getEffects()){s = e.getSkill();if(e.isOffensive() || s.isDebuff())continue;e.exit();}activeChar.setMassUpdating(false);activeChar.updateStats();activeChar.updateEffectIcons();}elseactiveChar.stopAllEffects();}elseactiveChar.sendPacket(Msg.INCORRECT_ITEM_COUNT);}/** Запускаем задачу автобафа */private void startAutoBuff(final L2Player activeChar, final int user_groupId, final Integer fix_groupId, final int price){if(chekCondition(activeChar)){if(price > 0 && activeChar.getAdena() < price){activeChar.sendPacket(Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA);return;}// устанавливаем что включен автобаффactiveChar.setCommunityAutoBuff(true);// добавляем слушателейif(Config.COMMUNITY_BOARD_BUFFER_ALLOW_AUTOBUFF)activeChar.addMethodInvokeListener(new AutoBuffListener());// если выбран автобафф фиксированной группыif(user_groupId == 0 && fix_groupId != null){activeChar.sendMessage("Включен авто-бафф набора #" + fix_groupId.intValue());activeChar.setCommunityFixedBuff(true);activeChar.setCommunityBuffs(new ArrayList(_buffs.get(fix_groupId.intValue())));// бафаем выбранную группуbuffFixedGroup(activeChar, fix_groupId, " Player");showFixedBuffGroup(activeChar, fix_groupId, 1);}// если выбран автобафф схемы созданной пользователемelse{activeChar.sendMessage("Включен авто-бафф набора #" + user_groupId);activeChar.setCommunityFixedBuff(false);activeChar.setCommunityBuffs(getUsersBuffs(activeChar.getObjectId(), user_groupId));// бафаем выбранную группуbuffGroup(activeChar, user_groupId, " Player");showBuffGroup(activeChar, user_groupId, 1);}}}/** Останавливаем задачу автобафа */private void stopAutoBuff(final L2Player activeChar, final int user_groupId, final Integer fix_groupId){activeChar.sendPacket(CustomSystemMessageId.L2CB_BUFFER_AUTOBUFF_DISABLED.getPacket());activeChar.setCommunityFixedBuff(false);activeChar.setCommunityAutoBuff(false);activeChar.setCommunityBuffs(null);// удаляем слушателиactiveChar.removeMethodInvokeListener(MethodCollection.AutoBuff);if(user_groupId == 0 && fix_groupId != null)showFixedBuffGroup(activeChar, fix_groupId, 1);elseshowBuffGroup(activeChar, user_groupId, 1);}/*** Получаем список доступных скилов для данной схемы** @param objectId* @param groupId* @return*/private final static ArrayList getUsersBuffs(final int objectId, final int groupId){final ArrayList skillIds = new ArrayList();ThreadConnection con = null;FiltredPreparedStatement statement = null;ResultSet rs = null;try{con = L2DatabaseFactory.getInstance().getConnection();statement = con.prepareStatement("SELECT skill_id, skill_level FROM community_buffs_group_skills WHERE group_id=? AND object_id=? ORDER BY buff_time ASC" );statement.setInt(1, groupId);statement.setInt(2, objectId);rs = statement.executeQuery();while (rs.next())skillIds.add(SkillTable.getInstance().getInfo(rs.getInt("skill_id"), rs.getInt("skill_level")));}catch(final Exception e){_log.log(Level.WARNING, "BuffBBSManager: getUsersBuffs error: ", e);}finally{DbUtils.closeQuietly(con, statement, rs);}return skillIds;}private static final void applyEffect(final L2Playable effected, final List skills){for(L2Skill skill : skills){if(skill != null){final int level = _allBuffs.get(skill.getId()); // скил для бафа должен быть в списке созданных администраторомif(level > 0 && level == skill.getLevel()){skill.getEffectsSelf(effected, Config.COMMUNITY_BOARD_BUFFER_ALT_TIME);try{Thread.sleep(3L);}catch(Exception e) {}}//L2GameThreadPools.getInstance().scheduleGeneral(new Buff(skill, effected), 250);//skill.getEffectsSelf(target, Config.COMMUNITY_BOARD_BUFFER_ALT_TIME);}}//EffectTaskManager.getInstance().schedule(new BuffGroupTask(effected, skills), 250);effected.getPlayer().setCommunityBuffTime(600);}private final static class Buff implements Runnable{private final L2Skill _skill;private final L2Playable _target;public Buff(final L2Skill skill, final L2Playable target){_skill = skill;_target = target;}@Overridepublic void run(){_skill.getEffectsSelf(_target, Config.COMMUNITY_BOARD_BUFFER_ALT_TIME);}}@Overridepublic void parsewrite(final String ar1, final String ar2, final String ar3, final String ar4, final String ar5, final L2Player player){}} []>[]>[]>[]>[]> Изменено 8 апреля, 2016 пользователем Onisim Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
SmokiMo 892 Опубликовано 8 апреля, 2016 if(target.startsWith("Player")) applyEffect(activeChar, skills); else if(target.startsWith("Pet") && activeChar.getPet() != null) applyEffect(activeChar.getPet(), skills); }Делай выводы 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Onisim 0 Опубликовано 8 апреля, 2016 if(target.startsWith("Player")) applyEffect(activeChar, skills); else if(target.startsWith("Pet") && activeChar.getPet() != null) applyEffect(activeChar.getPet(), skills); } Делай выводы Да я нашел эту строчку, как я понял тут значит если стоит трагет на своего пета, он должен бафать его, но в итоге получается, что баффает все равно игрока. Или я чего-то не понимаю. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Onisim 0 Опубликовано 8 апреля, 2016 Разобрался, все заработало, спасибо!) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты