janiko Posted May 4, 2012 Posted May 4, 2012 Hope someone can help I wrote script to restore buffs here is the function. the problem is that it restores only first buff from sql record Example of Sql Record -- ---------------------------- -- Table structure for `community_skillsave` -- ---------------------------- DROP TABLE IF EXISTS `community_skillsave`; CREATE TABLE `community_skillsave` ( `charId` int(10) DEFAULT NULL, `skills` text, `pet` text ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of community_skillsave -- ---------------------------- INSERT INTO `community_skillsave` VALUES ('268480452', '1240;1048;', null); Restore Java Script private void RESTOR(L2PcInstance activeChar) { Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement stat = con.prepareStatement("SELECT * FROM community_skillsave WHERE charId=?;"); stat.setInt(1, activeChar.getObjectId()); ResultSet rset = stat.executeQuery(); rset.next(); String allskills = rset.getString(2); StringTokenizer stBuff = new StringTokenizer(allskills, ";"); while (stBuff.hasMoreTokens()) { int skilltoresatore = Integer.parseInt(stBuff.nextToken()); int skilllevel = SkillTable.getInstance().getMaxLevel(skilltoresatore); L2Skill skill = SkillTable.getInstance().getInfo(skilltoresatore, skilllevel); PreparedStatement st = con.prepareStatement("SELECT COUNT(*) FROM community_skillsave WHERE skills=?;"); st.setInt(1, skilltoresatore); ResultSet rs = st.executeQuery(); rs.next(); if (rs.getInt(1) != 0) { skill.getEffects(activeChar, activeChar); } else { activeChar.sendMessage("Buff: " + skill.getName() + " (" + skill.getId() + "), can't be restored!"); } rs.close(); st.close(); } rset.close(); stat.close(); } catch (SQLException e) { } finally { L2DatabaseFactory.close(con); } } thanks to everyone Quote
0 Tryskell Posted May 4, 2012 Posted May 4, 2012 I don't understand at all the use of your StringTokenizer stBuff. If you want to retrieve from a DB, then use : while (rset.next()) { For a simple DB load you don't need to use StringTokenizer AT ALL. Eventually to split a String from a config file, but that's clearly not what you try to do. PS : I understood lol. What you try to do is ugly. Make one line per skillId. It will be faster than to try to retrieve a string, split it and then doing the same action. INSERT INTO `community_skillsave` VALUES ('268480452', '1240', null); INSERT INTO `community_skillsave` VALUES ('268480452', '1048', null); Quote
0 janiko Posted May 14, 2012 Author Posted May 14, 2012 I reworked it, but main goal that i want to achieve is to get skills from sql with 1024;1035; etc Because i save buff with bypass : bypass -h _bbs_buff_Player;264;266;267;268;270;304;529;364; thats why i want to restore with the same method, reworked Restore function restores only first one again :( private void SAVE(L2PcInstance activeChar) { Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement stat = con.prepareStatement("SELECT *FROM community_skillsave WHERE charId=?;"); stat.setInt(1, activeChar.getObjectId()); ResultSet rset = stat.executeQuery(); rset.next(); String allbuff = ""; int charId = rset.getInt("charId"); L2Effect[] skill = activeChar.getAllEffects();//TODO Check Buff Skills to not bug with other effects for (int j = 0; j < skill.length; ++j) { allbuff = allbuff + new StringBuilder().append(skill[j].getSkill().getId()).append(";").toString(); } if (charId == 0) { PreparedStatement statement1 = con.prepareStatement("INSERT INTO community_skillsave (charId,skills) values (?,?)"); statement1.setInt(1, activeChar.getObjectId()); statement1.setString(2, allbuff); activeChar.sendMessage("Buff Saved Successfully!"); statement1.execute(); statement1.close(); } else { PreparedStatement statement = con.prepareStatement("UPDATE community_skillsave SET skills=? WHERE charId=?;"); statement.setString(1, allbuff); statement.setInt(2, activeChar.getObjectId()); activeChar.sendMessage("Buff Updated Successfully!"); statement.execute(); statement.close(); } rset.close(); stat.close(); } catch (SQLException e) { } finally { L2DatabaseFactory.close(con); } } private void RESTOR(L2PcInstance activeChar) { Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement stat = con.prepareStatement("SELECT * FROM community_skillsave WHERE charId=?;"); stat.setInt(1, activeChar.getObjectId()); ResultSet rset = stat.executeQuery(); while (rset.next()) { String allskills = rset.getString("skills"); int charId = rset.getInt("charId"); StringTokenizer BuffId = new StringTokenizer(allskills, ";"); int skillid = Integer.parseInt(BuffId.nextToken()); int skilllevel = SkillTable.getInstance().getMaxLevel(skillid); L2Skill skill = SkillTable.getInstance().getInfo(skillid, skilllevel); if (charId != 0) { skill.getEffects(activeChar, activeChar); } else { activeChar.sendMessage("Buff: " + skill.getName() + " (" + skill.getId() + "), can't be restored!"); } } rset.close(); stat.close(); } catch (SQLException e) { } finally { L2DatabaseFactory.close(con); } } Quote
Question
janiko
Hope someone can help
I wrote script to restore buffs here is the function.
the problem is that it restores only first buff from sql record
Example of Sql Record
Restore Java Script
thanks to everyone
2 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.