Saick 46 Опубликовано 10 ноября, 2011 Сделал я бафера я профилями все ок но сохраняет только бафов 12-13 CharSchemesTable.java Скрытый текст /* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package com.l2jfrozen.gameserver.datatables; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.logging.Logger; import javolution.util.FastList; import javolution.util.FastMap; import com.l2jfrozen.Config; import com.l2jfrozen.gameserver.model.L2Skill; import com.l2jfrozen.gameserver.powerpak.PowerPakConfig; import com.l2jfrozen.util.CloseUtil; import com.l2jfrozen.util.database.L2DatabaseFactory; /** * This class stores players' buff schemes into FastMap. On player login, his scheme is loaded and on server shutdown all modified schemes are saved to DataBase. This avoids too many unnecessary DataBase connections and queries. If server crashes, nothing important is lost * * @author */ public class CharSchemesTable { private static FastMap<Integer, FastMap<String, FastList<L2Skill>>> _schemesTable; private static CharSchemesTable _instance = null; private static Logger _log = Logger.getLogger(CharSchemesTable.class.getName()); private static final String SQL_LOAD_SCHEME = "SELECT * FROM mods_buffer_schemes WHERE ownerId=?"; private static final String SQL_DELETE_SCHEME = "DELETE FROM mods_buffer_schemes WHERE ownerId=?"; private static final String SQL_INSERT_SCHEME = "INSERT INTO mods_buffer_schemes (ownerId, id, level, scheme) VALUES (?,?,?,?)"; public CharSchemesTable() { _schemesTable = new FastMap<Integer, FastMap<String, FastList<L2Skill>>>(); } /** * This method loads player scheme and put into _schemesTable map. * * @param objectId * : player's objectId */ public void loadScheme(int objectId) { Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(false); PreparedStatement statement = con.prepareStatement(SQL_LOAD_SCHEME); statement.setInt(1, objectId); ResultSet rs = statement.executeQuery(); FastMap<String, FastList<L2Skill>> map = new FastMap<String, FastList<L2Skill>>(); while (rs.next()) { int skillId = rs.getInt("id"); int skillLevel = rs.getInt("level"); String scheme = rs.getString("scheme"); if (!map.containsKey(scheme) && map.size() <= PowerPakConfig.NPCBUFFER_MAX_SCHEMES) map.put(scheme, new FastList<L2Skill>()); if (map.get(scheme) != null && map.get(scheme).size() < PowerPakConfig.NPCBUFFER_MAX_SKILLS) map.get(scheme).add(SkillTable.getInstance().getInfo(skillId, skillLevel)); } if (!map.isEmpty()) _schemesTable.put(objectId, map); statement.close(); rs.close(); } catch (Exception e) { if(Config.ENABLE_ALL_EXCEPTIONS) e.printStackTrace(); _log.warning("Error trying to load buff scheme from object id: " + objectId); } finally { CloseUtil.close(con); } } public void onPlayerLogin(int playerId) { if (_schemesTable.get(playerId) == null) loadScheme(playerId); } /** * Do necessary task when server is shutting down or restarting:<br> * <li>Clears DataBase</li> <li>Saves new info</li> */ public void onServerShutdown() { if (PowerPakConfig.NPCBUFFER_STORE_SCHEMES) { clearDB(); saveDataToDB(); } } public void clearDB() { if (_schemesTable.isEmpty()) return; Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(false); for (FastMap.Entry<Integer, FastMap<String, FastList<L2Skill>>> e = _schemesTable.head(), end = _schemesTable.tail(); (e = e.getNext()) != end;) { PreparedStatement statement = con.prepareStatement(SQL_DELETE_SCHEME); statement.setInt(1, e.getKey()); statement.execute(); } } catch (Exception e) { if(Config.ENABLE_ALL_EXCEPTIONS) e.printStackTrace(); _log.warning("CharSchemesTable: Error while trying to delete schemes"); } finally { CloseUtil.close(con); } } public void saveDataToDB() { if (_schemesTable.isEmpty()) return; Connection con = null; int count = 0; try { con = L2DatabaseFactory.getInstance().getConnection(false); // _schemesTable for (FastMap.Entry<Integer, FastMap<String, FastList<L2Skill>>> e = _schemesTable.head(), end = _schemesTable.tail(); (e = e.getNext()) != end;) { // each profile if (e.getValue() == null || e.getValue().isEmpty()) continue; for (FastMap.Entry<String, FastList<L2Skill>> a = e.getValue().head(), enda = e.getValue().tail(); (a = a.getNext()) != enda;) { if (a.getValue() == null || a.getValue().isEmpty()) continue; // each skill for (L2Skill sk : a.getValue()) { PreparedStatement statement = con.prepareStatement(SQL_INSERT_SCHEME); statement.setInt(1, e.getKey()); statement.setInt(2, sk.getId()); statement.setInt(3, sk.getLevel()); statement.setString(4, a.getKey()); statement.execute(); } } count++; } } catch (Exception e) { if(Config.ENABLE_ALL_EXCEPTIONS) e.printStackTrace(); _log.warning("CharSchemesTable: Error while trying to delete schemes"); } finally { CloseUtil.close(con); System.out.println("CharSchemeTable: Saved " + String.valueOf(count + " scheme(s)")); } } public FastList<L2Skill> getScheme(int playerid, String scheme_key) { if (_schemesTable.get(playerid) == null) return null; return _schemesTable.get(playerid).get(scheme_key); } public boolean getSchemeContainsSkill(int playerId, String scheme_key, int skillId) { for (L2Skill sk : getScheme(playerId, scheme_key)) if (sk.getId() == skillId) return true; return false; } public void setScheme(int playerId, String schemeKey, FastList<L2Skill> list) { _schemesTable.get(playerId).put(schemeKey, list); } public FastMap<String, FastList<L2Skill>> getAllSchemes(int playerId) { return _schemesTable.get(playerId); } public FastMap<Integer, FastMap<String, FastList<L2Skill>>> getSchemesTable() { return _schemesTable; } public static CharSchemesTable getInstance() { if (_instance == null) _instance = new CharSchemesTable(); return _instance; } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Excellion 0 Опубликовано 10 ноября, 2011 код самого бафера показывай Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xINVIZIBLx 67 Опубликовано 10 ноября, 2011 И он по моему сохраняет профили при перезагрузке или выключении) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 L2BuffInstance.java Скрытый текстpackage com.l2jfrozen.gameserver.model.actor.instance; import com.l2jfrozen.gameserver.datatables.CharSchemesTable; import com.l2jfrozen.gameserver.datatables.SkillTable; import com.l2jfrozen.gameserver.model.L2Effect; import com.l2jfrozen.gameserver.model.L2Skill; import com.l2jfrozen.gameserver.model.L2Summon; import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed; import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jfrozen.gameserver.templates.L2NpcTemplate; import javolution.util.FastList; import javolution.util.FastMap; import java.util.StringTokenizer; public class L2BuffInstance extends L2FolkInstance { public int[] TableId; public int[] TableDialog; public L2BuffInstance(int objectId, L2NpcTemplate template) { super(objectId, template); TableId=new int[]{ 1068,1388,1086,1077,1242,1240,1085,1059,1303,1062,1043, 1040,1389,1036,1035,1243,1304,1078,1087, 1045,1048,1204,1073,1397,1044,1268,1257, 1182,1189,1191,1033,1259,1392,1393,1353,1352,1354, 271,272,273,274,275,276,277,307,309,310,311, 264,265,266,267,268,269,270,304,305,306,308, 1355,1356,1357,1363,4699,4554,365,363,364,349,4702 }; TableDialog=new int[]{ 1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,4,4, 5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7 }; } @Override public String getHtmlPath(int npcId, int val) { String pom; if (val == 0) pom = "" + npcId; else pom = npcId + "-" + val; return "data/html/buff/" + pom + ".htm"; } @Override public void onBypassFeedback(L2PcInstance player, String command) { StringTokenizer st = new StringTokenizer(command, " "); String actualCommand = st.nextToken(); // Get actual command if (actualCommand.startsWith("Chat")) { String filename = "data/html/buff/40001.htm"; int cmdChoice = Integer.parseInt(command.substring(5,7).trim()); if(cmdChoice>0) { filename = "data/html/buff/40001-"+cmdChoice+".htm"; } NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile(filename); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("Cancel")) { player.stopAllEffects(); NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile("data/html/buff/40001.htm"); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("PetCancel")) { L2Summon pet=player.getPet(); if(pet!=null) pet.stopAllEffects(); NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile("data/html/buff/40001-08.htm"); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("Regenerate")) { player.setCurrentHpMp(player.getMaxHp(),(player.getMaxMp())); player.setCurrentCp(player.getMaxCp()); NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile("data/html/buff/40001.htm"); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("PetRegenerate")) { L2Summon pet=player.getPet(); pet.setCurrentHpMp(pet.getMaxHp(),(pet.getMaxMp())); pet.setCurrentCp(pet.getMaxCp()); NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile("data/html/buff/40001-08.htm"); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("Buff")) { String filename = "data/html/buff/40001",v; int cmdChoice = Integer.parseInt(command.substring(5, 7).trim()); int id=TableId[cmdChoice]; int dialog=TableDialog[cmdChoice]; int level=SkillTable.getInstance().getMaxLevel(id,0); if(id==4554)level=4; if(dialog==0)v=""; else v="-"+Integer.toString(dialog); player.stopSkillEffects(id); SkillTable.getInstance().getInfo(id,level).getEffects(player,player); NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile(filename+v+".htm"); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("PetBuff")) { String filename = "data/html/buff/40001",v; int cmdChoice = Integer.parseInt(command.substring(5, 7).trim()); int id=TableId[cmdChoice]; int dialog=TableDialog[cmdChoice]; int level=SkillTable.getInstance().getMaxLevel(id,0); if(dialog==0)v=""; else v="-"+Integer.toString(dialog); L2Summon pet=player.getPet(); if(pet!=null) { pet.stopSkillEffects(id); SkillTable.getInstance().getInfo(id,level).getEffects(pet,pet); } else player.sendMessage("РЈ вас нет СЃСѓРјРјРѕРЅР° или питомца"); NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile(filename+v+".htm"); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("save")) { int cmdChoice = Integer.parseInt(command.substring(5, 6).trim()); int flag=0; NpcHtmlMessage html = new NpcHtmlMessage(1); if(cmdChoice>3) { html.setFile("data/html/buff/40001-11.htm"); flag=1; } else html.setFile("data/html/buff/40001.htm"); CreateScheme(player,Integer.toString(cmdChoice),flag); sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else if(actualCommand.startsWith("give")) { int cmdChoice = Integer.parseInt(command.substring(5, 6).trim()); if((cmdChoice<1)&&(cmdChoice>6))return; String key="data/html/buff/40001",sKey=Integer.toString(cmdChoice); int flag=0; NpcHtmlMessage html = new NpcHtmlMessage(1); if(cmdChoice>3) { flag=1; key="data/html/buff/40001-8"; } if (CharSchemesTable.getInstance().getScheme( player.getObjectId(),sKey)!=null) { if(flag==0) { for (L2Skill sk : CharSchemesTable.getInstance().getScheme( player.getObjectId(),sKey)) { player.stopSkillEffects(sk.getId()); sk.getEffects(this, player); } } else { for (L2Skill sk : CharSchemesTable.getInstance().getScheme( player.getObjectId(),sKey)) { L2Summon pet = player.getPet(); if(pet!=null) { pet.stopSkillEffects(sk.getId()); sk.getEffects(this, pet); } } } html.setFile(key+".htm"); } else { player.sendMessage("Профиль "+sKey+" РЅРµ найден"); return; } sendHtmlMessage(player,html); player.sendPacket(new ActionFailed()); } else { super.onBypassFeedback(player, command); } } private void sendHtmlMessage(L2PcInstance player, NpcHtmlMessage html) { html.replace("%objectId%", String.valueOf(getObjectId())); html.replace("%npcId%", String.valueOf(getNpcId())); player.sendPacket(html); } private void CreateScheme(L2PcInstance player,String name,int flag) { if (CharSchemesTable.getInstance().getAllSchemes(player.getObjectId()) != null && CharSchemesTable.getInstance().getAllSchemes(player.getObjectId()).containsKey(n ame)) { CharSchemesTable.getInstance().getAllSchemes(player.getObjectId()).remove(name); } if (CharSchemesTable.getInstance().getAllSchemes(player.getObjectId()) == null) { CharSchemesTable.getInstance().getSchemesTable().put(player.getObjectId(), new FastMap<String, FastList<L2Skill>>(6)); } CharSchemesTable.getInstance().setScheme(player.getObjectId(),name.trim(), new FastList<L2Skill>(69)); L2Effect[] s; if (flag==0) { s= player.getAllEffects(); } else { L2Summon pet=player.getPet(); s=pet.getAllEffects(); } int Id; Boolean Ok=false; int i = 0; while (i < s.length) { L2Effect value = s; Id = value.getSkill().getId(); int k = 0; while (k < TableId.length) { if (Id == TableId[k]) { Ok = true; break; } k++; } if (Ok) CharSchemesTable.getInstance().getScheme( player.getObjectId(), name).add( SkillTable.getInstance().getInfo(Id, value.getSkill().getLevel())); Ok = false; i++; } player.sendMessage("Профиль "+name+" СѓСЃРїРµС?РЅРѕ сохранён"); } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 up Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Excellion 0 Опубликовано 10 ноября, 2011 ну на первый взгляд все впорядке (позже подробнее гляну, сейчас на работе) а бафы не сохраняет которые ? они есть в TableId=new int[] ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 бафер сам на питоне а профили в ядре вон он сохраняет где то бафов 13 последних ,а что в начале были не бафает Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 ну на первый взгляд все впорядке (позже подробнее гляну, сейчас на работе)а бафы не сохраняет которые ? они есть в TableId=new int[] ? есть Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 ап Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 ап Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 10 ноября, 2011 up Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Excellion 0 Опубликовано 11 ноября, 2011 эммм.... на каконм нафиг питоне ? L2BuffInstance.java Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 11 ноября, 2011 у меня только профили от туда Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Excellion 0 Опубликовано 11 ноября, 2011 вот поэтому возможно и глючит! т.к код бафера который вы мне указали работает правильно.... и опять же вам вопрос, а для чего вы Конструируите велосипед ? чем вас не устраивает на Java ? темболее его можно сделать таким каким бы вы его хотели видеть Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 11 ноября, 2011 ща попробую если что не так отпишу спс Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Admiralio 0 Опубликовано 15 ноября, 2011 Могу поделится бафером с профилями, который написан на питоне. Все профили он сохраняет в БД. Только импорты сами будете переделывать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
««†KENVOOD†»» 12 Опубликовано 15 ноября, 2011 это не лечится))) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Admiralio 0 Опубликовано 15 ноября, 2011 Короче, кому нужно, можете качать бафера, только не забудьте подредактировать импорты конфиги и sql запросы под себя. Там в архиве два варианта скриптов: английский и русифицированный. Жмите это сцылко! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xenapopalus 0 Опубликовано 27 марта, 2012 (изменено) Короче, кому нужно, можете качать бафера, только не забудьте подредактировать импорты конфиги и sql запросы под себя.Там в архиве два варианта скриптов: английский и русифицированный. Жмите это сцылко! ты не забыл случайно html? и указать под какие он хроники (он так то под gracia final как минимум) Изменено 27 марта, 2012 пользователем xenapopalus Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
revars 2 Опубликовано 27 марта, 2012 ты не забыл случайно html?и указать под какие он хроники (он так то под gracia final как минимум) Ты смотри на дату последнего поста Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты