L2Clan.java 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.sf.l2j.gameserver.model;
  16. import java.sql.PreparedStatement;
  17. import java.sql.ResultSet;
  18. import java.util.List;
  19. import java.util.Map;
  20. import java.util.logging.Logger;
  21. import javolution.util.FastList;
  22. import javolution.util.FastMap;
  23. import net.sf.l2j.Config;
  24. import net.sf.l2j.L2DatabaseFactory;
  25. import net.sf.l2j.gameserver.communitybbs.BB.Forum;
  26. import net.sf.l2j.gameserver.communitybbs.Manager.ForumsBBSManager;
  27. import net.sf.l2j.gameserver.datatables.ClanTable;
  28. import net.sf.l2j.gameserver.datatables.SkillTable;
  29. import net.sf.l2j.gameserver.instancemanager.CastleManager;
  30. import net.sf.l2j.gameserver.instancemanager.SiegeManager;
  31. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  32. import net.sf.l2j.gameserver.network.SystemMessageId;
  33. import net.sf.l2j.gameserver.serverpackets.ItemList;
  34. import net.sf.l2j.gameserver.serverpackets.L2GameServerPacket;
  35. import net.sf.l2j.gameserver.serverpackets.PledgeReceiveSubPledgeCreated;
  36. import net.sf.l2j.gameserver.serverpackets.PledgeShowInfoUpdate;
  37. import net.sf.l2j.gameserver.serverpackets.PledgeShowMemberListAll;
  38. import net.sf.l2j.gameserver.serverpackets.PledgeShowMemberListDeleteAll;
  39. import net.sf.l2j.gameserver.serverpackets.PledgeShowMemberListUpdate;
  40. import net.sf.l2j.gameserver.serverpackets.PledgeSkillListAdd;
  41. import net.sf.l2j.gameserver.serverpackets.StatusUpdate;
  42. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  43. import net.sf.l2j.gameserver.serverpackets.UserInfo;
  44. import net.sf.l2j.gameserver.util.Util;
  45. /**
  46. * This class ...
  47. *
  48. * @version $Revision: 1.7.2.4.2.7 $ $Date: 2005/04/06 16:13:41 $
  49. */
  50. public class L2Clan
  51. {
  52. private static final Logger _log = Logger.getLogger(L2Clan.class.getName());
  53. private String _name;
  54. private int _clanId;
  55. private L2ClanMember _leader;
  56. private Map<Integer, L2ClanMember> _members = new FastMap<Integer, L2ClanMember>();
  57. private String _allyName;
  58. private int _allyId;
  59. private int _level;
  60. private int _hasCastle;
  61. private int _hasFort;
  62. private int _hasHideout;
  63. private boolean _hasCrest;
  64. private int _hiredGuards;
  65. private int _crestId;
  66. private int _crestLargeId;
  67. private int _allyCrestId;
  68. private int _auctionBiddedAt = 0;
  69. private long _allyPenaltyExpiryTime;
  70. private int _allyPenaltyType;
  71. private long _charPenaltyExpiryTime;
  72. private long _dissolvingExpiryTime;
  73. // Ally Penalty Types
  74. /** Clan leaved ally */
  75. public static final int PENALTY_TYPE_CLAN_LEAVED = 1;
  76. /** Clan was dismissed from ally */
  77. public static final int PENALTY_TYPE_CLAN_DISMISSED = 2;
  78. /** Leader clan dismiss clan from ally */
  79. public static final int PENALTY_TYPE_DISMISS_CLAN = 3;
  80. /** Leader clan dissolve ally */
  81. public static final int PENALTY_TYPE_DISSOLVE_ALLY = 4;
  82. private ItemContainer _warehouse = new ClanWarehouse(this);
  83. private List<Integer> _atWarWith = new FastList<Integer>();
  84. private List<Integer> _atWarAttackers = new FastList<Integer>();
  85. private boolean _hasCrestLarge;
  86. private Forum _forum;
  87. private List<L2Skill> _skillList = new FastList<L2Skill>();
  88. // Clan Privileges
  89. /** No privilege to manage any clan activity */
  90. public static final int CP_NOTHING = 0;
  91. /** Privilege to join clan */
  92. public static final int CP_CL_JOIN_CLAN = 2;
  93. /** Privilege to give a title */
  94. public static final int CP_CL_GIVE_TITLE = 4;
  95. /** Privilege to view warehouse content */
  96. public static final int CP_CL_VIEW_WAREHOUSE = 8;
  97. /** Privilege to manage clan ranks */
  98. public static final int CP_CL_MANAGE_RANKS = 16;
  99. public static final int CP_CL_PLEDGE_WAR = 32;
  100. public static final int CP_CL_DISMISS = 64;
  101. /** Privilege to register clan crest */
  102. public static final int CP_CL_REGISTER_CREST = 128;
  103. public static final int CP_CL_MASTER_RIGHTS = 256;
  104. public static final int CP_CL_MANAGE_LEVELS = 512;
  105. /** Privilege to open a door */
  106. public static final int CP_CH_OPEN_DOOR = 1024;
  107. public static final int CP_CH_OTHER_RIGHTS = 2048;
  108. public static final int CP_CH_AUCTION = 4096;
  109. public static final int CP_CH_DISMISS = 8192;
  110. public static final int CP_CH_SET_FUNCTIONS = 16384;
  111. public static final int CP_CS_OPEN_DOOR = 32768;
  112. public static final int CP_CS_MANOR_ADMIN = 65536;
  113. public static final int CP_CS_MANAGE_SIEGE = 131072;
  114. public static final int CP_CS_USE_FUNCTIONS = 262144;
  115. public static final int CP_CS_DISMISS = 524288;
  116. public static final int CP_CS_TAXES =1048576;
  117. public static final int CP_CS_MERCENARIES =2097152;
  118. public static final int CP_CS_SET_FUNCTIONS =4194304;
  119. /** Privilege to manage all clan activity */
  120. public static final int CP_ALL = 8388606;
  121. // Sub-unit types
  122. /** Clan subunit type of Academy */
  123. public static final int SUBUNIT_ACADEMY = -1;
  124. /** Clan subunit type of Royal Guard A */
  125. public static final int SUBUNIT_ROYAL1 = 100;
  126. /** Clan subunit type of Royal Guard B */
  127. public static final int SUBUNIT_ROYAL2 = 200;
  128. /** Clan subunit type of Order of Knights A-1 */
  129. public static final int SUBUNIT_KNIGHT1 = 1001;
  130. /** Clan subunit type of Order of Knights A-2 */
  131. public static final int SUBUNIT_KNIGHT2 = 1002;
  132. /** Clan subunit type of Order of Knights B-1 */
  133. public static final int SUBUNIT_KNIGHT3 = 2001;
  134. /** Clan subunit type of Order of Knights B-2 */
  135. public static final int SUBUNIT_KNIGHT4 = 2002;
  136. /** FastMap(Integer, L2Skill) containing all skills of the L2Clan */
  137. protected final Map<Integer, L2Skill> _skills = new FastMap<Integer, L2Skill>();
  138. protected final Map<Integer, RankPrivs> _privs = new FastMap<Integer, RankPrivs>();
  139. protected final Map<Integer, SubPledge> _subPledges = new FastMap<Integer, SubPledge>();
  140. private int _reputationScore = 0;
  141. private int _rank = 0;
  142. /**
  143. * Called if a clan is referenced only by id.
  144. * In this case all other data needs to be fetched from db
  145. *
  146. * @param clanId A valid clan Id to create and restore
  147. */
  148. public L2Clan(int clanId)
  149. {
  150. _clanId = clanId;
  151. initializePrivs();
  152. restore();
  153. getWarehouse().restore();
  154. }
  155. /**
  156. * Called only if a new clan is created
  157. *
  158. * @param clanId A valid clan Id to create
  159. * @param clanName A valid clan name
  160. */
  161. public L2Clan(int clanId, String clanName)
  162. {
  163. _clanId = clanId;
  164. _name = clanName;
  165. initializePrivs();
  166. }
  167. /**
  168. * @return Returns the clanId.
  169. */
  170. public int getClanId()
  171. {
  172. return _clanId;
  173. }
  174. /**
  175. * @param clanId The clanId to set.
  176. */
  177. public void setClanId(int clanId)
  178. {
  179. _clanId = clanId;
  180. }
  181. /**
  182. * @return Returns the leaderId.
  183. */
  184. public int getLeaderId()
  185. {
  186. return (_leader != null ? _leader.getObjectId() : 0);
  187. }
  188. /**
  189. * @return L2ClanMember of clan leader.
  190. */
  191. public L2ClanMember getLeader()
  192. {
  193. return _leader;
  194. }
  195. /**
  196. * @param leaderId The leaderId to set.
  197. */
  198. public void setLeader(L2ClanMember leader)
  199. {
  200. _leader = leader;
  201. _members.put(leader.getObjectId(), leader);
  202. }
  203. public void setNewLeader(L2ClanMember member)
  204. {
  205. if (!getLeader().isOnline())
  206. {
  207. return;
  208. }
  209. if (member == null)
  210. {
  211. return;
  212. }
  213. if (!member.isOnline())
  214. {
  215. return;
  216. }
  217. L2PcInstance exLeader = getLeader().getPlayerInstance();
  218. SiegeManager.getInstance().removeSiegeSkills(exLeader);
  219. exLeader.setClan(this);
  220. exLeader.setClanPrivileges(L2Clan.CP_NOTHING);
  221. exLeader.broadcastUserInfo();
  222. setLeader(member);
  223. updateClanInDB();
  224. exLeader.setPledgeClass(exLeader.getClan().getClanMember(exLeader.getObjectId()).calculatePledgeClass(exLeader));
  225. exLeader.broadcastUserInfo();
  226. L2PcInstance newLeader = member.getPlayerInstance();
  227. newLeader.setClan(this);
  228. newLeader.setPledgeClass(member.calculatePledgeClass(newLeader));
  229. newLeader.setClanPrivileges(L2Clan.CP_ALL);
  230. if (getLevel() >= SiegeManager.getInstance().getSiegeClanMinLevel())
  231. {
  232. SiegeManager.getInstance().addSiegeSkills(newLeader);
  233. }
  234. newLeader.broadcastUserInfo();
  235. broadcastClanStatus();
  236. SystemMessage sm = new SystemMessage(SystemMessageId.CLAN_LEADER_PRIVILEGES_HAVE_BEEN_TRANSFERRED_TO_S1);
  237. sm.addString(newLeader.getName());
  238. broadcastToOnlineMembers(sm);
  239. sm = null;
  240. }
  241. /**
  242. * @return Returns the leaderName.
  243. */
  244. public String getLeaderName()
  245. {
  246. return _members.get(new Integer(_leader.getObjectId())).getName();
  247. }
  248. /**
  249. * @return Returns the name.
  250. */
  251. public String getName()
  252. {
  253. return _name;
  254. }
  255. /**
  256. * @param name The name to set.
  257. */
  258. public void setName(String name)
  259. {
  260. _name = name;
  261. }
  262. private void addClanMember(L2ClanMember member)
  263. {
  264. _members.put(member.getObjectId(), member);
  265. }
  266. public void addClanMember(L2PcInstance player)
  267. {
  268. // Using a different constructor, to make it easier to read
  269. // L2ClanMember(L2Clan, L2PcInstance)
  270. // L2ClanMember member = new L2ClanMember(this,player.getName(), player.getLevel(), player.getClassId().getId(), player.getObjectId(), player.getPledgeType(), player.getPowerGrade(), player.getTitle(), player.getAppearance().getSex(), player.getRace().ordinal());
  271. L2ClanMember member = new L2ClanMember(this, player);
  272. // store in memory
  273. //
  274. addClanMember(member);
  275. member.setPlayerInstance(player);
  276. player.setClan(this);
  277. player.setPledgeClass(member.calculatePledgeClass(player));
  278. player.sendPacket(new PledgeShowMemberListUpdate(player));
  279. player.sendPacket(new UserInfo(player));
  280. }
  281. public void updateClanMember(L2PcInstance player)
  282. {
  283. L2ClanMember member = new L2ClanMember(player);
  284. addClanMember(member);
  285. }
  286. public L2ClanMember getClanMember(String name)
  287. {
  288. for (L2ClanMember temp : _members.values())
  289. {
  290. if (temp.getName().equals(name)) return temp;
  291. }
  292. return null;
  293. }
  294. public L2ClanMember getClanMember(int objectID)
  295. {
  296. return _members.get(objectID);
  297. }
  298. public void removeClanMember(int objectId, long clanJoinExpiryTime)
  299. {
  300. L2ClanMember exMember = _members.remove(objectId);
  301. if(exMember == null)
  302. {
  303. _log.warning("Member Object ID: "+objectId+" not found in clan while trying to remove");
  304. return;
  305. }
  306. int leadssubpledge = getLeaderSubPledge(objectId);
  307. if (leadssubpledge != 0)
  308. {
  309. // Sub-unit leader withdraws, position becomes vacant and leader
  310. // should appoint new via NPC
  311. getSubPledge(leadssubpledge).setLeaderId(0);
  312. updateSubPledgeInDB(leadssubpledge);
  313. }
  314. if(exMember.getApprentice() != 0)
  315. {
  316. L2ClanMember apprentice = getClanMember(exMember.getApprentice());
  317. if(apprentice != null)
  318. {
  319. if (apprentice.getPlayerInstance() != null)
  320. apprentice.getPlayerInstance().setSponsor(0);
  321. else
  322. apprentice.initApprenticeAndSponsor(0, 0);
  323. apprentice.saveApprenticeAndSponsor(0, 0);
  324. }
  325. }
  326. if(exMember.getSponsor() != 0)
  327. {
  328. L2ClanMember sponsor = getClanMember(exMember.getSponsor());
  329. if(sponsor != null)
  330. {
  331. if (sponsor.getPlayerInstance() != null)
  332. sponsor.getPlayerInstance().setApprentice(0);
  333. else
  334. sponsor.initApprenticeAndSponsor(0, 0);
  335. sponsor.saveApprenticeAndSponsor(0, 0);
  336. }
  337. }
  338. exMember.saveApprenticeAndSponsor(0, 0);
  339. if (Config.REMOVE_CASTLE_CIRCLETS)
  340. {
  341. CastleManager.getInstance().removeCirclet(exMember,getHasCastle());
  342. }
  343. if (exMember.isOnline())
  344. {
  345. L2PcInstance player = exMember.getPlayerInstance();
  346. player.setApprentice(0);
  347. player.setSponsor(0);
  348. if (player.isClanLeader())
  349. {
  350. SiegeManager.getInstance().removeSiegeSkills(player);
  351. player.setClanCreateExpiryTime(System.currentTimeMillis() + Config.ALT_CLAN_CREATE_DAYS * 86400000L); //24*60*60*1000 = 86400000
  352. }
  353. // remove Clanskills from Player
  354. for(L2Skill skill: player.getClan().getAllSkills())
  355. player.removeSkill(skill,false);
  356. player.setClan(null);
  357. player.setClanJoinExpiryTime(clanJoinExpiryTime);
  358. player.setPledgeClass(exMember.calculatePledgeClass(player));
  359. player.broadcastUserInfo();
  360. // disable clan tab
  361. player.sendPacket(new PledgeShowMemberListDeleteAll());
  362. }
  363. else
  364. {
  365. removeMemberInDatabase(exMember, clanJoinExpiryTime,
  366. getLeaderId()==objectId ? System.currentTimeMillis() + Config.ALT_CLAN_CREATE_DAYS * 86400000L : 0);
  367. }
  368. }
  369. public L2ClanMember[] getMembers()
  370. {
  371. return _members.values().toArray(new L2ClanMember[_members.size()]);
  372. }
  373. public int getMembersCount()
  374. {
  375. return _members.size();
  376. }
  377. public int getSubPledgeMembersCount(int subpl)
  378. {
  379. int result = 0;
  380. for (L2ClanMember temp : _members.values())
  381. {
  382. if (temp.getPledgeType() == subpl) result++;
  383. }
  384. return result;
  385. }
  386. public int getMaxNrOfMembers(int pledgetype)
  387. {
  388. int limit = 0;
  389. switch (pledgetype)
  390. {
  391. case 0:
  392. switch (getLevel())
  393. {
  394. case 4:
  395. limit = 40;
  396. break;
  397. case 3:
  398. limit = 30;
  399. break;
  400. case 2:
  401. limit = 20;
  402. break;
  403. case 1:
  404. limit = 15;
  405. break;
  406. case 0:
  407. limit = 10;
  408. break;
  409. default:
  410. limit = 40;
  411. break;
  412. }
  413. break;
  414. case -1:
  415. case 100:
  416. case 200:
  417. limit = 20;
  418. break;
  419. case 1001:
  420. case 1002:
  421. case 2001:
  422. case 2002:
  423. switch (getLevel())
  424. {
  425. case 9:
  426. case 10:
  427. limit = 25;
  428. break;
  429. default:
  430. limit = 10;
  431. break;
  432. }
  433. break;
  434. default:
  435. break;
  436. }
  437. return limit;
  438. }
  439. public L2PcInstance[] getOnlineMembers(int exclude)
  440. {
  441. List<L2PcInstance> result = new FastList<L2PcInstance>();
  442. for (L2ClanMember temp : _members.values())
  443. {
  444. try {
  445. if (temp.isOnline() && !(temp.getObjectId()==exclude))
  446. result.add(temp.getPlayerInstance());
  447. } catch (NullPointerException e) {}
  448. }
  449. return result.toArray(new L2PcInstance[result.size()]);
  450. }
  451. /**
  452. * @return
  453. */
  454. public int getAllyId()
  455. {
  456. return _allyId;
  457. }
  458. /**
  459. * @return
  460. */
  461. public String getAllyName()
  462. {
  463. return _allyName;
  464. }
  465. public void setAllyCrestId(int allyCrestId)
  466. {
  467. _allyCrestId = allyCrestId;
  468. }
  469. /**
  470. * @return
  471. */
  472. public int getAllyCrestId()
  473. {
  474. return _allyCrestId;
  475. }
  476. /**
  477. * @return
  478. */
  479. public int getLevel()
  480. {
  481. return _level;
  482. }
  483. /**
  484. * @return
  485. */
  486. public int getHasCastle()
  487. {
  488. return _hasCastle;
  489. }
  490. /**
  491. * @return
  492. */
  493. public int getHasFort()
  494. {
  495. return _hasFort;
  496. }
  497. /**
  498. * @return
  499. */
  500. public int getHasHideout()
  501. {
  502. return _hasHideout;
  503. }
  504. /**
  505. * @param crestId The id of pledge crest.
  506. */
  507. public void setCrestId(int crestId)
  508. {
  509. _crestId = crestId;
  510. }
  511. /**
  512. * @return Returns the clanCrestId.
  513. */
  514. public int getCrestId()
  515. {
  516. return _crestId;
  517. }
  518. /**
  519. * @param crestLargeId The id of pledge LargeCrest.
  520. */
  521. public void setCrestLargeId(int crestLargeId)
  522. {
  523. _crestLargeId = crestLargeId;
  524. }
  525. /**
  526. * @return Returns the clan CrestLargeId
  527. */
  528. public int getCrestLargeId()
  529. {
  530. return _crestLargeId;
  531. }
  532. /**
  533. * @param allyId The allyId to set.
  534. */
  535. public void setAllyId(int allyId)
  536. {
  537. _allyId = allyId;
  538. }
  539. /**
  540. * @param allyName The allyName to set.
  541. */
  542. public void setAllyName(String allyName)
  543. {
  544. _allyName = allyName;
  545. }
  546. /**
  547. * @param hasCastle The hasCastle to set.
  548. */
  549. public void setHasCastle(int hasCastle)
  550. {
  551. _hasCastle = hasCastle;
  552. }
  553. /**
  554. * @param hasFort The hasFort to set.
  555. */
  556. public void setHasFort(int hasFort)
  557. {
  558. _hasFort = hasFort;
  559. }
  560. /**
  561. * @param hasHideout The hasHideout to set.
  562. */
  563. public void setHasHideout(int hasHideout)
  564. {
  565. _hasHideout = hasHideout;
  566. }
  567. /**
  568. * @param level The level to set.
  569. */
  570. public void setLevel(int level)
  571. {
  572. _level = level;
  573. if(_forum == null)
  574. {
  575. if(_level >= 2)
  576. {
  577. _forum = ForumsBBSManager.getInstance().getForumByName("ClanRoot").getChildByName(_name);
  578. if(_forum == null)
  579. {
  580. _forum = ForumsBBSManager.getInstance().createNewForum(_name,ForumsBBSManager.getInstance().getForumByName("ClanRoot"),Forum.CLAN,Forum.CLANMEMBERONLY,getClanId());
  581. }
  582. }
  583. }
  584. }
  585. /**
  586. * @param player name
  587. * @return
  588. */
  589. public boolean isMember(int id)
  590. {
  591. return (id == 0 ? false :_members.containsKey(id));
  592. }
  593. public void updateClanInDB()
  594. {
  595. java.sql.Connection con = null;
  596. try
  597. {
  598. con = L2DatabaseFactory.getInstance().getConnection();
  599. PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET leader_id=?,ally_id=?,ally_name=?,reputation_score=?,ally_penalty_expiry_time=?,ally_penalty_type=?,char_penalty_expiry_time=?,dissolving_expiry_time=? WHERE clan_id=?");
  600. statement.setInt(1, getLeaderId());
  601. statement.setInt(2, getAllyId());
  602. statement.setString(3, getAllyName());
  603. statement.setInt(4, getReputationScore());
  604. statement.setLong(5, getAllyPenaltyExpiryTime());
  605. statement.setInt(6, getAllyPenaltyType());
  606. statement.setLong(7, getCharPenaltyExpiryTime());
  607. statement.setLong(8, getDissolvingExpiryTime());
  608. statement.setInt(9, getClanId());
  609. statement.execute();
  610. statement.close();
  611. if (Config.DEBUG) _log.fine("New clan leader saved in db: "+getClanId());
  612. }
  613. catch (Exception e)
  614. {
  615. _log.warning("error while saving new clan leader to db "+e);
  616. }
  617. finally
  618. {
  619. try { con.close(); } catch (Exception e) {}
  620. }
  621. }
  622. public void store()
  623. {
  624. java.sql.Connection con = null;
  625. try
  626. {
  627. con = L2DatabaseFactory.getInstance().getConnection();
  628. PreparedStatement statement = con.prepareStatement("INSERT INTO clan_data (clan_id,clan_name,clan_level,hasCastle,ally_id,ally_name,leader_id,crest_id,crest_large_id,ally_crest_id) values (?,?,?,?,?,?,?,?,?,?)");
  629. statement.setInt(1, getClanId());
  630. statement.setString(2, getName());
  631. statement.setInt(3, getLevel());
  632. statement.setInt(4, getHasCastle());
  633. statement.setInt(5, getAllyId());
  634. statement.setString(6, getAllyName());
  635. statement.setInt(7, getLeaderId());
  636. statement.setInt(8, getCrestId());
  637. statement.setInt(9,getCrestLargeId());
  638. statement.setInt(10,getAllyCrestId());
  639. statement.execute();
  640. statement.close();
  641. if (Config.DEBUG) _log.fine("New clan saved in db: "+getClanId());
  642. }
  643. catch (Exception e)
  644. {
  645. _log.warning("error while saving new clan to db "+e);
  646. }
  647. finally
  648. {
  649. try { con.close(); } catch (Exception e) {}
  650. }
  651. }
  652. private void removeMemberInDatabase(L2ClanMember member, long clanJoinExpiryTime, long clanCreateExpiryTime)
  653. {
  654. java.sql.Connection con = null;
  655. try
  656. {
  657. con = L2DatabaseFactory.getInstance().getConnection();
  658. PreparedStatement statement = con.prepareStatement("UPDATE characters SET clanid=0, title=?, clan_join_expiry_time=?, clan_create_expiry_time=?, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0 WHERE charId=?");
  659. statement.setString(1, "");
  660. statement.setLong(2, clanJoinExpiryTime);
  661. statement.setLong(3, clanCreateExpiryTime);
  662. statement.setInt(4, member.getObjectId());
  663. statement.execute();
  664. statement.close();
  665. if (Config.DEBUG) _log.fine("clan member removed in db: "+getClanId());
  666. statement = con.prepareStatement("UPDATE characters SET apprentice=0 WHERE apprentice=?");
  667. statement.setInt(1, member.getObjectId());
  668. statement.execute();
  669. statement.close();
  670. statement = con.prepareStatement("UPDATE characters SET sponsor=0 WHERE sponsor=?");
  671. statement.setInt(1, member.getObjectId());
  672. statement.execute();
  673. statement.close();
  674. }
  675. catch (Exception e)
  676. {
  677. _log.warning("error while removing clan member in db "+e);
  678. }
  679. finally
  680. {
  681. try { con.close(); } catch (Exception e) {}
  682. }
  683. }
  684. @SuppressWarnings("unused")
  685. private void updateWarsInDB()
  686. {
  687. java.sql.Connection con = null;
  688. try
  689. {
  690. con = L2DatabaseFactory.getInstance().getConnection();
  691. PreparedStatement statement;
  692. statement = con.prepareStatement("UPDATE clan_wars SET wantspeace1=? WHERE clan1=?");
  693. statement.setInt(1, 0);
  694. statement.setInt(2, 0);
  695. // TODO: deprecated? no execute? :o
  696. statement.close();
  697. }
  698. catch (Exception e)
  699. {
  700. _log.warning("could not update clans wars data:" + e);
  701. }
  702. finally
  703. {
  704. try
  705. {
  706. con.close();
  707. }
  708. catch (Exception e)
  709. {
  710. }
  711. }
  712. }
  713. private void restore()
  714. {
  715. //restorewars();
  716. java.sql.Connection con = null;
  717. try
  718. {
  719. L2ClanMember member;
  720. con = L2DatabaseFactory.getInstance().getConnection();
  721. PreparedStatement statement = con.prepareStatement("SELECT clan_name,clan_level,hasCastle,ally_id,ally_name,leader_id,crest_id,crest_large_id,ally_crest_id,reputation_score,auction_bid_at,ally_penalty_expiry_time,ally_penalty_type,char_penalty_expiry_time,dissolving_expiry_time FROM clan_data where clan_id=?");
  722. statement.setInt(1, getClanId());
  723. ResultSet clanData = statement.executeQuery();
  724. if (clanData.next())
  725. {
  726. setName(clanData.getString("clan_name"));
  727. setLevel(clanData.getInt("clan_level"));
  728. setHasCastle(clanData.getInt("hasCastle"));
  729. setAllyId(clanData.getInt("ally_id"));
  730. setAllyName(clanData.getString("ally_name"));
  731. setAllyPenaltyExpiryTime(clanData.getLong("ally_penalty_expiry_time"), clanData.getInt("ally_penalty_type"));
  732. if (getAllyPenaltyExpiryTime() < System.currentTimeMillis())
  733. {
  734. setAllyPenaltyExpiryTime(0, 0);
  735. }
  736. setCharPenaltyExpiryTime(clanData.getLong("char_penalty_expiry_time"));
  737. if (getCharPenaltyExpiryTime() + Config.ALT_CLAN_JOIN_DAYS * 86400000L < System.currentTimeMillis()) //24*60*60*1000 = 86400000
  738. {
  739. setCharPenaltyExpiryTime(0);
  740. }
  741. setDissolvingExpiryTime(clanData.getLong("dissolving_expiry_time"));
  742. setCrestId(clanData.getInt("crest_id"));
  743. if (getCrestId() != 0)
  744. {
  745. setHasCrest(true);
  746. }
  747. setCrestLargeId(clanData.getInt("crest_large_id"));
  748. if (getCrestLargeId() != 0)
  749. {
  750. setHasCrestLarge(true);
  751. }
  752. setAllyCrestId(clanData.getInt("ally_crest_id"));
  753. setReputationScore(clanData.getInt("reputation_score"), false);
  754. setAuctionBiddedAt(clanData.getInt("auction_bid_at"), false);
  755. int leaderId = (clanData.getInt("leader_id"));
  756. PreparedStatement statement2 = con.prepareStatement("SELECT char_name,level,classid,charId,title,power_grade,subpledge,apprentice,sponsor,sex,race FROM characters WHERE clanid=?");
  757. statement2.setInt(1, getClanId());
  758. ResultSet clanMembers = statement2.executeQuery();
  759. while (clanMembers.next())
  760. {
  761. member = new L2ClanMember(this, clanMembers.getString("char_name"), clanMembers.getInt("level"), clanMembers.getInt("classid"), clanMembers.getInt("charId"),clanMembers.getInt("subpledge"), clanMembers.getInt("power_grade"), clanMembers.getString("title"), (clanMembers.getInt("sex")!=0), clanMembers.getInt("race"));
  762. if (member.getObjectId() == leaderId)
  763. setLeader(member);
  764. else
  765. addClanMember(member);
  766. member.initApprenticeAndSponsor(clanMembers.getInt("apprentice"), clanMembers.getInt("sponsor"));
  767. }
  768. clanMembers.close();
  769. statement2.close();
  770. }
  771. clanData.close();
  772. statement.close();
  773. if (Config.DEBUG && getName() != null)
  774. _log.config("Restored clan data for \"" + getName() + "\" from database.");
  775. restoreSubPledges();
  776. restoreRankPrivs();
  777. restoreSkills();
  778. }
  779. catch (Exception e)
  780. {
  781. _log.warning("error while restoring clan "+e);
  782. }
  783. finally
  784. {
  785. try { con.close(); } catch (Exception e) {}
  786. }
  787. }
  788. private void restoreSkills()
  789. {
  790. java.sql.Connection con = null;
  791. try
  792. {
  793. // Retrieve all skills of this L2PcInstance from the database
  794. con = L2DatabaseFactory.getInstance().getConnection();
  795. PreparedStatement statement = con.prepareStatement("SELECT skill_id,skill_level FROM clan_skills WHERE clan_id=?");
  796. statement.setInt(1, getClanId());
  797. ResultSet rset = statement.executeQuery();
  798. // Go though the recordset of this SQL query
  799. while (rset.next())
  800. {
  801. int id = rset.getInt("skill_id");
  802. int level = rset.getInt("skill_level");
  803. // Create a L2Skill object for each record
  804. L2Skill skill = SkillTable.getInstance().getInfo(id, level);
  805. // Add the L2Skill object to the L2Clan _skills
  806. _skills.put(skill.getId(), skill);
  807. }
  808. rset.close();
  809. statement.close();
  810. }
  811. catch (Exception e)
  812. {
  813. _log.warning("Could not restore clan skills: " + e);
  814. }
  815. finally
  816. {
  817. try { con.close(); } catch (Exception e) {}
  818. }
  819. }
  820. /** used to retrieve all skills */
  821. public final L2Skill[] getAllSkills()
  822. {
  823. if (_skills == null)
  824. return new L2Skill[0];
  825. return _skills.values().toArray(new L2Skill[_skills.values().size()]);
  826. }
  827. /** used to add a skill to skill list of this L2Clan */
  828. public L2Skill addSkill(L2Skill newSkill)
  829. {
  830. L2Skill oldSkill = null;
  831. if (newSkill != null)
  832. {
  833. // Replace oldSkill by newSkill or Add the newSkill
  834. oldSkill = _skills.put(newSkill.getId(), newSkill);
  835. }
  836. return oldSkill;
  837. }
  838. /** used to add a new skill to the list, send a packet to all online clan members, update their stats and store it in db*/
  839. public L2Skill addNewSkill(L2Skill newSkill)
  840. {
  841. L2Skill oldSkill = null;
  842. java.sql.Connection con = null;
  843. if (newSkill != null)
  844. {
  845. // Replace oldSkill by newSkill or Add the newSkill
  846. oldSkill = _skills.put(newSkill.getId(), newSkill);
  847. try
  848. {
  849. con = L2DatabaseFactory.getInstance().getConnection();
  850. PreparedStatement statement;
  851. if (oldSkill != null)
  852. {
  853. statement = con.prepareStatement("UPDATE clan_skills SET skill_level=? WHERE skill_id=? AND clan_id=?");
  854. statement.setInt(1, newSkill.getLevel());
  855. statement.setInt(2, oldSkill.getId());
  856. statement.setInt(3, getClanId());
  857. statement.execute();
  858. statement.close();
  859. }
  860. else
  861. {
  862. statement = con.prepareStatement("INSERT INTO clan_skills (clan_id,skill_id,skill_level,skill_name) VALUES (?,?,?,?)");
  863. statement.setInt(1, getClanId());
  864. statement.setInt(2, newSkill.getId());
  865. statement.setInt(3, newSkill.getLevel());
  866. statement.setString(4, newSkill.getName());
  867. statement.execute();
  868. statement.close();
  869. }
  870. }
  871. catch (Exception e)
  872. {
  873. _log.warning("Error could not store char skills: " + e);
  874. }
  875. finally
  876. {
  877. try { con.close(); } catch (Exception e) {}
  878. }
  879. for (L2ClanMember temp : _members.values())
  880. {
  881. try {
  882. if (temp.isOnline())
  883. {
  884. if (newSkill.getMinPledgeClass() <= temp.getPlayerInstance().getPledgeClass())
  885. {
  886. temp.getPlayerInstance().addSkill(newSkill, false); // Skill is not saved to player DB
  887. temp.getPlayerInstance().sendPacket(new PledgeSkillListAdd(newSkill.getId(), newSkill.getLevel()));
  888. }
  889. }
  890. } catch (NullPointerException e) {}
  891. }
  892. }
  893. return oldSkill;
  894. }
  895. public void addSkillEffects()
  896. {
  897. for(L2Skill skill : _skills.values())
  898. {
  899. for (L2ClanMember temp : _members.values())
  900. {
  901. try{
  902. if (temp.isOnline())
  903. {
  904. if (skill.getMinPledgeClass() <= temp.getPlayerInstance().getPledgeClass())
  905. temp.getPlayerInstance().addSkill(skill, false); // Skill is not saved to player DB
  906. }
  907. } catch (NullPointerException e) {}
  908. }
  909. }
  910. }
  911. public void addSkillEffects(L2PcInstance cm)
  912. {
  913. if (cm == null)
  914. return;
  915. for(L2Skill skill : _skills.values())
  916. {
  917. //TODO add skills according to members class( in ex. don't add Clan Agillity skill's effect to lower class then Baron)
  918. if (skill.getMinPledgeClass() <= cm.getPledgeClass())
  919. cm.addSkill(skill, false); // Skill is not saved to player DB
  920. }
  921. }
  922. /*
  923. public void broadcastToOnlineAllyMembers(L2GameServerPacket packet)
  924. {
  925. if (getAllyId() == 0)
  926. {
  927. return;
  928. }
  929. for (L2Clan clan : _allyList.values())
  930. {
  931. clan.broadcastToOnlineMembers(packet);
  932. }
  933. }
  934. */
  935. public void broadcastToOnlineAllyMembers(L2GameServerPacket packet)
  936. {
  937. if (getAllyId() == 0)
  938. {
  939. return;
  940. }
  941. for (L2Clan clan : ClanTable.getInstance().getClans())
  942. {
  943. if (clan.getAllyId() == getAllyId())
  944. {
  945. clan.broadcastToOnlineMembers(packet);
  946. }
  947. }
  948. }
  949. public void broadcastToOnlineMembers(L2GameServerPacket packet)
  950. {
  951. for (L2ClanMember member : _members.values())
  952. {
  953. try {
  954. if (member.isOnline())
  955. member.getPlayerInstance().sendPacket(packet);
  956. } catch (NullPointerException e) {}
  957. }
  958. }
  959. public void broadcastToOtherOnlineMembers(L2GameServerPacket packet, L2PcInstance player)
  960. {
  961. for (L2ClanMember member : _members.values())
  962. {
  963. try {
  964. if (member.isOnline() && member.getPlayerInstance() != player)
  965. member.getPlayerInstance().sendPacket(packet);
  966. } catch (NullPointerException e) {}
  967. }
  968. }
  969. @Override
  970. public String toString()
  971. {
  972. return getName();
  973. }
  974. /**
  975. * @return
  976. */
  977. public boolean hasCrest()
  978. {
  979. return _hasCrest;
  980. }
  981. public boolean hasCrestLarge()
  982. {
  983. return _hasCrestLarge;
  984. }
  985. public void setHasCrest(boolean flag)
  986. {
  987. _hasCrest = flag;
  988. }
  989. public void setHasCrestLarge(boolean flag)
  990. {
  991. _hasCrestLarge = flag;
  992. }
  993. public ItemContainer getWarehouse()
  994. {
  995. return _warehouse;
  996. }
  997. public boolean isAtWarWith(Integer id)
  998. {
  999. if ((_atWarWith != null)&&(_atWarWith.size() > 0))
  1000. if (_atWarWith.contains(id)) return true;
  1001. return false;
  1002. }
  1003. public boolean isAtWarAttacker(Integer id)
  1004. {
  1005. if ((_atWarAttackers != null)&&(_atWarAttackers.size() > 0))
  1006. if (_atWarAttackers.contains(id)) return true;
  1007. return false;
  1008. }
  1009. public void setEnemyClan(L2Clan clan)
  1010. {
  1011. Integer id = clan.getClanId();
  1012. _atWarWith.add(id);
  1013. }
  1014. public void setEnemyClan(Integer clan)
  1015. {
  1016. _atWarWith.add(clan);
  1017. }
  1018. public void setAttackerClan(L2Clan clan)
  1019. {
  1020. Integer id = clan.getClanId();
  1021. _atWarAttackers.add(id);
  1022. }
  1023. public void setAttackerClan(Integer clan)
  1024. {
  1025. _atWarAttackers.add(clan);
  1026. }
  1027. public void deleteEnemyClan(L2Clan clan)
  1028. {
  1029. Integer id = clan.getClanId();
  1030. _atWarWith.remove(id);
  1031. }
  1032. public void deleteAttackerClan(L2Clan clan)
  1033. {
  1034. Integer id = clan.getClanId();
  1035. _atWarAttackers.remove(id);
  1036. }
  1037. public int getHiredGuards(){ return _hiredGuards; }
  1038. public void incrementHiredGuards(){ _hiredGuards++; }
  1039. public boolean isAtWar()
  1040. {
  1041. if ((_atWarWith != null)&&(_atWarWith.size() > 0))
  1042. return true;
  1043. return false;
  1044. }
  1045. public List<Integer> getWarList()
  1046. {
  1047. return _atWarWith;
  1048. }
  1049. public List<Integer> getAttackerList()
  1050. {
  1051. return _atWarAttackers;
  1052. }
  1053. public void broadcastClanStatus()
  1054. {
  1055. for(L2PcInstance member: getOnlineMembers(0))
  1056. {
  1057. member.sendPacket(new PledgeShowMemberListDeleteAll());
  1058. member.sendPacket(new PledgeShowMemberListAll(this, member));
  1059. }
  1060. }
  1061. public void removeSkill(int id)
  1062. {
  1063. L2Skill deleteSkill = null;
  1064. for(L2Skill sk : _skillList)
  1065. {
  1066. if(sk.getId() == id)
  1067. {
  1068. deleteSkill = sk;
  1069. return;
  1070. }
  1071. }
  1072. _skillList.remove(deleteSkill);
  1073. }
  1074. public void removeSkill(L2Skill deleteSkill)
  1075. {
  1076. _skillList.remove(deleteSkill);
  1077. }
  1078. /**
  1079. * @return
  1080. */
  1081. public List<L2Skill> getSkills()
  1082. {
  1083. return _skillList;
  1084. }
  1085. public class SubPledge
  1086. {
  1087. private int _id;
  1088. private String _subPledgeName;
  1089. private int _leaderId;
  1090. public SubPledge(int id, String name, int leaderId)
  1091. {
  1092. _id = id;
  1093. _subPledgeName = name;
  1094. _leaderId = leaderId;
  1095. }
  1096. public int getId()
  1097. {
  1098. return _id;
  1099. }
  1100. public String getName()
  1101. {
  1102. return _subPledgeName;
  1103. }
  1104. public int getLeaderId()
  1105. {
  1106. return _leaderId;
  1107. }
  1108. public void setLeaderId(int leaderId)
  1109. {
  1110. _leaderId = leaderId;
  1111. }
  1112. }
  1113. public class RankPrivs
  1114. {
  1115. private int _rankId;
  1116. private int _party;// TODO find out what this stuff means and implement it
  1117. private int _rankPrivs;
  1118. public RankPrivs(int rank, int party, int privs)
  1119. {
  1120. _rankId = rank;
  1121. _party = party;
  1122. _rankPrivs = privs;
  1123. }
  1124. public int getRank()
  1125. {
  1126. return _rankId;
  1127. }
  1128. public int getParty()
  1129. {
  1130. return _party;
  1131. }
  1132. public int getPrivs()
  1133. {
  1134. return _rankPrivs;
  1135. }
  1136. public void setPrivs(int privs)
  1137. {
  1138. _rankPrivs = privs;
  1139. }
  1140. }
  1141. private void restoreSubPledges()
  1142. {
  1143. java.sql.Connection con = null;
  1144. try
  1145. {
  1146. // Retrieve all subpledges of this clan from the database
  1147. con = L2DatabaseFactory.getInstance().getConnection();
  1148. PreparedStatement statement = con.prepareStatement("SELECT sub_pledge_id,name,leader_id FROM clan_subpledges WHERE clan_id=?");
  1149. statement.setInt(1, getClanId());
  1150. ResultSet rset = statement.executeQuery();
  1151. while (rset.next())
  1152. {
  1153. int id = rset.getInt("sub_pledge_id");
  1154. String name = rset.getString("name");
  1155. int leaderId = rset.getInt("leader_id");
  1156. // Create a SubPledge object for each record
  1157. SubPledge pledge = new SubPledge(id, name, leaderId);
  1158. _subPledges.put(id, pledge);
  1159. }
  1160. rset.close();
  1161. statement.close();
  1162. }
  1163. catch (Exception e)
  1164. {
  1165. _log.warning("Could not restore clan sub-units: " + e);
  1166. }
  1167. finally
  1168. {
  1169. try { con.close(); } catch (Exception e) {}
  1170. }
  1171. }
  1172. /** used to retrieve subPledge by type */
  1173. public final SubPledge getSubPledge(int pledgeType)
  1174. {
  1175. if (_subPledges == null)
  1176. return null;
  1177. return _subPledges.get(pledgeType);
  1178. }
  1179. /** used to retrieve subPledge by type */
  1180. public final SubPledge getSubPledge(String pledgeName)
  1181. {
  1182. if (_subPledges == null)
  1183. return null;
  1184. for (SubPledge sp : _subPledges.values())
  1185. {
  1186. if (sp.getName().equalsIgnoreCase(pledgeName))
  1187. {
  1188. return sp;
  1189. }
  1190. }
  1191. return null;
  1192. }
  1193. /** used to retrieve all subPledges */
  1194. public final SubPledge[] getAllSubPledges()
  1195. {
  1196. if (_subPledges == null)
  1197. return new SubPledge[0];
  1198. return _subPledges.values().toArray(new SubPledge[_subPledges.values().size()]);
  1199. }
  1200. public SubPledge createSubPledge(L2PcInstance player, int pledgeType, int leaderId, String subPledgeName)
  1201. {
  1202. SubPledge subPledge = null;
  1203. pledgeType = getAvailablePledgeTypes(pledgeType);
  1204. if (pledgeType == 0)
  1205. {
  1206. if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
  1207. player.sendPacket(new SystemMessage(SystemMessageId.CLAN_HAS_ALREADY_ESTABLISHED_A_CLAN_ACADEMY));
  1208. else
  1209. player.sendMessage("You can't create any more sub-units of this type");
  1210. return null;
  1211. }
  1212. if (_leader.getObjectId()==leaderId)
  1213. {
  1214. player.sendMessage("Leader is not correct");
  1215. return null;
  1216. }
  1217. // Royal Guard 5000 points per each
  1218. // Order of Knights 10000 points per each
  1219. if(pledgeType != -1 &&
  1220. ((getReputationScore() < 5000 && pledgeType < L2Clan.SUBUNIT_KNIGHT1) ||
  1221. (getReputationScore() < 10000 && pledgeType > L2Clan.SUBUNIT_ROYAL2)))
  1222. {
  1223. SystemMessage sp = new SystemMessage(SystemMessageId.THE_CLAN_REPUTATION_SCORE_IS_TOO_LOW);
  1224. player.sendPacket(sp);
  1225. return null;
  1226. }
  1227. else
  1228. {
  1229. java.sql.Connection con = null;
  1230. try
  1231. {
  1232. con = L2DatabaseFactory.getInstance().getConnection();
  1233. PreparedStatement statement = con.prepareStatement("INSERT INTO clan_subpledges (clan_id,sub_pledge_id,name,leader_id) values (?,?,?,?)");
  1234. statement.setInt(1, getClanId());
  1235. statement.setInt(2, pledgeType);
  1236. statement.setString(3, subPledgeName);
  1237. if (pledgeType != -1)
  1238. statement.setInt(4, leaderId);
  1239. else
  1240. statement.setInt(4, 0);
  1241. statement.execute();
  1242. statement.close();
  1243. subPledge = new SubPledge(pledgeType, subPledgeName, leaderId);
  1244. _subPledges.put(pledgeType, subPledge);
  1245. if(pledgeType != -1)
  1246. {
  1247. setReputationScore(getReputationScore() - 2500, true);
  1248. }
  1249. if (Config.DEBUG) _log.fine("New sub_clan saved in db: "+getClanId()+"; "+pledgeType);
  1250. }
  1251. catch (Exception e)
  1252. {
  1253. _log.warning("error while saving new sub_clan to db "+e);
  1254. }
  1255. finally
  1256. {
  1257. try { con.close(); } catch (Exception e) {}
  1258. }
  1259. }
  1260. broadcastToOnlineMembers(new PledgeShowInfoUpdate(_leader.getClan()));
  1261. broadcastToOnlineMembers(new PledgeReceiveSubPledgeCreated(subPledge, _leader.getClan()));
  1262. return subPledge;
  1263. }
  1264. public int getAvailablePledgeTypes(int pledgeType)
  1265. {
  1266. if (_subPledges.get(pledgeType) != null)
  1267. {
  1268. //_log.warning("found sub-unit with id: "+pledgeType);
  1269. switch(pledgeType)
  1270. {
  1271. case SUBUNIT_ACADEMY:
  1272. return 0;
  1273. case SUBUNIT_ROYAL1:
  1274. pledgeType = getAvailablePledgeTypes(SUBUNIT_ROYAL2);
  1275. break;
  1276. case SUBUNIT_ROYAL2:
  1277. return 0;
  1278. case SUBUNIT_KNIGHT1:
  1279. pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT2);
  1280. break;
  1281. case SUBUNIT_KNIGHT2:
  1282. pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT3);
  1283. break;
  1284. case SUBUNIT_KNIGHT3:
  1285. pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT4);
  1286. break;
  1287. case SUBUNIT_KNIGHT4:
  1288. return 0;
  1289. }
  1290. }
  1291. return pledgeType;
  1292. }
  1293. public void updateSubPledgeInDB(int pledgeType)
  1294. {
  1295. java.sql.Connection con = null;
  1296. try
  1297. {
  1298. con = L2DatabaseFactory.getInstance().getConnection();
  1299. PreparedStatement statement = con.prepareStatement("UPDATE clan_subpledges SET leader_id=? WHERE clan_id=? AND sub_pledge_id=?");
  1300. statement.setInt(1, getSubPledge(pledgeType).getLeaderId());
  1301. statement.setInt(2, getClanId());
  1302. statement.setInt(3, pledgeType);
  1303. statement.execute();
  1304. statement.close();
  1305. if (Config.DEBUG)
  1306. _log.fine("New subpledge leader saved in db: "+getClanId());
  1307. }
  1308. catch (Exception e)
  1309. {
  1310. _log.warning("error while saving new clan leader to db "+e);
  1311. }
  1312. finally
  1313. {
  1314. try { con.close(); } catch (Exception e) {}
  1315. }
  1316. }
  1317. private void restoreRankPrivs()
  1318. {
  1319. java.sql.Connection con = null;
  1320. try
  1321. {
  1322. // Retrieve all skills of this L2PcInstance from the database
  1323. con = L2DatabaseFactory.getInstance().getConnection();
  1324. PreparedStatement statement = con.prepareStatement("SELECT privs,rank,party FROM clan_privs WHERE clan_id=?");
  1325. statement.setInt(1, getClanId());
  1326. //_log.warning("clanPrivs restore for ClanId : "+getClanId());
  1327. ResultSet rset = statement.executeQuery();
  1328. // Go though the recordset of this SQL query
  1329. while (rset.next())
  1330. {
  1331. int rank = rset.getInt("rank");
  1332. //int party = rset.getInt("party");
  1333. int privileges = rset.getInt("privs");
  1334. // Create a SubPledge object for each record
  1335. //RankPrivs privs = new RankPrivs(rank, party, privileges);
  1336. //_Privs.put(rank, privs);
  1337. _privs.get(rank).setPrivs(privileges);
  1338. }
  1339. rset.close();
  1340. statement.close();
  1341. }
  1342. catch (Exception e)
  1343. {
  1344. _log.warning("Could not restore clan privs by rank: " + e);
  1345. }
  1346. finally
  1347. {
  1348. try { con.close(); } catch (Exception e) {}
  1349. }
  1350. }
  1351. public void initializePrivs()
  1352. {
  1353. RankPrivs privs;
  1354. for (int i=1; i < 10; i++)
  1355. {
  1356. privs = new RankPrivs(i, 0, CP_NOTHING);
  1357. _privs.put(i, privs);
  1358. }
  1359. }
  1360. public int getRankPrivs(int rank)
  1361. {
  1362. if (_privs.get(rank) != null)
  1363. return _privs.get(rank).getPrivs();
  1364. else
  1365. return CP_NOTHING;
  1366. }
  1367. public void setRankPrivs(int rank, int privs)
  1368. {
  1369. if (_privs.get(rank)!= null)
  1370. {
  1371. _privs.get(rank).setPrivs(privs);
  1372. java.sql.Connection con = null;
  1373. try
  1374. {
  1375. //_log.warning("requested store clan privs in db for rank: "+rank+", privs: "+privs);
  1376. // Retrieve all skills of this L2PcInstance from the database
  1377. con = L2DatabaseFactory.getInstance().getConnection();
  1378. PreparedStatement statement = con.prepareStatement("INSERT INTO clan_privs (clan_id,rank,party,privs) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE privs = ?");
  1379. statement.setInt(1, getClanId());
  1380. statement.setInt(2, rank);
  1381. statement.setInt(3, 0);
  1382. statement.setInt(4, privs);
  1383. statement.setInt(5, privs);
  1384. statement.execute();
  1385. statement.close();
  1386. }
  1387. catch (Exception e)
  1388. {
  1389. _log.warning("Could not store clan privs for rank: " + e);
  1390. }
  1391. finally
  1392. {
  1393. try { con.close(); } catch (Exception e) {}
  1394. }
  1395. for (L2ClanMember cm : getMembers())
  1396. {
  1397. if (cm.isOnline())
  1398. if (cm.getPowerGrade() == rank)
  1399. if (cm.getPlayerInstance() != null)
  1400. {
  1401. cm.getPlayerInstance().setClanPrivileges(privs);
  1402. cm.getPlayerInstance().sendPacket(new UserInfo(cm.getPlayerInstance()));
  1403. }
  1404. }
  1405. broadcastClanStatus();
  1406. }
  1407. else
  1408. {
  1409. _privs.put(rank, new RankPrivs(rank, 0, privs));
  1410. java.sql.Connection con = null;
  1411. try
  1412. {
  1413. //_log.warning("requested store clan new privs in db for rank: "+rank);
  1414. // Retrieve all skills of this L2PcInstance from the database
  1415. con = L2DatabaseFactory.getInstance().getConnection();
  1416. PreparedStatement statement = con.prepareStatement("INSERT INTO clan_privs (clan_id,rank,party,privs) VALUES (?,?,?,?)");
  1417. statement.setInt(1, getClanId());
  1418. statement.setInt(2, rank);
  1419. statement.setInt(3, 0);
  1420. statement.setInt(4, privs);
  1421. statement.execute();
  1422. statement.close();
  1423. }
  1424. catch (Exception e)
  1425. {
  1426. _log.warning("Could not create new rank and store clan privs for rank: " + e);
  1427. }
  1428. finally
  1429. {
  1430. try { con.close(); } catch (Exception e) {}
  1431. }
  1432. }
  1433. }
  1434. /** used to retrieve all RankPrivs */
  1435. public final RankPrivs[] getAllRankPrivs()
  1436. {
  1437. if (_privs == null)
  1438. return new RankPrivs[0];
  1439. return _privs.values().toArray(new RankPrivs[_privs.values().size()]);
  1440. }
  1441. public int getLeaderSubPledge(int leaderId)
  1442. {
  1443. int id = 0;
  1444. for (SubPledge sp : _subPledges.values())
  1445. {
  1446. if (sp.getLeaderId() == 0) continue;
  1447. if (sp.getLeaderId() == leaderId)
  1448. id = sp.getId();
  1449. }
  1450. return id;
  1451. }
  1452. public void setReputationScore(int value, boolean save)
  1453. {
  1454. if(_reputationScore >= 0 && value < 0)
  1455. {
  1456. broadcastToOnlineMembers(new SystemMessage(SystemMessageId.REPUTATION_POINTS_0_OR_LOWER_CLAN_SKILLS_DEACTIVATED));
  1457. L2Skill[] skills = getAllSkills();
  1458. for (L2ClanMember member : _members.values())
  1459. {
  1460. if (member.isOnline() && member.getPlayerInstance() != null)
  1461. {
  1462. for (L2Skill sk : skills)
  1463. member.getPlayerInstance().removeSkill(sk, false);
  1464. }
  1465. }
  1466. }
  1467. else if(_reputationScore < 0 && value >= 0)
  1468. {
  1469. broadcastToOnlineMembers(new SystemMessage(SystemMessageId.CLAN_SKILLS_WILL_BE_ACTIVATED_SINCE_REPUTATION_IS_0_OR_HIGHER));
  1470. L2Skill[] skills = getAllSkills();
  1471. for (L2ClanMember member : _members.values())
  1472. {
  1473. if (member.isOnline() && member.getPlayerInstance() != null)
  1474. {
  1475. for (L2Skill sk : skills)
  1476. {
  1477. if(sk.getMinPledgeClass() <= member.getPlayerInstance().getPledgeClass())
  1478. member.getPlayerInstance().addSkill(sk, false);
  1479. }
  1480. }
  1481. }
  1482. }
  1483. _reputationScore = value;
  1484. if(_reputationScore > 100000000) _reputationScore = 100000000;
  1485. if(_reputationScore < -100000000) _reputationScore = -100000000;
  1486. if (save) updateClanInDB();
  1487. }
  1488. public int getReputationScore()
  1489. {
  1490. return _reputationScore;
  1491. }
  1492. public void setRank(int rank)
  1493. {
  1494. _rank = rank;
  1495. }
  1496. public int getRank()
  1497. {
  1498. return _rank;
  1499. }
  1500. public int getAuctionBiddedAt()
  1501. {
  1502. return _auctionBiddedAt;
  1503. }
  1504. public void setAuctionBiddedAt(int id, boolean storeInDb)
  1505. {
  1506. _auctionBiddedAt = id;
  1507. if(storeInDb)
  1508. {
  1509. java.sql.Connection con = null;
  1510. try
  1511. {
  1512. con = L2DatabaseFactory.getInstance().getConnection();
  1513. PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET auction_bid_at=? WHERE clan_id=?");
  1514. statement.setInt(1, id);
  1515. statement.setInt(2, getClanId());
  1516. statement.execute();
  1517. statement.close();
  1518. }
  1519. catch (Exception e)
  1520. {
  1521. _log.warning("Could not store auction for clan: " + e);
  1522. }
  1523. finally
  1524. {
  1525. try { con.close(); } catch (Exception e) {}
  1526. }
  1527. }
  1528. }
  1529. /**
  1530. * Checks if activeChar and target meet various conditions to join a clan
  1531. *
  1532. * @param activeChar
  1533. * @param target
  1534. * @param pledgeType
  1535. * @return
  1536. */
  1537. public boolean checkClanJoinCondition(L2PcInstance activeChar, L2PcInstance target, int pledgeType)
  1538. {
  1539. if (activeChar == null)
  1540. {
  1541. return false;
  1542. }
  1543. if ((activeChar.getClanPrivileges() & L2Clan.CP_CL_JOIN_CLAN) != L2Clan.CP_CL_JOIN_CLAN)
  1544. {
  1545. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  1546. return false;
  1547. }
  1548. if (target == null)
  1549. {
  1550. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET));
  1551. return false;
  1552. }
  1553. if (activeChar.getObjectId() == target.getObjectId())
  1554. {
  1555. activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_INVITE_YOURSELF));
  1556. return false;
  1557. }
  1558. if (getCharPenaltyExpiryTime() > System.currentTimeMillis())
  1559. {
  1560. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_MUST_WAIT_BEFORE_ACCEPTING_A_NEW_MEMBER);
  1561. sm.addString(target.getName());
  1562. activeChar.sendPacket(sm);
  1563. sm = null;
  1564. return false;
  1565. }
  1566. if (target.getClanId() != 0)
  1567. {
  1568. SystemMessage sm = new SystemMessage(SystemMessageId.S1_WORKING_WITH_ANOTHER_CLAN);
  1569. sm.addString(target.getName());
  1570. activeChar.sendPacket(sm);
  1571. sm = null;
  1572. return false;
  1573. }
  1574. if (target.getClanJoinExpiryTime() > System.currentTimeMillis())
  1575. {
  1576. SystemMessage sm = new SystemMessage(SystemMessageId.S1_MUST_WAIT_BEFORE_JOINING_ANOTHER_CLAN);
  1577. sm.addString(target.getName());
  1578. activeChar.sendPacket(sm);
  1579. sm = null;
  1580. return false;
  1581. }
  1582. if ((target.getLevel() > 40 || target.getClassId().level() >= 2) && pledgeType == -1)
  1583. {
  1584. SystemMessage sm = new SystemMessage(SystemMessageId.S1_DOESNOT_MEET_REQUIREMENTS_TO_JOIN_ACADEMY);
  1585. sm.addString(target.getName());
  1586. activeChar.sendPacket(sm);
  1587. sm = null;
  1588. activeChar.sendPacket(new SystemMessage(SystemMessageId.ACADEMY_REQUIREMENTS));
  1589. return false;
  1590. }
  1591. if (getSubPledgeMembersCount(pledgeType) >= getMaxNrOfMembers(pledgeType))
  1592. {
  1593. if (pledgeType == 0)
  1594. {
  1595. SystemMessage sm = new SystemMessage(SystemMessageId.S1_CLAN_IS_FULL);
  1596. sm.addString(getName());
  1597. activeChar.sendPacket(sm);
  1598. sm = null;
  1599. }
  1600. else
  1601. {
  1602. activeChar.sendPacket(new SystemMessage(SystemMessageId.SUBCLAN_IS_FULL));
  1603. }
  1604. return false;
  1605. }
  1606. return true;
  1607. }
  1608. /**
  1609. * Checks if activeChar and target meet various conditions to join a clan
  1610. *
  1611. * @param activeChar
  1612. * @param target
  1613. * @return
  1614. */
  1615. public boolean checkAllyJoinCondition(L2PcInstance activeChar, L2PcInstance target)
  1616. {
  1617. if (activeChar == null)
  1618. {
  1619. return false;
  1620. }
  1621. if (activeChar.getAllyId() == 0 || !activeChar.isClanLeader() || activeChar.getClanId() != activeChar.getAllyId())
  1622. {
  1623. activeChar.sendPacket(new SystemMessage(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER));
  1624. return false;
  1625. }
  1626. L2Clan leaderClan = activeChar.getClan();
  1627. if (leaderClan.getAllyPenaltyExpiryTime() > System.currentTimeMillis())
  1628. {
  1629. if (leaderClan.getAllyPenaltyType() == PENALTY_TYPE_DISMISS_CLAN)
  1630. {
  1631. activeChar.sendPacket(new SystemMessage(SystemMessageId.CANT_INVITE_CLAN_WITHIN_1_DAY));
  1632. return false;
  1633. }
  1634. }
  1635. if (target == null)
  1636. {
  1637. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET));
  1638. return false;
  1639. }
  1640. if (activeChar.getObjectId() == target.getObjectId())
  1641. {
  1642. activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_INVITE_YOURSELF));
  1643. return false;
  1644. }
  1645. if (target.getClan() == null)
  1646. {
  1647. activeChar.sendPacket(new SystemMessage(SystemMessageId.TARGET_MUST_BE_IN_CLAN));
  1648. return false;
  1649. }
  1650. if (!target.isClanLeader())
  1651. {
  1652. SystemMessage sm = new SystemMessage(SystemMessageId.S1_IS_NOT_A_CLAN_LEADER);
  1653. sm.addString(target.getName());
  1654. activeChar.sendPacket(sm);
  1655. sm = null;
  1656. return false;
  1657. }
  1658. L2Clan targetClan = target.getClan();
  1659. if (target.getAllyId() != 0)
  1660. {
  1661. SystemMessage sm = new SystemMessage(SystemMessageId.S1_CLAN_ALREADY_MEMBER_OF_S2_ALLIANCE);
  1662. sm.addString(targetClan.getName());
  1663. sm.addString(targetClan.getAllyName());
  1664. activeChar.sendPacket(sm);
  1665. sm = null;
  1666. return false;
  1667. }
  1668. if (targetClan.getAllyPenaltyExpiryTime() > System.currentTimeMillis())
  1669. {
  1670. if (targetClan.getAllyPenaltyType() == PENALTY_TYPE_CLAN_LEAVED)
  1671. {
  1672. SystemMessage sm = new SystemMessage(SystemMessageId.S1_CANT_ENTER_ALLIANCE_WITHIN_1_DAY);
  1673. sm.addString(target.getClan().getName());
  1674. sm.addString(target.getClan().getAllyName());
  1675. activeChar.sendPacket(sm);
  1676. sm = null;
  1677. return false;
  1678. }
  1679. if (targetClan.getAllyPenaltyType() == PENALTY_TYPE_CLAN_DISMISSED)
  1680. {
  1681. activeChar.sendPacket(new SystemMessage(SystemMessageId.CANT_ENTER_ALLIANCE_WITHIN_1_DAY));
  1682. return false;
  1683. }
  1684. }
  1685. if (activeChar.isInsideZone(L2Character.ZONE_SIEGE) && target.isInsideZone(L2Character.ZONE_SIEGE))
  1686. {
  1687. activeChar.sendPacket(new SystemMessage(SystemMessageId.OPPOSING_CLAN_IS_PARTICIPATING_IN_SIEGE));
  1688. return false;
  1689. }
  1690. if (leaderClan.isAtWarWith(targetClan.getClanId()))
  1691. {
  1692. activeChar.sendPacket(new SystemMessage(SystemMessageId.MAY_NOT_ALLY_CLAN_BATTLE));
  1693. return false;
  1694. }
  1695. int numOfClansInAlly = 0;
  1696. for (L2Clan clan : ClanTable.getInstance().getClans())
  1697. {
  1698. if (clan.getAllyId() == activeChar.getAllyId())
  1699. {
  1700. ++numOfClansInAlly;
  1701. }
  1702. }
  1703. if (numOfClansInAlly >= Config.ALT_MAX_NUM_OF_CLANS_IN_ALLY)
  1704. {
  1705. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_THE_LIMIT));
  1706. return false;
  1707. }
  1708. return true;
  1709. }
  1710. public long getAllyPenaltyExpiryTime()
  1711. {
  1712. return _allyPenaltyExpiryTime;
  1713. }
  1714. public int getAllyPenaltyType()
  1715. {
  1716. return _allyPenaltyType;
  1717. }
  1718. public void setAllyPenaltyExpiryTime(long expiryTime, int penaltyType)
  1719. {
  1720. _allyPenaltyExpiryTime = expiryTime;
  1721. _allyPenaltyType = penaltyType;
  1722. }
  1723. public long getCharPenaltyExpiryTime()
  1724. {
  1725. return _charPenaltyExpiryTime;
  1726. }
  1727. public void setCharPenaltyExpiryTime(long time)
  1728. {
  1729. _charPenaltyExpiryTime = time;
  1730. }
  1731. public long getDissolvingExpiryTime()
  1732. {
  1733. return _dissolvingExpiryTime;
  1734. }
  1735. public void setDissolvingExpiryTime(long time)
  1736. {
  1737. _dissolvingExpiryTime = time;
  1738. }
  1739. public void createAlly(L2PcInstance player, String allyName)
  1740. {
  1741. if (null == player)
  1742. return;
  1743. if (Config.DEBUG)
  1744. _log.fine(player.getObjectId() + "(" + player.getName() + ") requested ally creation from ");
  1745. if (!player.isClanLeader())
  1746. {
  1747. player.sendPacket(new SystemMessage(SystemMessageId.ONLY_CLAN_LEADER_CREATE_ALLIANCE));
  1748. return;
  1749. }
  1750. if (getAllyId() != 0)
  1751. {
  1752. player.sendPacket(new SystemMessage(SystemMessageId.ALREADY_JOINED_ALLIANCE));
  1753. return;
  1754. }
  1755. if (getLevel() < 5)
  1756. {
  1757. player.sendPacket(new SystemMessage(SystemMessageId.TO_CREATE_AN_ALLY_YOU_CLAN_MUST_BE_LEVEL_5_OR_HIGHER));
  1758. return;
  1759. }
  1760. if (getAllyPenaltyExpiryTime() > System.currentTimeMillis())
  1761. {
  1762. if (getAllyPenaltyType() == L2Clan.PENALTY_TYPE_DISSOLVE_ALLY)
  1763. {
  1764. player.sendPacket(new SystemMessage(SystemMessageId.CANT_CREATE_ALLIANCE_10_DAYS_DISOLUTION));
  1765. return;
  1766. }
  1767. }
  1768. if (getDissolvingExpiryTime() > System.currentTimeMillis())
  1769. {
  1770. player.sendPacket(new SystemMessage(SystemMessageId.YOU_MAY_NOT_CREATE_ALLY_WHILE_DISSOLVING));
  1771. return;
  1772. }
  1773. if (!Util.isAlphaNumeric(allyName))
  1774. {
  1775. player.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_ALLIANCE_NAME));
  1776. return;
  1777. }
  1778. if (allyName.length() > 16 || allyName.length() < 2)
  1779. {
  1780. player.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_ALLIANCE_NAME_LENGTH));
  1781. return;
  1782. }
  1783. if (ClanTable.getInstance().isAllyExists(allyName))
  1784. {
  1785. player.sendPacket(new SystemMessage(SystemMessageId.ALLIANCE_ALREADY_EXISTS));
  1786. return;
  1787. }
  1788. setAllyId(getClanId());
  1789. setAllyName(allyName.trim());
  1790. setAllyPenaltyExpiryTime(0, 0);
  1791. updateClanInDB();
  1792. player.sendPacket(new UserInfo(player));
  1793. //TODO: Need correct message id
  1794. player.sendMessage("Alliance " + allyName + " has been created.");
  1795. }
  1796. public void dissolveAlly(L2PcInstance player)
  1797. {
  1798. if (getAllyId() == 0)
  1799. {
  1800. player.sendPacket(new SystemMessage(SystemMessageId.NO_CURRENT_ALLIANCES));
  1801. return;
  1802. }
  1803. if (!player.isClanLeader() || getClanId() != getAllyId())
  1804. {
  1805. player.sendPacket(new SystemMessage(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER));
  1806. return;
  1807. }
  1808. if (player.isInsideZone(L2Character.ZONE_SIEGE))
  1809. {
  1810. player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_DISSOLVE_ALLY_WHILE_IN_SIEGE));
  1811. return;
  1812. }
  1813. broadcastToOnlineAllyMembers(new SystemMessage(SystemMessageId.ALLIANCE_DISOLVED));
  1814. long currentTime = System.currentTimeMillis();
  1815. for (L2Clan clan : ClanTable.getInstance().getClans())
  1816. {
  1817. if (clan.getAllyId() == getAllyId() && clan.getClanId() != getClanId())
  1818. {
  1819. clan.setAllyId(0);
  1820. clan.setAllyName(null);
  1821. clan.setAllyPenaltyExpiryTime(0, 0);
  1822. clan.updateClanInDB();
  1823. }
  1824. }
  1825. setAllyId(0);
  1826. setAllyName(null);
  1827. setAllyPenaltyExpiryTime(
  1828. currentTime + Config.ALT_CREATE_ALLY_DAYS_WHEN_DISSOLVED * 86400000L,
  1829. L2Clan.PENALTY_TYPE_DISSOLVE_ALLY); //24*60*60*1000 = 86400000
  1830. updateClanInDB();
  1831. // The clan leader should take the XP penalty of a full death.
  1832. player.deathPenalty(false);
  1833. }
  1834. public void levelUpClan(L2PcInstance player)
  1835. {
  1836. if (!player.isClanLeader())
  1837. {
  1838. player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  1839. return;
  1840. }
  1841. if (System.currentTimeMillis() < getDissolvingExpiryTime())
  1842. {
  1843. player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_RISE_LEVEL_WHILE_DISSOLUTION_IN_PROGRESS));
  1844. return;
  1845. }
  1846. boolean increaseClanLevel = false;
  1847. switch (getLevel())
  1848. {
  1849. case 0:
  1850. {
  1851. // Upgrade to 1
  1852. if (player.getSp() >= 20000 && player.getAdena() >= 650000)
  1853. {
  1854. if (player.reduceAdena("ClanLvl", 650000, player.getTarget(), true))
  1855. {
  1856. player.setSp(player.getSp() - 30000);
  1857. SystemMessage sp = new SystemMessage(SystemMessageId.SP_DECREASED_S1);
  1858. sp.addNumber(30000);
  1859. player.sendPacket(sp);
  1860. sp = null;
  1861. increaseClanLevel = true;
  1862. }
  1863. }
  1864. break;
  1865. }
  1866. case 1:
  1867. {
  1868. // Upgrade to 2
  1869. if (player.getSp() >= 100000 && player.getAdena() >= 2500000)
  1870. {
  1871. if (player.reduceAdena("ClanLvl", 2500000, player.getTarget(), true))
  1872. {
  1873. player.setSp(player.getSp() - 150000);
  1874. SystemMessage sp = new SystemMessage(SystemMessageId.SP_DECREASED_S1);
  1875. sp.addNumber(150000);
  1876. player.sendPacket(sp);
  1877. sp = null;
  1878. increaseClanLevel = true;
  1879. }
  1880. }
  1881. break;
  1882. }
  1883. case 2:
  1884. {
  1885. // Upgrade to 3
  1886. if (player.getSp() >= 350000 && player.getInventory().getItemByItemId(1419) != null)
  1887. {
  1888. // itemId 1419 == Blood Mark
  1889. if (player.destroyItemByItemId("ClanLvl", 1419, 1, player.getTarget(), false))
  1890. {
  1891. player.setSp(player.getSp() - 500000);
  1892. SystemMessage sp = new SystemMessage(SystemMessageId.SP_DECREASED_S1);
  1893. sp.addNumber(500000);
  1894. player.sendPacket(sp);
  1895. sp = null;
  1896. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  1897. sm.addItemName(1419);
  1898. sm.addNumber(1);
  1899. player.sendPacket(sm);
  1900. sm = null;
  1901. increaseClanLevel = true;
  1902. }
  1903. }
  1904. break;
  1905. }
  1906. case 3:
  1907. {
  1908. // Upgrade to 4
  1909. if (player.getSp() >= 1000000 && player.getInventory().getItemByItemId(3874) != null)
  1910. {
  1911. // itemId 3874 == Alliance Manifesto
  1912. if (player.destroyItemByItemId("ClanLvl", 3874, 1, player.getTarget(), false))
  1913. {
  1914. player.setSp(player.getSp() - 1400000);
  1915. SystemMessage sp = new SystemMessage(SystemMessageId.SP_DECREASED_S1);
  1916. sp.addNumber(1400000);
  1917. player.sendPacket(sp);
  1918. sp = null;
  1919. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  1920. sm.addItemName(3874);
  1921. sm.addNumber(1);
  1922. player.sendPacket(sm);
  1923. sm = null;
  1924. increaseClanLevel = true;
  1925. }
  1926. }
  1927. break;
  1928. }
  1929. case 4:
  1930. {
  1931. // Upgrade to 5
  1932. if (player.getSp() >= 2500000 && player.getInventory().getItemByItemId(3870) != null)
  1933. {
  1934. // itemId 3870 == Seal of Aspiration
  1935. if (player.destroyItemByItemId("ClanLvl", 3870, 1, player.getTarget(), false))
  1936. {
  1937. player.setSp(player.getSp() - 3500000);
  1938. SystemMessage sp = new SystemMessage(SystemMessageId.SP_DECREASED_S1);
  1939. sp.addNumber(3500000);
  1940. player.sendPacket(sp);
  1941. sp = null;
  1942. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  1943. sm.addItemName(3870);
  1944. sm.addNumber(1);
  1945. player.sendPacket(sm);
  1946. sm = null;
  1947. increaseClanLevel = true;
  1948. }
  1949. }
  1950. break;
  1951. }
  1952. case 5:
  1953. // Upgrade to 6
  1954. if(getReputationScore() >= 10000 && getMembersCount() >= 30)
  1955. {
  1956. setReputationScore(getReputationScore() - 10000, true);
  1957. SystemMessage cr = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  1958. cr.addNumber(10000);
  1959. player.sendPacket(cr);
  1960. cr = null;
  1961. increaseClanLevel = true;
  1962. }
  1963. break;
  1964. case 6:
  1965. // Upgrade to 7
  1966. if(getReputationScore() >= 20000 && getMembersCount() >= 80)
  1967. {
  1968. setReputationScore(getReputationScore() - 20000, true);
  1969. SystemMessage cr = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  1970. cr.addNumber(20000);
  1971. player.sendPacket(cr);
  1972. cr = null;
  1973. increaseClanLevel = true;
  1974. }
  1975. break;
  1976. case 7:
  1977. // Upgrade to 8
  1978. if(getReputationScore() >= 40000 && getMembersCount() >= 120)
  1979. {
  1980. setReputationScore(getReputationScore() - 40000, true);
  1981. SystemMessage cr = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  1982. cr.addNumber(40000);
  1983. player.sendPacket(cr);
  1984. cr = null;
  1985. increaseClanLevel = true;
  1986. }
  1987. break;
  1988. case 8:
  1989. // Upgrade to 9
  1990. if(getReputationScore() >= 40000 && player.getInventory().getItemByItemId(9910) != null && getMembersCount() >= 120)
  1991. {
  1992. // itemId 9910 == Blood Oath
  1993. if (player.destroyItemByItemId("ClanLvl", 9910, 150, player.getTarget(), false))
  1994. {
  1995. setReputationScore(getReputationScore() - 40000, true);
  1996. SystemMessage cr = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  1997. cr.addNumber(40000);
  1998. player.sendPacket(cr);
  1999. cr = null;
  2000. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  2001. sm.addItemName(9910);
  2002. sm.addNumber(150);
  2003. player.sendPacket(sm);
  2004. increaseClanLevel = true;
  2005. }
  2006. }
  2007. break;
  2008. case 9:
  2009. // Upgrade to 10
  2010. if(getReputationScore() >= 40000 && player.getInventory().getItemByItemId(9911) != null && getMembersCount() >= 140)
  2011. {
  2012. // itemId 9911 == Blood Alliance
  2013. if (player.destroyItemByItemId("ClanLvl", 9911, 5, player.getTarget(), false))
  2014. {
  2015. setReputationScore(getReputationScore() - 40000, true);
  2016. SystemMessage cr = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2017. cr.addNumber(40000);
  2018. player.sendPacket(cr);
  2019. cr = null;
  2020. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  2021. sm.addItemName(9911);
  2022. sm.addNumber(5);
  2023. player.sendPacket(sm);
  2024. increaseClanLevel = true;
  2025. }
  2026. }
  2027. break;
  2028. default:
  2029. return;
  2030. }
  2031. if (!increaseClanLevel)
  2032. {
  2033. SystemMessage sm = new SystemMessage(SystemMessageId.FAILED_TO_INCREASE_CLAN_LEVEL);
  2034. player.sendPacket(sm);
  2035. return;
  2036. }
  2037. // the player should know that he has less sp now :p
  2038. StatusUpdate su = new StatusUpdate(player.getObjectId());
  2039. su.addAttribute(StatusUpdate.SP, player.getSp());
  2040. player.sendPacket(su);
  2041. ItemList il = new ItemList(player, false);
  2042. player.sendPacket(il);
  2043. changeLevel(getLevel() + 1);
  2044. }
  2045. public void changeLevel(int level)
  2046. {
  2047. java.sql.Connection con = null;
  2048. try
  2049. {
  2050. con = L2DatabaseFactory.getInstance().getConnection();
  2051. PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET clan_level = ? WHERE clan_id = ?");
  2052. statement.setInt(1, level);
  2053. statement.setInt(2, getClanId());
  2054. statement.execute();
  2055. statement.close();
  2056. con.close();
  2057. }
  2058. catch (Exception e)
  2059. {
  2060. _log.warning("could not increase clan level:" + e);
  2061. }
  2062. finally
  2063. {
  2064. try { con.close(); } catch (Exception e) {}
  2065. }
  2066. setLevel(level);
  2067. if (getLeader().isOnline())
  2068. {
  2069. L2PcInstance leader = getLeader().getPlayerInstance();
  2070. if (4 < level)
  2071. {
  2072. SiegeManager.getInstance().addSiegeSkills(leader);
  2073. }
  2074. else if (5 > level)
  2075. {
  2076. SiegeManager.getInstance().removeSiegeSkills(leader);
  2077. }
  2078. if (4 < level)
  2079. {
  2080. leader.sendPacket(new SystemMessage(SystemMessageId.CLAN_CAN_ACCUMULATE_CLAN_REPUTATION_POINTS));
  2081. }
  2082. }
  2083. // notify all the members about it
  2084. broadcastToOnlineMembers(new SystemMessage(SystemMessageId.CLAN_LEVEL_INCREASED));
  2085. broadcastToOnlineMembers(new PledgeShowInfoUpdate(this));
  2086. /*
  2087. * Micht :
  2088. * - use PledgeShowInfoUpdate instead of PledgeStatusChanged
  2089. * to update clan level ingame
  2090. * - remove broadcastClanStatus() to avoid members duplication
  2091. */
  2092. //clan.broadcastToOnlineMembers(new PledgeStatusChanged(clan));
  2093. //clan.broadcastClanStatus();
  2094. }
  2095. }