L2Clan.java 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064
  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 com.l2jserver.gameserver.model;
  16. import java.sql.Connection;
  17. import java.sql.PreparedStatement;
  18. import java.sql.ResultSet;
  19. import java.sql.SQLException;
  20. import java.util.Collection;
  21. import java.util.List;
  22. import java.util.Map;
  23. import java.util.logging.Level;
  24. import java.util.logging.Logger;
  25. import javolution.util.FastList;
  26. import javolution.util.FastMap;
  27. import com.l2jserver.Config;
  28. import com.l2jserver.L2DatabaseFactory;
  29. import com.l2jserver.gameserver.cache.CrestCache;
  30. import com.l2jserver.gameserver.communitybbs.BB.Forum;
  31. import com.l2jserver.gameserver.communitybbs.Manager.ForumsBBSManager;
  32. import com.l2jserver.gameserver.datatables.ClanTable;
  33. import com.l2jserver.gameserver.datatables.SkillTable;
  34. import com.l2jserver.gameserver.instancemanager.CastleManager;
  35. import com.l2jserver.gameserver.instancemanager.FortManager;
  36. import com.l2jserver.gameserver.instancemanager.SiegeManager;
  37. import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
  38. import com.l2jserver.gameserver.instancemanager.TerritoryWarManager.Territory;
  39. import com.l2jserver.gameserver.model.actor.L2Character;
  40. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  41. import com.l2jserver.gameserver.model.itemcontainer.ClanWarehouse;
  42. import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;
  43. import com.l2jserver.gameserver.model.skills.L2Skill;
  44. import com.l2jserver.gameserver.network.SystemMessageId;
  45. import com.l2jserver.gameserver.network.communityserver.CommunityServerThread;
  46. import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo;
  47. import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
  48. import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
  49. import com.l2jserver.gameserver.network.serverpackets.ExSubPledgeSkillAdd;
  50. import com.l2jserver.gameserver.network.serverpackets.ItemList;
  51. import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
  52. import com.l2jserver.gameserver.network.serverpackets.PledgeReceiveSubPledgeCreated;
  53. import com.l2jserver.gameserver.network.serverpackets.PledgeShowInfoUpdate;
  54. import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListAll;
  55. import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListDeleteAll;
  56. import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListUpdate;
  57. import com.l2jserver.gameserver.network.serverpackets.PledgeSkillList;
  58. import com.l2jserver.gameserver.network.serverpackets.PledgeSkillList.SubPledgeSkill;
  59. import com.l2jserver.gameserver.network.serverpackets.PledgeSkillListAdd;
  60. import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime;
  61. import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
  62. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  63. import com.l2jserver.gameserver.network.serverpackets.UserInfo;
  64. import com.l2jserver.gameserver.scripting.scriptengine.events.ClanCreationEvent;
  65. import com.l2jserver.gameserver.scripting.scriptengine.events.ClanJoinEvent;
  66. import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLeaderChangeEvent;
  67. import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLeaveEvent;
  68. import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLevelUpEvent;
  69. import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanCreationListener;
  70. import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanMembershipListener;
  71. import com.l2jserver.gameserver.util.Util;
  72. /**
  73. * This class ...
  74. *
  75. * @version $Revision: 1.7.2.4.2.7 $ $Date: 2005/04/06 16:13:41 $
  76. */
  77. public class L2Clan
  78. {
  79. private static final Logger _log = Logger.getLogger(L2Clan.class.getName());
  80. private static List<ClanCreationListener> clanCreationListeners = new FastList<ClanCreationListener>().shared();
  81. private static List<ClanMembershipListener> clanMembershipListeners = new FastList<ClanMembershipListener>().shared();
  82. private String _name;
  83. private int _clanId;
  84. private L2ClanMember _leader;
  85. private final Map<Integer, L2ClanMember> _members = new FastMap<>();
  86. private String _allyName;
  87. private int _allyId;
  88. private int _level;
  89. private int _castleId;
  90. private int _fortId;
  91. private int _hideoutId;
  92. private int _hiredGuards;
  93. private int _crestId;
  94. private int _crestLargeId;
  95. private int _allyCrestId;
  96. private int _auctionBiddedAt = 0;
  97. private long _allyPenaltyExpiryTime;
  98. private int _allyPenaltyType;
  99. private long _charPenaltyExpiryTime;
  100. private long _dissolvingExpiryTime;
  101. // Ally Penalty Types
  102. /** Clan leaved ally */
  103. public static final int PENALTY_TYPE_CLAN_LEAVED = 1;
  104. /** Clan was dismissed from ally */
  105. public static final int PENALTY_TYPE_CLAN_DISMISSED = 2;
  106. /** Leader clan dismiss clan from ally */
  107. public static final int PENALTY_TYPE_DISMISS_CLAN = 3;
  108. /** Leader clan dissolve ally */
  109. public static final int PENALTY_TYPE_DISSOLVE_ALLY = 4;
  110. private final ItemContainer _warehouse = new ClanWarehouse(this);
  111. private final List<Integer> _atWarWith = new FastList<>();
  112. private final List<Integer> _atWarAttackers = new FastList<>();
  113. private Forum _forum;
  114. // Clan Privileges
  115. /** No privilege to manage any clan activity */
  116. public static final int CP_NOTHING = 0;
  117. /** Privilege to join clan */
  118. public static final int CP_CL_JOIN_CLAN = 2;
  119. /** Privilege to give a title */
  120. public static final int CP_CL_GIVE_TITLE = 4;
  121. /** Privilege to view warehouse content */
  122. public static final int CP_CL_VIEW_WAREHOUSE = 8;
  123. /** Privilege to manage clan ranks */
  124. public static final int CP_CL_MANAGE_RANKS = 16;
  125. public static final int CP_CL_PLEDGE_WAR = 32;
  126. public static final int CP_CL_DISMISS = 64;
  127. /** Privilege to register clan crest */
  128. public static final int CP_CL_REGISTER_CREST = 128;
  129. public static final int CP_CL_APPRENTICE = 256;
  130. public static final int CP_CL_TROOPS_FAME = 512;
  131. public static final int CP_CL_SUMMON_AIRSHIP = 1024;
  132. /** Privilege to open a door */
  133. public static final int CP_CH_OPEN_DOOR = 2048;
  134. public static final int CP_CH_OTHER_RIGHTS = 4096;
  135. public static final int CP_CH_AUCTION = 8192;
  136. public static final int CP_CH_DISMISS = 16384;
  137. public static final int CP_CH_SET_FUNCTIONS = 32768;
  138. public static final int CP_CS_OPEN_DOOR = 65536;
  139. public static final int CP_CS_MANOR_ADMIN = 131072;
  140. public static final int CP_CS_MANAGE_SIEGE = 262144;
  141. public static final int CP_CS_USE_FUNCTIONS = 524288;
  142. public static final int CP_CS_DISMISS = 1048576;
  143. public static final int CP_CS_TAXES = 2097152;
  144. public static final int CP_CS_MERCENARIES = 4194304;
  145. public static final int CP_CS_SET_FUNCTIONS = 8388608;
  146. /** Privilege to manage all clan activity */
  147. public static final int CP_ALL = 16777214;
  148. // Sub-unit types
  149. /** Clan subunit type of Academy */
  150. public static final int SUBUNIT_ACADEMY = -1;
  151. /** Clan subunit type of Royal Guard A */
  152. public static final int SUBUNIT_ROYAL1 = 100;
  153. /** Clan subunit type of Royal Guard B */
  154. public static final int SUBUNIT_ROYAL2 = 200;
  155. /** Clan subunit type of Order of Knights A-1 */
  156. public static final int SUBUNIT_KNIGHT1 = 1001;
  157. /** Clan subunit type of Order of Knights A-2 */
  158. public static final int SUBUNIT_KNIGHT2 = 1002;
  159. /** Clan subunit type of Order of Knights B-1 */
  160. public static final int SUBUNIT_KNIGHT3 = 2001;
  161. /** Clan subunit type of Order of Knights B-2 */
  162. public static final int SUBUNIT_KNIGHT4 = 2002;
  163. /** FastMap(Integer, L2Skill) containing all skills of the L2Clan */
  164. private final Map<Integer, L2Skill> _skills = new FastMap<>();
  165. private final Map<Integer, RankPrivs> _privs = new FastMap<>();
  166. private final Map<Integer, SubPledge> _subPledges = new FastMap<>();
  167. private final Map<Integer, L2Skill> _subPledgeSkills = new FastMap<>();
  168. private int _reputationScore = 0;
  169. private int _rank = 0;
  170. private String _notice;
  171. private boolean _noticeEnabled = false;
  172. private static final int MAX_NOTICE_LENGTH = 8192;
  173. /**
  174. * Called if a clan is referenced only by id.
  175. * In this case all other data needs to be fetched from db
  176. *
  177. * @param clanId A valid clan Id to create and restore
  178. */
  179. public L2Clan(int clanId)
  180. {
  181. _clanId = clanId;
  182. initializePrivs();
  183. restore();
  184. getWarehouse().restore();
  185. }
  186. /**
  187. * Called only if a new clan is created
  188. *
  189. * @param clanId A valid clan Id to create
  190. * @param clanName A valid clan name
  191. */
  192. public L2Clan(int clanId, String clanName)
  193. {
  194. _clanId = clanId;
  195. _name = clanName;
  196. initializePrivs();
  197. fireClanCreationListeners();
  198. }
  199. /**
  200. * @return Returns the clanId.
  201. */
  202. public int getClanId()
  203. {
  204. return _clanId;
  205. }
  206. /**
  207. * @param clanId The clanId to set.
  208. */
  209. public void setClanId(int clanId)
  210. {
  211. _clanId = clanId;
  212. }
  213. /**
  214. * @return Returns the leaderId.
  215. */
  216. public int getLeaderId()
  217. {
  218. return (_leader != null ? _leader.getObjectId() : 0);
  219. }
  220. /**
  221. * @return L2ClanMember of clan leader.
  222. */
  223. public L2ClanMember getLeader()
  224. {
  225. return _leader;
  226. }
  227. /**
  228. * @param leader the leader to set.
  229. */
  230. public void setLeader(L2ClanMember leader)
  231. {
  232. _leader = leader;
  233. _members.put(leader.getObjectId(), leader);
  234. }
  235. public void setNewLeader(L2ClanMember member)
  236. {
  237. if (!getLeader().isOnline())
  238. {
  239. return;
  240. }
  241. if (member == null)
  242. {
  243. return;
  244. }
  245. if (!member.isOnline())
  246. {
  247. return;
  248. }
  249. L2PcInstance exLeader = getLeader().getPlayerInstance();
  250. L2PcInstance newLeader = member.getPlayerInstance();
  251. if (!fireClanLeaderChangeListeners(newLeader, exLeader))
  252. {
  253. return;
  254. }
  255. SiegeManager.getInstance().removeSiegeSkills(exLeader);
  256. exLeader.setClan(this);
  257. exLeader.setClanPrivileges(L2Clan.CP_NOTHING);
  258. exLeader.broadcastUserInfo();
  259. setLeader(member);
  260. updateClanInDB();
  261. exLeader.setPledgeClass(exLeader.getClan().getClanMember(exLeader.getObjectId()).calculatePledgeClass(exLeader));
  262. exLeader.broadcastUserInfo();
  263. exLeader.checkItemRestriction();
  264. newLeader.setClan(this);
  265. newLeader.setPledgeClass(member.calculatePledgeClass(newLeader));
  266. newLeader.setClanPrivileges(L2Clan.CP_ALL);
  267. if (getLevel() >= SiegeManager.getInstance().getSiegeClanMinLevel())
  268. {
  269. SiegeManager.getInstance().addSiegeSkills(newLeader);
  270. // Transferring siege skills TimeStamps from old leader to new leader to prevent unlimited headquarters
  271. if (!exLeader.getSkillReuseTimeStamps().isEmpty())
  272. {
  273. TimeStamp t;
  274. for (L2Skill sk : SkillTable.getInstance().getSiegeSkills(newLeader.isNoble(), getCastleId() > 0))
  275. {
  276. if (exLeader.hasSkillReuse(sk.getReuseHashCode()))
  277. {
  278. t = exLeader.getSkillReuseTimeStamp(sk.getReuseHashCode());
  279. newLeader.addTimeStamp(sk, t.getReuse(), t.getStamp());
  280. }
  281. }
  282. newLeader.sendPacket(new SkillCoolTime(newLeader));
  283. }
  284. }
  285. newLeader.broadcastUserInfo();
  286. broadcastClanStatus();
  287. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_LEADER_PRIVILEGES_HAVE_BEEN_TRANSFERRED_TO_C1);
  288. sm.addString(newLeader.getName());
  289. broadcastToOnlineMembers(sm);
  290. sm = null;
  291. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  292. }
  293. /**
  294. * @return the clan leader's name.
  295. */
  296. public String getLeaderName()
  297. {
  298. if (_leader == null)
  299. {
  300. _log.warning(L2Clan.class.getName() + ": Clan " + getName() + " without clan leader!");
  301. return "";
  302. }
  303. return _leader.getName();
  304. }
  305. /**
  306. * @return the clan name.
  307. */
  308. public String getName()
  309. {
  310. return _name;
  311. }
  312. /**
  313. * @param name The name to set.
  314. */
  315. public void setName(String name)
  316. {
  317. _name = name;
  318. }
  319. /**
  320. * Adds a clan member to the clan.
  321. * @param member the clan member.
  322. */
  323. private void addClanMember(L2ClanMember member)
  324. {
  325. _members.put(member.getObjectId(), member);
  326. }
  327. /**
  328. * Adds a clan member to the clan.<br>
  329. * Using a different constructor, to make it easier to read.
  330. * @param player the clan member
  331. */
  332. public void addClanMember(L2PcInstance player)
  333. {
  334. if (!fireClanJoinListeners(player))
  335. {
  336. return;
  337. }
  338. final L2ClanMember member = new L2ClanMember(this, player);
  339. // store in memory
  340. addClanMember(member);
  341. member.setPlayerInstance(player);
  342. player.setClan(this);
  343. player.setPledgeClass(member.calculatePledgeClass(player));
  344. player.sendPacket(new PledgeShowMemberListUpdate(player));
  345. player.sendPacket(new PledgeSkillList(this));
  346. addSkillEffects(player);
  347. // notify CB server about the change
  348. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  349. }
  350. /**
  351. * Updates player status in clan.
  352. * @param player the player to be updated.
  353. */
  354. public void updateClanMember(L2PcInstance player)
  355. {
  356. final L2ClanMember member = new L2ClanMember(player);
  357. if (player.isClanLeader())
  358. setLeader(member);
  359. addClanMember(member);
  360. // notify CB server about the change
  361. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  362. }
  363. /**
  364. * @param name the name of the required clan member.
  365. * @return the clan member for a given name.
  366. */
  367. public L2ClanMember getClanMember(String name)
  368. {
  369. for (L2ClanMember temp : _members.values())
  370. {
  371. if (temp.getName().equals(name))
  372. return temp;
  373. }
  374. return null;
  375. }
  376. /**
  377. * @param objectID the required clan member object Id.
  378. * @return the clan member for a given {@code objectID}.
  379. */
  380. public L2ClanMember getClanMember(int objectID)
  381. {
  382. return _members.get(objectID);
  383. }
  384. /**
  385. * @param objectId the object Id of the member that will be removed.
  386. * @param clanJoinExpiryTime time penalty to join a clan.
  387. */
  388. public void removeClanMember(int objectId, long clanJoinExpiryTime)
  389. {
  390. if (!fireClanLeaveListeners(objectId))
  391. {
  392. return;
  393. }
  394. final L2ClanMember exMember = _members.remove(objectId);
  395. if (exMember == null)
  396. {
  397. _log.warning("Member Object ID: " + objectId + " not found in clan while trying to remove");
  398. return;
  399. }
  400. final int leadssubpledge = getLeaderSubPledge(objectId);
  401. if (leadssubpledge != 0)
  402. {
  403. // Sub-unit leader withdraws, position becomes vacant and leader
  404. // should appoint new via NPC
  405. getSubPledge(leadssubpledge).setLeaderId(0);
  406. updateSubPledgeInDB(leadssubpledge);
  407. }
  408. if (exMember.getApprentice() != 0)
  409. {
  410. final L2ClanMember apprentice = getClanMember(exMember.getApprentice());
  411. if (apprentice != null)
  412. {
  413. if (apprentice.getPlayerInstance() != null)
  414. apprentice.getPlayerInstance().setSponsor(0);
  415. else
  416. apprentice.initApprenticeAndSponsor(0, 0);
  417. apprentice.saveApprenticeAndSponsor(0, 0);
  418. }
  419. }
  420. if (exMember.getSponsor() != 0)
  421. {
  422. final L2ClanMember sponsor = getClanMember(exMember.getSponsor());
  423. if (sponsor != null)
  424. {
  425. if (sponsor.getPlayerInstance() != null)
  426. sponsor.getPlayerInstance().setApprentice(0);
  427. else
  428. sponsor.initApprenticeAndSponsor(0, 0);
  429. sponsor.saveApprenticeAndSponsor(0, 0);
  430. }
  431. }
  432. exMember.saveApprenticeAndSponsor(0, 0);
  433. if (Config.REMOVE_CASTLE_CIRCLETS)
  434. {
  435. CastleManager.getInstance().removeCirclet(exMember, getCastleId());
  436. }
  437. if (exMember.isOnline())
  438. {
  439. L2PcInstance player = exMember.getPlayerInstance();
  440. if (!player.isNoble())
  441. {
  442. player.setTitle("");
  443. }
  444. player.setApprentice(0);
  445. player.setSponsor(0);
  446. if (player.isClanLeader())
  447. {
  448. SiegeManager.getInstance().removeSiegeSkills(player);
  449. player.setClanCreateExpiryTime(System.currentTimeMillis() + Config.ALT_CLAN_CREATE_DAYS * 86400000L); //24*60*60*1000 = 86400000
  450. }
  451. // remove Clan skills from Player
  452. removeSkillEffects(player);
  453. // remove Residential skills
  454. if (player.getClan().getCastleId() > 0)
  455. CastleManager.getInstance().getCastleByOwner(player.getClan()).removeResidentialSkills(player);
  456. if (player.getClan().getFortId() > 0)
  457. FortManager.getInstance().getFortByOwner(player.getClan()).removeResidentialSkills(player);
  458. player.sendSkillList();
  459. player.setClan(null);
  460. // players leaving from clan academy have no penalty
  461. if (exMember.getPledgeType() != -1)
  462. player.setClanJoinExpiryTime(clanJoinExpiryTime);
  463. player.setPledgeClass(exMember.calculatePledgeClass(player));
  464. player.broadcastUserInfo();
  465. // disable clan tab
  466. player.sendPacket(new PledgeShowMemberListDeleteAll());
  467. }
  468. else
  469. {
  470. removeMemberInDatabase(exMember, clanJoinExpiryTime, getLeaderId() == objectId ? System.currentTimeMillis() + Config.ALT_CLAN_CREATE_DAYS * 86400000L : 0);
  471. }
  472. // notify CB server about the change
  473. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  474. }
  475. public L2ClanMember[] getMembers()
  476. {
  477. return _members.values().toArray(new L2ClanMember[_members.size()]);
  478. }
  479. public int getMembersCount()
  480. {
  481. return _members.size();
  482. }
  483. public int getSubPledgeMembersCount(int subpl)
  484. {
  485. int result = 0;
  486. for (L2ClanMember temp : _members.values())
  487. {
  488. if (temp.getPledgeType() == subpl)
  489. result++;
  490. }
  491. return result;
  492. }
  493. /**
  494. * @param pledgeType the Id of the pledge type.
  495. * @return the maximum number of members allowed for a given {@code pledgeType}.
  496. */
  497. public int getMaxNrOfMembers(int pledgeType)
  498. {
  499. int limit = 0;
  500. switch (pledgeType)
  501. {
  502. case 0:
  503. switch (getLevel())
  504. {
  505. case 3:
  506. limit = 30;
  507. break;
  508. case 2:
  509. limit = 20;
  510. break;
  511. case 1:
  512. limit = 15;
  513. break;
  514. case 0:
  515. limit = 10;
  516. break;
  517. default:
  518. limit = 40;
  519. break;
  520. }
  521. break;
  522. case -1:
  523. limit = 20;
  524. break;
  525. case 100:
  526. case 200:
  527. switch (getLevel())
  528. {
  529. case 11:
  530. limit = 30;
  531. break;
  532. default:
  533. limit = 20;
  534. break;
  535. }
  536. break;
  537. case 1001:
  538. case 1002:
  539. case 2001:
  540. case 2002:
  541. switch (getLevel())
  542. {
  543. case 9:
  544. case 10:
  545. case 11:
  546. limit = 25;
  547. break;
  548. default:
  549. limit = 10;
  550. break;
  551. }
  552. break;
  553. default:
  554. break;
  555. }
  556. return limit;
  557. }
  558. /**
  559. * @param exclude the object Id to exclude from list.
  560. * @return all online members excluding the one with object id {code exclude}.
  561. */
  562. public FastList<L2PcInstance> getOnlineMembers(int exclude)
  563. {
  564. final FastList<L2PcInstance> onlineMembers = new FastList<>();
  565. for (L2ClanMember temp : _members.values())
  566. {
  567. if ((temp != null) && temp.isOnline() && (temp.getObjectId() != exclude))
  568. {
  569. onlineMembers.add(temp.getPlayerInstance());
  570. }
  571. }
  572. return onlineMembers;
  573. }
  574. /**
  575. * @return the online clan member count.
  576. */
  577. public int getOnlineMembersCount()
  578. {
  579. int count = 0;
  580. for (L2ClanMember temp : _members.values())
  581. {
  582. if ((temp == null) || !temp.isOnline())
  583. {
  584. continue;
  585. }
  586. count++;
  587. }
  588. return count;
  589. }
  590. /**
  591. * @return the alliance Id.
  592. */
  593. public int getAllyId()
  594. {
  595. return _allyId;
  596. }
  597. /**
  598. * @return the alliance name.
  599. */
  600. public String getAllyName()
  601. {
  602. return _allyName;
  603. }
  604. /**
  605. * @param allyCrestId the alliance crest Id to be set.
  606. */
  607. public void setAllyCrestId(int allyCrestId)
  608. {
  609. _allyCrestId = allyCrestId;
  610. }
  611. /**
  612. * @return the alliance crest Id.
  613. */
  614. public int getAllyCrestId()
  615. {
  616. return _allyCrestId;
  617. }
  618. /**
  619. * @return the clan level.
  620. */
  621. public int getLevel()
  622. {
  623. return _level;
  624. }
  625. /**
  626. * Sets the clan level and updates the clan forum if it's needed.
  627. * @param level the clan level to be set.
  628. */
  629. public void setLevel(int level)
  630. {
  631. _level = level;
  632. if ((_level >= 2) && (_forum == null) && (Config.COMMUNITY_TYPE > 0))
  633. {
  634. final Forum forum = ForumsBBSManager.getInstance().getForumByName("ClanRoot");
  635. if (forum != null)
  636. {
  637. _forum = forum.getChildByName(_name);
  638. if (_forum == null)
  639. {
  640. _forum = ForumsBBSManager.getInstance().createNewForum(_name, ForumsBBSManager.getInstance().getForumByName("ClanRoot"), Forum.CLAN, Forum.CLANMEMBERONLY, getClanId());
  641. }
  642. }
  643. }
  644. }
  645. /**
  646. * @return the castle Id for this clan if owns a castle, zero otherwise.
  647. */
  648. public int getCastleId()
  649. {
  650. return _castleId;
  651. }
  652. /**
  653. * @return the fort Id for this clan if owns a fort, zero otherwise.
  654. */
  655. public int getFortId()
  656. {
  657. return _fortId;
  658. }
  659. /**
  660. * @return the hideout Id for this clan if owns a hideout, zero otherwise.
  661. */
  662. public int getHideoutId()
  663. {
  664. return _hideoutId;
  665. }
  666. /**
  667. * @param crestId the Id of the clan crest to be set.
  668. */
  669. public void setCrestId(int crestId)
  670. {
  671. _crestId = crestId;
  672. }
  673. /**
  674. * @return Returns the clanCrestId.
  675. */
  676. public int getCrestId()
  677. {
  678. return _crestId;
  679. }
  680. /**
  681. * @param crestLargeId The id of pledge LargeCrest.
  682. */
  683. public void setCrestLargeId(int crestLargeId)
  684. {
  685. _crestLargeId = crestLargeId;
  686. }
  687. /**
  688. * @return Returns the clan CrestLargeId
  689. */
  690. public int getCrestLargeId()
  691. {
  692. return _crestLargeId;
  693. }
  694. /**
  695. * @param allyId The allyId to set.
  696. */
  697. public void setAllyId(int allyId)
  698. {
  699. _allyId = allyId;
  700. }
  701. /**
  702. * @param allyName The allyName to set.
  703. */
  704. public void setAllyName(String allyName)
  705. {
  706. _allyName = allyName;
  707. }
  708. /**
  709. * @param castleId the castle Id to set.
  710. */
  711. public void setCastleId(int castleId)
  712. {
  713. _castleId = castleId;
  714. }
  715. /**
  716. * @param fortId the fort Id to set.
  717. */
  718. public void setFortId(int fortId)
  719. {
  720. _fortId = fortId;
  721. }
  722. /**
  723. * @param hideoutId the hideout Id to set.
  724. */
  725. public void setHideoutId(int hideoutId)
  726. {
  727. _hideoutId = hideoutId;
  728. }
  729. /**
  730. * @param id the Id of the player to be verified.
  731. * @return {code true} if the player belongs to the clan.
  732. */
  733. public boolean isMember(int id)
  734. {
  735. return (id == 0 ? false : _members.containsKey(id));
  736. }
  737. /**
  738. * Store in database current clan's reputation.
  739. */
  740. public void updateClanScoreInDB()
  741. {
  742. Connection con = null;
  743. try
  744. {
  745. con = L2DatabaseFactory.getInstance().getConnection();
  746. final PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET reputation_score=? WHERE clan_id=?");
  747. statement.setInt(1, getReputationScore());
  748. statement.setInt(2, getClanId());
  749. statement.execute();
  750. statement.close();
  751. }
  752. catch (Exception e)
  753. {
  754. _log.log(Level.WARNING, "Exception on updateClanScoreInDb(): " + e.getMessage(), e);
  755. }
  756. finally
  757. {
  758. L2DatabaseFactory.close(con);
  759. }
  760. }
  761. /**
  762. * Updates in database clan information:
  763. * <ul>
  764. * <li>Clan leader Id</li>
  765. * <li>Alliance Id</li>
  766. * <li>Alliance name</li>
  767. * <li>Clan's reputation</li>
  768. * <li>Alliance's penalty expiration time</li>
  769. * <li>Alliance's penalty type</li>
  770. * <li>Character's penalty expiration time</li>
  771. * <li>Dissolving expiration time</li>
  772. * <li>Clan's id</li>
  773. * </ul>
  774. */
  775. public void updateClanInDB()
  776. {
  777. Connection con = null;
  778. try
  779. {
  780. con = L2DatabaseFactory.getInstance().getConnection();
  781. final 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=?");
  782. statement.setInt(1, getLeaderId());
  783. statement.setInt(2, getAllyId());
  784. statement.setString(3, getAllyName());
  785. statement.setInt(4, getReputationScore());
  786. statement.setLong(5, getAllyPenaltyExpiryTime());
  787. statement.setInt(6, getAllyPenaltyType());
  788. statement.setLong(7, getCharPenaltyExpiryTime());
  789. statement.setLong(8, getDissolvingExpiryTime());
  790. statement.setInt(9, getClanId());
  791. statement.execute();
  792. statement.close();
  793. if (Config.DEBUG)
  794. _log.fine("New clan leader saved in db: " + getClanId());
  795. }
  796. catch (Exception e)
  797. {
  798. _log.log(Level.SEVERE, "Error saving clan: " + e.getMessage(), e);
  799. }
  800. finally
  801. {
  802. L2DatabaseFactory.close(con);
  803. }
  804. }
  805. /**
  806. * Stores in database clan information:
  807. * <ul>
  808. * <li>Clan Id</li>
  809. * <li>Clan name</li>
  810. * <li>Clan level</li>
  811. * <li>Has castle</li>
  812. * <li>Alliance Id</li>
  813. * <li>Alliance name</li>
  814. * <li>Clan leader Id</li>
  815. * <li>Clan crest Id</li>
  816. * <li>Clan large crest Id</li>
  817. * <li>Alliance crest Id</li>
  818. * </ul>
  819. */
  820. public void store()
  821. {
  822. Connection con = null;
  823. try
  824. {
  825. con = L2DatabaseFactory.getInstance().getConnection();
  826. final 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 (?,?,?,?,?,?,?,?,?,?)");
  827. statement.setInt(1, getClanId());
  828. statement.setString(2, getName());
  829. statement.setInt(3, getLevel());
  830. statement.setInt(4, getCastleId());
  831. statement.setInt(5, getAllyId());
  832. statement.setString(6, getAllyName());
  833. statement.setInt(7, getLeaderId());
  834. statement.setInt(8, getCrestId());
  835. statement.setInt(9, getCrestLargeId());
  836. statement.setInt(10, getAllyCrestId());
  837. statement.execute();
  838. statement.close();
  839. if (Config.DEBUG)
  840. _log.fine("New clan saved in db: " + getClanId());
  841. }
  842. catch (Exception e)
  843. {
  844. _log.log(Level.SEVERE, "Error saving new clan: " + e.getMessage(), e);
  845. }
  846. finally
  847. {
  848. L2DatabaseFactory.close(con);
  849. }
  850. }
  851. /**
  852. * @param member the clan member to be removed.
  853. * @param clanJoinExpiryTime
  854. * @param clanCreateExpiryTime
  855. */
  856. private void removeMemberInDatabase(L2ClanMember member, long clanJoinExpiryTime, long clanCreateExpiryTime)
  857. {
  858. Connection con = null;
  859. try
  860. {
  861. con = L2DatabaseFactory.getInstance().getConnection();
  862. 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=?");
  863. statement.setString(1, "");
  864. statement.setLong(2, clanJoinExpiryTime);
  865. statement.setLong(3, clanCreateExpiryTime);
  866. statement.setInt(4, member.getObjectId());
  867. statement.execute();
  868. statement.close();
  869. if (Config.DEBUG)
  870. _log.fine("clan member removed in db: " + getClanId());
  871. statement = con.prepareStatement("UPDATE characters SET apprentice=0 WHERE apprentice=?");
  872. statement.setInt(1, member.getObjectId());
  873. statement.execute();
  874. statement.close();
  875. statement = con.prepareStatement("UPDATE characters SET sponsor=0 WHERE sponsor=?");
  876. statement.setInt(1, member.getObjectId());
  877. statement.execute();
  878. statement.close();
  879. }
  880. catch (Exception e)
  881. {
  882. _log.log(Level.SEVERE, "Error removing clan member: " + e.getMessage(), e);
  883. }
  884. finally
  885. {
  886. L2DatabaseFactory.close(con);
  887. }
  888. }
  889. @SuppressWarnings("unused")
  890. private void updateWarsInDB()
  891. {
  892. Connection con = null;
  893. try
  894. {
  895. con = L2DatabaseFactory.getInstance().getConnection();
  896. final PreparedStatement statement = con.prepareStatement("UPDATE clan_wars SET wantspeace1=? WHERE clan1=?");
  897. statement.setInt(1, 0);
  898. statement.setInt(2, 0);
  899. statement.close();
  900. }
  901. catch (Exception e)
  902. {
  903. _log.log(Level.SEVERE, "Error updating clan wars data: " + e.getMessage(), e);
  904. }
  905. finally
  906. {
  907. L2DatabaseFactory.close(con);
  908. }
  909. }
  910. private void restore()
  911. {
  912. //restorewars();
  913. Connection con = null;
  914. try
  915. {
  916. con = L2DatabaseFactory.getInstance().getConnection();
  917. 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=?");
  918. statement.setInt(1, getClanId());
  919. final ResultSet clanData = statement.executeQuery();
  920. if (clanData.next())
  921. {
  922. setName(clanData.getString("clan_name"));
  923. setLevel(clanData.getInt("clan_level"));
  924. setCastleId(clanData.getInt("hasCastle"));
  925. setAllyId(clanData.getInt("ally_id"));
  926. setAllyName(clanData.getString("ally_name"));
  927. setAllyPenaltyExpiryTime(clanData.getLong("ally_penalty_expiry_time"), clanData.getInt("ally_penalty_type"));
  928. if (getAllyPenaltyExpiryTime() < System.currentTimeMillis())
  929. {
  930. setAllyPenaltyExpiryTime(0, 0);
  931. }
  932. setCharPenaltyExpiryTime(clanData.getLong("char_penalty_expiry_time"));
  933. if (getCharPenaltyExpiryTime() + Config.ALT_CLAN_JOIN_DAYS * 86400000L < System.currentTimeMillis()) //24*60*60*1000 = 86400000
  934. {
  935. setCharPenaltyExpiryTime(0);
  936. }
  937. setDissolvingExpiryTime(clanData.getLong("dissolving_expiry_time"));
  938. setCrestId(clanData.getInt("crest_id"));
  939. setCrestLargeId(clanData.getInt("crest_large_id"));
  940. setAllyCrestId(clanData.getInt("ally_crest_id"));
  941. setReputationScore(clanData.getInt("reputation_score"), false);
  942. setAuctionBiddedAt(clanData.getInt("auction_bid_at"), false);
  943. final int leaderId = (clanData.getInt("leader_id"));
  944. statement.clearParameters();
  945. statement = con.prepareStatement("SELECT char_name,level,classid,charId,title,power_grade,subpledge,apprentice,sponsor,sex,race FROM characters WHERE clanid=?");
  946. statement.setInt(1, getClanId());
  947. final ResultSet clanMembers = statement.executeQuery();
  948. L2ClanMember member = null;
  949. while (clanMembers.next())
  950. {
  951. 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"));
  952. if (member.getObjectId() == leaderId)
  953. setLeader(member);
  954. else
  955. addClanMember(member);
  956. member.initApprenticeAndSponsor(clanMembers.getInt("apprentice"), clanMembers.getInt("sponsor"));
  957. }
  958. clanMembers.close();
  959. }
  960. clanData.close();
  961. statement.close();
  962. if (Config.DEBUG && getName() != null)
  963. _log.info("Restored clan data for \"" + getName() + "\" from database.");
  964. restoreSubPledges();
  965. restoreRankPrivs();
  966. restoreSkills();
  967. restoreNotice();
  968. }
  969. catch (Exception e)
  970. {
  971. _log.log(Level.SEVERE, "Error restoring clan data: " + e.getMessage(), e);
  972. }
  973. finally
  974. {
  975. L2DatabaseFactory.close(con);
  976. }
  977. }
  978. private void restoreNotice()
  979. {
  980. Connection con = null;
  981. try
  982. {
  983. con = L2DatabaseFactory.getInstance().getConnection();
  984. final PreparedStatement statement = con.prepareStatement("SELECT enabled,notice FROM clan_notices WHERE clan_id=?");
  985. statement.setInt(1, getClanId());
  986. final ResultSet noticeData = statement.executeQuery();
  987. while (noticeData.next())
  988. {
  989. _noticeEnabled = noticeData.getBoolean("enabled");
  990. _notice = noticeData.getString("notice");
  991. }
  992. noticeData.close();
  993. statement.close();
  994. }
  995. catch (Exception e)
  996. {
  997. _log.log(Level.SEVERE, "Error restoring clan notice: " + e.getMessage(), e);
  998. }
  999. finally
  1000. {
  1001. L2DatabaseFactory.close(con);
  1002. }
  1003. }
  1004. private void storeNotice(String notice, boolean enabled)
  1005. {
  1006. if (notice == null)
  1007. notice = "";
  1008. if (notice.length() > MAX_NOTICE_LENGTH)
  1009. notice = notice.substring(0, MAX_NOTICE_LENGTH - 1);
  1010. Connection con = null;
  1011. try
  1012. {
  1013. con = L2DatabaseFactory.getInstance().getConnection();
  1014. final PreparedStatement statement = con.prepareStatement("INSERT INTO clan_notices (clan_id,notice,enabled) values (?,?,?) ON DUPLICATE KEY UPDATE notice=?,enabled=?");
  1015. statement.setInt(1, getClanId());
  1016. statement.setString(2, notice);
  1017. if (enabled)
  1018. statement.setString(3, "true");
  1019. else
  1020. statement.setString(3, "false");
  1021. statement.setString(4, notice);
  1022. if (enabled)
  1023. statement.setString(5, "true");
  1024. else
  1025. statement.setString(5, "false");
  1026. statement.execute();
  1027. statement.close();
  1028. }
  1029. catch (Exception e)
  1030. {
  1031. _log.log(Level.WARNING, "Error could not store clan notice: " + e.getMessage(), e);
  1032. }
  1033. finally
  1034. {
  1035. L2DatabaseFactory.close(con);
  1036. }
  1037. _notice = notice;
  1038. _noticeEnabled = enabled;
  1039. }
  1040. public void setNoticeEnabled(boolean enabled)
  1041. {
  1042. storeNotice(_notice, enabled);
  1043. }
  1044. public void setNotice(String notice)
  1045. {
  1046. storeNotice(notice, _noticeEnabled);
  1047. }
  1048. public boolean isNoticeEnabled()
  1049. {
  1050. return _noticeEnabled;
  1051. }
  1052. public String getNotice()
  1053. {
  1054. if (_notice == null)
  1055. return "";
  1056. return _notice;
  1057. }
  1058. private void restoreSkills()
  1059. {
  1060. Connection con = null;
  1061. try
  1062. {
  1063. // Retrieve all skills of this L2PcInstance from the database
  1064. con = L2DatabaseFactory.getInstance().getConnection();
  1065. final PreparedStatement statement = con.prepareStatement("SELECT skill_id,skill_level,sub_pledge_id FROM clan_skills WHERE clan_id=?");
  1066. statement.setInt(1, getClanId());
  1067. final ResultSet rset = statement.executeQuery();
  1068. // Go though the recordset of this SQL query
  1069. while (rset.next())
  1070. {
  1071. int id = rset.getInt("skill_id");
  1072. int level = rset.getInt("skill_level");
  1073. // Create a L2Skill object for each record
  1074. L2Skill skill = SkillTable.getInstance().getInfo(id, level);
  1075. // Add the L2Skill object to the L2Clan _skills
  1076. int subType = rset.getInt("sub_pledge_id");
  1077. if (subType == -2)
  1078. _skills.put(skill.getId(), skill);
  1079. else if (subType == 0)
  1080. _subPledgeSkills.put(skill.getId(), skill);
  1081. else
  1082. {
  1083. SubPledge subunit = _subPledges.get(subType);
  1084. if (subunit != null)
  1085. subunit.addNewSkill(skill);
  1086. else
  1087. _log.info("Missing subpledge "+subType+" for clan "+this+", skill skipped.");
  1088. }
  1089. }
  1090. rset.close();
  1091. statement.close();
  1092. }
  1093. catch (Exception e)
  1094. {
  1095. _log.log(Level.SEVERE, "Error restoring clan skills: " + e.getMessage(), e);
  1096. }
  1097. finally
  1098. {
  1099. L2DatabaseFactory.close(con);
  1100. }
  1101. }
  1102. /**
  1103. * @return all the clan skills.
  1104. */
  1105. public final L2Skill[] getAllSkills()
  1106. {
  1107. if (_skills == null)
  1108. return new L2Skill[0];
  1109. return _skills.values().toArray(new L2Skill[_skills.values().size()]);
  1110. }
  1111. /**
  1112. * @return the map containing this clan skills.
  1113. */
  1114. public Map<Integer, L2Skill> getSkills()
  1115. {
  1116. return _skills;
  1117. }
  1118. /**
  1119. * Used to add a skill to skill list of this L2Clan
  1120. * @param newSkill
  1121. * @return
  1122. */
  1123. public L2Skill addSkill(L2Skill newSkill)
  1124. {
  1125. L2Skill oldSkill = null;
  1126. if (newSkill != null)
  1127. {
  1128. // Replace oldSkill by newSkill or Add the newSkill
  1129. oldSkill = _skills.put(newSkill.getId(), newSkill);
  1130. }
  1131. return oldSkill;
  1132. }
  1133. public L2Skill addNewSkill(L2Skill newSkill)
  1134. {
  1135. return addNewSkill(newSkill, -2);
  1136. }
  1137. /**
  1138. * 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
  1139. * @param newSkill
  1140. * @param subType
  1141. * @return
  1142. */
  1143. public L2Skill addNewSkill(L2Skill newSkill, int subType)
  1144. {
  1145. L2Skill oldSkill = null;
  1146. Connection con = null;
  1147. if (newSkill != null)
  1148. {
  1149. if (subType == -2) // regular clan skill
  1150. oldSkill = _skills.put(newSkill.getId(), newSkill);
  1151. else if (subType == 0) // main clan sub skill
  1152. oldSkill = _subPledgeSkills.put(newSkill.getId(), newSkill);
  1153. else
  1154. {
  1155. SubPledge subunit = getSubPledge(subType);
  1156. if (subunit != null)
  1157. oldSkill = subunit.addNewSkill(newSkill);
  1158. else
  1159. {
  1160. _log.log(Level.WARNING, "Subpledge "+subType +" does not exist for clan "+this);
  1161. return oldSkill;
  1162. }
  1163. }
  1164. try
  1165. {
  1166. con = L2DatabaseFactory.getInstance().getConnection();
  1167. PreparedStatement statement;
  1168. if (oldSkill != null)
  1169. {
  1170. statement = con.prepareStatement("UPDATE clan_skills SET skill_level=? WHERE skill_id=? AND clan_id=?");
  1171. statement.setInt(1, newSkill.getLevel());
  1172. statement.setInt(2, oldSkill.getId());
  1173. statement.setInt(3, getClanId());
  1174. }
  1175. else
  1176. {
  1177. statement = con.prepareStatement("INSERT INTO clan_skills (clan_id,skill_id,skill_level,skill_name,sub_pledge_id) VALUES (?,?,?,?,?)");
  1178. statement.setInt(1, getClanId());
  1179. statement.setInt(2, newSkill.getId());
  1180. statement.setInt(3, newSkill.getLevel());
  1181. statement.setString(4, newSkill.getName());
  1182. statement.setInt(5, subType);
  1183. }
  1184. statement.execute();
  1185. statement.close();
  1186. }
  1187. catch (Exception e)
  1188. {
  1189. _log.log(Level.WARNING, "Error could not store clan skills: " + e.getMessage(), e);
  1190. }
  1191. finally
  1192. {
  1193. L2DatabaseFactory.close(con);
  1194. }
  1195. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_SKILL_S1_ADDED);
  1196. sm.addSkillName(newSkill.getId());
  1197. for (L2ClanMember temp : _members.values())
  1198. {
  1199. if (temp != null && temp.getPlayerInstance() != null && temp.isOnline())
  1200. {
  1201. if (subType == -2)
  1202. {
  1203. if (newSkill.getMinPledgeClass() <= temp.getPlayerInstance().getPledgeClass())
  1204. {
  1205. temp.getPlayerInstance().addSkill(newSkill, false); // Skill is not saved to player DB
  1206. temp.getPlayerInstance().sendPacket(new PledgeSkillListAdd(newSkill.getId(), newSkill.getLevel()));
  1207. temp.getPlayerInstance().sendPacket(sm);
  1208. temp.getPlayerInstance().sendSkillList();
  1209. }
  1210. }
  1211. else
  1212. {
  1213. if (temp.getPledgeType() == subType)
  1214. {
  1215. temp.getPlayerInstance().addSkill(newSkill, false); // Skill is not saved to player DB
  1216. temp.getPlayerInstance().sendPacket(new ExSubPledgeSkillAdd(subType, newSkill.getId(), newSkill.getLevel()));
  1217. temp.getPlayerInstance().sendPacket(sm);
  1218. temp.getPlayerInstance().sendSkillList();
  1219. }
  1220. }
  1221. }
  1222. }
  1223. }
  1224. return oldSkill;
  1225. }
  1226. public void addSkillEffects()
  1227. {
  1228. for (L2Skill skill : _skills.values())
  1229. {
  1230. for (L2ClanMember temp : _members.values())
  1231. {
  1232. try
  1233. {
  1234. if (temp != null && temp.isOnline())
  1235. {
  1236. if (skill.getMinPledgeClass() <= temp.getPlayerInstance().getPledgeClass())
  1237. temp.getPlayerInstance().addSkill(skill, false); // Skill is not saved to player DB
  1238. }
  1239. }
  1240. catch (NullPointerException e)
  1241. {
  1242. _log.log(Level.WARNING, e.getMessage(),e);
  1243. }
  1244. }
  1245. }
  1246. }
  1247. public void addSkillEffects(L2PcInstance player)
  1248. {
  1249. if (player == null || _reputationScore < 0)
  1250. return;
  1251. for (L2Skill skill : _skills.values())
  1252. {
  1253. if (skill.getMinPledgeClass() <= player.getPledgeClass())
  1254. player.addSkill(skill, false); // Skill is not saved to player DB
  1255. }
  1256. if (player.getPledgeType() == 0)
  1257. {
  1258. for (L2Skill skill : _subPledgeSkills.values())
  1259. player.addSkill(skill, false); // Skill is not saved to player DB
  1260. }
  1261. else
  1262. {
  1263. SubPledge subunit = getSubPledge(player.getPledgeType());
  1264. if (subunit == null)
  1265. return;
  1266. for (L2Skill skill : subunit.getSkills())
  1267. player.addSkill(skill, false); // Skill is not saved to player DB
  1268. }
  1269. }
  1270. public void removeSkillEffects(L2PcInstance player)
  1271. {
  1272. if (player == null)
  1273. return;
  1274. for (L2Skill skill : _skills.values())
  1275. {
  1276. player.removeSkill(skill, false); // Skill is not saved to player DB
  1277. }
  1278. if (player.getPledgeType() == 0)
  1279. {
  1280. for (L2Skill skill : _subPledgeSkills.values())
  1281. player.removeSkill(skill, false); // Skill is not saved to player DB
  1282. }
  1283. else
  1284. {
  1285. SubPledge subunit = getSubPledge(player.getPledgeType());
  1286. if (subunit == null)
  1287. return;
  1288. for (L2Skill skill : subunit.getSkills())
  1289. player.removeSkill(skill, false); // Skill is not saved to player DB
  1290. }
  1291. }
  1292. public void broadcastToOnlineAllyMembers(L2GameServerPacket packet)
  1293. {
  1294. for (L2Clan clan : ClanTable.getInstance().getClanAllies(getAllyId()))
  1295. {
  1296. clan.broadcastToOnlineMembers(packet);
  1297. }
  1298. }
  1299. public void broadcastToOnlineMembers(L2GameServerPacket packet)
  1300. {
  1301. for (L2ClanMember member : _members.values())
  1302. {
  1303. if (member != null && member.isOnline())
  1304. member.getPlayerInstance().sendPacket(packet);
  1305. }
  1306. }
  1307. public void broadcastCSToOnlineMembers(CreatureSay packet, L2PcInstance broadcaster)
  1308. {
  1309. for (L2ClanMember member : _members.values())
  1310. {
  1311. if (member != null && member.isOnline() && !BlockList.isBlocked(member.getPlayerInstance(), broadcaster))
  1312. member.getPlayerInstance().sendPacket(packet);
  1313. }
  1314. }
  1315. public void broadcastToOtherOnlineMembers(L2GameServerPacket packet, L2PcInstance player)
  1316. {
  1317. for (L2ClanMember member : _members.values())
  1318. {
  1319. if (member != null && member.isOnline() && member.getPlayerInstance() != player)
  1320. member.getPlayerInstance().sendPacket(packet);
  1321. }
  1322. }
  1323. @Override
  1324. public String toString()
  1325. {
  1326. return getName()+"["+getClanId()+"]";
  1327. }
  1328. public ItemContainer getWarehouse()
  1329. {
  1330. return _warehouse;
  1331. }
  1332. public boolean isAtWarWith(Integer id)
  1333. {
  1334. if (!_atWarWith.isEmpty())
  1335. if (_atWarWith.contains(id))
  1336. return true;
  1337. return false;
  1338. }
  1339. public boolean isAtWarWith(L2Clan clan)
  1340. {
  1341. if (clan == null)
  1342. return false;
  1343. if (!_atWarWith.isEmpty())
  1344. if (_atWarWith.contains(clan.getClanId()))
  1345. return true;
  1346. return false;
  1347. }
  1348. public boolean isAtWarAttacker(Integer id)
  1349. {
  1350. if (_atWarAttackers != null && !_atWarAttackers.isEmpty())
  1351. if (_atWarAttackers.contains(id))
  1352. return true;
  1353. return false;
  1354. }
  1355. public void setEnemyClan(L2Clan clan)
  1356. {
  1357. Integer id = clan.getClanId();
  1358. _atWarWith.add(id);
  1359. }
  1360. public void setEnemyClan(Integer clan)
  1361. {
  1362. _atWarWith.add(clan);
  1363. }
  1364. public void setAttackerClan(L2Clan clan)
  1365. {
  1366. Integer id = clan.getClanId();
  1367. _atWarAttackers.add(id);
  1368. }
  1369. public void setAttackerClan(Integer clan)
  1370. {
  1371. _atWarAttackers.add(clan);
  1372. }
  1373. public void deleteEnemyClan(L2Clan clan)
  1374. {
  1375. Integer id = clan.getClanId();
  1376. _atWarWith.remove(id);
  1377. }
  1378. public void deleteAttackerClan(L2Clan clan)
  1379. {
  1380. Integer id = clan.getClanId();
  1381. _atWarAttackers.remove(id);
  1382. }
  1383. public int getHiredGuards()
  1384. {
  1385. return _hiredGuards;
  1386. }
  1387. public void incrementHiredGuards()
  1388. {
  1389. _hiredGuards++;
  1390. }
  1391. public boolean isAtWar()
  1392. {
  1393. if (_atWarWith != null && !_atWarWith.isEmpty())
  1394. return true;
  1395. return false;
  1396. }
  1397. public List<Integer> getWarList()
  1398. {
  1399. return _atWarWith;
  1400. }
  1401. public List<Integer> getAttackerList()
  1402. {
  1403. return _atWarAttackers;
  1404. }
  1405. public void broadcastClanStatus()
  1406. {
  1407. for (L2PcInstance member : getOnlineMembers(0))
  1408. {
  1409. member.sendPacket(new PledgeShowMemberListDeleteAll());
  1410. member.sendPacket(new PledgeShowMemberListAll(this, member));
  1411. }
  1412. }
  1413. public static class SubPledge
  1414. {
  1415. private final int _id;
  1416. private String _subPledgeName;
  1417. private int _leaderId;
  1418. private final Map<Integer, L2Skill> _subPledgeSkills = new FastMap<>();
  1419. public SubPledge(int id, String name, int leaderId)
  1420. {
  1421. _id = id;
  1422. _subPledgeName = name;
  1423. _leaderId = leaderId;
  1424. }
  1425. public int getId()
  1426. {
  1427. return _id;
  1428. }
  1429. public String getName()
  1430. {
  1431. return _subPledgeName;
  1432. }
  1433. public void setName(String name)
  1434. {
  1435. _subPledgeName = name;
  1436. }
  1437. public int getLeaderId()
  1438. {
  1439. return _leaderId;
  1440. }
  1441. public void setLeaderId(int leaderId)
  1442. {
  1443. _leaderId = leaderId;
  1444. }
  1445. public L2Skill addNewSkill(L2Skill skill)
  1446. {
  1447. return _subPledgeSkills.put(skill.getId(), skill);
  1448. }
  1449. public Collection<L2Skill> getSkills()
  1450. {
  1451. return _subPledgeSkills.values();
  1452. }
  1453. public L2Skill getSkill(int id)
  1454. {
  1455. return _subPledgeSkills.get(id);
  1456. }
  1457. }
  1458. public static class RankPrivs
  1459. {
  1460. private final int _rankId;
  1461. private final int _party;// TODO find out what this stuff means and implement it
  1462. private int _rankPrivs;
  1463. public RankPrivs(int rank, int party, int privs)
  1464. {
  1465. _rankId = rank;
  1466. _party = party;
  1467. _rankPrivs = privs;
  1468. }
  1469. public int getRank()
  1470. {
  1471. return _rankId;
  1472. }
  1473. public int getParty()
  1474. {
  1475. return _party;
  1476. }
  1477. public int getPrivs()
  1478. {
  1479. return _rankPrivs;
  1480. }
  1481. public void setPrivs(int privs)
  1482. {
  1483. _rankPrivs = privs;
  1484. }
  1485. }
  1486. private void restoreSubPledges()
  1487. {
  1488. Connection con = null;
  1489. try
  1490. {
  1491. // Retrieve all subpledges of this clan from the database
  1492. con = L2DatabaseFactory.getInstance().getConnection();
  1493. final PreparedStatement statement = con.prepareStatement("SELECT sub_pledge_id,name,leader_id FROM clan_subpledges WHERE clan_id=?");
  1494. statement.setInt(1, getClanId());
  1495. final ResultSet rset = statement.executeQuery();
  1496. while (rset.next())
  1497. {
  1498. int id = rset.getInt("sub_pledge_id");
  1499. String name = rset.getString("name");
  1500. int leaderId = rset.getInt("leader_id");
  1501. // Create a SubPledge object for each record
  1502. SubPledge pledge = new SubPledge(id, name, leaderId);
  1503. _subPledges.put(id, pledge);
  1504. }
  1505. rset.close();
  1506. statement.close();
  1507. }
  1508. catch (Exception e)
  1509. {
  1510. _log.log(Level.WARNING, "Could not restore clan sub-units: " + e.getMessage(), e);
  1511. }
  1512. finally
  1513. {
  1514. L2DatabaseFactory.close(con);
  1515. }
  1516. }
  1517. /**
  1518. * used to retrieve subPledge by type
  1519. * @param pledgeType
  1520. * @return
  1521. */
  1522. public final SubPledge getSubPledge(int pledgeType)
  1523. {
  1524. if (_subPledges == null)
  1525. return null;
  1526. return _subPledges.get(pledgeType);
  1527. }
  1528. /**
  1529. * Used to retrieve subPledge by type
  1530. * @param pledgeName
  1531. * @return
  1532. */
  1533. public final SubPledge getSubPledge(String pledgeName)
  1534. {
  1535. if (_subPledges == null)
  1536. return null;
  1537. for (SubPledge sp : _subPledges.values())
  1538. {
  1539. if (sp.getName().equalsIgnoreCase(pledgeName))
  1540. {
  1541. return sp;
  1542. }
  1543. }
  1544. return null;
  1545. }
  1546. /**
  1547. * Used to retrieve all subPledges
  1548. * @return
  1549. */
  1550. public final SubPledge[] getAllSubPledges()
  1551. {
  1552. if (_subPledges == null)
  1553. return new SubPledge[0];
  1554. return _subPledges.values().toArray(new SubPledge[_subPledges.values().size()]);
  1555. }
  1556. public SubPledge createSubPledge(L2PcInstance player, int pledgeType, int leaderId, String subPledgeName)
  1557. {
  1558. SubPledge subPledge = null;
  1559. pledgeType = getAvailablePledgeTypes(pledgeType);
  1560. if (pledgeType == 0)
  1561. {
  1562. if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
  1563. player.sendPacket(SystemMessageId.CLAN_HAS_ALREADY_ESTABLISHED_A_CLAN_ACADEMY);
  1564. else
  1565. player.sendMessage("You can't create any more sub-units of this type");
  1566. return null;
  1567. }
  1568. if (_leader.getObjectId() == leaderId)
  1569. {
  1570. player.sendMessage("Leader is not correct");
  1571. return null;
  1572. }
  1573. // Royal Guard 5000 points per each
  1574. // Order of Knights 10000 points per each
  1575. if (pledgeType != -1 && ((getReputationScore() < 5000 && pledgeType < L2Clan.SUBUNIT_KNIGHT1) || (getReputationScore() < 10000 && pledgeType > L2Clan.SUBUNIT_ROYAL2)))
  1576. {
  1577. player.sendPacket(SystemMessageId.THE_CLAN_REPUTATION_SCORE_IS_TOO_LOW);
  1578. return null;
  1579. }
  1580. Connection con = null;
  1581. try
  1582. {
  1583. con = L2DatabaseFactory.getInstance().getConnection();
  1584. final PreparedStatement statement = con.prepareStatement("INSERT INTO clan_subpledges (clan_id,sub_pledge_id,name,leader_id) values (?,?,?,?)");
  1585. statement.setInt(1, getClanId());
  1586. statement.setInt(2, pledgeType);
  1587. statement.setString(3, subPledgeName);
  1588. if (pledgeType != -1)
  1589. statement.setInt(4, leaderId);
  1590. else
  1591. statement.setInt(4, 0);
  1592. statement.execute();
  1593. statement.close();
  1594. subPledge = new SubPledge(pledgeType, subPledgeName, leaderId);
  1595. _subPledges.put(pledgeType, subPledge);
  1596. if (pledgeType != -1)
  1597. {
  1598. // Royal Guard 5000 points per each
  1599. // Order of Knights 10000 points per each
  1600. if (pledgeType < L2Clan.SUBUNIT_KNIGHT1)
  1601. setReputationScore(getReputationScore() - Config.ROYAL_GUARD_COST, true);
  1602. else
  1603. setReputationScore(getReputationScore() - Config.KNIGHT_UNIT_COST, true);
  1604. //TODO: clan lvl9 or more can reinforce knights cheaper if first knight unit already created, use Config.KNIGHT_REINFORCE_COST
  1605. }
  1606. if (Config.DEBUG)
  1607. _log.fine("New sub_clan saved in db: " + getClanId() + "; " + pledgeType);
  1608. }
  1609. catch (Exception e)
  1610. {
  1611. _log.log(Level.SEVERE, "Error saving sub clan data: " + e.getMessage(), e);
  1612. }
  1613. finally
  1614. {
  1615. L2DatabaseFactory.close(con);
  1616. }
  1617. broadcastToOnlineMembers(new PledgeShowInfoUpdate(_leader.getClan()));
  1618. broadcastToOnlineMembers(new PledgeReceiveSubPledgeCreated(subPledge, _leader.getClan()));
  1619. return subPledge;
  1620. }
  1621. public int getAvailablePledgeTypes(int pledgeType)
  1622. {
  1623. if (_subPledges.get(pledgeType) != null)
  1624. {
  1625. //_log.warning("found sub-unit with id: "+pledgeType);
  1626. switch (pledgeType)
  1627. {
  1628. case SUBUNIT_ACADEMY:
  1629. return 0;
  1630. case SUBUNIT_ROYAL1:
  1631. pledgeType = getAvailablePledgeTypes(SUBUNIT_ROYAL2);
  1632. break;
  1633. case SUBUNIT_ROYAL2:
  1634. return 0;
  1635. case SUBUNIT_KNIGHT1:
  1636. pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT2);
  1637. break;
  1638. case SUBUNIT_KNIGHT2:
  1639. pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT3);
  1640. break;
  1641. case SUBUNIT_KNIGHT3:
  1642. pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT4);
  1643. break;
  1644. case SUBUNIT_KNIGHT4:
  1645. return 0;
  1646. }
  1647. }
  1648. return pledgeType;
  1649. }
  1650. public void updateSubPledgeInDB(int pledgeType)
  1651. {
  1652. Connection con = null;
  1653. try
  1654. {
  1655. con = L2DatabaseFactory.getInstance().getConnection();
  1656. final PreparedStatement statement = con.prepareStatement("UPDATE clan_subpledges SET leader_id=?, name=? WHERE clan_id=? AND sub_pledge_id=?");
  1657. statement.setInt(1, getSubPledge(pledgeType).getLeaderId());
  1658. statement.setString(2, getSubPledge(pledgeType).getName());
  1659. statement.setInt(3, getClanId());
  1660. statement.setInt(4, pledgeType);
  1661. statement.execute();
  1662. statement.close();
  1663. if (Config.DEBUG)
  1664. _log.fine("Subpledge updated in db: " + getClanId());
  1665. }
  1666. catch (Exception e)
  1667. {
  1668. _log.log(Level.SEVERE, "Error updating subpledge: " + e.getMessage(), e);
  1669. }
  1670. finally
  1671. {
  1672. L2DatabaseFactory.close(con);
  1673. }
  1674. }
  1675. private void restoreRankPrivs()
  1676. {
  1677. Connection con = null;
  1678. try
  1679. {
  1680. // Retrieve all skills of this L2PcInstance from the database
  1681. con = L2DatabaseFactory.getInstance().getConnection();
  1682. final PreparedStatement statement = con.prepareStatement("SELECT privs,rank,party FROM clan_privs WHERE clan_id=?");
  1683. statement.setInt(1, getClanId());
  1684. //_log.warning("clanPrivs restore for ClanId : "+getClanId());
  1685. final ResultSet rset = statement.executeQuery();
  1686. // Go though the recordset of this SQL query
  1687. while (rset.next())
  1688. {
  1689. int rank = rset.getInt("rank");
  1690. //int party = rset.getInt("party");
  1691. int privileges = rset.getInt("privs");
  1692. // Create a SubPledge object for each record
  1693. if (rank == -1)
  1694. continue;
  1695. _privs.get(rank).setPrivs(privileges);
  1696. }
  1697. rset.close();
  1698. statement.close();
  1699. }
  1700. catch (Exception e)
  1701. {
  1702. _log.log(Level.SEVERE, "Error restoring clan privs by rank: " + e.getMessage(), e);
  1703. }
  1704. finally
  1705. {
  1706. L2DatabaseFactory.close(con);
  1707. }
  1708. }
  1709. public void initializePrivs()
  1710. {
  1711. RankPrivs privs;
  1712. for (int i = 1; i < 10; i++)
  1713. {
  1714. privs = new RankPrivs(i, 0, CP_NOTHING);
  1715. _privs.put(i, privs);
  1716. }
  1717. }
  1718. public int getRankPrivs(int rank)
  1719. {
  1720. if (_privs.get(rank) != null)
  1721. return _privs.get(rank).getPrivs();
  1722. return CP_NOTHING;
  1723. }
  1724. public void setRankPrivs(int rank, int privs)
  1725. {
  1726. if (_privs.get(rank) != null)
  1727. {
  1728. _privs.get(rank).setPrivs(privs);
  1729. Connection con = null;
  1730. try
  1731. {
  1732. //_log.warning("requested store clan privs in db for rank: "+rank+", privs: "+privs);
  1733. // Retrieve all skills of this L2PcInstance from the database
  1734. con = L2DatabaseFactory.getInstance().getConnection();
  1735. final PreparedStatement statement = con.prepareStatement("INSERT INTO clan_privs (clan_id,rank,party,privs) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE privs = ?");
  1736. statement.setInt(1, getClanId());
  1737. statement.setInt(2, rank);
  1738. statement.setInt(3, 0);
  1739. statement.setInt(4, privs);
  1740. statement.setInt(5, privs);
  1741. statement.execute();
  1742. statement.close();
  1743. }
  1744. catch (Exception e)
  1745. {
  1746. _log.log(Level.WARNING, "Could not store clan privs for rank: " + e.getMessage(), e);
  1747. }
  1748. finally
  1749. {
  1750. L2DatabaseFactory.close(con);
  1751. }
  1752. for (L2ClanMember cm : getMembers())
  1753. {
  1754. if (cm.isOnline())
  1755. if (cm.getPowerGrade() == rank)
  1756. if (cm.getPlayerInstance() != null)
  1757. {
  1758. cm.getPlayerInstance().setClanPrivileges(privs);
  1759. cm.getPlayerInstance().sendPacket(new UserInfo(cm.getPlayerInstance()));
  1760. cm.getPlayerInstance().sendPacket(new ExBrExtraUserInfo(cm.getPlayerInstance()));
  1761. }
  1762. }
  1763. broadcastClanStatus();
  1764. }
  1765. else
  1766. {
  1767. _privs.put(rank, new RankPrivs(rank, 0, privs));
  1768. Connection con = null;
  1769. try
  1770. {
  1771. //_log.warning("requested store clan new privs in db for rank: "+rank);
  1772. // Retrieve all skills of this L2PcInstance from the database
  1773. con = L2DatabaseFactory.getInstance().getConnection();
  1774. final PreparedStatement statement = con.prepareStatement("INSERT INTO clan_privs (clan_id,rank,party,privs) VALUES (?,?,?,?)");
  1775. statement.setInt(1, getClanId());
  1776. statement.setInt(2, rank);
  1777. statement.setInt(3, 0);
  1778. statement.setInt(4, privs);
  1779. statement.execute();
  1780. statement.close();
  1781. }
  1782. catch (Exception e)
  1783. {
  1784. _log.log(Level.WARNING, "Could not create new rank and store clan privs for rank: " + e.getMessage(), e);
  1785. }
  1786. finally
  1787. {
  1788. L2DatabaseFactory.close(con);
  1789. }
  1790. }
  1791. }
  1792. /**
  1793. * @return all RankPrivs.
  1794. */
  1795. public final RankPrivs[] getAllRankPrivs()
  1796. {
  1797. if (_privs == null)
  1798. return new RankPrivs[0];
  1799. return _privs.values().toArray(new RankPrivs[_privs.values().size()]);
  1800. }
  1801. public int getLeaderSubPledge(int leaderId)
  1802. {
  1803. int id = 0;
  1804. for (SubPledge sp : _subPledges.values())
  1805. {
  1806. if (sp.getLeaderId() == 0)
  1807. continue;
  1808. if (sp.getLeaderId() == leaderId)
  1809. id = sp.getId();
  1810. }
  1811. return id;
  1812. }
  1813. public synchronized void addReputationScore(int value, boolean save)
  1814. {
  1815. setReputationScore(getReputationScore() + value, save);
  1816. }
  1817. public synchronized void takeReputationScore(int value, boolean save)
  1818. {
  1819. setReputationScore(getReputationScore() - value, save);
  1820. }
  1821. private void setReputationScore(int value, boolean save)
  1822. {
  1823. if (_reputationScore >= 0 && value < 0)
  1824. {
  1825. broadcastToOnlineMembers(SystemMessage.getSystemMessage(SystemMessageId.REPUTATION_POINTS_0_OR_LOWER_CLAN_SKILLS_DEACTIVATED));
  1826. for (L2ClanMember member : _members.values())
  1827. {
  1828. if (member.isOnline() && member.getPlayerInstance() != null)
  1829. {
  1830. removeSkillEffects(member.getPlayerInstance());
  1831. }
  1832. }
  1833. }
  1834. else if (_reputationScore < 0 && value >= 0)
  1835. {
  1836. broadcastToOnlineMembers(SystemMessage.getSystemMessage(SystemMessageId.CLAN_SKILLS_WILL_BE_ACTIVATED_SINCE_REPUTATION_IS_0_OR_HIGHER));
  1837. for (L2ClanMember member : _members.values())
  1838. {
  1839. if (member.isOnline() && member.getPlayerInstance() != null)
  1840. {
  1841. addSkillEffects(member.getPlayerInstance());
  1842. }
  1843. }
  1844. }
  1845. _reputationScore = value;
  1846. if (_reputationScore > 100000000)
  1847. _reputationScore = 100000000;
  1848. if (_reputationScore < -100000000)
  1849. _reputationScore = -100000000;
  1850. broadcastToOnlineMembers(new PledgeShowInfoUpdate(this));
  1851. if (save)
  1852. updateClanScoreInDB();
  1853. }
  1854. public int getReputationScore()
  1855. {
  1856. return _reputationScore;
  1857. }
  1858. public void setRank(int rank)
  1859. {
  1860. _rank = rank;
  1861. }
  1862. public int getRank()
  1863. {
  1864. return _rank;
  1865. }
  1866. public int getAuctionBiddedAt()
  1867. {
  1868. return _auctionBiddedAt;
  1869. }
  1870. public void setAuctionBiddedAt(int id, boolean storeInDb)
  1871. {
  1872. _auctionBiddedAt = id;
  1873. if (storeInDb)
  1874. {
  1875. Connection con = null;
  1876. try
  1877. {
  1878. con = L2DatabaseFactory.getInstance().getConnection();
  1879. final PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET auction_bid_at=? WHERE clan_id=?");
  1880. statement.setInt(1, id);
  1881. statement.setInt(2, getClanId());
  1882. statement.execute();
  1883. statement.close();
  1884. }
  1885. catch (Exception e)
  1886. {
  1887. _log.log(Level.WARNING, "Could not store auction for clan: " + e.getMessage(), e);
  1888. }
  1889. finally
  1890. {
  1891. L2DatabaseFactory.close(con);
  1892. }
  1893. }
  1894. }
  1895. /**
  1896. * @param activeChar the clan inviting player.
  1897. * @param target the invited player.
  1898. * @param pledgeType the pledge type to join.
  1899. * @return {core true} if activeChar and target meet various conditions to join a clan.
  1900. */
  1901. public boolean checkClanJoinCondition(L2PcInstance activeChar, L2PcInstance target, int pledgeType)
  1902. {
  1903. if (activeChar == null)
  1904. {
  1905. return false;
  1906. }
  1907. if ((activeChar.getClanPrivileges() & L2Clan.CP_CL_JOIN_CLAN) != L2Clan.CP_CL_JOIN_CLAN)
  1908. {
  1909. activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
  1910. return false;
  1911. }
  1912. if (target == null)
  1913. {
  1914. activeChar.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET);
  1915. return false;
  1916. }
  1917. if (activeChar.getObjectId() == target.getObjectId())
  1918. {
  1919. activeChar.sendPacket(SystemMessageId.CANNOT_INVITE_YOURSELF);
  1920. return false;
  1921. }
  1922. if (getCharPenaltyExpiryTime() > System.currentTimeMillis())
  1923. {
  1924. activeChar.sendPacket(SystemMessageId.YOU_MUST_WAIT_BEFORE_ACCEPTING_A_NEW_MEMBER);
  1925. return false;
  1926. }
  1927. if (target.getClanId() != 0)
  1928. {
  1929. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_WORKING_WITH_ANOTHER_CLAN);
  1930. sm.addString(target.getName());
  1931. activeChar.sendPacket(sm);
  1932. return false;
  1933. }
  1934. if (target.getClanJoinExpiryTime() > System.currentTimeMillis())
  1935. {
  1936. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MUST_WAIT_BEFORE_JOINING_ANOTHER_CLAN);
  1937. sm.addString(target.getName());
  1938. activeChar.sendPacket(sm);
  1939. return false;
  1940. }
  1941. if ((target.getLevel() > 40 || target.getClassId().level() >= 2) && pledgeType == -1)
  1942. {
  1943. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DOESNOT_MEET_REQUIREMENTS_TO_JOIN_ACADEMY);
  1944. sm.addString(target.getName());
  1945. activeChar.sendPacket(sm);
  1946. activeChar.sendPacket(SystemMessageId.ACADEMY_REQUIREMENTS);
  1947. return false;
  1948. }
  1949. if (getSubPledgeMembersCount(pledgeType) >= getMaxNrOfMembers(pledgeType))
  1950. {
  1951. if (pledgeType == 0)
  1952. {
  1953. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CLAN_IS_FULL);
  1954. sm.addString(getName());
  1955. activeChar.sendPacket(sm);
  1956. }
  1957. else
  1958. {
  1959. activeChar.sendPacket(SystemMessageId.SUBCLAN_IS_FULL);
  1960. }
  1961. return false;
  1962. }
  1963. return true;
  1964. }
  1965. /**
  1966. * @param activeChar the clan inviting player.
  1967. * @param target the invited player.
  1968. * @return {core true} if activeChar and target meet various conditions to join a clan.
  1969. */
  1970. public boolean checkAllyJoinCondition(L2PcInstance activeChar, L2PcInstance target)
  1971. {
  1972. if (activeChar == null)
  1973. {
  1974. return false;
  1975. }
  1976. if (activeChar.getAllyId() == 0 || !activeChar.isClanLeader() || activeChar.getClanId() != activeChar.getAllyId())
  1977. {
  1978. activeChar.sendPacket(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER);
  1979. return false;
  1980. }
  1981. L2Clan leaderClan = activeChar.getClan();
  1982. if (leaderClan.getAllyPenaltyExpiryTime() > System.currentTimeMillis())
  1983. {
  1984. if (leaderClan.getAllyPenaltyType() == PENALTY_TYPE_DISMISS_CLAN)
  1985. {
  1986. activeChar.sendPacket(SystemMessageId.CANT_INVITE_CLAN_WITHIN_1_DAY);
  1987. return false;
  1988. }
  1989. }
  1990. if (target == null)
  1991. {
  1992. activeChar.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET);
  1993. return false;
  1994. }
  1995. if (activeChar.getObjectId() == target.getObjectId())
  1996. {
  1997. activeChar.sendPacket(SystemMessageId.CANNOT_INVITE_YOURSELF);
  1998. return false;
  1999. }
  2000. if (target.getClan() == null)
  2001. {
  2002. activeChar.sendPacket(SystemMessageId.TARGET_MUST_BE_IN_CLAN);
  2003. return false;
  2004. }
  2005. if (!target.isClanLeader())
  2006. {
  2007. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_IS_NOT_A_CLAN_LEADER);
  2008. sm.addString(target.getName());
  2009. activeChar.sendPacket(sm);
  2010. sm = null;
  2011. return false;
  2012. }
  2013. L2Clan targetClan = target.getClan();
  2014. if (target.getAllyId() != 0)
  2015. {
  2016. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CLAN_ALREADY_MEMBER_OF_S2_ALLIANCE);
  2017. sm.addString(targetClan.getName());
  2018. sm.addString(targetClan.getAllyName());
  2019. activeChar.sendPacket(sm);
  2020. sm = null;
  2021. return false;
  2022. }
  2023. if (targetClan.getAllyPenaltyExpiryTime() > System.currentTimeMillis())
  2024. {
  2025. if (targetClan.getAllyPenaltyType() == PENALTY_TYPE_CLAN_LEAVED)
  2026. {
  2027. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANT_ENTER_ALLIANCE_WITHIN_1_DAY);
  2028. sm.addString(target.getClan().getName());
  2029. sm.addString(target.getClan().getAllyName());
  2030. activeChar.sendPacket(sm);
  2031. sm = null;
  2032. return false;
  2033. }
  2034. if (targetClan.getAllyPenaltyType() == PENALTY_TYPE_CLAN_DISMISSED)
  2035. {
  2036. activeChar.sendPacket(SystemMessageId.CANT_ENTER_ALLIANCE_WITHIN_1_DAY);
  2037. return false;
  2038. }
  2039. }
  2040. if (activeChar.isInsideZone(L2Character.ZONE_SIEGE) && target.isInsideZone(L2Character.ZONE_SIEGE))
  2041. {
  2042. activeChar.sendPacket(SystemMessageId.OPPOSING_CLAN_IS_PARTICIPATING_IN_SIEGE);
  2043. return false;
  2044. }
  2045. if (leaderClan.isAtWarWith(targetClan.getClanId()))
  2046. {
  2047. activeChar.sendPacket(SystemMessageId.MAY_NOT_ALLY_CLAN_BATTLE);
  2048. return false;
  2049. }
  2050. if (ClanTable.getInstance().getClanAllies(activeChar.getAllyId()).size() >= Config.ALT_MAX_NUM_OF_CLANS_IN_ALLY)
  2051. {
  2052. activeChar.sendPacket(SystemMessageId.YOU_HAVE_EXCEEDED_THE_LIMIT);
  2053. return false;
  2054. }
  2055. return true;
  2056. }
  2057. public long getAllyPenaltyExpiryTime()
  2058. {
  2059. return _allyPenaltyExpiryTime;
  2060. }
  2061. public int getAllyPenaltyType()
  2062. {
  2063. return _allyPenaltyType;
  2064. }
  2065. public void setAllyPenaltyExpiryTime(long expiryTime, int penaltyType)
  2066. {
  2067. _allyPenaltyExpiryTime = expiryTime;
  2068. _allyPenaltyType = penaltyType;
  2069. }
  2070. public long getCharPenaltyExpiryTime()
  2071. {
  2072. return _charPenaltyExpiryTime;
  2073. }
  2074. public void setCharPenaltyExpiryTime(long time)
  2075. {
  2076. _charPenaltyExpiryTime = time;
  2077. }
  2078. public long getDissolvingExpiryTime()
  2079. {
  2080. return _dissolvingExpiryTime;
  2081. }
  2082. public void setDissolvingExpiryTime(long time)
  2083. {
  2084. _dissolvingExpiryTime = time;
  2085. }
  2086. public void createAlly(L2PcInstance player, String allyName)
  2087. {
  2088. if (null == player)
  2089. return;
  2090. if (Config.DEBUG)
  2091. _log.fine(player.getObjectId() + "(" + player.getName() + ") requested ally creation from ");
  2092. if (!player.isClanLeader())
  2093. {
  2094. player.sendPacket(SystemMessageId.ONLY_CLAN_LEADER_CREATE_ALLIANCE);
  2095. return;
  2096. }
  2097. if (getAllyId() != 0)
  2098. {
  2099. player.sendPacket(SystemMessageId.ALREADY_JOINED_ALLIANCE);
  2100. return;
  2101. }
  2102. if (getLevel() < 5)
  2103. {
  2104. player.sendPacket(SystemMessageId.TO_CREATE_AN_ALLY_YOU_CLAN_MUST_BE_LEVEL_5_OR_HIGHER);
  2105. return;
  2106. }
  2107. if (getAllyPenaltyExpiryTime() > System.currentTimeMillis())
  2108. {
  2109. if (getAllyPenaltyType() == L2Clan.PENALTY_TYPE_DISSOLVE_ALLY)
  2110. {
  2111. player.sendPacket(SystemMessageId.CANT_CREATE_ALLIANCE_10_DAYS_DISOLUTION);
  2112. return;
  2113. }
  2114. }
  2115. if (getDissolvingExpiryTime() > System.currentTimeMillis())
  2116. {
  2117. player.sendPacket(SystemMessageId.YOU_MAY_NOT_CREATE_ALLY_WHILE_DISSOLVING);
  2118. return;
  2119. }
  2120. if (!Util.isAlphaNumeric(allyName))
  2121. {
  2122. player.sendPacket(SystemMessageId.INCORRECT_ALLIANCE_NAME);
  2123. return;
  2124. }
  2125. if (allyName.length() > 16 || allyName.length() < 2)
  2126. {
  2127. player.sendPacket(SystemMessageId.INCORRECT_ALLIANCE_NAME_LENGTH);
  2128. return;
  2129. }
  2130. if (ClanTable.getInstance().isAllyExists(allyName))
  2131. {
  2132. player.sendPacket(SystemMessageId.ALLIANCE_ALREADY_EXISTS);
  2133. return;
  2134. }
  2135. setAllyId(getClanId());
  2136. setAllyName(allyName.trim());
  2137. setAllyPenaltyExpiryTime(0, 0);
  2138. updateClanInDB();
  2139. player.sendPacket(new UserInfo(player));
  2140. player.sendPacket(new ExBrExtraUserInfo(player));
  2141. //TODO: Need correct message id
  2142. player.sendMessage("Alliance " + allyName + " has been created.");
  2143. // notify CB server about the change
  2144. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  2145. }
  2146. public void dissolveAlly(L2PcInstance player)
  2147. {
  2148. if (getAllyId() == 0)
  2149. {
  2150. player.sendPacket(SystemMessageId.NO_CURRENT_ALLIANCES);
  2151. return;
  2152. }
  2153. if (!player.isClanLeader() || getClanId() != getAllyId())
  2154. {
  2155. player.sendPacket(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER);
  2156. return;
  2157. }
  2158. if (player.isInsideZone(L2Character.ZONE_SIEGE))
  2159. {
  2160. player.sendPacket(SystemMessageId.CANNOT_DISSOLVE_ALLY_WHILE_IN_SIEGE);
  2161. return;
  2162. }
  2163. broadcastToOnlineAllyMembers(SystemMessage.getSystemMessage(SystemMessageId.ALLIANCE_DISOLVED));
  2164. long currentTime = System.currentTimeMillis();
  2165. for (L2Clan clan : ClanTable.getInstance().getClanAllies(getAllyId()))
  2166. {
  2167. if (clan.getClanId() != getClanId())
  2168. {
  2169. clan.setAllyId(0);
  2170. clan.setAllyName(null);
  2171. clan.setAllyPenaltyExpiryTime(0, 0);
  2172. clan.updateClanInDB();
  2173. // notify CB server about the change
  2174. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, clan, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  2175. }
  2176. }
  2177. setAllyId(0);
  2178. setAllyName(null);
  2179. changeAllyCrest(0, false);
  2180. setAllyPenaltyExpiryTime(currentTime + Config.ALT_CREATE_ALLY_DAYS_WHEN_DISSOLVED * 86400000L, L2Clan.PENALTY_TYPE_DISSOLVE_ALLY); //24*60*60*1000 = 86400000
  2181. updateClanInDB();
  2182. // The clan leader should take the XP penalty of a full death.
  2183. player.deathPenalty(false, false, false);
  2184. // notify CB server about the change
  2185. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  2186. }
  2187. public boolean levelUpClan(L2PcInstance player)
  2188. {
  2189. if (!player.isClanLeader())
  2190. {
  2191. player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
  2192. return false;
  2193. }
  2194. if (System.currentTimeMillis() < getDissolvingExpiryTime())
  2195. {
  2196. player.sendPacket(SystemMessageId.CANNOT_RISE_LEVEL_WHILE_DISSOLUTION_IN_PROGRESS);
  2197. return false;
  2198. }
  2199. boolean increaseClanLevel = false;
  2200. if (!fireClanLevelUpListeners())
  2201. {
  2202. return false;
  2203. }
  2204. switch (getLevel())
  2205. {
  2206. case 0:
  2207. {
  2208. // Upgrade to 1
  2209. if (player.getSp() >= 20000 && player.getAdena() >= 650000)
  2210. {
  2211. if (player.reduceAdena("ClanLvl", 650000, player.getTarget(), true))
  2212. {
  2213. player.setSp(player.getSp() - 20000);
  2214. SystemMessage sp = SystemMessage.getSystemMessage(SystemMessageId.SP_DECREASED_S1);
  2215. sp.addNumber(20000);
  2216. player.sendPacket(sp);
  2217. sp = null;
  2218. increaseClanLevel = true;
  2219. }
  2220. }
  2221. break;
  2222. }
  2223. case 1:
  2224. {
  2225. // Upgrade to 2
  2226. if (player.getSp() >= 100000 && player.getAdena() >= 2500000)
  2227. {
  2228. if (player.reduceAdena("ClanLvl", 2500000, player.getTarget(), true))
  2229. {
  2230. player.setSp(player.getSp() - 100000);
  2231. SystemMessage sp = SystemMessage.getSystemMessage(SystemMessageId.SP_DECREASED_S1);
  2232. sp.addNumber(100000);
  2233. player.sendPacket(sp);
  2234. sp = null;
  2235. increaseClanLevel = true;
  2236. }
  2237. }
  2238. break;
  2239. }
  2240. case 2:
  2241. {
  2242. // Upgrade to 3
  2243. if (player.getSp() >= 350000 && player.getInventory().getItemByItemId(1419) != null)
  2244. {
  2245. // itemId 1419 == Blood Mark
  2246. if (player.destroyItemByItemId("ClanLvl", 1419, 1, player.getTarget(), false))
  2247. {
  2248. player.setSp(player.getSp() - 350000);
  2249. SystemMessage sp = SystemMessage.getSystemMessage(SystemMessageId.SP_DECREASED_S1);
  2250. sp.addNumber(350000);
  2251. player.sendPacket(sp);
  2252. sp = null;
  2253. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED);
  2254. sm.addItemName(1419);
  2255. player.sendPacket(sm);
  2256. sm = null;
  2257. increaseClanLevel = true;
  2258. }
  2259. }
  2260. break;
  2261. }
  2262. case 3:
  2263. {
  2264. // Upgrade to 4
  2265. if (player.getSp() >= 1000000 && player.getInventory().getItemByItemId(3874) != null)
  2266. {
  2267. // itemId 3874 == Alliance Manifesto
  2268. if (player.destroyItemByItemId("ClanLvl", 3874, 1, player.getTarget(), false))
  2269. {
  2270. player.setSp(player.getSp() - 1000000);
  2271. SystemMessage sp = SystemMessage.getSystemMessage(SystemMessageId.SP_DECREASED_S1);
  2272. sp.addNumber(1000000);
  2273. player.sendPacket(sp);
  2274. sp = null;
  2275. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED);
  2276. sm.addItemName(3874);
  2277. player.sendPacket(sm);
  2278. sm = null;
  2279. increaseClanLevel = true;
  2280. }
  2281. }
  2282. break;
  2283. }
  2284. case 4:
  2285. {
  2286. // Upgrade to 5
  2287. if (player.getSp() >= 2500000 && player.getInventory().getItemByItemId(3870) != null)
  2288. {
  2289. // itemId 3870 == Seal of Aspiration
  2290. if (player.destroyItemByItemId("ClanLvl", 3870, 1, player.getTarget(), false))
  2291. {
  2292. player.setSp(player.getSp() - 2500000);
  2293. SystemMessage sp = SystemMessage.getSystemMessage(SystemMessageId.SP_DECREASED_S1);
  2294. sp.addNumber(2500000);
  2295. player.sendPacket(sp);
  2296. sp = null;
  2297. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED);
  2298. sm.addItemName(3870);
  2299. player.sendPacket(sm);
  2300. sm = null;
  2301. increaseClanLevel = true;
  2302. }
  2303. }
  2304. break;
  2305. }
  2306. case 5:
  2307. // Upgrade to 6
  2308. if (getReputationScore() >= Config.CLAN_LEVEL_6_COST && getMembersCount() >= Config.CLAN_LEVEL_6_REQUIREMENT)
  2309. {
  2310. setReputationScore(getReputationScore() - Config.CLAN_LEVEL_6_COST, true);
  2311. SystemMessage cr = SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2312. cr.addNumber(Config.CLAN_LEVEL_6_COST);
  2313. player.sendPacket(cr);
  2314. cr = null;
  2315. increaseClanLevel = true;
  2316. }
  2317. break;
  2318. case 6:
  2319. // Upgrade to 7
  2320. if (getReputationScore() >= Config.CLAN_LEVEL_7_COST && getMembersCount() >= Config.CLAN_LEVEL_7_REQUIREMENT)
  2321. {
  2322. setReputationScore(getReputationScore() - Config.CLAN_LEVEL_7_COST, true);
  2323. SystemMessage cr = SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2324. cr.addNumber(Config.CLAN_LEVEL_7_COST);
  2325. player.sendPacket(cr);
  2326. cr = null;
  2327. increaseClanLevel = true;
  2328. }
  2329. break;
  2330. case 7:
  2331. // Upgrade to 8
  2332. if (getReputationScore() >= Config.CLAN_LEVEL_8_COST && getMembersCount() >= Config.CLAN_LEVEL_8_REQUIREMENT)
  2333. {
  2334. setReputationScore(getReputationScore() - Config.CLAN_LEVEL_8_COST, true);
  2335. SystemMessage cr = SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2336. cr.addNumber(Config.CLAN_LEVEL_8_COST);
  2337. player.sendPacket(cr);
  2338. cr = null;
  2339. increaseClanLevel = true;
  2340. }
  2341. break;
  2342. case 8:
  2343. // Upgrade to 9
  2344. if (getReputationScore() >= Config.CLAN_LEVEL_9_COST && player.getInventory().getItemByItemId(9910) != null && getMembersCount() >= Config.CLAN_LEVEL_9_REQUIREMENT)
  2345. {
  2346. // itemId 9910 == Blood Oath
  2347. if (player.destroyItemByItemId("ClanLvl", 9910, 150, player.getTarget(), false))
  2348. {
  2349. setReputationScore(getReputationScore() - Config.CLAN_LEVEL_9_COST, true);
  2350. SystemMessage cr = SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2351. cr.addNumber(Config.CLAN_LEVEL_9_COST);
  2352. player.sendPacket(cr);
  2353. cr = null;
  2354. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  2355. sm.addItemName(9910);
  2356. sm.addItemNumber(150);
  2357. player.sendPacket(sm);
  2358. increaseClanLevel = true;
  2359. }
  2360. }
  2361. break;
  2362. case 9:
  2363. // Upgrade to 10
  2364. if (getReputationScore() >= Config.CLAN_LEVEL_10_COST && player.getInventory().getItemByItemId(9911) != null && getMembersCount() >= Config.CLAN_LEVEL_10_REQUIREMENT)
  2365. {
  2366. // itemId 9911 == Blood Alliance
  2367. if (player.destroyItemByItemId("ClanLvl", 9911, 5, player.getTarget(), false))
  2368. {
  2369. setReputationScore(getReputationScore() - Config.CLAN_LEVEL_10_COST, true);
  2370. SystemMessage cr = SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2371. cr.addNumber(Config.CLAN_LEVEL_10_COST);
  2372. player.sendPacket(cr);
  2373. cr = null;
  2374. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  2375. sm.addItemName(9911);
  2376. sm.addItemNumber(5);
  2377. player.sendPacket(sm);
  2378. increaseClanLevel = true;
  2379. }
  2380. }
  2381. break;
  2382. case 10:
  2383. // Upgrade to 11
  2384. boolean hasTerritory = false;
  2385. for (Territory terr : TerritoryWarManager.getInstance().getAllTerritories())
  2386. {
  2387. if (terr.getOwnerClan().getClanId() == getClanId())
  2388. {
  2389. hasTerritory = true;
  2390. break;
  2391. }
  2392. }
  2393. if (hasTerritory && getReputationScore() >= Config.CLAN_LEVEL_11_COST && getMembersCount() >= Config.CLAN_LEVEL_11_REQUIREMENT)
  2394. {
  2395. setReputationScore(getReputationScore() - Config.CLAN_LEVEL_11_COST, true);
  2396. SystemMessage cr = SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  2397. cr.addNumber(Config.CLAN_LEVEL_11_COST);
  2398. player.sendPacket(cr);
  2399. cr = null;
  2400. increaseClanLevel = true;
  2401. }
  2402. break;
  2403. default:
  2404. return false;
  2405. }
  2406. if (!increaseClanLevel)
  2407. {
  2408. player.sendPacket(SystemMessageId.FAILED_TO_INCREASE_CLAN_LEVEL);
  2409. return false;
  2410. }
  2411. // the player should know that he has less sp now :p
  2412. StatusUpdate su = new StatusUpdate(player);
  2413. su.addAttribute(StatusUpdate.SP, player.getSp());
  2414. player.sendPacket(su);
  2415. ItemList il = new ItemList(player, false);
  2416. player.sendPacket(il);
  2417. changeLevel(getLevel() + 1);
  2418. return true;
  2419. }
  2420. public void changeLevel(int level)
  2421. {
  2422. Connection con = null;
  2423. try
  2424. {
  2425. con = L2DatabaseFactory.getInstance().getConnection();
  2426. final PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET clan_level = ? WHERE clan_id = ?");
  2427. statement.setInt(1, level);
  2428. statement.setInt(2, getClanId());
  2429. statement.execute();
  2430. statement.close();
  2431. }
  2432. catch (Exception e)
  2433. {
  2434. _log.log(Level.WARNING, "could not increase clan level:" + e.getMessage(), e);
  2435. }
  2436. finally
  2437. {
  2438. L2DatabaseFactory.close(con);
  2439. }
  2440. setLevel(level);
  2441. if (getLeader().isOnline())
  2442. {
  2443. L2PcInstance leader = getLeader().getPlayerInstance();
  2444. if (4 < level)
  2445. {
  2446. SiegeManager.getInstance().addSiegeSkills(leader);
  2447. leader.sendPacket(SystemMessageId.CLAN_CAN_ACCUMULATE_CLAN_REPUTATION_POINTS);
  2448. }
  2449. else if (5 > level)
  2450. {
  2451. SiegeManager.getInstance().removeSiegeSkills(leader);
  2452. }
  2453. }
  2454. // notify all the members about it
  2455. broadcastToOnlineMembers(SystemMessage.getSystemMessage(SystemMessageId.CLAN_LEVEL_INCREASED));
  2456. broadcastToOnlineMembers(new PledgeShowInfoUpdate(this));
  2457. /*
  2458. * Micht :
  2459. * - use PledgeShowInfoUpdate instead of PledgeStatusChanged
  2460. * to update clan level ingame
  2461. * - remove broadcastClanStatus() to avoid members duplication
  2462. */
  2463. //clan.broadcastToOnlineMembers(new PledgeStatusChanged(clan));
  2464. //clan.broadcastClanStatus();
  2465. // notify CB server about the change
  2466. CommunityServerThread.getInstance().sendPacket(new WorldInfo(null, this, WorldInfo.TYPE_UPDATE_CLAN_DATA));
  2467. }
  2468. /**
  2469. * Change the clan crest. If crest id is 0, crest is removed. New crest id is saved to database.
  2470. * @param crestId if 0, crest is removed, else new crest id is set and saved to database
  2471. */
  2472. public void changeClanCrest(int crestId)
  2473. {
  2474. if (getCrestId() != 0)
  2475. CrestCache.getInstance().removePledgeCrest(getCrestId());
  2476. setCrestId(crestId);
  2477. Connection con = null;
  2478. try
  2479. {
  2480. con = L2DatabaseFactory.getInstance().getConnection();
  2481. final PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET crest_id = ? WHERE clan_id = ?");
  2482. statement.setInt(1, crestId);
  2483. statement.setInt(2, getClanId());
  2484. statement.executeUpdate();
  2485. statement.close();
  2486. }
  2487. catch (SQLException e)
  2488. {
  2489. _log.log(Level.WARNING, "Could not update crest for clan " + getName() + " [" + getClanId() + "] : " + e.getMessage(), e);
  2490. }
  2491. finally
  2492. {
  2493. L2DatabaseFactory.close(con);
  2494. }
  2495. for (L2PcInstance member : getOnlineMembers(0))
  2496. member.broadcastUserInfo();
  2497. }
  2498. /**
  2499. * Change the ally crest. If crest id is 0, crest is removed. New crest id is saved to database.
  2500. * @param crestId if 0, crest is removed, else new crest id is set and saved to database
  2501. * @param onlyThisClan
  2502. */
  2503. public void changeAllyCrest(int crestId, boolean onlyThisClan)
  2504. {
  2505. String sqlStatement = "UPDATE clan_data SET ally_crest_id = ? WHERE clan_id = ?";
  2506. int allyId = getClanId();
  2507. if (!onlyThisClan)
  2508. {
  2509. if (getAllyCrestId() != 0)
  2510. CrestCache.getInstance().removeAllyCrest(getAllyCrestId());
  2511. sqlStatement = "UPDATE clan_data SET ally_crest_id = ? WHERE ally_id = ?";
  2512. allyId = getAllyId();
  2513. }
  2514. Connection con = null;
  2515. try
  2516. {
  2517. con = L2DatabaseFactory.getInstance().getConnection();
  2518. final PreparedStatement statement = con.prepareStatement(sqlStatement);
  2519. statement.setInt(1, crestId);
  2520. statement.setInt(2, allyId);
  2521. statement.executeUpdate();
  2522. statement.close();
  2523. }
  2524. catch (SQLException e)
  2525. {
  2526. _log.log(Level.WARNING, "Could not update ally crest for ally/clan id " + allyId + " : " + e.getMessage(), e);
  2527. }
  2528. finally
  2529. {
  2530. L2DatabaseFactory.close(con);
  2531. }
  2532. if (onlyThisClan)
  2533. {
  2534. setAllyCrestId(crestId);
  2535. for (L2PcInstance member : getOnlineMembers(0))
  2536. member.broadcastUserInfo();
  2537. }
  2538. else
  2539. {
  2540. for (L2Clan clan : ClanTable.getInstance().getClanAllies(getAllyId()))
  2541. {
  2542. clan.setAllyCrestId(crestId);
  2543. for (L2PcInstance member : clan.getOnlineMembers(0))
  2544. {
  2545. member.broadcastUserInfo();
  2546. }
  2547. }
  2548. }
  2549. }
  2550. /**
  2551. * Change the large crest. If crest id is 0, crest is removed. New crest id is saved to database.
  2552. * @param crestId if 0, crest is removed, else new crest id is set and saved to database
  2553. */
  2554. public void changeLargeCrest(int crestId)
  2555. {
  2556. if (getCrestLargeId() != 0)
  2557. CrestCache.getInstance().removePledgeCrestLarge(getCrestLargeId());
  2558. setCrestLargeId(crestId);
  2559. Connection con = null;
  2560. try
  2561. {
  2562. con = L2DatabaseFactory.getInstance().getConnection();
  2563. final PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET crest_large_id = ? WHERE clan_id = ?");
  2564. statement.setInt(1, crestId);
  2565. statement.setInt(2, getClanId());
  2566. statement.executeUpdate();
  2567. statement.close();
  2568. }
  2569. catch (SQLException e)
  2570. {
  2571. _log.log(Level.WARNING, "Could not update large crest for clan " + getName() + " [" + getClanId() + "] : " + e.getMessage(), e);
  2572. }
  2573. finally
  2574. {
  2575. L2DatabaseFactory.close(con);
  2576. }
  2577. for (L2PcInstance member : getOnlineMembers(0))
  2578. member.broadcastUserInfo();
  2579. }
  2580. /**
  2581. * Check if this clan can learn the skill for the given skill ID, level.
  2582. * @param skillId
  2583. * @param skillLevel
  2584. * @return {@code true} if skill can be learned.
  2585. */
  2586. public boolean isLearnableSubSkill(int skillId, int skillLevel)
  2587. {
  2588. L2Skill current = _subPledgeSkills.get(skillId);
  2589. // is next level?
  2590. if ((current != null) && ((current.getLevel() + 1) == skillLevel))
  2591. return true;
  2592. // is first level?
  2593. if ((current == null) && (skillLevel == 1))
  2594. return true;
  2595. // other sub-pledges
  2596. for (SubPledge subunit : _subPledges.values())
  2597. {
  2598. //disable academy
  2599. if (subunit.getId() == -1)
  2600. continue;
  2601. current = subunit.getSkill(skillId);
  2602. // is next level?
  2603. if ((current != null) && ((current.getLevel() + 1) == skillLevel))
  2604. return true;
  2605. // is first level?
  2606. if ((current == null) && (skillLevel == 1))
  2607. return true;
  2608. }
  2609. return false;
  2610. }
  2611. public boolean isLearnableSubPledgeSkill(L2Skill skill, int subType)
  2612. {
  2613. //academy
  2614. if (subType == -1)
  2615. return false;
  2616. int id = skill.getId();
  2617. L2Skill current;
  2618. if (subType == 0)
  2619. {
  2620. current = _subPledgeSkills.get(id);
  2621. }
  2622. else
  2623. {
  2624. current = _subPledges.get(subType).getSkill(id);
  2625. }
  2626. // is next level?
  2627. if ((current != null) && (current.getLevel() + 1) == skill.getLevel())
  2628. return true;
  2629. // is first level?
  2630. if ((current == null) && (skill.getLevel() == 1))
  2631. return true;
  2632. return false;
  2633. }
  2634. public SubPledgeSkill[] getAllSubSkills()
  2635. {
  2636. FastList<SubPledgeSkill> list = FastList.newInstance();
  2637. for (L2Skill skill : _subPledgeSkills.values())
  2638. list.add(new SubPledgeSkill(0, skill.getId(), skill.getLevel()));
  2639. for (SubPledge subunit: _subPledges.values())
  2640. for (L2Skill skill : subunit.getSkills())
  2641. list.add(new SubPledgeSkill(subunit.getId(), skill.getId(), skill.getLevel()));
  2642. SubPledgeSkill[] result = list.toArray(new SubPledgeSkill[list.size()]);
  2643. FastList.recycle(list);
  2644. return result;
  2645. }
  2646. // Listeners
  2647. /**
  2648. * Fires the clan creation listeners, if any.
  2649. */
  2650. private void fireClanCreationListeners()
  2651. {
  2652. if (!clanCreationListeners.isEmpty())
  2653. {
  2654. ClanCreationEvent event = new ClanCreationEvent();
  2655. event.setClan(this);
  2656. for (ClanCreationListener listener : clanCreationListeners)
  2657. {
  2658. listener.onClanCreate(event);
  2659. }
  2660. }
  2661. }
  2662. /**
  2663. * Fires all the ClanMemberShipListener.onLeaderChange() methods, if any. Prevents the clan leader change if it returns false;
  2664. * @param newLeader
  2665. * @param exLeader
  2666. * @return
  2667. */
  2668. private boolean fireClanLeaderChangeListeners(L2PcInstance newLeader, L2PcInstance exLeader)
  2669. {
  2670. if (!clanMembershipListeners.isEmpty() && newLeader != null && exLeader != null)
  2671. {
  2672. ClanLeaderChangeEvent event = new ClanLeaderChangeEvent();
  2673. event.setClan(this);
  2674. event.setNewLeader(newLeader);
  2675. event.setOldLeader(exLeader);
  2676. for (ClanMembershipListener listener : clanMembershipListeners)
  2677. {
  2678. if (!listener.onLeaderChange(event))
  2679. {
  2680. return false;
  2681. }
  2682. }
  2683. }
  2684. return true;
  2685. }
  2686. /**
  2687. * Fires all the ClanMembershipListener.onJoin() methods, if any<br>
  2688. * Returns true/false -> allow the player to join or not
  2689. * @param player
  2690. * @return
  2691. */
  2692. private boolean fireClanJoinListeners(L2PcInstance player)
  2693. {
  2694. if (!clanMembershipListeners.isEmpty() && player != null)
  2695. {
  2696. ClanJoinEvent event = new ClanJoinEvent();
  2697. event.setClan(this);
  2698. event.setPlayer(player);
  2699. for (ClanMembershipListener listener : clanMembershipListeners)
  2700. {
  2701. if (!listener.onJoin(event))
  2702. {
  2703. return false;
  2704. }
  2705. }
  2706. }
  2707. return true;
  2708. }
  2709. /**
  2710. * Fires all the ClanMembershipListener.onLeave() methods, if any<br>
  2711. * Returns true/false -> the player can leave the clan or not
  2712. * @param objectId - the clan member's objectId
  2713. * @return
  2714. */
  2715. private boolean fireClanLeaveListeners(int objectId)
  2716. {
  2717. if (!clanMembershipListeners.isEmpty())
  2718. {
  2719. ClanLeaveEvent event = new ClanLeaveEvent();
  2720. event.setPlayerId(objectId);
  2721. event.setClan(this);
  2722. for (ClanMembershipListener listener : clanMembershipListeners)
  2723. {
  2724. if (!listener.onLeave(event))
  2725. {
  2726. return false;
  2727. }
  2728. }
  2729. }
  2730. return true;
  2731. }
  2732. /**
  2733. * Fires all the ClanCreationListener.onClanLevelUp() methods, if any<br>
  2734. * Blocks the level up if it returns false
  2735. * @return
  2736. */
  2737. private boolean fireClanLevelUpListeners()
  2738. {
  2739. if (!clanCreationListeners.isEmpty())
  2740. {
  2741. ClanLevelUpEvent event = new ClanLevelUpEvent();
  2742. event.setClan(this);
  2743. event.setOldLevel(_level);
  2744. for (ClanCreationListener listener : clanCreationListeners)
  2745. {
  2746. if (!listener.onClanLevelUp(event))
  2747. {
  2748. return false;
  2749. }
  2750. }
  2751. }
  2752. return true;
  2753. }
  2754. /**
  2755. * Adds a clan creation listener
  2756. * @param listener
  2757. */
  2758. public static void addClanCreationListener(ClanCreationListener listener)
  2759. {
  2760. if (!clanCreationListeners.contains(listener))
  2761. {
  2762. clanCreationListeners.add(listener);
  2763. }
  2764. }
  2765. /**
  2766. * Removes a clan creation listener
  2767. * @param listener
  2768. */
  2769. public static void removeClanCreationListener(ClanCreationListener listener)
  2770. {
  2771. clanCreationListeners.remove(listener);
  2772. }
  2773. /**
  2774. * Adds a clan join listener (a player just joined the clan)
  2775. * @param listener
  2776. */
  2777. public static void addClanMembershipListener(ClanMembershipListener listener)
  2778. {
  2779. if (!clanMembershipListeners.contains(listener))
  2780. {
  2781. clanMembershipListeners.add(listener);
  2782. }
  2783. }
  2784. /**
  2785. * Removes a clan join listener (a player left the clan)
  2786. * @param listener
  2787. */
  2788. public static void removeClanMembershipListener(ClanMembershipListener listener)
  2789. {
  2790. clanMembershipListeners.remove(listener);
  2791. }
  2792. }