diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java index 405d0c1263..5b67af11d4 100644 --- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java +++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java @@ -30,17 +30,16 @@ import org.l2jmobius.gameserver.model.homunculus.Homunculus; import org.l2jmobius.gameserver.model.homunculus.HomunculusTemplate; /** - * @author nexvill + * @author nexvill, Mobius */ public class HomunculusManager { private static final Logger LOGGER = Logger.getLogger(HomunculusManager.class.getName()); - private static final String SELECT_QUERY = "SELECT slot, id, level, exp, skillLevel1, skillLevel2, skillLevel3, skillLevel4, skillLevel5, active FROM character_homunculus WHERE ownerId=?"; + private static final String SELECT_QUERY = "SELECT slot, id, level, exp, skillLevel1, skillLevel2, skillLevel3, skillLevel4, skillLevel5, active FROM character_homunculus WHERE ownerId=? ORDER by slot ASC"; private static final String INSERT_QUERY = "INSERT INTO `character_homunculus` (ownerId, slot, id, level, exp, skillLevel1, skillLevel2, skillLevel3, skillLevel4, skillLevel5, active) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; private static final String DELETE_QUERY = "DELETE FROM character_homunculus WHERE ownerId=? AND slot=? AND id=? AND level=? AND exp=? AND skillLevel1=? AND skillLevel2=? AND skillLevel3=? AND skillLevel4=? AND skillLevel5=? AND active=?"; - private static final String UPDATE_QUERY = "UPDATE character_homunculus SET level=?, exp=?, skillLevel1=?, skillLevel2=?, skillLevel3=?, skillLevel4=?, skillLevel5=?, active=? WHERE ownerId=? AND slot=? AND id=?"; - private static final String UPDATE_SLOT_QUERY = "UPDATE character_homunculus SET slot=0 WHERE ownerId=? AND slot=1"; + private static final String UPDATE_QUERY = "UPDATE character_homunculus SET level=?, exp=?, skillLevel1=?, skillLevel2=?, skillLevel3=?, skillLevel4=?, skillLevel5=?, active=?, slot=? WHERE id=? AND ownerId=?"; public List select(PlayerInstance owner) { @@ -50,7 +49,6 @@ public class HomunculusManager { statement.setInt(1, owner.getObjectId()); final ResultSet rset = statement.executeQuery(); - while (rset.next()) { final int id = rset.getInt("id"); @@ -144,26 +142,6 @@ public class HomunculusManager LOGGER.warning(owner.getHomunculusList() + " could not delete homunculus: " + id + " " + active + " ownerId: " + owner.getObjectId()); return false; } - if (slot == 0) - { - updateSlot(owner); - } - return true; - } - - private boolean updateSlot(PlayerInstance owner) - { - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement statement = con.prepareStatement(UPDATE_SLOT_QUERY)) - { - statement.setInt(1, owner.getObjectId()); - statement.execute(); - } - catch (Exception e) - { - LOGGER.warning(owner.getHomunculusList() + " could not change homunculus slot on owner id: " + owner.getObjectId()); - return false; - } return true; } @@ -180,9 +158,9 @@ public class HomunculusManager statement.setInt(6, homunculus.getSkillLevel4()); statement.setInt(7, homunculus.getSkillLevel5()); statement.setInt(8, homunculus.isActive() ? 1 : 0); - statement.setInt(9, owner.getObjectId()); - statement.setInt(10, homunculus.getSlot()); - statement.setInt(11, homunculus.getId()); + statement.setInt(9, homunculus.getSlot()); + statement.setInt(10, homunculus.getId()); + statement.setInt(11, owner.getObjectId()); statement.execute(); } catch (Exception e) diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java index c3875b4d3c..d169c0c85d 100644 --- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java +++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java @@ -28,7 +28,7 @@ import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.SkillHolder; /** - * @author nexvill + * @author nexvill, Mobius */ public class HomunculusList { @@ -50,14 +50,11 @@ public class HomunculusList { _homunculusList = new ArrayList<>(); - final List homunculuses = HomunculusManager.getInstance().select(_owner); - for (Homunculus homunculus : homunculuses) + for (Homunculus homunculus : HomunculusManager.getInstance().select(_owner)) { _homunculusList.add(homunculus); } - Collections.sort(_homunculusList); - if (_homunculusList.size() > Config.MAX_HOMUNCULUS_COUNT) { for (int i = Config.MAX_HOMUNCULUS_COUNT; i < _homunculusList.size(); i++) @@ -106,15 +103,13 @@ public class HomunculusList if (HomunculusManager.getInstance().insert(_owner, homunculus)) { _homunculusList.add(homunculus); - Collections.sort(_homunculusList); - if (refreshStats(true)) { _owner.sendSkillList(); } - return true; } + return false; } @@ -125,29 +120,46 @@ public class HomunculusList public boolean remove(Homunculus homunculus) { - if (!remove0(homunculus)) - { - return false; - } - - if (refreshStats(true)) - { - _owner.sendSkillList(); - } - - return true; - } - - private boolean remove0(Homunculus homunculus) - { + // Remove from list. if (!_homunculusList.remove(homunculus)) { return false; } - Collections.sort(_homunculusList); + // Remove from database. + if (HomunculusManager.getInstance().delete(_owner, homunculus)) + { + // Sort. + int slot = 0; + final List newList = new ArrayList<>(); + for (int i = 0; i < Config.MAX_HOMUNCULUS_COUNT; i++) + { + final Homunculus homu = get(i); + if (homu == null) + { + continue; + } + + if (homu.getSlot() != slot) + { + homu.setSlot(slot); + update(homu); + } + slot++; + + newList.add(homu); + } + _homunculusList = newList; + + // Refresh stats. + if (refreshStats(true)) + { + _owner.sendSkillList(); + } + return true; + } - return HomunculusManager.getInstance().delete(_owner, homunculus); + return false; } public boolean refreshStats(boolean send) diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java index 405d0c1263..5b67af11d4 100644 --- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java +++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/HomunculusManager.java @@ -30,17 +30,16 @@ import org.l2jmobius.gameserver.model.homunculus.Homunculus; import org.l2jmobius.gameserver.model.homunculus.HomunculusTemplate; /** - * @author nexvill + * @author nexvill, Mobius */ public class HomunculusManager { private static final Logger LOGGER = Logger.getLogger(HomunculusManager.class.getName()); - private static final String SELECT_QUERY = "SELECT slot, id, level, exp, skillLevel1, skillLevel2, skillLevel3, skillLevel4, skillLevel5, active FROM character_homunculus WHERE ownerId=?"; + private static final String SELECT_QUERY = "SELECT slot, id, level, exp, skillLevel1, skillLevel2, skillLevel3, skillLevel4, skillLevel5, active FROM character_homunculus WHERE ownerId=? ORDER by slot ASC"; private static final String INSERT_QUERY = "INSERT INTO `character_homunculus` (ownerId, slot, id, level, exp, skillLevel1, skillLevel2, skillLevel3, skillLevel4, skillLevel5, active) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; private static final String DELETE_QUERY = "DELETE FROM character_homunculus WHERE ownerId=? AND slot=? AND id=? AND level=? AND exp=? AND skillLevel1=? AND skillLevel2=? AND skillLevel3=? AND skillLevel4=? AND skillLevel5=? AND active=?"; - private static final String UPDATE_QUERY = "UPDATE character_homunculus SET level=?, exp=?, skillLevel1=?, skillLevel2=?, skillLevel3=?, skillLevel4=?, skillLevel5=?, active=? WHERE ownerId=? AND slot=? AND id=?"; - private static final String UPDATE_SLOT_QUERY = "UPDATE character_homunculus SET slot=0 WHERE ownerId=? AND slot=1"; + private static final String UPDATE_QUERY = "UPDATE character_homunculus SET level=?, exp=?, skillLevel1=?, skillLevel2=?, skillLevel3=?, skillLevel4=?, skillLevel5=?, active=?, slot=? WHERE id=? AND ownerId=?"; public List select(PlayerInstance owner) { @@ -50,7 +49,6 @@ public class HomunculusManager { statement.setInt(1, owner.getObjectId()); final ResultSet rset = statement.executeQuery(); - while (rset.next()) { final int id = rset.getInt("id"); @@ -144,26 +142,6 @@ public class HomunculusManager LOGGER.warning(owner.getHomunculusList() + " could not delete homunculus: " + id + " " + active + " ownerId: " + owner.getObjectId()); return false; } - if (slot == 0) - { - updateSlot(owner); - } - return true; - } - - private boolean updateSlot(PlayerInstance owner) - { - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement statement = con.prepareStatement(UPDATE_SLOT_QUERY)) - { - statement.setInt(1, owner.getObjectId()); - statement.execute(); - } - catch (Exception e) - { - LOGGER.warning(owner.getHomunculusList() + " could not change homunculus slot on owner id: " + owner.getObjectId()); - return false; - } return true; } @@ -180,9 +158,9 @@ public class HomunculusManager statement.setInt(6, homunculus.getSkillLevel4()); statement.setInt(7, homunculus.getSkillLevel5()); statement.setInt(8, homunculus.isActive() ? 1 : 0); - statement.setInt(9, owner.getObjectId()); - statement.setInt(10, homunculus.getSlot()); - statement.setInt(11, homunculus.getId()); + statement.setInt(9, homunculus.getSlot()); + statement.setInt(10, homunculus.getId()); + statement.setInt(11, owner.getObjectId()); statement.execute(); } catch (Exception e) diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java index c3875b4d3c..d169c0c85d 100644 --- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java +++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/homunculus/HomunculusList.java @@ -28,7 +28,7 @@ import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.SkillHolder; /** - * @author nexvill + * @author nexvill, Mobius */ public class HomunculusList { @@ -50,14 +50,11 @@ public class HomunculusList { _homunculusList = new ArrayList<>(); - final List homunculuses = HomunculusManager.getInstance().select(_owner); - for (Homunculus homunculus : homunculuses) + for (Homunculus homunculus : HomunculusManager.getInstance().select(_owner)) { _homunculusList.add(homunculus); } - Collections.sort(_homunculusList); - if (_homunculusList.size() > Config.MAX_HOMUNCULUS_COUNT) { for (int i = Config.MAX_HOMUNCULUS_COUNT; i < _homunculusList.size(); i++) @@ -106,15 +103,13 @@ public class HomunculusList if (HomunculusManager.getInstance().insert(_owner, homunculus)) { _homunculusList.add(homunculus); - Collections.sort(_homunculusList); - if (refreshStats(true)) { _owner.sendSkillList(); } - return true; } + return false; } @@ -125,29 +120,46 @@ public class HomunculusList public boolean remove(Homunculus homunculus) { - if (!remove0(homunculus)) - { - return false; - } - - if (refreshStats(true)) - { - _owner.sendSkillList(); - } - - return true; - } - - private boolean remove0(Homunculus homunculus) - { + // Remove from list. if (!_homunculusList.remove(homunculus)) { return false; } - Collections.sort(_homunculusList); + // Remove from database. + if (HomunculusManager.getInstance().delete(_owner, homunculus)) + { + // Sort. + int slot = 0; + final List newList = new ArrayList<>(); + for (int i = 0; i < Config.MAX_HOMUNCULUS_COUNT; i++) + { + final Homunculus homu = get(i); + if (homu == null) + { + continue; + } + + if (homu.getSlot() != slot) + { + homu.setSlot(slot); + update(homu); + } + slot++; + + newList.add(homu); + } + _homunculusList = newList; + + // Refresh stats. + if (refreshStats(true)) + { + _owner.sendSkillList(); + } + return true; + } - return HomunculusManager.getInstance().delete(_owner, homunculus); + return false; } public boolean refreshStats(boolean send)