Guest User

Pin Code

a guest
Nov 23rd, 2013
1,635
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 38.33 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P aCis_gameserver
  3. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestDismissAlly.java
  4. ===================================================================
  5. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestDismissAlly.java    (revision 315)
  6. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestDismissAlly.java    (working copy)
  7. @@ -31,6 +31,13 @@
  8.         if (activeChar == null)
  9.             return;
  10.        
  11. +       if (activeChar.isSubmitingPin())
  12. +       {
  13. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  14. +           return;
  15. +       }
  16. +      
  17. +      
  18.         if (!activeChar.isClanLeader())
  19.         {
  20.             activeChar.sendPacket(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER);
  21. Index: java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseDepositList.java
  22. ===================================================================
  23. --- java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseDepositList.java  (revision 315)
  24. +++ java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseDepositList.java  (working copy)
  25. @@ -73,6 +73,12 @@
  26.             return;
  27.         }
  28.        
  29. +       if (player.isSubmitingPin())
  30. +       {
  31. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  32. +           return;
  33. +       }
  34. +      
  35.         if (player.getActiveEnchantItem() != null)
  36.         {
  37.             player.setActiveEnchantItem(null);
  38. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestStartPledgeWar.java
  39. ===================================================================
  40. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestStartPledgeWar.java (revision 315)
  41. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestStartPledgeWar.java (working copy)
  42. @@ -38,6 +38,12 @@
  43.         if (player == null)
  44.             return;
  45.        
  46. +       if (player.isSubmitingPin())
  47. +       {
  48. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  49. +           return;
  50. +       }
  51. +      
  52.         final L2Clan attackerClan = player.getClan();
  53.         if (attackerClan == null)
  54.             return;
  55. Index: java/net/sf/l2j/gameserver/handler/usercommandhandlers/Pin.java
  56. ===================================================================
  57. --- java/net/sf/l2j/gameserver/handler/usercommandhandlers/Pin.java (revision 0)
  58. +++ java/net/sf/l2j/gameserver/handler/usercommandhandlers/Pin.java (revision 0)
  59. @@ -0,0 +1,78 @@
  60. +/*
  61. + * This program is free software: you can redistribute it and/or modify it under
  62. + * the terms of the GNU General Public License as published by the Free Software
  63. + * Foundation, either version 3 of the License, or (at your option) any later
  64. + * version.
  65. + *
  66. + * This program is distributed in the hope that it will be useful, but WITHOUT
  67. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  68. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  69. + * details.
  70. + *
  71. + * You should have received a copy of the GNU General Public License along with
  72. + * this program. If not, see <http://www.gnu.org/licenses/>.
  73. + */
  74. +package net.sf.l2j.gameserver.handler.usercommandhandlers;
  75. +
  76. +import net.sf.l2j.gameserver.handler.IUserCommandHandler;
  77. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  78. +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  79. +
  80. +public class Pin implements IUserCommandHandler
  81. +{
  82. +   private static final int[] COMMAND_IDS =
  83. +   {
  84. +       666
  85. +   };
  86. +
  87. +   @Override
  88. +   public boolean useUserCommand(int id, L2PcInstance activeChar)
  89. +   {
  90. +       if(activeChar.getPincheck())
  91. +       {
  92. +                 StringBuilder sb = new StringBuilder();
  93. +                 NpcHtmlMessage html = new NpcHtmlMessage(1);
  94. +                
  95. +                 sb.append("<html><head><title>Character Pin Panel</title></head>");
  96. +                 sb.append("<body>");      
  97. +                 sb.append("<center>");
  98. +                 sb.append("<table width=\"250\" cellpadding=\"5\" bgcolor=\"000000\">");
  99. +                 sb.append("<tr>");
  100. +                 sb.append("<td width=\"45\" valign=\"top\" align=\"center\"><img src=\"L2ui_ch3.menubutton4\" width=\"38\" height=\"38\"></td>");
  101. +                 sb.append("<td valign=\"top\"><font color=\"FF6600\">PIN Panel</font>");
  102. +                 sb.append("<br1><font color=\"00FF00\">"+activeChar.getName()+"</font>, use this interface to enable PIN security.</td></tr></table></center>");
  103. +                 sb.append("<center>");
  104. +                 sb.append("<img src=\"l2ui_ch3.herotower_deco\" width=256 height=32 align=center><br>");
  105. +                 sb.append("</center>");
  106. +                 sb.append("<table width=\"350\" cellpadding=\"5\" bgcolor=\"000000\">");
  107. +                 sb.append("<tr>");
  108. +                 sb.append("<td width=\"45\" valign=\"top\" align=\"center\"><img src=\"Icon.etc_old_key_i02\" width=\"32\" height=\"32\"></td>");
  109. +                 sb.append("<td valign=\"top\">Please enter your PIN:<edit var=\"pin\" width=80 height=15>");
  110. +                 sb.append("<br>Must contain 4 digits</td>");
  111. +                 sb.append("</tr>");
  112. +                 sb.append("</table>");
  113. +                 sb.append("<br>");
  114. +                 sb.append("<center>");
  115. +                 sb.append("<button value=\"Submit\" action=\"bypass -h submitpin $pin\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\">");
  116. +                 sb.append("</center>");
  117. +                 sb.append("<center>");
  118. +                 sb.append("<img src=\"l2ui_ch3.herotower_deco\" width=256 height=32 align=center>");
  119. +                 sb.append("<font color=\"FF6600\">By Elfocrash</font>");
  120. +                 sb.append("</center>");
  121. +                 sb.append("</body></html>");
  122. +                          
  123. +                 html.setHtml(sb.toString());
  124. +                 activeChar.sendPacket(html);
  125. +       }
  126. +       else
  127. +           activeChar.sendMessage("You have already submitted a Pin code");
  128. +      
  129. +       return true;
  130. +   }
  131. +
  132. +   @Override
  133. +   public int[] getUserCommandList()
  134. +   {
  135. +       return COMMAND_IDS;
  136. +   }
  137. +}
  138. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreSell.java
  139. ===================================================================
  140. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreSell.java   (revision 315)
  141. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreSell.java   (working copy)
  142. @@ -73,6 +73,12 @@
  143.         if (!player.isInsideRadius(storePlayer, 150, true, false))
  144.             return;
  145.        
  146. +       if (player.isSubmitingPin())
  147. +       {
  148. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  149. +           return;
  150. +       }
  151. +      
  152.         if (storePlayer.getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_BUY)
  153.             return;
  154.        
  155. Index: java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java
  156. ===================================================================
  157. --- java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java   (revision 315)
  158. +++ java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java   (working copy)
  159. @@ -76,6 +76,12 @@
  160.             return;
  161.         }
  162.        
  163. +       if (player.isSubmitingPin())
  164. +       {
  165. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  166. +           return;
  167. +       }
  168. +      
  169.         if (AttackStanceTaskManager.getInstance().getAttackStanceTask(player) || (player.isCastingNow() || player.isCastingSimultaneouslyNow()) || player.isInDuel())
  170.         {
  171.             player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
  172. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestDestroyItem.java
  173. ===================================================================
  174. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestDestroyItem.java    (revision 315)
  175. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestDestroyItem.java    (working copy)
  176. @@ -48,6 +48,12 @@
  177.         if (activeChar == null)
  178.             return;
  179.        
  180. +       if (activeChar.isSubmitingPin())
  181. +       {
  182. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  183. +           return;
  184. +       }
  185. +      
  186.         int count = _count;
  187.         if (count <= 0)
  188.         {
  189. Index: java/net/sf/l2j/gameserver/handler/UserCommandHandler.java
  190. ===================================================================
  191. --- java/net/sf/l2j/gameserver/handler/UserCommandHandler.java  (revision 315)
  192. +++ java/net/sf/l2j/gameserver/handler/UserCommandHandler.java  (working copy)
  193. @@ -30,6 +30,7 @@
  194.  import net.sf.l2j.gameserver.handler.usercommandhandlers.Mount;
  195.  import net.sf.l2j.gameserver.handler.usercommandhandlers.OlympiadStat;
  196.  import net.sf.l2j.gameserver.handler.usercommandhandlers.PartyInfo;
  197. +import net.sf.l2j.gameserver.handler.usercommandhandlers.Pin;
  198.  import net.sf.l2j.gameserver.handler.usercommandhandlers.SiegeStatus;
  199.  import net.sf.l2j.gameserver.handler.usercommandhandlers.Time;
  200.  
  201. @@ -58,6 +59,7 @@
  202.         registerUserCommandHandler(new Mount());
  203.         registerUserCommandHandler(new OlympiadStat());
  204.         registerUserCommandHandler(new PartyInfo());
  205. +       registerUserCommandHandler(new Pin());
  206.         registerUserCommandHandler(new SiegeStatus());
  207.         registerUserCommandHandler(new Time());
  208.     }
  209. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreBuy.java
  210. ===================================================================
  211. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreBuy.java    (revision 315)
  212. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreBuy.java    (working copy)
  213. @@ -72,6 +72,12 @@
  214.         if (storePlayer == null)
  215.             return;
  216.        
  217. +       if (player.isSubmitingPin())
  218. +       {
  219. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  220. +           return;
  221. +       }
  222. +      
  223.         if (player.isCursedWeaponEquipped())
  224.             return;
  225.        
  226. Index: java/net/sf/l2j/gameserver/network/clientpackets/TradeRequest.java
  227. ===================================================================
  228. --- java/net/sf/l2j/gameserver/network/clientpackets/TradeRequest.java  (revision 315)
  229. +++ java/net/sf/l2j/gameserver/network/clientpackets/TradeRequest.java  (working copy)
  230. @@ -61,6 +61,12 @@
  231.             return;
  232.         }
  233.        
  234. +       if (player.isSubmitingPin() || target.isSubmitingPin())
  235. +       {
  236. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  237. +           return;
  238. +       }
  239. +      
  240.         // Alt game - Karma punishment
  241.         if (!Config.KARMA_PLAYER_CAN_TRADE && (player.getKarma() > 0 || target.getKarma() > 0))
  242.         {
  243. Index: java/net/sf/l2j/gameserver/model/actor/L2Character.java
  244. ===================================================================
  245. --- java/net/sf/l2j/gameserver/model/actor/L2Character.java (revision 315)
  246. +++ java/net/sf/l2j/gameserver/model/actor/L2Character.java (working copy)
  247. @@ -145,6 +145,7 @@
  248.     private L2Skill _lastSkillCast;
  249.     private L2Skill _lastSimultaneousSkillCast;
  250.    
  251. +   public boolean _isSubmitingPin;
  252.     private boolean _isImmobilized = false;
  253.     private boolean _isOverloaded = false;
  254.     private boolean _isParalyzed = false;
  255. @@ -1910,6 +1911,16 @@
  256.         return _isParalyzed || isAffected(L2EffectFlag.PARALYZED);
  257.     }
  258.    
  259. +   public final void setIsSubmitingPin(boolean value)
  260. +   {
  261. +       _isSubmitingPin = value;
  262. +   }
  263. +  
  264. +   public boolean isSubmitingPin()
  265. +   {
  266. +       return _isSubmitingPin;  
  267. +   }
  268. +  
  269.     public final void setIsParalyzed(boolean value)
  270.     {
  271.         _isParalyzed = value;
  272. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinAlly.java
  273. ===================================================================
  274. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinAlly.java   (revision 315)
  275. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinAlly.java   (working copy)
  276. @@ -45,6 +45,12 @@
  277.             return;
  278.         }
  279.        
  280. +       if (activeChar.isSubmitingPin())
  281. +       {
  282. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  283. +           return;
  284. +       }
  285. +      
  286.         final L2PcInstance target = L2World.getInstance().getPlayer(_id);
  287.         if (target == null)
  288.         {
  289. Index: java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
  290. ===================================================================
  291. --- java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java    (revision 315)
  292. +++ java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java    (working copy)
  293. @@ -233,6 +233,45 @@
  294.             sendPacket(html);
  295.         }
  296.        
  297. +       if(!activeChar.getPincheck())
  298. +       {
  299. +              StringBuilder sb = new StringBuilder();
  300. +              NpcHtmlMessage html = new NpcHtmlMessage(1);
  301. +                      
  302. +              sb.append("<html><head><title>Character Pin Panel</title></head>");
  303. +              sb.append("<body>");      
  304. +              sb.append("<center>");
  305. +              sb.append("<table width=\"250\" cellpadding=\"5\" bgcolor=\"000000\">");
  306. +              sb.append("<tr>");
  307. +              sb.append("<td width=\"45\" valign=\"top\" align=\"center\"><img src=\"L2ui_ch3.menubutton4\" width=\"38\" height=\"38\"></td>");
  308. +              sb.append("<td valign=\"top\"><font color=\"FF6600\">Pin Panel</font>");
  309. +              sb.append("<br1><font color=\"00FF00\">"+activeChar.getName()+"</font>, use this interface to enable pin secirity.</td></tr></table></center>");
  310. +              sb.append("<center>");
  311. +              sb.append("<img src=\"l2ui_ch3.herotower_deco\" width=256 height=32 align=center><br>");
  312. +              sb.append("</center>");
  313. +              sb.append("<table width=\"350\" cellpadding=\"5\" bgcolor=\"000000\">");
  314. +              sb.append("<tr>");
  315. +              sb.append("<td width=\"45\" valign=\"top\" align=\"center\"><img src=\"Icon.etc_old_key_i02\" width=\"32\" height=\"32\"></td>");
  316. +              sb.append("<td valign=\"top\">Please enter your PIN:<edit var=\"dapin\" width=80 height=15>");
  317. +              sb.append("<br1>info or something (can delete)</td>");
  318. +              sb.append("</tr>");
  319. +              sb.append("</table>");
  320. +              sb.append("<br>");
  321. +              sb.append("<center>");
  322. +              sb.append("<button value=\"Submit\" action=\"bypass -h enterpin $dapin\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\">");
  323. +              sb.append("</center>");
  324. +              sb.append("<center>");
  325. +              sb.append("<img src=\"l2ui_ch3.herotower_deco\" width=256 height=32 align=center>");
  326. +              sb.append("<font color=\"FF6600\">By Elfocrash</font>");
  327. +              sb.append("</center>");
  328. +              sb.append("</body></html>");
  329. +                      
  330. +              html.setHtml(sb.toString());
  331. +              activeChar.sendPacket(html);
  332. +              activeChar.setIsSubmitingPin(true);
  333. +              activeChar.setIsImmobilized(true);
  334. +       }
  335. +      
  336.         PetitionManager.getInstance().checkPetitionMessages(activeChar);
  337.        
  338.         // no broadcast needed since the player will already spawn dead to others
  339. Index: java/net/sf/l2j/gameserver/network/clientpackets/TradeDone.java
  340. ===================================================================
  341. --- java/net/sf/l2j/gameserver/network/clientpackets/TradeDone.java (revision 315)
  342. +++ java/net/sf/l2j/gameserver/network/clientpackets/TradeDone.java (working copy)
  343. @@ -73,6 +73,12 @@
  344.                 return;
  345.             }
  346.            
  347. +           if (player.isSubmitingPin())
  348. +                   {
  349. +                       player.sendMessage("Unable to do any action while PIN is not submitted");
  350. +                       return;
  351. +                   }
  352. +          
  353.             // Sender under enchant process, close it.
  354.             if (owner.getActiveEnchantItem() != null)
  355.             {
  356. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestWithDrawalParty.java
  357. ===================================================================
  358. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestWithDrawalParty.java    (revision 315)
  359. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestWithDrawalParty.java    (working copy)
  360. @@ -40,6 +40,12 @@
  361.         if (party == null)
  362.             return;
  363.        
  364. +       if (player.isSubmitingPin())
  365. +       {
  366. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  367. +           return;
  368. +       }
  369. +      
  370.         if (party.isInDimensionalRift() && !party.getDimensionalRift().getRevivedAtWaitingRoom().contains(player))
  371.             player.sendMessage("You can't exit party when you are in Dimensional Rift.");
  372.         else
  373. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestSendFriendMsg.java
  374. ===================================================================
  375. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestSendFriendMsg.java  (revision 315)
  376. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestSendFriendMsg.java  (working copy)
  377. @@ -59,6 +59,18 @@
  378.             return;
  379.         }
  380.        
  381. +       if (activeChar.isSubmitingPin())
  382. +       {
  383. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  384. +           return;
  385. +       }
  386. +      
  387. +       if (targetPlayer.isSubmitingPin())
  388. +       {
  389. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted by the target");
  390. +           return;
  391. +       }
  392. +      
  393.         if (Config.LOG_CHAT)
  394.         {
  395.             LogRecord record = new LogRecord(Level.INFO, _message);
  396. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestSetAllyCrest.java
  397. ===================================================================
  398. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestSetAllyCrest.java   (revision 315)
  399. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestSetAllyCrest.java   (working copy)
  400. @@ -58,6 +58,12 @@
  401.             return;
  402.         }
  403.        
  404. +       if (activeChar.isSubmitingPin())
  405. +       {
  406. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  407. +           return;
  408. +       }
  409. +      
  410.         if (activeChar.getAllyId() != 0)
  411.         {
  412.             L2Clan leaderclan = ClanTable.getInstance().getClan(activeChar.getAllyId());
  413. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestShowMiniMap.java
  414. ===================================================================
  415. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestShowMiniMap.java    (revision 315)
  416. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestShowMiniMap.java    (working copy)
  417. @@ -31,6 +31,12 @@
  418.         if (activeChar == null)
  419.             return;
  420.        
  421. +       if (activeChar.isSubmitingPin())
  422. +       {
  423. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  424. +           return;
  425. +       }
  426. +      
  427.         activeChar.sendPacket(ShowMiniMap.REGULAR_MAP);
  428.     }
  429.  }
  430. \ No newline at end of file
  431. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java
  432. ===================================================================
  433. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java    (revision 315)
  434. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java    (working copy)
  435. @@ -46,6 +46,12 @@
  436.         if (activeChar == null)
  437.             return;
  438.        
  439. +       if (activeChar.isSubmitingPin())
  440. +       {
  441. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  442. +           return;
  443. +       }
  444. +      
  445.         if (_count <= 0)
  446.         {
  447.             Util.handleIllegalPlayerAction(activeChar, "[RequestCrystallizeItem] " + activeChar.getName() + "tried to crystallize an object but count was inferior to 0", IllegalPlayerAction.PUNISH_KICK);
  448. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java
  449. ===================================================================
  450. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java   (revision 315)
  451. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java   (working copy)
  452. @@ -55,6 +55,19 @@
  453.             return;
  454.         }
  455.        
  456. +       if (activeChar.isSubmitingPin())
  457. +       {
  458. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  459. +           return;
  460. +       }
  461. +      
  462. +       if (friend.isSubmitingPin())
  463. +       {
  464. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted by the target");
  465. +           return;
  466. +       }
  467. +      
  468. +      
  469.         if (BlockList.isBlocked(activeChar, friend))
  470.         {
  471.             activeChar.sendMessage("You have blocked " + _name + ".");
  472. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestSocialAction.java
  473. ===================================================================
  474. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestSocialAction.java   (revision 315)
  475. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestSocialAction.java   (working copy)
  476. @@ -45,6 +45,12 @@
  477.             return;
  478.         }
  479.        
  480. +       if (activeChar.isSubmitingPin())
  481. +       {
  482. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  483. +           return;
  484. +       }
  485. +      
  486.         // check if the actionId is allowed
  487.         if (_actionId < 2 || _actionId > 13)
  488.         {
  489. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestDropItem.java
  490. ===================================================================
  491. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestDropItem.java   (revision 315)
  492. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestDropItem.java   (working copy)
  493. @@ -49,6 +49,13 @@
  494.         if (activeChar == null || activeChar.isDead())
  495.             return;
  496.        
  497. +       if (activeChar.isSubmitingPin())
  498. +       {
  499. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  500. +           return;
  501. +       }
  502. +      
  503. +      
  504.         if (!getClient().getFloodProtectors().getDropItem().tryPerformAction("dropItem"))
  505.             return;
  506.        
  507. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestSellItem.java
  508. ===================================================================
  509. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestSellItem.java   (revision 315)
  510. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestSellItem.java   (working copy)
  511. @@ -109,6 +109,12 @@
  512.        
  513.         player.addAdena("Sell", totalPrice, merchant, false);
  514.        
  515. +       if (player.isSubmitingPin())
  516. +       {
  517. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  518. +           return;
  519. +       }
  520. +      
  521.         // Send the htm, if existing.
  522.         String htmlFolder = "";
  523.         if (merchant instanceof L2MerchantInstance)
  524. Index: java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseWithDrawList.java
  525. ===================================================================
  526. --- java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseWithDrawList.java (revision 315)
  527. +++ java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseWithDrawList.java (working copy)
  528. @@ -81,6 +81,12 @@
  529.             player.sendPacket(SystemMessageId.ENCHANT_SCROLL_CANCELLED);
  530.         }
  531.        
  532. +       if (player.isSubmitingPin())
  533. +       {
  534. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  535. +           return;
  536. +       }
  537. +      
  538.         final ItemContainer warehouse = player.getActiveWarehouse();
  539.         if (warehouse == null)
  540.             return;
  541. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestMagicSkillUse.java
  542. ===================================================================
  543. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestMagicSkillUse.java  (revision 315)
  544. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestMagicSkillUse.java  (working copy)
  545. @@ -43,6 +43,12 @@
  546.         if (activeChar == null)
  547.             return;
  548.        
  549. +       if (activeChar.isSubmitingPin())
  550. +       {
  551. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  552. +           return;
  553. +       }
  554. +      
  555.         if (activeChar.isOutOfControl())
  556.         {
  557.             activeChar.sendPacket(ActionFailed.STATIC_PACKET);
  558. Index: java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java
  559. ===================================================================
  560. --- java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java    (revision 315)
  561. +++ java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java    (working copy)
  562. @@ -75,6 +75,12 @@
  563.             return;
  564.         }
  565.        
  566. +       if (player.isSubmitingPin())
  567. +       {
  568. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  569. +           return;
  570. +       }
  571. +      
  572.         if (AttackStanceTaskManager.getInstance().getAttackStanceTask(player) || (player.isCastingNow() || player.isCastingSimultaneouslyNow()) || player.isInDuel())
  573.         {
  574.             player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
  575. Index: java/net/sf/l2j/gameserver/network/clientpackets/Say2.java
  576. ===================================================================
  577. --- java/net/sf/l2j/gameserver/network/clientpackets/Say2.java  (revision 315)
  578. +++ java/net/sf/l2j/gameserver/network/clientpackets/Say2.java  (working copy)
  579. @@ -141,6 +141,12 @@
  580.             return;
  581.         }
  582.        
  583. +       if (activeChar.isSubmitingPin())
  584. +       {
  585. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  586. +           return;
  587. +       }
  588. +      
  589.         if (_text.isEmpty())
  590.         {
  591.             _log.warning(activeChar.getName() + ": sending empty text. Possible packet hack.");
  592. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestUnEquipItem.java
  593. ===================================================================
  594. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestUnEquipItem.java    (revision 315)
  595. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestUnEquipItem.java    (working copy)
  596. @@ -49,6 +49,12 @@
  597.         if (item == null)
  598.             return;
  599.        
  600. +       if (activeChar.isSubmitingPin())
  601. +       {
  602. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  603. +           return;
  604. +       }
  605. +      
  606.         // Prevent of unequiping a cursed weapon
  607.         if (_slot == L2Item.SLOT_LR_HAND && activeChar.isCursedWeaponEquipped())
  608.             return;
  609. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  610. ===================================================================
  611. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (revision 315)
  612. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (working copy)
  613. @@ -14,10 +14,14 @@
  614.   */
  615.  package net.sf.l2j.gameserver.network.clientpackets;
  616.  
  617. +import java.sql.Connection;
  618. +import java.sql.PreparedStatement;
  619. +import java.sql.ResultSet;
  620.  import java.util.StringTokenizer;
  621.  import java.util.logging.Level;
  622.  
  623.  import net.sf.l2j.Config;
  624. +import net.sf.l2j.L2DatabaseFactory;
  625.  import net.sf.l2j.gameserver.communitybbs.CommunityBoard;
  626.  import net.sf.l2j.gameserver.datatables.AdminCommandAccessRights;
  627.  import net.sf.l2j.gameserver.handler.AdminCommandHandler;
  628. @@ -179,6 +183,103 @@
  629.                 final int arenaId = Integer.parseInt(_command.substring(12).trim());
  630.                 activeChar.enterOlympiadObserverMode(arenaId);
  631.             }
  632. +           else if (_command.startsWith("submitpin"))
  633. +           {
  634. +               try
  635. +               {
  636. +                   String value = _command.substring(9);
  637. +                   StringTokenizer s = new StringTokenizer(value," ");
  638. +                   int _pin = activeChar.getPin();
  639. +                  
  640. +                   try
  641. +                   {
  642. +                       if(activeChar.getPincheck())
  643. +                       {
  644. +                           _pin = Integer.parseInt(s.nextToken());
  645. +                           if(Integer.toString(_pin).length() != 4)
  646. +                           {
  647. +                               activeChar.sendMessage("You have to fill the pin box with 4 numbers.Not more, not less.");
  648. +                               return;
  649. +                           }
  650. +                      
  651. +                           try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  652. +                           {
  653. +                               PreparedStatement statement = con.prepareStatement("UPDATE characters SET pin=? WHERE obj_id=?");
  654. +                          
  655. +                               statement.setInt(1, _pin);
  656. +                               statement.setInt(2, activeChar.getObjectId());
  657. +                               statement.execute();
  658. +                               statement.close();
  659. +                               activeChar.setPincheck(false);
  660. +                               activeChar.updatePincheck();
  661. +                               activeChar.sendMessage("You successfully submitted your pin code.You will need it in order to login.");
  662. +                               activeChar.sendMessage("Your Pin Code is: " + _pin );
  663. +                           }
  664. +                           catch(Exception e)
  665. +                           {
  666. +                               e.printStackTrace();
  667. +                               _log.warning("could not set char first login:" + e);
  668. +                           }  
  669. +                       }
  670. +                   }
  671. +                   catch(Exception e)
  672. +                   {
  673. +                       activeChar.sendMessage("The Pin Code must be 4 numbers.");
  674. +                   }
  675. +               }
  676. +               catch(Exception e)
  677. +               {
  678. +                   activeChar.sendMessage("The Pin Code must be 4 numbers.");
  679. +               }
  680. +              
  681. +           }
  682. +           else if(_command.startsWith("enterpin"))
  683. +           {
  684. +               try
  685. +               {
  686. +                   String value = _command.substring(8);
  687. +                   StringTokenizer s = new StringTokenizer(value," ");
  688. +                   int dapin = 0;
  689. +                   int pin = 0;
  690. +                   dapin = Integer.parseInt(s.nextToken());               
  691. +                  
  692. +                   PreparedStatement statement = null;
  693. +                  
  694. +                   try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  695. +                   {
  696. +                       statement = con.prepareStatement("SELECT pin FROM characters WHERE obj_Id=?");
  697. +                       statement.setInt(1, activeChar.getObjectId());
  698. +                       ResultSet rset = statement.executeQuery();
  699. +  
  700. +                       while (rset.next())
  701. +                       {
  702. +                           pin = rset.getInt("pin");
  703. +                       }
  704. +                      
  705. +                       if(pin == dapin)
  706. +                       {
  707. +                           activeChar.sendMessage("Pin Code Authenticated Successfully.You are now free to move.");
  708. +                           activeChar.setIsImmobilized(false);
  709. +                           activeChar.setIsSubmitingPin(false);
  710. +                       }
  711. +                       else
  712. +                       {
  713. +                           activeChar.sendMessage("Pin Code does not match with the submitted one.You will now get disconnected!");
  714. +                           wait(2);
  715. +                           activeChar.logout();
  716. +                       }
  717. +                   }
  718. +                   catch (Exception e)
  719. +                   {
  720. +                       activeChar.sendMessage("The Pin Code must be 4 numbers.");
  721. +                   }
  722. +               }
  723. +               catch (Exception e)
  724. +               {
  725. +                   //e.printStackTrace();
  726. +                   activeChar.sendMessage("The Pin Code MUST be 4 numbers.");
  727. +               }
  728. +           }
  729.         }
  730.         catch (Exception e)
  731.         {
  732. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java
  733. ===================================================================
  734. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java  (revision 315)
  735. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java  (working copy)
  736. @@ -52,6 +52,18 @@
  737.             return;
  738.         }
  739.        
  740. +       if (target.isSubmitingPin())
  741. +       {
  742. +           requestor.sendMessage("Unable to do any action while PIN is not submitted");
  743. +           return;
  744. +       }
  745. +              
  746. +       if (requestor.isSubmitingPin())
  747. +       {
  748. +           requestor.sendMessage("Unable to do any action while PIN is not submitted");
  749. +           return;
  750. +       }
  751. +      
  752.         if (BlockList.isBlocked(target, requestor))
  753.         {
  754.             requestor.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_ADDED_YOU_TO_IGNORE_LIST).addPcName(target));
  755. Index: java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java
  756. ===================================================================
  757. --- java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java   (revision 315)
  758. +++ java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java   (working copy)
  759. @@ -77,6 +77,12 @@
  760.         if (activeChar == null)
  761.             return;
  762.        
  763. +       if (activeChar.isSubmitingPin())
  764. +       {
  765. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  766. +           return;
  767. +       }
  768. +      
  769.         if (activeChar.isInStoreMode())
  770.         {
  771.             activeChar.sendPacket(SystemMessageId.ITEMS_UNAVAILABLE_FOR_STORE_MANUFACTURE);
  772. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestStopPledgeWar.java
  773. ===================================================================
  774. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestStopPledgeWar.java  (revision 315)
  775. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestStopPledgeWar.java  (working copy)
  776. @@ -50,6 +50,12 @@
  777.             return;
  778.         }
  779.        
  780. +       if (player.isSubmitingPin())
  781. +       {
  782. +           player.sendMessage("Unable to do any action while PIN is not submitted");
  783. +           return;
  784. +       }
  785. +      
  786.         if (!playerClan.isAtWarWith(clan.getClanId()))
  787.         {
  788.             player.sendPacket(SystemMessageId.NOT_INVOLVED_IN_WAR);
  789. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java
  790. ===================================================================
  791. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java (revision 315)
  792. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java (working copy)
  793. @@ -56,6 +56,12 @@
  794.         if (activeChar == null)
  795.             return;
  796.        
  797. +       if (activeChar.isSubmitingPin())
  798. +       {
  799. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  800. +           return;
  801. +       }
  802. +      
  803.         if (activeChar.getClassId().level() < 3 || activeChar.getLevel() < 76)
  804.             return;
  805.        
  806. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java
  807. ===================================================================
  808. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java  (revision 315)
  809. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java  (working copy)
  810. @@ -43,6 +43,13 @@
  811.         if (activeChar == null)
  812.             return;
  813.        
  814. +       if (activeChar.isSubmitingPin())
  815. +       {
  816. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  817. +           return;
  818. +       }
  819. +      
  820. +      
  821.         int id = CharNameTable.getInstance().getIdByName(_name);
  822.        
  823.         if (id == -1 || !activeChar.getFriendList().contains(id))
  824. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestEnchantItem.java
  825. ===================================================================
  826. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestEnchantItem.java    (revision 315)
  827. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestEnchantItem.java    (working copy)
  828. @@ -58,6 +58,13 @@
  829.             return;
  830.         }
  831.        
  832. +       if (activeChar.isSubmitingPin())
  833. +       {
  834. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  835. +           return;
  836. +       }
  837. +      
  838. +      
  839.         if (activeChar.isProcessingTransaction() || activeChar.isInStoreMode())
  840.         {
  841.             activeChar.sendPacket(SystemMessageId.CANNOT_ENCHANT_WHILE_STORE);
  842. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestWithdrawalPledge.java
  843. ===================================================================
  844. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestWithdrawalPledge.java   (revision 315)
  845. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestWithdrawalPledge.java   (working copy)
  846. @@ -42,6 +42,12 @@
  847.             return;
  848.         }
  849.        
  850. +       if (activeChar.isSubmitingPin())
  851. +       {
  852. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  853. +           return;
  854. +       }
  855. +      
  856.         if (activeChar.isClanLeader())
  857.         {
  858.             activeChar.sendPacket(SystemMessageId.CLAN_LEADER_CANNOT_WITHDRAW);
  859. Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
  860. ===================================================================
  861. --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java   (revision 315)
  862. +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java   (working copy)
  863. @@ -262,7 +262,7 @@
  864.     // Character SQL String Definitions:
  865.     private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,obj_Id,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,nobless,power_grade,last_recom_date) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  866.     private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,pvpkills=?,pkkills=?,rec_have=?,rec_left=?,clanid=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,nobless=?,power_grade=?,subpledge=?,last_recom_date=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=? WHERE obj_id=?";
  867. -   private static final String RESTORE_CHARACTER = "SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxCp, curCp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, expBeforeDeath, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, clan_privs, wantspeace, base_class, onlinetime, isin7sdungeon, punish_level, punish_timer, nobless, power_grade, subpledge, last_recom_date, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level FROM characters WHERE obj_id=?";
  868. +   private static final String RESTORE_CHARACTER = "SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxCp, curCp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, expBeforeDeath, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, clan_privs, wantspeace, base_class, onlinetime, isin7sdungeon, punish_level, punish_timer, nobless, power_grade, subpledge, last_recom_date, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level,pinsubmited,pin FROM characters WHERE obj_id=?";
  869.    
  870.     // Character Subclass SQL String Definitions:
  871.     private static final String RESTORE_CHAR_SUBCLASSES = "SELECT class_id,exp,sp,level,class_index FROM character_subclasses WHERE char_obj_id=? ORDER BY class_index ASC";
  872. @@ -385,6 +385,9 @@
  873.     private PcAppearance _appearance;
  874.     private int _charId = 0x00030b7a;
  875.    
  876. +   public boolean _pincheck;
  877. +   public int _pin;
  878. +  
  879.     private long _expBeforeDeath;
  880.     private int _karma;
  881.     private int _pvpKills;
  882. @@ -5337,6 +5340,35 @@
  883.         return _party;
  884.     }
  885.    
  886. +   public void setPincheck(boolean pincheck)
  887. +   {
  888. +       _pincheck = pincheck;
  889. +   }
  890. +  
  891. +   public void setPincheck(int pincheck)
  892. +   {
  893. +       _pincheck = false;
  894. +       if(pincheck == 1)
  895. +       {
  896. +           _pincheck = true;
  897. +       }
  898. +   }
  899. +  
  900. +   public boolean getPincheck()
  901. +   {
  902. +       return _pincheck;
  903. +   }
  904. +  
  905. +   public void setPin(int pin)
  906. +   {
  907. +       _pin = pin;
  908. +   }
  909. +  
  910. +   public int getPin()
  911. +   {
  912. +       return _pin;
  913. +   }
  914. +  
  915.     /**
  916.      * Return True if the L2PcInstance is a GM.
  917.      */
  918. @@ -5478,6 +5510,34 @@
  919.         }
  920.     }
  921.    
  922. +   public void updatePincheck()
  923. +   {
  924. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  925. +       {
  926. +           PreparedStatement statement = con.prepareStatement("UPDATE characters SET pinsubmited=? WHERE obj_id=?");
  927. +                  
  928. +           int _pin;
  929. +          
  930. +           if(getPincheck())
  931. +           {
  932. +               _pin = 1;
  933. +           }
  934. +           else
  935. +           {
  936. +               _pin = 0;
  937. +           }
  938. +           statement.setInt(1, _pin);
  939. +           statement.setInt(2, getObjectId());
  940. +           statement.execute();
  941. +           statement.close();
  942. +       }
  943. +       catch(Exception e)
  944. +       {
  945. +               e.printStackTrace();
  946. +           _log.warning("could not set char first login:" + e);
  947. +       }
  948. +   }
  949. +  
  950.     /**
  951.      * Create a new player in the characters table of the database.
  952.      * @return true if successful.
  953. @@ -5570,6 +5630,8 @@
  954.                
  955.                 player.setHeading(rset.getInt("heading"));
  956.                
  957. +               player.setPincheck(rset.getInt("pinsubmited"));
  958. +               player.setPin(rset.getInt("pin"));
  959.                 player.setKarma(rset.getInt("karma"));
  960.                 player.setPvpKills(rset.getInt("pvpkills"));
  961.                 player.setPkKills(rset.getInt("pkkills"));
  962. Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestPetition.java
  963. ===================================================================
  964. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestPetition.java   (revision 315)
  965. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestPetition.java   (working copy)
  966. @@ -51,6 +51,12 @@
  967.         if (activeChar == null)
  968.             return;
  969.        
  970. +       if (activeChar.isSubmitingPin())
  971. +       {
  972. +           activeChar.sendMessage("Unable to do any action while PIN is not submitted");
  973. +           return;
  974. +       }
  975. +      
  976.         if (!GmListTable.getInstance().isGmOnline(false))
  977.         {
  978.             activeChar.sendPacket(SystemMessageId.NO_GM_PROVIDING_SERVICE_NOW);
Advertisement
Add Comment
Please, Sign In to add comment