Index: java/net/sf/l2j/gameserver/model/L2Clan.java =================================================================== --- java/net/sf/l2j/gameserver/model/L2Clan.java (revision 1240) +++ java/net/sf/l2j/gameserver/model/L2Clan.java (working copy) @@ -32,6 +32,7 @@ import net.sf.l2j.gameserver.communitybbs.Manager.ForumsBBSManager; import net.sf.l2j.gameserver.datatables.ClanTable; import net.sf.l2j.gameserver.datatables.SkillTable; +import net.sf.l2j.gameserver.instancemanager.CastleManager; import net.sf.l2j.gameserver.instancemanager.SiegeManager; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.network.SystemMessageId; @@ -367,7 +368,10 @@ } } exMember.saveApprenticeAndSponsor(0, 0); - + if (Config.REMOVE_CASTLE_CIRCLETS) + { + CastleManager.getInstance().removeCirclet(exMember,getHasCastle()); + } if (exMember.isOnline()) { L2PcInstance player = exMember.getPlayerInstance(); Index: java/net/sf/l2j/Config.java =================================================================== --- java/net/sf/l2j/Config.java (revision 1245) +++ java/net/sf/l2j/Config.java (working copy) @@ -130,6 +130,8 @@ public static double ALT_GAME_CREATION_SP_RATE; /** Alternative setting to blacksmith use of recipes to craft - default true*/ public static boolean ALT_BLACKSMITH_USE_RECIPES; + /** Remove Castle circlets after clan lose his castle? - default true*/ + public static boolean REMOVE_CASTLE_CIRCLETS; /** Alternative game weight limit multiplier - default 1*/ public static double ALT_WEIGHT_LIMIT; @@ -1640,6 +1642,7 @@ ALT_PARTY_RANGE = Integer.parseInt(altSettings.getProperty("AltPartyRange", "1600")); ALT_PARTY_RANGE2 = Integer.parseInt(altSettings.getProperty("AltPartyRange2", "1400")); ALT_GAME_SKILL_HIT_RATE = Float.parseFloat(altSettings.getProperty("AltGameSkillHitRate", "1.")); + REMOVE_CASTLE_CIRCLETS = Boolean.parseBoolean(altSettings.getProperty("RemoveCastleCirclets", "true")); IS_CRAFTING_ENABLED = Boolean.parseBoolean(altSettings.getProperty("CraftingEnabled", "true")); LIFE_CRYSTAL_NEEDED = Boolean.parseBoolean(altSettings.getProperty("LifeCrystalNeeded", "true")); SP_BOOK_NEEDED = Boolean.parseBoolean(altSettings.getProperty("SpBookNeeded", "true")); @@ -2299,7 +2302,7 @@ else if (pName.equalsIgnoreCase("AltWeightLimit")) ALT_WEIGHT_LIMIT = Double.parseDouble(pValue); else if (pName.equalsIgnoreCase("AltBlacksmithUseRecipes")) ALT_BLACKSMITH_USE_RECIPES = Boolean.valueOf(pValue); else if (pName.equalsIgnoreCase("AltGameSkillLearn")) ALT_GAME_SKILL_LEARN = Boolean.valueOf(pValue); - + else if (pName.equalsIgnoreCase("RemoveCastleCirclets")) REMOVE_CASTLE_CIRCLETS = Boolean.valueOf(pValue); else if (pName.equalsIgnoreCase("AltGameCancelByHit")) { ALT_GAME_CANCEL_BOW = pValue.equalsIgnoreCase("bow") || pValue.equalsIgnoreCase("all"); Index: java/config/altsettings.properties =================================================================== --- java/config/altsettings.properties (revision 1245) +++ java/config/altsettings.properties (working copy) @@ -177,6 +177,9 @@ # Privilege browse warehouse enables at the same time also withdraw from warehouse! AltMembersCanWithdrawFromClanWH = False +#Remove Castle circlets after clan lose his castle? - default true +RemoveCastleCirclets = True + #------------------------------------------------------------- # Olympiad config #------------------------------------------------------------- Index: /java/net/sf/l2j/gameserver/model/entity/Castle.java =================================================================== --- java/net/sf/l2j/gameserver/model/entity/Castle.java (revision 1240) +++ java/net/sf/l2j/gameserver/model/entity/Castle.java (working copy) @@ -25,6 +25,7 @@ import java.util.logging.Logger; import javolution.util.FastList; +import net.sf.l2j.Config; import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.gameserver.Announcements; import net.sf.l2j.gameserver.CastleUpdater; @@ -256,6 +257,10 @@ if (clan != null) { _formerOwner = clan; + if (Config.REMOVE_CASTLE_CIRCLETS) + { + CastleManager.getInstance().removeCirclets(clan,clan.getHasCastle()); + } clan.setHasCastle(0); new Announcements().announceToAll(clan.getName() + " has lost " +getName() + " castle"); clan.broadcastToOnlineMembers(new PledgeShowInfoUpdate(clan)); @@ -264,7 +269,6 @@ updateOwnerInDB(null); if (getSiege().getIsInProgress()) getSiege().midVictory(); - updateClansReputation(); } Index: java/net/sf/l2j/gameserver/instancemanager/CastleManager.java =================================================================== --- java/net/sf/l2j/gameserver/instancemanager/CastleManager.java (revision 1272) +++ java/net/sf/l2j/gameserver/instancemanager/CastleManager.java (working copy) @@ -24,7 +24,10 @@ import javolution.util.FastList; import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.gameserver.model.L2Clan; +import net.sf.l2j.gameserver.model.L2ClanMember; +import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2Object; +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.entity.Castle; import net.sf.l2j.gameserver.SevenSigns; @@ -225,4 +228,54 @@ return 0; } + + // remove this castle's circlets from the clan + public void removeCirclet(L2Clan clan, int castleId) + { + for (L2ClanMember member : clan.getMembers()) + removeCirclet(member, castleId); + } + public void removeCirclet(L2ClanMember member, int castleId) + { + if (member == null) return; + L2PcInstance player = member.getPlayerInstance(); + int circletId = getCircletByCastleId(castleId); + + if (circletId != 0) + { + // online-player circlet removal + if (player != null) + { + L2ItemInstance circlet = player.getInventory().getItemByItemId(circletId); + if (circlet != null) + { + if (circlet.isEquipped()) + player.getInventory().unEquipItemInSlotAndRecord(circlet.getEquipSlot()); + player.destroyItemByItemId("CastleCircletRemoval", circletId, 1, player, true); + } + } + else // offline-player circlet removal + { + java.sql.Connection con = null; + try + { + con = L2DatabaseFactory.getInstance().getConnection(); + PreparedStatement statement = con.prepareStatement("DELETE FROM items WHERE owner_id = ? and item_id = ?"); + statement.setInt(1, member.getObjectId()); + statement.setInt(2, circletId); + statement.execute(); + statement.close(); + } + catch (Exception e) + { + System.out.println("Failed to remove castle circlets offline for player "+member.getName()); + e.printStackTrace(); + } + finally + { + try { con.close(); } catch (Exception e) {} + } + } + } + } }