tensador125

Dungeon l2jfrozen

Feb 27th, 2022 (edited)
1,173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 117.14 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P L2jFrozen_GameServer
  3. Index: head-src/com/l2jfrozen/Config.java
  4. ===================================================================
  5. --- head-src/com/l2jfrozen/Config.java   (nonexistent)
  6. +++ head-src/com/l2jfrozen/Config.java   (working copy)
  7.  
  8. import com.l2jfrozen.util.StringUtil;
  9. +import Base.Config.ExProperties;
  10.  
  11.  
  12.  
  13.  
  14. public final class Config
  15. {
  16. +   public static final String DUNGEON_REWARD_FILE = "./events/Dungeon_Html_Reward.properties";
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.             e.printStackTrace();
  25.             throw new Error("Failed to Load " + OTHER + " File.");
  26.         }
  27.     }
  28.    
  29. +   public static ExProperties load(String filename)
  30. +   {
  31. +       return load(new File(filename));
  32. +   }
  33. +  
  34. +   public static ExProperties load(File file)
  35. +   {
  36. +       ExProperties result = new ExProperties();
  37. +      
  38. +       try
  39. +       {
  40. +           result.load(file);
  41. +       }
  42. +       catch (IOException e)
  43. +       {
  44. +           LOGGER.warn("Error loading config : " + file.getName() + "!");
  45. +       }
  46. +      
  47. +       return result;
  48. +   }          
  49.     // ============================================================
  50.     public static float RATE_XP;
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.     public static String PVP1_CUSTOM_MESSAGE;
  66.     public static String PVP2_CUSTOM_MESSAGE;
  67.    
  68. +   public static int DUNGEON_COIN_ID;  
  69. +   public static int CONT_DUNGEON_ITEM;
  70. +   public static int DUNGEON_SPAWN_X;
  71. +   public static int DUNGEON_SPAWN_Y;
  72. +   public static int DUNGEON_SPAWN_Z;
  73. +   public static int DUNGEON_SPAWN_RND;
  74.    
  75. +   public static int DUNGEON_ITEM_RENEWAL0;
  76. +   public static int DUNGEON_ITEM_RENEWAL1;
  77. +   public static int DUNGEON_ITEM_RENEWAL2;
  78. +   public static int DUNGEON_ITEM_RENEWAL3;
  79. +   public static int DUNGEON_ITEM_RENEWAL4;
  80. +   public static int DUNGEON_ITEM_RENEWAL5;
  81. +   public static int DUNGEON_ITEM_RENEWAL6;
  82. +   public static int DUNGEON_ITEM_RENEWAL7;
  83. +   public static int DUNGEON_ITEM_RENEWAL8;
  84. +   public static int DUNGEON_ITEM_RENEWAL9;
  85. +   public static int DUNGEON_ITEM_RENEWAL10;  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.             ONLINE_PLAYERS_ON_LOGIN = Boolean.valueOf(L2JFrozenSettings.getProperty("OnlineOnLogin", "False"));
  94.             SHOW_SERVER_VERSION = Boolean.valueOf(L2JFrozenSettings.getProperty("ShowServerVersion", "False"));
  95.        
  96.  
  97.  
  98. +           // Dungeon
  99. +           ExProperties SafeDungeon = load(DUNGEON_REWARD_FILE);
  100. +          
  101. +           DUNGEON_COIN_ID = SafeDungeon.getProperty("DungeonCoinId", 57);
  102. +           CONT_DUNGEON_ITEM = SafeDungeon.getProperty("DungeonContItem", 1);
  103. +           DUNGEON_SPAWN_X = SafeDungeon.getProperty("DungeonSpawnX", 82635);
  104. +           DUNGEON_SPAWN_Y = SafeDungeon.getProperty("DungeonSpawnY", 148798);
  105. +           DUNGEON_SPAWN_Z = SafeDungeon.getProperty("DungeonSpawnZ", -3464);
  106. +           DUNGEON_SPAWN_RND = SafeDungeon.getProperty("DungeonSpawnRnd", 25);
  107. +          
  108. +           DUNGEON_ITEM_RENEWAL0 = SafeDungeon.getProperty("DungeonRenewalHtml0", 15);
  109. +           DUNGEON_ITEM_RENEWAL1 = SafeDungeon.getProperty("DungeonRenewalHtml1", 15);
  110. +           DUNGEON_ITEM_RENEWAL2 = SafeDungeon.getProperty("DungeonRenewalHtml2", 15);
  111. +           DUNGEON_ITEM_RENEWAL3 = SafeDungeon.getProperty("DungeonRenewalHtml3", 15);
  112. +           DUNGEON_ITEM_RENEWAL4 = SafeDungeon.getProperty("DungeonRenewalHtml4", 15);
  113. +           DUNGEON_ITEM_RENEWAL5 = SafeDungeon.getProperty("DungeonRenewalHtml5", 15);
  114. +           DUNGEON_ITEM_RENEWAL6 = SafeDungeon.getProperty("DungeonRenewalHtml6", 15);
  115. +           DUNGEON_ITEM_RENEWAL7 = SafeDungeon.getProperty("DungeonRenewalHtml7", 15);
  116. +           DUNGEON_ITEM_RENEWAL8 = SafeDungeon.getProperty("DungeonRenewalHtml8", 15);
  117. +           DUNGEON_ITEM_RENEWAL9 = SafeDungeon.getProperty("DungeonRenewalHtml9", 15);
  118. +           DUNGEON_ITEM_RENEWAL10 = SafeDungeon.getProperty("DungeonRenewalHtml10", 15);  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128. ### Eclipse Workspace Patch 1.0
  129. #P L2jFrozen_GameServer
  130. Index: head-src/Base/Dev/Dungeon/Dungeon.java
  131. ===================================================================
  132. --- head-src/Base/Dev/Dungeon/Dungeon.java   (nonexistent)
  133. +++ head-src/Base/Dev/Dungeon/Dungeon.java    (working copy)
  134. +/*
  135. + * This program is free software: you can redistribute it and/or modify it under
  136. + * the terms of the GNU General Public License as published by the Free Software
  137. + * Foundation, either version 3 of the License, or (at your option) any later
  138. + * version.
  139. +*
  140. + * This program is distributed in the hope that it will be useful, but WITHOUT
  141. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  142. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  143. + * details.
  144. + *
  145. + * You should have received a copy of the GNU General Public License along with
  146. + * this program. If not, see <http://www.gnu.org/licenses/>.
  147. + */
  148. +package Base.Dev.Dungeon;
  149. +
  150. +import java.util.List;
  151. +import java.util.Map.Entry;
  152. +import java.util.concurrent.CopyOnWriteArrayList;
  153. +import java.util.concurrent.ScheduledFuture;
  154. +
  155. +
  156. +import com.l2jfrozen.Config;
  157. +import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
  158. +import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
  159. +import com.l2jfrozen.gameserver.model.Location;
  160. +import com.l2jfrozen.gameserver.model.actor.instance.L2DungeonMobInstance;
  161. +import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
  162. +import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
  163. +import com.l2jfrozen.gameserver.network.serverpackets.ExShowScreenMessage;
  164. +import com.l2jfrozen.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
  165. +import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillUser;
  166. +import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
  167. +import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
  168. +import com.l2jfrozen.gameserver.thread.ThreadPool;
  169. +
  170. +import Base.Memo.PlayerMemo;
  171. +
  172. +
  173. +
  174. +/**
  175. + * @author Anarchy
  176. + */
  177. +public class Dungeon
  178. +{
  179. +   private DungeonTemplate template;
  180. +   private List<L2PcInstance> players;
  181. +   private ScheduledFuture<?> dungeonCancelTask = null;
  182. +   private ScheduledFuture<?> nextTask = null;
  183. +   private ScheduledFuture<?> timerTask = null;
  184. +   private DungeonStage currentStage = null;
  185. +   private long stageBeginTime = 0;
  186. +   private List<L2DungeonMobInstance> mobs = new CopyOnWriteArrayList<>();
  187. +   private Instance instance;
  188. +  
  189. +   public Dungeon(DungeonTemplate template, List<L2PcInstance> players)
  190. +   {
  191. +       this.template = template;
  192. +       this.players = players;
  193. +       instance = InstanceManager.getInstance().createInstance();
  194. +      
  195. +       for (L2PcInstance player : players)
  196. +           player.setDungeon(this);
  197. +      
  198. +       beginTeleport();
  199. +   }
  200. +  
  201. +   public void onPlayerDeath(L2PcInstance player)
  202. +   {
  203. +       if (!players.contains(player))
  204. +           return;
  205. +      
  206. +       if (players.size() == 1)
  207. +           ThreadPool.schedule(() -> cancelDungeon(), 5 * 1000);
  208. +       else
  209. +           player.sendMessage("You will be ressurected if your team completes this stage.");
  210. +   }
  211. +  
  212. +   public synchronized void onMobKill(L2DungeonMobInstance mob)
  213. +   {
  214. +       if (!mobs.contains(mob))
  215. +           return;
  216. +      
  217. +       deleteMob(mob);
  218. +      
  219. +       if (mobs.isEmpty())
  220. +       {
  221. +           if (dungeonCancelTask != null)
  222. +               dungeonCancelTask.cancel(false);
  223. +           if (timerTask != null)
  224. +               timerTask.cancel(true);
  225. +           if (nextTask != null)
  226. +               nextTask.cancel(true);
  227. +          
  228. +           for (L2PcInstance player : players)
  229. +               if (player.isDead())
  230. +                   player.doRevive();
  231. +              
  232. +           getNextStage();
  233. +           if (currentStage == null) // No more stages
  234. +           {
  235. +               rewardPlayers();
  236. +               if (template.getRewardHtm().equals("NULL"))
  237. +               {
  238. +                   broadcastScreenMessage("You have completed the dungeon!", 5);
  239. +                   teleToTown();
  240. +               }
  241. +               else
  242. +               {
  243. +                   broadcastScreenMessage("You have completed the dungeon! Select your reward", 5);
  244. +                   // teleToTown();
  245. +               }
  246. +               InstanceManager.getInstance().deleteInstance(instance.getId());
  247. +               DungeonManager.getInstance().removeDungeon(this);
  248. +           }
  249. +           else
  250. +           {
  251. +               broadcastScreenMessage("You have completed stage " + (currentStage.getOrder() - 1) + "! Next stage begins in 10 seconds.", 5);
  252. +               ThreadPool.schedule(() -> teleToStage(), 5 * 1000);
  253. +               nextTask = ThreadPool.schedule(() -> beginStage(), 10 * 1000);
  254. +           }
  255. +       }
  256. +   }
  257. +  
  258. +   private void rewardPlayers()
  259. +   {
  260. +       // First Add Fixed Reward
  261. +       for (L2PcInstance player : players)
  262. +       {
  263. +          
  264. +           PlayerMemo.setVar(player, "dungeon_atleast1time", "true", -1);
  265. +           for (Entry<Integer, Integer> itemId : template.getRewards().entrySet())
  266. +           {
  267. +               player.addItem("dungeon reward", itemId.getKey(), itemId.getValue(), null, true);
  268. +           }
  269. +       }
  270. +      
  271. +       if (!template.getRewardHtm().equals("NULL"))
  272. +       {
  273. +           NpcHtmlMessage htm = new NpcHtmlMessage(0);
  274. +           htm.setFile(template.getRewardHtm());
  275. +           for (L2PcInstance player : players)
  276. +               player.sendPacket(htm);
  277. +       }
  278. +       else
  279. +       {
  280. +           for (L2PcInstance player : players)
  281. +           {
  282. +               player.setInstance(InstanceManager.getInstance().getInstance(0), true);
  283. +                player.teleToLocation(Config.DUNGEON_SPAWN_X, Config.DUNGEON_SPAWN_Y, Config.DUNGEON_SPAWN_Z, Config.DUNGEON_SPAWN_RND);
  284. +           }
  285. +       }
  286. +   }
  287. +  
  288. +   private void teleToStage()
  289. +   {
  290. +       if (!currentStage.teleport())
  291. +           return;
  292. +      
  293. +       for (L2PcInstance player : players)
  294. +           player.teleToLocation(currentStage.getLocation(), 25);
  295. +   }
  296. +  
  297. +   private void teleToTown()
  298. +   {
  299. +       for (L2PcInstance player : players)
  300. +       {
  301. +           if (!player.isOnline2() || player.getClient().isDetached())
  302. +               continue;
  303. +          
  304. +           DungeonManager.getInstance().getDungeonParticipants().remove(player.getObjectId());
  305. +           player.setDungeon(null);
  306. +           player.setInstance(InstanceManager.getInstance().getInstance(0), true);
  307. +                player.teleToLocation(Config.DUNGEON_SPAWN_X, Config.DUNGEON_SPAWN_Y, Config.DUNGEON_SPAWN_Z, Config.DUNGEON_SPAWN_RND);
  308. +       }
  309. +   }
  310. +  
  311. +   private void cancelDungeon()
  312. +   {
  313. +       for (L2PcInstance player : players)
  314. +       {
  315. +           if (player.isDead())
  316. +               player.doRevive();
  317. +          
  318. +           player.abortAttack();
  319. +           player.abortCast();
  320. +       }
  321. +      
  322. +      
  323. +       for (L2DungeonMobInstance mob : mobs)
  324. +           deleteMob(mob);
  325. +
  326. +       broadcastScreenMessage("You have failed to complete the dungeon. You will be teleported back in 10 seconds.", 5);
  327. +       teleToTown();
  328. +      
  329. +       InstanceManager.getInstance().deleteInstance(instance.getId());
  330. +       DungeonManager.getInstance().removeDungeon(this);
  331. +      
  332. +       if (nextTask != null)
  333. +           nextTask.cancel(true);
  334. +       if (timerTask != null)
  335. +           timerTask.cancel(true);
  336. +       if (dungeonCancelTask != null)
  337. +           dungeonCancelTask.cancel(true);
  338. +   }
  339. +  
  340. +   private void deleteMob(L2DungeonMobInstance mob)
  341. +   {
  342. +       if (!mobs.contains(mob))
  343. +           return;
  344. +      
  345. +       mobs.remove(mob);
  346. +       if (mob.getSpawn() != null)
  347. +           SpawnTable.getInstance().deleteSpawn(mob.getSpawn(), false);
  348. +       mob.deleteMe();
  349. +   }
  350. +  
  351. +   private void beginStage()
  352. +   {
  353. +       for (int mobId : currentStage.getMobs().keySet())
  354. +           spawnMob(mobId, currentStage.getMobs().get(mobId));
  355. +      
  356. +       stageBeginTime = System.currentTimeMillis();
  357. +       timerTask = ThreadPool.scheduleAtFixedRate(() -> broadcastTimer(), 5 * 1000, 1000);
  358. +       nextTask = null;
  359. +       dungeonCancelTask = ThreadPool.schedule(() -> cancelDungeon(), 1000 * 60 * currentStage.getMinutes());
  360. +       broadcastScreenMessage("You have " + currentStage.getMinutes() + " minutes to finish stage " + currentStage.getOrder() + "!", 5);
  361. +   }
  362. +  
  363. +   private void spawnMob(int mobId, List<Location> locations)
  364. +   {
  365. +       L2NpcTemplate template = NpcTable.getInstance().getTemplate(mobId);
  366. +       try
  367. +       {
  368. +           for (Location loc : locations)
  369. +           {
  370. +               L2Spawn spawn = new L2Spawn(template);
  371. +               spawn.setLocx(loc.getX());
  372. +               spawn.setLocy(loc.getY());
  373. +               spawn.setLocz(loc.getZ());
  374. +              
  375. +               spawn.setRespawnDelay(1);
  376. +               spawn.doSpawn(false);
  377. +              
  378. +               ((L2DungeonMobInstance) spawn.getNpc()).setDungeon(this);
  379. +               spawn.getNpc().setInstance(instance, false); // Set instance first
  380. +               // SpawnTable.getInstance().addNewSpawn(spawn, false); // TODO: Useless
  381. +               spawn.getNpc().broadcastStatusUpdate();
  382. +              
  383. +               // Add it to memory
  384. +               mobs.add((L2DungeonMobInstance) spawn.getNpc());
  385. +           }
  386. +       }
  387. +       catch (Exception e)
  388. +       {
  389. +           e.printStackTrace();
  390. +       }
  391. +   }
  392. +  
  393. +   private void teleportPlayers()
  394. +   {
  395. +       for (L2PcInstance player : players)
  396. +           player.setInstance(instance, true);
  397. +      
  398. +       teleToStage();
  399. +      
  400. +       broadcastScreenMessage("Stage " + currentStage.getOrder() + " begins in 10 seconds!", 5);
  401. +      
  402. +       nextTask = ThreadPool.schedule(() -> beginStage(), 10 * 1000);
  403. +   }
  404. +  
  405. +   private void beginTeleport()
  406. +   {
  407. +       getNextStage();
  408. +       for (L2PcInstance player : players)
  409. +       {
  410. +           player.broadcastPacket(new MagicSkillUser(player, 1050, 1, 10000, 10000));
  411. +           broadcastScreenMessage("You will be teleported in 10 seconds!", 3);
  412. +       }
  413. +      
  414. +       nextTask = ThreadPool.schedule(() -> teleportPlayers(), 10 * 1000);
  415. +   }
  416. +  
  417. +   private void getNextStage()
  418. +   {
  419. +       currentStage = currentStage == null ? template.getStages().get(1) : template.getStages().get(currentStage.getOrder() + 1);
  420. +   }
  421. +  
  422. +   private void broadcastTimer()
  423. +   {
  424. +       int secondsLeft = (int) (((stageBeginTime + (1000 * 60 * currentStage.getMinutes())) - System.currentTimeMillis()) / 1000);
  425. +       int minutes = secondsLeft / 60;
  426. +       int seconds = secondsLeft % 60;
  427. +       ExShowScreenMessage packet = new ExShowScreenMessage(String.format("%02d:%02d", minutes, seconds), 1010, SMPOS.BOTTOM_RIGHT, false);
  428. +       for (L2PcInstance player : players)
  429. +           player.sendPacket(packet);
  430. +   }
  431. +  
  432. +   private void broadcastScreenMessage(String msg, int seconds)
  433. +   {
  434. +       ExShowScreenMessage packet = new ExShowScreenMessage(msg, seconds * 1000, SMPOS.TOP_CENTER, false);
  435. +       for (L2PcInstance player : players)
  436. +           player.sendPacket(packet);
  437. +   }
  438. +  
  439. +   public List<L2PcInstance> getPlayers()
  440. +   {
  441. +       return players;
  442. +   }
  443. +}
  444.  
  445. ### Eclipse Workspace Patch 1.0
  446. #P L2jFrozen_GameServer
  447. Index: head-src/Base/Dev/Dungeon/DungeonManager.java
  448. ===================================================================
  449. --- head-src/Base/Dev/Dungeon/DungeonManager.java   (nonexistent)
  450. +++ head-src/Base/Dev/Dungeon/DungeonManager.java   (working copy)
  451. +/*
  452. + * This program is free software: you can redistribute it and/or modify it under
  453. + * the terms of the GNU General Public License as published by the Free Software
  454. + * Foundation, either version 3 of the License, or (at your option) any later
  455. + * version.
  456. + *
  457. + * This program is distributed in the hope that it will be useful, but WITHOUT
  458. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  459. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  460. + * details.
  461. + *
  462. + * You should have received a copy of the GNU General Public License along with
  463. + * this program. If not, see <http://www.gnu.org/licenses/>.
  464. + */
  465. +package Base.Dev.Dungeon;
  466. +
  467. +import java.io.File;
  468. +import java.sql.Connection;
  469. +import java.sql.PreparedStatement;
  470. +import java.sql.ResultSet;
  471. +import java.util.ArrayList;
  472. +import java.util.HashMap;
  473. +import java.util.List;
  474. +import java.util.Map;
  475. +import java.util.concurrent.ConcurrentHashMap;
  476. +import java.util.concurrent.CopyOnWriteArrayList;
  477. +import java.util.logging.Level;
  478. +import java.util.logging.Logger;
  479. +
  480. +
  481. +
  482. +import org.w3c.dom.Document;
  483. +import org.w3c.dom.NamedNodeMap;
  484. +import org.w3c.dom.Node;
  485. +
  486. +import com.l2jfrozen.gameserver.model.Location;
  487. +import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
  488. +import com.l2jfrozen.gameserver.thread.ThreadPool;
  489. +import com.l2jfrozen.util.database.L2DatabaseFactory;
  490. +
  491. +import Base.XML.XMLDocumentFactory;
  492. +
  493. +/**
  494. + * @author Juvenil Walker
  495. + */
  496. +public class DungeonManager
  497. +{
  498. +   private static Logger log = Logger.getLogger(DungeonManager.class.getName());
  499. +  
  500. +   private Map<Integer, DungeonTemplate> templates;
  501. +   private List<Dungeon> running;
  502. +   private List<Integer> dungeonParticipants;
  503. +   private boolean reloading = false;
  504. +   private Map<String, Long[]> dungeonPlayerData;
  505. +  
  506. +   protected DungeonManager()
  507. +   {
  508. +       templates = new ConcurrentHashMap<>();
  509. +       running = new CopyOnWriteArrayList<>();
  510. +       dungeonParticipants = new CopyOnWriteArrayList<>();
  511. +       dungeonPlayerData = new ConcurrentHashMap<>();
  512. +      
  513. +       load();
  514. +       ThreadPool.scheduleAtFixedRate(() -> updateDatabase(), 1000 * 60 * 30, 1000 * 60 * 60);
  515. +   }
  516. +  
  517. +   private void updateDatabase()
  518. +   {
  519. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  520. +       {
  521. +           PreparedStatement stm = con.prepareStatement("DELETE FROM dungeon");
  522. +           stm.execute();
  523. +          
  524. +           for (String ip : dungeonPlayerData.keySet())
  525. +           {
  526. +               for (int i = 1; i < dungeonPlayerData.get(ip).length; i++)
  527. +               {
  528. +                   PreparedStatement stm2 = con.prepareStatement("INSERT INTO dungeon VALUES (?,?,?)");
  529. +                   stm2.setInt(1, i);
  530. +                   stm2.setString(2, ip);
  531. +                   stm2.setLong(3, dungeonPlayerData.get(ip)[i]);
  532. +                   stm2.execute();
  533. +                   stm2.close();
  534. +               }
  535. +           }
  536. +          
  537. +           stm.close();
  538. +       }
  539. +       catch (Exception e)
  540. +       {
  541. +           e.printStackTrace();
  542. +       }
  543. +   }
  544. +  
  545. +   public boolean reload()
  546. +   {
  547. +       if (!running.isEmpty())
  548. +       {
  549. +           reloading = true;
  550. +           return false;
  551. +       }
  552. +      
  553. +       templates.clear();
  554. +       load();
  555. +       return true;
  556. +   }
  557. +  
  558. +   private void load()
  559. +   {
  560. +       try
  561. +       {
  562. +           File f = new File("./events/Dungeon.xml");
  563. +           Document doc = XMLDocumentFactory.getInstance().loadDocument(f);
  564. +          
  565. +           Node n = doc.getFirstChild();
  566. +           for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
  567. +           {
  568. +               if (d.getNodeName().equals("dungeon"))
  569. +               {
  570. +                   int id = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
  571. +                   String name = d.getAttributes().getNamedItem("name").getNodeValue();
  572. +                   int players = Integer.parseInt(d.getAttributes().getNamedItem("players").getNodeValue());
  573. +                   Map<Integer, Integer> rewards = new HashMap<>();
  574. +                   String rewardHtm = d.getAttributes().getNamedItem("rewardHtm").getNodeValue();
  575. +                   Map<Integer, DungeonStage> stages = new HashMap<>();
  576. +                  
  577. +                   String rewards_data = d.getAttributes().getNamedItem("rewards").getNodeValue();
  578. +                   if (!rewards_data.isEmpty()) // If config is empty do not feed the rewards
  579. +                   {
  580. +                       String[] rewards_data_split = rewards_data.split(";");
  581. +                       for (String reward : rewards_data_split)
  582. +                       {
  583. +                           String[] reward_split = reward.split(",");
  584. +                           rewards.put(Integer.parseInt(reward_split[0]), Integer.parseInt(reward_split[1]));
  585. +                       }
  586. +                   }
  587. +                  
  588. +                   for (Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling())
  589. +                   {
  590. +                       NamedNodeMap attrs = cd.getAttributes();
  591. +                      
  592. +                       if (cd.getNodeName().equals("stage"))
  593. +                       {
  594. +                           int order = Integer.parseInt(attrs.getNamedItem("order").getNodeValue());
  595. +                           String loc_data = attrs.getNamedItem("loc").getNodeValue();
  596. +                           String[] loc_data_split = loc_data.split(",");
  597. +                           Location loc = new Location(Integer.parseInt(loc_data_split[0]), Integer.parseInt(loc_data_split[1]), Integer.parseInt(loc_data_split[2]));
  598. +                           boolean teleport = Boolean.parseBoolean(attrs.getNamedItem("teleport").getNodeValue());
  599. +                           int minutes = Integer.parseInt(attrs.getNamedItem("minutes").getNodeValue());
  600. +                           Map<Integer, List<Location>> mobs = new HashMap<>();
  601. +                          
  602. +                           for (Node ccd = cd.getFirstChild(); ccd != null; ccd = ccd.getNextSibling())
  603. +                           {
  604. +                               NamedNodeMap attrs2 = ccd.getAttributes();
  605. +                              
  606. +                               if (ccd.getNodeName().equals("mob"))
  607. +                               {
  608. +                                   int npcId = Integer.parseInt(attrs2.getNamedItem("npcId").getNodeValue());
  609. +                                   List<Location> locs = new ArrayList<>();
  610. +                                  
  611. +                                   String locs_data = attrs2.getNamedItem("locs").getNodeValue();
  612. +                                   String[] locs_data_split = locs_data.split(";");
  613. +                                   for (String locc : locs_data_split)
  614. +                                   {
  615. +                                       String[] locc_data = locc.split(",");
  616. +                                       locs.add(new Location(Integer.parseInt(locc_data[0]), Integer.parseInt(locc_data[1]), Integer.parseInt(locc_data[2])));
  617. +                                   }
  618. +                                  
  619. +                                   mobs.put(npcId, locs);
  620. +                               }
  621. +                           }
  622. +                          
  623. +                           stages.put(order, new DungeonStage(order, loc, teleport, minutes, mobs));
  624. +                       }
  625. +                   }
  626. +                  
  627. +                   templates.put(id, new DungeonTemplate(id, name, players, rewards, rewardHtm, stages));
  628. +               }
  629. +           }
  630. +       }
  631. +       catch (Exception e)
  632. +       {
  633. +           log.log(Level.WARNING, "DungeonManager: Error loading dungeons.xml", e);
  634. +           e.printStackTrace();
  635. +       }
  636. +      
  637. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  638. +       {
  639. +           PreparedStatement stm = con.prepareStatement("SELECT * FROM dungeon");
  640. +           ResultSet rset = stm.executeQuery();
  641. +          
  642. +           while (rset.next())
  643. +           {
  644. +               int dungid = rset.getInt("dungid");
  645. +               String ipaddr = rset.getString("ipaddr");
  646. +               long lastjoin = rset.getLong("lastjoin");
  647. +              
  648. +               if (!dungeonPlayerData.containsKey(ipaddr))
  649. +               {
  650. +                   Long[] times = new Long[templates.size() + 1];
  651. +                   for (int i = 0; i < times.length; i++)
  652. +                       times[i] = 0L;
  653. +                   times[dungid] = lastjoin;
  654. +                  
  655. +                   dungeonPlayerData.put(ipaddr, times);
  656. +               }
  657. +               else
  658. +                   dungeonPlayerData.get(ipaddr)[dungid] = lastjoin;
  659. +           }
  660. +          
  661. +           rset.close();
  662. +           stm.close();
  663. +       }
  664. +       catch (Exception e)
  665. +       {
  666. +           e.printStackTrace();
  667. +       }
  668. +      
  669. +       log.info("DungeonManager: Loaded " + templates.size() + " dungeon templates");
  670. +   }
  671. +  
  672. +   public synchronized void removeDungeon(Dungeon dungeon)
  673. +   {
  674. +       running.remove(dungeon);
  675. +      
  676. +       if (reloading && running.isEmpty())
  677. +       {
  678. +           reloading = false;
  679. +           reload();
  680. +       }
  681. +   }
  682. +  
  683. +   public synchronized void enterDungeon(int id, L2PcInstance player)
  684. +   {
  685. +       if (reloading)
  686. +       {
  687. +           player.sendMessage("The Dungeon system is reloading, please try again in a few minutes.");
  688. +           return;
  689. +       }
  690. +      
  691. +       DungeonTemplate template = templates.get(id);
  692. +       if (template.getPlayers() > 1 && (!player.isInParty() || player.getParty().getMemberCount() != template.getPlayers()))
  693. +       {
  694. +           player.sendMessage("You need a party of " + template.getPlayers() + " players to enter this Dungeon.");
  695. +           return;
  696. +       }
  697. +       else if (template.getPlayers() == 1 && player.isInParty())
  698. +       {
  699. +           player.sendMessage("You can only enter this Dungeon alone.");
  700. +           return;
  701. +       }
  702. +      
  703. +       List<L2PcInstance> players = new ArrayList<>();
  704. +       if (player.isInParty())
  705. +       {
  706. +           for (L2PcInstance pm : player.getParty().getPartyMembers())
  707. +           {
  708. +               String pmip = pm.getIP();
  709. +               if (dungeonPlayerData.containsKey(pmip) && (System.currentTimeMillis() - dungeonPlayerData.get(pmip)[template.getId()] < 1000 * 60 * 60 * 24))
  710. +               {
  711. +                   player.sendMessage("One of your party members cannot join this Dungeon because 24 hours have not passed since they last joined.");
  712. +                   return;
  713. +               }
  714. +           }
  715. +          
  716. +           for (L2PcInstance pm : player.getParty().getPartyMembers())
  717. +           {
  718. +               String pmip = pm.getIP();
  719. +              
  720. +               dungeonParticipants.add(pm.getObjectId());
  721. +               players.add(pm);
  722. +               if (dungeonPlayerData.containsKey(pmip))
  723. +                   dungeonPlayerData.get(pmip)[template.getId()] = System.currentTimeMillis();
  724. +               else
  725. +               {
  726. +                   Long[] times = new Long[templates.size() + 1];
  727. +                   for (int i = 0; i < times.length; i++)
  728. +                       times[i] = 0L;
  729. +                   times[template.getId()] = System.currentTimeMillis();
  730. +                   dungeonPlayerData.put(pmip, times);
  731. +               }
  732. +           }
  733. +       }
  734. +       else
  735. +       {
  736. +           String pmip = player.getIP();
  737. +           if (dungeonPlayerData.containsKey(pmip) && (System.currentTimeMillis() - dungeonPlayerData.get(pmip)[template.getId()] < 1000 * 60 * 60 * 24))
  738. +           {
  739. +               player.sendMessage("24 hours have not passed since you last entered this Dungeon.");
  740. +               return;
  741. +           }
  742. +          
  743. +           dungeonParticipants.add(player.getObjectId());
  744. +           players.add(player);
  745. +           if (dungeonPlayerData.containsKey(pmip))
  746. +               dungeonPlayerData.get(pmip)[template.getId()] = System.currentTimeMillis();
  747. +           else
  748. +           {
  749. +               Long[] times = new Long[templates.size() + 1];
  750. +               for (int i = 0; i < times.length; i++)
  751. +                   times[i] = 0L;
  752. +               times[template.getId()] = System.currentTimeMillis();
  753. +               dungeonPlayerData.put(pmip, times);
  754. +           }
  755. +       }
  756. +      
  757. +       running.add(new Dungeon(template, players));
  758. +   }
  759. +  
  760. +   public boolean isReloading()
  761. +   {
  762. +       return reloading;
  763. +   }
  764. +  
  765. +   public boolean isInDungeon(L2PcInstance player)
  766. +   {
  767. +       for (Dungeon dungeon : running)
  768. +           for (L2PcInstance p : dungeon.getPlayers())
  769. +               if (p == player)
  770. +                   return true;
  771. +              
  772. +       return false;
  773. +   }
  774. +  
  775. +   public Map<String, Long[]> getPlayerData()
  776. +   {
  777. +       return dungeonPlayerData;
  778. +   }
  779. +  
  780. +   public List<Integer> getDungeonParticipants()
  781. +   {
  782. +       return dungeonParticipants;
  783. +   }
  784. +  
  785. +   public static DungeonManager getInstance()
  786. +   {
  787. +       return SingletonHolder.instance;
  788. +   }
  789. +  
  790. +   private static class SingletonHolder
  791. +   {
  792. +       protected static final DungeonManager instance = new DungeonManager();
  793. +   }
  794. +}
  795.  
  796. ### Eclipse Workspace Patch 1.0
  797. #P L2jFrozen_GameServer
  798. Index: head-src/Base/Dev/Dungeon/DungeonStage.java
  799. ===================================================================
  800. --- head-src/Base/Dev/Dungeon/DungeonStage.java   (nonexistent)
  801. +++ head-src/Base/Dev/Dungeon/DungeonStage.java   (working copy)
  802. +/*
  803. + * This program is free software: you can redistribute it and/or modify it under
  804. + * the terms of the GNU General Public License as published by the Free Software
  805. + * Foundation, either version 3 of the License, or (at your option) any later
  806. + * version.
  807. + *
  808. + * This program is distributed in the hope that it will be useful, but WITHOUT
  809. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  810. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  811. + * details.
  812. + *
  813. + * You should have received a copy of the GNU General Public License along with
  814. + * this program. If not, see <http://www.gnu.org/licenses/>.
  815. + */
  816. +package Base.Dev.Dungeon;
  817. +
  818. +import java.util.List;
  819. +import java.util.Map;
  820. +
  821. +import com.l2jfrozen.gameserver.model.Location;
  822. +
  823. +
  824. +/**
  825. + * @author Anarchy
  826. + *
  827. + */
  828. +public class DungeonStage
  829. +{
  830. +   private int order;
  831. +   private Location location;
  832. +   private boolean teleport;
  833. +   private int minutes;
  834. +   private Map<Integer, List<Location>> mobs;
  835. +  
  836. +   public DungeonStage(int order, Location location, boolean teleport, int minutes, Map<Integer, List<Location>> mobs)
  837. +   {
  838. +       this.order = order;
  839. +       this.location = location;
  840. +       this.teleport = teleport;
  841. +       this.minutes = minutes;
  842. +       this.mobs = mobs;
  843. +   }
  844. +  
  845. +   public int getOrder()
  846. +   {
  847. +       return order;
  848. +   }
  849. +  
  850. +   public Location getLocation()
  851. +   {
  852. +       return location;
  853. +   }
  854. +  
  855. +   public boolean teleport()
  856. +   {
  857. +       return teleport;
  858. +   }
  859. +  
  860. +   public int getMinutes()
  861. +   {
  862. +       return minutes;
  863. +   }
  864. +  
  865. +   public Map<Integer, List<Location>> getMobs()
  866. +   {
  867. +       return mobs;
  868. +   }
  869. +}
  870.  
  871. ### Eclipse Workspace Patch 1.0
  872. #P L2jFrozen_GameServer
  873. Index: head-src/Base/Dev/Dungeon/DungeonTemplate.java
  874. ===================================================================
  875. --- head-src/Base/Dev/Dungeon/DungeonTemplate.java   (nonexistent)
  876. +++ head-src/Base/Dev/Dungeon/DungeonTemplate.java   (working copy)
  877. +/*
  878. + * This program is free software: you can redistribute it and/or modify it under
  879. + * the terms of the GNU General Public License as published by the Free Software
  880. + * Foundation, either version 3 of the License, or (at your option) any later
  881. + * version.
  882. + *
  883. + * This program is distributed in the hope that it will be useful, but WITHOUT
  884. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  885. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  886. + * details.
  887. + *
  888. + * You should have received a copy of the GNU General Public License along with
  889. + * this program. If not, see <http://www.gnu.org/licenses/>.
  890. + */
  891. +package Base.Dev.Dungeon;
  892. +
  893. +import java.util.Map;
  894. +
  895. +/**
  896. + * @author Anarchy
  897. + *
  898. + */
  899. +public class DungeonTemplate
  900. +{
  901. +   private int id;
  902. +   private String name;
  903. +   private int players;
  904. +   private Map<Integer, Integer> rewards;
  905. +   private String rewardHtm;
  906. +   private Map<Integer, DungeonStage> stages;
  907. +  
  908. +   public DungeonTemplate(int id, String name, int players, Map<Integer, Integer> rewards, String rewardHtm, Map<Integer, DungeonStage> stages)
  909. +   {
  910. +       this.id = id;
  911. +       this.name = name;
  912. +       this.players = players;
  913. +       this.rewards = rewards;
  914. +       this.rewardHtm = rewardHtm;
  915. +       this.stages = stages;
  916. +   }
  917. +  
  918. +   public int getId()
  919. +   {
  920. +       return id;
  921. +   }
  922. +  
  923. +   public String getName()
  924. +   {
  925. +       return name;
  926. +   }
  927. +  
  928. +   public int getPlayers()
  929. +   {
  930. +       return players;
  931. +   }
  932. +  
  933. +   public Map<Integer, Integer> getRewards()
  934. +   {
  935. +       return rewards;
  936. +   }
  937. +  
  938. +   public String getRewardHtm()
  939. +   {
  940. +       return rewardHtm;
  941. +   }
  942. +  
  943. +   public Map<Integer, DungeonStage> getStages()
  944. +   {
  945. +       return stages;
  946. +   }
  947. +}
  948.  
  949. ### Eclipse Workspace Patch 1.0
  950. #P L2jFrozen_GameServer
  951. Index: head-src/Base/Dev/Dungeon/Instance.java
  952. ===================================================================
  953. --- head-src/Base/Dev/Dungeon/Instance.java   (nonexistent)
  954. +++ head-src/Base/Dev/Dungeon/Instance.java   (working copy)
  955. +/*
  956. + * This program is free software: you can redistribute it and/or modify it under
  957. + * the terms of the GNU General Public License as published by the Free Software
  958. + * Foundation, either version 3 of the License, or (at your option) any later
  959. + * version.
  960. + *
  961. + * This program is distributed in the hope that it will be useful, but WITHOUT
  962. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  963. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  964. + * details.
  965. + *
  966. + * You should have received a copy of the GNU General Public License along with
  967. + * this program. If not, see <http://www.gnu.org/licenses/>.
  968. + */
  969. +package Base.Dev.Dungeon;
  970. +
  971. +import java.util.ArrayList;
  972. +import java.util.List;
  973. +
  974. +import com.l2jfrozen.gameserver.model.actor.instance.L2DoorInstance;
  975. +
  976. +
  977. +
  978. +/**
  979. + * @author Anarchy
  980. + *
  981. + */
  982. +public class Instance
  983. +{
  984. +   private int id;
  985. +   private List<L2DoorInstance> doors;
  986. +  
  987. +   public Instance(int id)
  988. +   {
  989. +       this.id = id;
  990. +       doors = new ArrayList<>();
  991. +   }
  992. +  
  993. +   public void openDoors()
  994. +   {
  995. +       for (L2DoorInstance door : doors)
  996. +           door.openMe();
  997. +   }
  998. +  
  999. +   public void closeDoors()
  1000. +   {
  1001. +       for (L2DoorInstance door : doors)
  1002. +           door.closeMe();
  1003. +   }
  1004. +  
  1005. +   public void addDoor(L2DoorInstance door)
  1006. +   {
  1007. +       doors.add(door);
  1008. +   }
  1009. +  
  1010. +   public List<L2DoorInstance> getDoors()
  1011. +   {
  1012. +       return doors;
  1013. +   }
  1014. +  
  1015. +   public int getId()
  1016. +   {
  1017. +       return id;
  1018. +   }
  1019. +}
  1020.  
  1021. ### Eclipse Workspace Patch 1.0
  1022. #P L2jFrozen_GameServer
  1023. Index: head-src/Base/Dev/Dungeon/InstanceIdFactory.java
  1024. ===================================================================
  1025. --- head-src/Base/Dev/Dungeon/InstanceIdFactory.java   (nonexistent)
  1026. +++ head-src/Base/Dev/Dungeon/InstanceIdFactory.java   (working copy)
  1027. +/*
  1028. + * This program is free software: you can redistribute it and/or modify it under
  1029. + * the terms of the GNU General Public License as published by the Free Software
  1030. + * Foundation, either version 3 of the License, or (at your option) any later
  1031. + * version.
  1032. + *
  1033. + * This program is distributed in the hope that it will be useful, but WITHOUT
  1034. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  1035. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  1036. + * details.
  1037. + *
  1038. + * You should have received a copy of the GNU General Public License along with
  1039. + * this program. If not, see <http://www.gnu.org/licenses/>.
  1040. + */
  1041. +package Base.Dev.Dungeon;
  1042. +
  1043. +import java.util.concurrent.atomic.AtomicInteger;
  1044. +
  1045. +/**
  1046. + * @author Anarchy
  1047. + *
  1048. + */
  1049. +public final class InstanceIdFactory
  1050. +{
  1051. +   private static AtomicInteger nextAvailable = new AtomicInteger(1);
  1052. +  
  1053. +   public synchronized static int getNextAvailable()
  1054. +   {
  1055. +       return nextAvailable.getAndIncrement();
  1056. +   }
  1057. +}
  1058.  
  1059.  
  1060. ### Eclipse Workspace Patch 1.0
  1061. #P L2jFrozen_GameServer
  1062. Index: head-src/Base/Dev/Dungeon/InstanceManager.java
  1063. ===================================================================
  1064. --- head-src/Base/Dev/Dungeon/InstanceManager.java   (nonexistent)
  1065. +++ head-src/Base/Dev/Dungeon/InstanceManager.java   (working copy)
  1066. +/*
  1067. + * This program is free software: you can redistribute it and/or modify it under
  1068. + * the terms of the GNU General Public License as published by the Free Software
  1069. + * Foundation, either version 3 of the License, or (at your option) any later
  1070. + * version.
  1071. + *
  1072. + * This program is distributed in the hope that it will be useful, but WITHOUT
  1073. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  1074. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  1075. + * details.
  1076. + *
  1077. + * You should have received a copy of the GNU General Public License along with
  1078. + * this program. If not, see <http://www.gnu.org/licenses/>.
  1079. + */
  1080. +package Base.Dev.Dungeon;
  1081. +
  1082. +import java.util.Map;
  1083. +import java.util.concurrent.ConcurrentHashMap;
  1084. +
  1085. +import com.l2jfrozen.gameserver.model.actor.instance.L2DoorInstance;
  1086. +
  1087. +
  1088. +
  1089. +/**
  1090. + * @author Anarchy
  1091. + *
  1092. + */
  1093. +public class InstanceManager
  1094. +{
  1095. +   private Map<Integer, Instance> instances;
  1096. +  
  1097. +   protected InstanceManager()
  1098. +   {
  1099. +       instances = new ConcurrentHashMap<>();
  1100. +       instances.put(0, new Instance(0));
  1101. +   }
  1102. +  
  1103. +   public void addDoor(int id, L2DoorInstance door)
  1104. +   {
  1105. +       if (!instances.containsKey(id) || id == 0)
  1106. +           return;
  1107. +      
  1108. +       instances.get(id).addDoor(door);
  1109. +   }
  1110. +  
  1111. +   public void deleteInstance(int id)
  1112. +   {
  1113. +       if (id == 0)
  1114. +       {
  1115. +           System.out.println("Attempt to delete instance with id 0.");
  1116. +           return;
  1117. +       }
  1118. +      
  1119. +       // delete doors
  1120. +   }
  1121. +  
  1122. +   public synchronized Instance createInstance()
  1123. +   {
  1124. +       Instance instance = new Instance(InstanceIdFactory.getNextAvailable());
  1125. +       instances.put(instance.getId(), instance);
  1126. +       return instance;
  1127. +   }
  1128. +  
  1129. +   public Instance getInstance(int id)
  1130. +   {
  1131. +       return instances.get(id);
  1132. +   }
  1133. +  
  1134. +   public static InstanceManager getInstance()
  1135. +   {
  1136. +       return SingletonHolder.instance;
  1137. +   }
  1138. +  
  1139. +   private static final class SingletonHolder
  1140. +   {
  1141. +       protected static final InstanceManager instance = new InstanceManager();
  1142. +   }
  1143. +}
  1144.  
  1145. ### Eclipse Workspace Patch 1.0
  1146. #P L2jFrozen_GameServer
  1147. Index: head-src/Base/Manager/NewCharTaskManager.java
  1148. ===================================================================
  1149. --- head-src/Base/Manager/NewCharTaskManager.java   (nonexistent)
  1150. +++ head-src/Base/Manager/NewCharTaskManager.java     (working copy)
  1151. +package Base.Manager;
  1152. +
  1153. +import java.util.Map;
  1154. +import java.util.concurrent.ConcurrentHashMap;
  1155. +
  1156. +import com.l2jfrozen.gameserver.model.L2Character;
  1157. +import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
  1158. +import com.l2jfrozen.gameserver.thread.ThreadPool;
  1159. +
  1160. +
  1161. +/**
  1162. + * @author Baggos
  1163. + */
  1164. +public final class NewCharTaskManager implements Runnable
  1165. +{
  1166. +   private final Map<L2PcInstance, Long> _players = new ConcurrentHashMap<>();
  1167. +
  1168. +   protected NewCharTaskManager()
  1169. +   {
  1170. +       // Run task each 10 second.
  1171. +       ThreadPool.scheduleAtFixedRate(this, 1000, 1000);
  1172. +   }
  1173. +
  1174. +   public final void add(L2PcInstance player)
  1175. +   {
  1176. +       _players.put(player, System.currentTimeMillis());
  1177. +   }
  1178. +
  1179. +   public final void remove(L2Character player)
  1180. +   {
  1181. +       _players.remove(player);
  1182. +   }
  1183. +
  1184. +   @Override
  1185. +   public final void run()
  1186. +   {
  1187. +       if (_players.isEmpty())
  1188. +           return;
  1189. +
  1190. +       for (Map.Entry<L2PcInstance, Long> entry : _players.entrySet())
  1191. +       {
  1192. +           final L2PcInstance player = entry.getKey();
  1193. +
  1194. +           if (player.getMemos().getLong("newEndTime") < System.currentTimeMillis())
  1195. +           {
  1196. +               L2PcInstance.removeNewChar(player);
  1197. +               remove(player);
  1198. +           }
  1199. +       }
  1200. +   }
  1201. +
  1202. +   public static final NewCharTaskManager getInstance()
  1203. +   {
  1204. +       return SingletonHolder._instance;
  1205. +   }
  1206. +
  1207. +   private static class SingletonHolder
  1208. +   {
  1209. +       protected static final NewCharTaskManager _instance = new NewCharTaskManager();
  1210. +   }
  1211. +}
  1212.  
  1213. ### Eclipse Workspace Patch 1.0
  1214. #P L2jFrozen_GameServer
  1215. Index: head-src/Base/Memo/AbstractMemo.java
  1216. ===================================================================
  1217. --- head-src/Base/Memo/AbstractMemo.java  (nonexistent)
  1218. +++ head-src/Base/Memo/AbstractMemo.java    (working copy)
  1219. +package Base.Memo;
  1220. +
  1221. +import java.util.concurrent.atomic.AtomicBoolean;
  1222. +
  1223. +
  1224. +
  1225. +
  1226. +/**
  1227. + * A {@link StatsSet} which overrides methods to prevent doing useless database operations if there is no changes since last edit (it uses an AtomicBoolean to keep edition tracking).<br>
  1228. + * <br>
  1229. + * It also has 2 abstract methods, named restoreMe() and storeMe().
  1230. + */
  1231. +public abstract class AbstractMemo extends StatsSet
  1232. +{
  1233. +   /**
  1234. +    *
  1235. +    */
  1236. +   private static final long serialVersionUID = 1L;
  1237. +   private final AtomicBoolean _hasChanges = new AtomicBoolean(false);
  1238. +
  1239. +   @Override
  1240. +   public final void set(String name, boolean value)
  1241. +   {
  1242. +       _hasChanges.compareAndSet(false, true);
  1243. +       super.set(name, value);
  1244. +   }
  1245. +
  1246. +   @Override
  1247. +   public final void set(String name, double value)
  1248. +   {
  1249. +       _hasChanges.compareAndSet(false, true);
  1250. +       super.set(name, value);
  1251. +   }
  1252. +
  1253. +   @Override
  1254. +   public final void set(String name, Enum<?> value)
  1255. +   {
  1256. +       _hasChanges.compareAndSet(false, true);
  1257. +       super.set(name, value);
  1258. +   }
  1259. +
  1260. +   @Override
  1261. +   public final void set(String name, int value)
  1262. +   {
  1263. +       _hasChanges.compareAndSet(false, true);
  1264. +       super.set(name, value);
  1265. +   }
  1266. +
  1267. +   @Override
  1268. +   public final void set(String name, long value)
  1269. +   {
  1270. +       _hasChanges.compareAndSet(false, true);
  1271. +       super.set(name, value);
  1272. +   }
  1273. +
  1274. +   @Override
  1275. +   public final void set(String name, String value)
  1276. +   {
  1277. +       _hasChanges.compareAndSet(false, true);
  1278. +       super.set(name, value);
  1279. +   }
  1280. +
  1281. +   /**
  1282. +    * @return {@code true} if changes are made since last load/save.
  1283. +    */
  1284. +   public final boolean hasChanges()
  1285. +   {
  1286. +       return _hasChanges.get();
  1287. +   }
  1288. +
  1289. +   /**
  1290. +    * Atomically sets the value to the given updated value if the current value {@code ==} the expected value.
  1291. +    * @param expect
  1292. +    * @param update
  1293. +    * @return {@code true} if successful. {@code false} return indicates that the actual value was not equal to the expected value.
  1294. +    */
  1295. +   public final boolean compareAndSetChanges(boolean expect, boolean update)
  1296. +   {
  1297. +       return _hasChanges.compareAndSet(expect, update);
  1298. +   }
  1299. +
  1300. +   /**
  1301. +    * Removes variable
  1302. +    * @param name
  1303. +    */
  1304. +   public final void remove(String name)
  1305. +   {
  1306. +       _hasChanges.compareAndSet(false, true);
  1307. +       unset(name);
  1308. +   }
  1309. +
  1310. +   protected abstract boolean restoreMe();
  1311. +
  1312. +   protected abstract boolean storeMe();
  1313. +}
  1314.  
  1315. ### Eclipse Workspace Patch 1.0
  1316. #P L2jFrozen_GameServer
  1317. Index: head-src/Base/Memo/StatsSet.java
  1318. ===================================================================
  1319. --- head-src/Base/Memo/StatsSet.java (nonexistent)
  1320. +++ head-src/Base/Memo/StatsSet.java    (working copy)
  1321. +package Base.Memo;
  1322. +
  1323. +import java.util.ArrayList;
  1324. +import java.util.Collections;
  1325. +import java.util.HashMap;
  1326. +import java.util.List;
  1327. +import java.util.Map;
  1328. +
  1329. +/**
  1330. + * This class is used in order to have a set of couples (key,value).<BR>
  1331. + * Methods deployed are accessors to the set (add/get value from its key) and addition of a whole set in the current one.
  1332. + * @author mkizub, G1ta0
  1333. + */
  1334. +public class StatsSet extends HashMap<String, Object>
  1335. +{
  1336. +   /**
  1337. +    *
  1338. +    */
  1339. +   private static final long serialVersionUID = 1L;
  1340. +  
  1341. +   public StatsSet()
  1342. +   {
  1343. +       super();
  1344. +   }
  1345. +
  1346. +   public StatsSet(final int size)
  1347. +   {
  1348. +       super(size);
  1349. +   }
  1350. +
  1351. +   public StatsSet(final StatsSet set)
  1352. +   {
  1353. +       super(set);
  1354. +   }
  1355. +
  1356. +   public void set(final String key, final Object value)
  1357. +   {
  1358. +       put(key, value);
  1359. +   }
  1360. +
  1361. +   public void set(final String key, final String value)
  1362. +   {
  1363. +       put(key, value);
  1364. +   }
  1365. +
  1366. +   public void set(final String key, final boolean value)
  1367. +   {
  1368. +       put(key, value ? Boolean.TRUE : Boolean.FALSE);
  1369. +   }
  1370. +
  1371. +   public void set(final String key, final int value)
  1372. +   {
  1373. +       put(key, value);
  1374. +   }
  1375. +
  1376. +   public void set(final String key, final int[] value)
  1377. +   {
  1378. +       put(key, value);
  1379. +   }
  1380. +
  1381. +   public void set(final String key, final long value)
  1382. +   {
  1383. +       put(key, value);
  1384. +   }
  1385. +
  1386. +   public void set(final String key, final double value)
  1387. +   {
  1388. +       put(key, value);
  1389. +   }
  1390. +
  1391. +   public void set(final String key, final Enum<?> value)
  1392. +   {
  1393. +       put(key, value);
  1394. +   }
  1395. +
  1396. +   public void unset(final String key)
  1397. +   {
  1398. +       remove(key);
  1399. +   }
  1400. +
  1401. +   public boolean getBool(final String key)
  1402. +   {
  1403. +       final Object val = get(key);
  1404. +
  1405. +       if (val instanceof Boolean)
  1406. +           return (Boolean) val;
  1407. +       if (val instanceof String)
  1408. +           return Boolean.parseBoolean((String) val);
  1409. +       if (val instanceof Number)
  1410. +           return ((Number) val).intValue() != 0;
  1411. +
  1412. +       throw new IllegalArgumentException("StatsSet : Boolean value required, but found: " + val + " for key: " + key + ".");
  1413. +   }
  1414. +
  1415. +   public boolean getBool(final String key, final boolean defaultValue)
  1416. +   {
  1417. +       final Object val = get(key);
  1418. +
  1419. +       if (val instanceof Boolean)
  1420. +           return (Boolean) val;
  1421. +       if (val instanceof String)
  1422. +           return Boolean.parseBoolean((String) val);
  1423. +       if (val instanceof Number)
  1424. +           return ((Number) val).intValue() != 0;
  1425. +
  1426. +       return defaultValue;
  1427. +   }
  1428. +
  1429. +   public byte getByte(final String key)
  1430. +   {
  1431. +       final Object val = get(key);
  1432. +
  1433. +       if (val instanceof Number)
  1434. +           return ((Number) val).byteValue();
  1435. +       if (val instanceof String)
  1436. +           return Byte.parseByte((String) val);
  1437. +
  1438. +       throw new IllegalArgumentException("StatsSet : Byte value required, but found: " + val + " for key: " + key + ".");
  1439. +   }
  1440. +
  1441. +   public byte getByte(final String key, final byte defaultValue)
  1442. +   {
  1443. +       final Object val = get(key);
  1444. +
  1445. +       if (val instanceof Number)
  1446. +           return ((Number) val).byteValue();
  1447. +       if (val instanceof String)
  1448. +           return Byte.parseByte((String) val);
  1449. +
  1450. +       return defaultValue;
  1451. +   }
  1452. +
  1453. +   public double getDouble(final String key)
  1454. +   {
  1455. +       final Object val = get(key);
  1456. +
  1457. +       if (val instanceof Number)
  1458. +           return ((Number) val).doubleValue();
  1459. +       if (val instanceof String)
  1460. +           return Double.parseDouble((String) val);
  1461. +       if (val instanceof Boolean)
  1462. +           return (Boolean) val ? 1. : 0.;
  1463. +
  1464. +       throw new IllegalArgumentException("StatsSet : Double value required, but found: " + val + " for key: " + key + ".");
  1465. +   }
  1466. +
  1467. +   public double getDouble(final String key, final double defaultValue)
  1468. +   {
  1469. +       final Object val = get(key);
  1470. +
  1471. +       if (val instanceof Number)
  1472. +           return ((Number) val).doubleValue();
  1473. +       if (val instanceof String)
  1474. +           return Double.parseDouble((String) val);
  1475. +       if (val instanceof Boolean)
  1476. +           return (Boolean) val ? 1. : 0.;
  1477. +
  1478. +       return defaultValue;
  1479. +   }
  1480. +
  1481. +   public double[] getDoubleArray(final String key)
  1482. +   {
  1483. +       final Object val = get(key);
  1484. +
  1485. +       if (val instanceof double[])
  1486. +           return (double[]) val;
  1487. +       if (val instanceof Number)
  1488. +           return new double[]
  1489. +               {
  1490. +           ((Number) val).doubleValue()
  1491. +               };
  1492. +       if (val instanceof String)
  1493. +       {
  1494. +           final String[] vals = ((String) val).split(";");
  1495. +
  1496. +           final double[] result = new double[vals.length];
  1497. +
  1498. +           int i = 0;
  1499. +           for (final String v : vals)
  1500. +               result[i++] = Double.parseDouble(v);
  1501. +
  1502. +           return result;
  1503. +       }
  1504. +
  1505. +       throw new IllegalArgumentException("StatsSet : Double array required, but found: " + val + " for key: " + key + ".");
  1506. +   }
  1507. +
  1508. +   public float getFloat(final String key)
  1509. +   {
  1510. +       final Object val = get(key);
  1511. +
  1512. +       if (val instanceof Number)
  1513. +           return ((Number) val).floatValue();
  1514. +       if (val instanceof String)
  1515. +           return Float.parseFloat((String) val);
  1516. +       if (val instanceof Boolean)
  1517. +           return (Boolean) val ? 1 : 0;
  1518. +
  1519. +       throw new IllegalArgumentException("StatsSet : Float value required, but found: " + val + " for key: " + key + ".");
  1520. +   }
  1521. +
  1522. +   public float getFloat(final String key, final float defaultValue)
  1523. +   {
  1524. +       final Object val = get(key);
  1525. +
  1526. +       if (val instanceof Number)
  1527. +           return ((Number) val).floatValue();
  1528. +       if (val instanceof String)
  1529. +           return Float.parseFloat((String) val);
  1530. +       if (val instanceof Boolean)
  1531. +           return (Boolean) val ? 1 : 0;
  1532. +
  1533. +       return defaultValue;
  1534. +   }
  1535. +
  1536. +   public int getInteger(final String key)
  1537. +   {
  1538. +       final Object val = get(key);
  1539. +
  1540. +       if (val instanceof Number)
  1541. +           return ((Number) val).intValue();
  1542. +       if (val instanceof String)
  1543. +           return Integer.parseInt((String) val);
  1544. +       if (val instanceof Boolean)
  1545. +           return (Boolean) val ? 1 : 0;
  1546. +
  1547. +       throw new IllegalArgumentException("StatsSet : Integer value required, but found: " + val + " for key: " + key + ".");
  1548. +   }
  1549. +
  1550. +   public int getInteger(final String key, final int defaultValue)
  1551. +   {
  1552. +       final Object val = get(key);
  1553. +
  1554. +       if (val instanceof Number)
  1555. +           return ((Number) val).intValue();
  1556. +       if (val instanceof String)
  1557. +           return Integer.parseInt((String) val);
  1558. +       if (val instanceof Boolean)
  1559. +           return (Boolean) val ? 1 : 0;
  1560. +
  1561. +       return defaultValue;
  1562. +   }
  1563. +
  1564. +   public int[] getIntegerArray(final String key)
  1565. +   {
  1566. +       final Object val = get(key);
  1567. +
  1568. +       if (val instanceof int[])
  1569. +           return (int[]) val;
  1570. +       if (val instanceof Number)
  1571. +           return new int[]
  1572. +               {
  1573. +           ((Number) val).intValue()
  1574. +               };
  1575. +       if (val instanceof String)
  1576. +       {
  1577. +           final String[] vals = ((String) val).split(";");
  1578. +
  1579. +           final int[] result = new int[vals.length];
  1580. +
  1581. +           int i = 0;
  1582. +           for (final String v : vals)
  1583. +               result[i++] = Integer.parseInt(v);
  1584. +
  1585. +           return result;
  1586. +       }
  1587. +
  1588. +       throw new IllegalArgumentException("StatsSet : Integer array required, but found: " + val + " for key: " + key + ".");
  1589. +   }
  1590. +
  1591. +   public int[] getIntegerArray(final String key, final int[] defaultArray)
  1592. +   {
  1593. +       try
  1594. +       {
  1595. +           return getIntegerArray(key);
  1596. +       }
  1597. +       catch (IllegalArgumentException e)
  1598. +       {
  1599. +           return defaultArray;
  1600. +       }
  1601. +   }
  1602. +
  1603. +   @SuppressWarnings("unchecked")
  1604. +   public <T> List<T> getList(final String key)
  1605. +   {
  1606. +       final Object val = get(key);
  1607. +
  1608. +       if (val == null)
  1609. +           return Collections.emptyList();
  1610. +
  1611. +       return (ArrayList<T>) val;
  1612. +   }
  1613. +
  1614. +   public long getLong(final String key)
  1615. +   {
  1616. +       final Object val = get(key);
  1617. +
  1618. +       if (val instanceof Number)
  1619. +           return ((Number) val).longValue();
  1620. +       if (val instanceof String)
  1621. +           return Long.parseLong((String) val);
  1622. +       if (val instanceof Boolean)
  1623. +           return (Boolean) val ? 1L : 0L;
  1624. +
  1625. +       throw new IllegalArgumentException("StatsSet : Long value required, but found: " + val + " for key: " + key + ".");
  1626. +   }
  1627. +
  1628. +   public long getLong(final String key, final long defaultValue)
  1629. +   {
  1630. +       final Object val = get(key);
  1631. +
  1632. +       if (val instanceof Number)
  1633. +           return ((Number) val).longValue();
  1634. +       if (val instanceof String)
  1635. +           return Long.parseLong((String) val);
  1636. +       if (val instanceof Boolean)
  1637. +           return (Boolean) val ? 1L : 0L;
  1638. +
  1639. +       return defaultValue;
  1640. +   }
  1641. +
  1642. +   public long[] getLongArray(final String key)
  1643. +   {
  1644. +       final Object val = get(key);
  1645. +
  1646. +       if (val instanceof long[])
  1647. +           return (long[]) val;
  1648. +       if (val instanceof Number)
  1649. +           return new long[]
  1650. +               {
  1651. +           ((Number) val).longValue()
  1652. +               };
  1653. +       if (val instanceof String)
  1654. +       {
  1655. +           final String[] vals = ((String) val).split(";");
  1656. +
  1657. +           final long[] result = new long[vals.length];
  1658. +
  1659. +           int i = 0;
  1660. +           for (final String v : vals)
  1661. +               result[i++] = Integer.parseInt(v);
  1662. +
  1663. +           return result;
  1664. +       }
  1665. +
  1666. +       throw new IllegalArgumentException("StatsSet : Long array required, but found: " + val + " for key: " + key + ".");
  1667. +   }
  1668. +
  1669. +   @SuppressWarnings("unchecked")
  1670. +   public <T, U> Map<T, U> getMap(final String key)
  1671. +   {
  1672. +       final Object val = get(key);
  1673. +
  1674. +       if (val == null)
  1675. +           return Collections.emptyMap();
  1676. +
  1677. +       return (HashMap<T, U>) val;
  1678. +   }
  1679. +
  1680. +   public String getString(final String key)
  1681. +   {
  1682. +       final Object val = get(key);
  1683. +
  1684. +       if (val != null)
  1685. +           return String.valueOf(val);
  1686. +
  1687. +       throw new IllegalArgumentException("StatsSet : String value required, but unspecified for key: " + key + ".");
  1688. +   }
  1689. +
  1690. +   public String getString(final String key, final String defaultValue)
  1691. +   {
  1692. +       final Object val = get(key);
  1693. +
  1694. +       if (val != null)
  1695. +           return String.valueOf(val);
  1696. +
  1697. +       return defaultValue;
  1698. +   }
  1699. +
  1700. +   public String[] getStringArray(final String key)
  1701. +   {
  1702. +       final Object val = get(key);
  1703. +
  1704. +       if (val instanceof String[])
  1705. +           return (String[]) val;
  1706. +       if (val instanceof String)
  1707. +           return ((String) val).split(";");
  1708. +
  1709. +       throw new IllegalArgumentException("StatsSet : String array required, but found: " + val + " for key: " + key + ".");
  1710. +   }
  1711. +
  1712. +   @SuppressWarnings("unchecked")
  1713. +   public <A> A getObject(final String key, final Class<A> type)
  1714. +   {
  1715. +       final Object val = get(key);
  1716. +
  1717. +       if (val == null || !type.isAssignableFrom(val.getClass()))
  1718. +           return null;
  1719. +
  1720. +       return (A) val;
  1721. +   }
  1722. +
  1723. +   @SuppressWarnings("unchecked")
  1724. +   public <E extends Enum<E>> E getEnum(final String name, final Class<E> enumClass)
  1725. +   {
  1726. +       final Object val = get(name);
  1727. +
  1728. +       if (val != null && enumClass.isInstance(val))
  1729. +           return (E) val;
  1730. +       if (val instanceof String)
  1731. +           return Enum.valueOf(enumClass, (String) val);
  1732. +
  1733. +       throw new IllegalArgumentException("Enum value of type " + enumClass.getName() + "required, but found: " + val + ".");
  1734. +   }
  1735. +
  1736. +   @SuppressWarnings("unchecked")
  1737. +   public <E extends Enum<E>> E getEnum(final String name, final Class<E> enumClass, final E defaultValue)
  1738. +   {
  1739. +       final Object val = get(name);
  1740. +
  1741. +       if (val != null && enumClass.isInstance(val))
  1742. +           return (E) val;
  1743. +       if (val instanceof String)
  1744. +           return Enum.valueOf(enumClass, (String) val);
  1745. +
  1746. +       return defaultValue;
  1747. +   }
  1748. +}
  1749.  
  1750. ### Eclipse Workspace Patch 1.0
  1751. #P L2jFrozen_GameServer
  1752. Index: head-src/Base/Memo/PlayerMemo.java
  1753. ===================================================================
  1754. --- head-src/Base/Memo/PlayerMemo.java (nonexistent)
  1755. +++ head-src/Base/Memo/PlayerMemo.java    (working copy)
  1756. +package Base.Memo;
  1757. +
  1758. +import java.sql.Connection;
  1759. +import java.sql.PreparedStatement;
  1760. +import java.sql.ResultSet;
  1761. +import java.sql.SQLException;
  1762. +import java.util.logging.Level;
  1763. +import java.util.logging.Logger;
  1764. +
  1765. +import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
  1766. +
  1767. +import com.l2jfrozen.util.database.L2DatabaseFactory;
  1768. +
  1769. +import Base.Util.Mysql;
  1770. +
  1771. +
  1772. +
  1773. +/**
  1774. + * An implementation of {@link AbstractMemo} used for Player. There is a restore/save system.
  1775. + */
  1776. +public class PlayerMemo extends AbstractMemo
  1777. +{
  1778. +   /**
  1779. +    *
  1780. +    */
  1781. +   private static final long serialVersionUID = 1L;
  1782. +  
  1783. +   private static final Logger LOG = Logger.getLogger(PlayerMemo.class.getName());
  1784. +
  1785. +   private static final String SELECT_QUERY = "SELECT * FROM character_memo WHERE charId = ?";
  1786. +   private static final String DELETE_QUERY = "DELETE FROM character_memo WHERE charId = ?";
  1787. +   private static final String INSERT_QUERY = "INSERT INTO character_memo (charId, var, val) VALUES (?, ?, ?)";
  1788. +
  1789. +   private final int _objectId;
  1790. +
  1791. +
  1792. +
  1793. +
  1794. +       /**
  1795. +    * @param objectId
  1796. +    */
  1797. +   public PlayerMemo(int objectId)
  1798. +   {
  1799. +       _objectId = objectId;
  1800. +       restoreMe();
  1801. +   }
  1802. +
  1803. +
  1804. +       // When var exist
  1805. +       public static void changeValue(L2PcInstance player, String name, String value)
  1806. +       {
  1807. +           if (!player.getMemos().containsKey(name))
  1808. +           {
  1809. +               player.sendMessage("Variable is not exist...");
  1810. +               return;
  1811. +           }
  1812. +          
  1813. +           getVarObject(player, name).setValue(value);
  1814. +           Mysql.set("UPDATE character_memo_dungeon SET value=? WHERE obj_id=? AND name=?", value, player.getObjectId(), name);
  1815. +       }
  1816. +      
  1817. +       public static void setVar(L2PcInstance player, String name, String value, long expirationTime)
  1818. +       {
  1819. +           if (player.getMemos().containsKey(name))
  1820. +               getVarObject(player, name).stopExpireTask();
  1821. +
  1822. +           player.getMemos().put(name, new PlayerVar(player, name, value, expirationTime));
  1823. +           Mysql.set("REPLACE INTO character_memo_dungeon (obj_id, name, value, expire_time) VALUES (?,?,?,?)", player.getObjectId(), name, value, expirationTime);
  1824. +       }
  1825. +      
  1826. +       public static void setVar(L2PcInstance player, String name, int value, long expirationTime)
  1827. +       {
  1828. +           setVar(player, name, String.valueOf(value), expirationTime);
  1829. +       }  
  1830. +          
  1831. +       public void setVar(L2PcInstance player, String name, long value, long expirationTime)
  1832. +       {
  1833. +           setVar(player, name, String.valueOf(value), expirationTime);
  1834. +       }
  1835. +      
  1836. +      
  1837. +       public static PlayerVar getVarObject(L2PcInstance player, String name)
  1838. +       {
  1839. +           if(player.getMemos() == null)
  1840. +               return null;
  1841. +          
  1842. +           return (PlayerVar) player.getMemos().get(name);
  1843. +       }
  1844. +      
  1845. +       public static long getVarTimeToExpire(L2PcInstance player, String name)
  1846. +       {
  1847. +           try
  1848. +           {
  1849. +               return getVarObject(player, name).getTimeToExpire();
  1850. +           }
  1851. +           catch (NullPointerException npe)
  1852. +           {
  1853. +           }
  1854. +              
  1855. +           return 0;
  1856. +       }
  1857. +
  1858. +       public static void unsetVar(L2PcInstance player, String name)
  1859. +       {
  1860. +           if (name == null)
  1861. +               return;
  1862. +          
  1863. +           // Avoid possible unsetVar that have elements for login
  1864. +           if(player == null)
  1865. +               return;
  1866. +
  1867. +           PlayerVar pv = (PlayerVar) player.getMemos().get(name);
  1868. +
  1869. +           if (pv != null)
  1870. +           {
  1871. +               if(name.contains("delete_temp_item"))
  1872. +                   pv.getOwner().deleteTempItem(Integer.parseInt(pv.getValue()));
  1873. +               else if(name.contains("solo_hero")) {
  1874. +                   pv.getOwner().broadcastCharInfo();
  1875. +                   pv.getOwner().broadcastUserInfo();
  1876. +               }
  1877. +          
  1878. +
  1879. +               Mysql.set("DELETE FROM character_memo_dungeon WHERE obj_id=? AND name=? LIMIT 1", pv.getOwner().getObjectId(), name);
  1880. +
  1881. +               pv.stopExpireTask();
  1882. +           }
  1883. +       }
  1884. +          
  1885. +       public static void deleteExpiredVar(L2PcInstance player, String name, String value)
  1886. +       {
  1887. +           if (name == null)
  1888. +               return;
  1889. +
  1890. +           if(name.contains("delete_temp_item"))
  1891. +               player.deleteTempItem(Integer.parseInt(value));
  1892. +           /*else if(name.contains("solo_hero")) // Useless
  1893. +               player.broadcastCharInfo();*/
  1894. +          
  1895. +           Mysql.set("DELETE FROM character_memo_dungeon WHERE obj_id=? AND name=? LIMIT 1", player.getObjectId(), name);
  1896. +       }
  1897. +          
  1898. +       public static String getVar(L2PcInstance player, String name)
  1899. +       {
  1900. +           PlayerVar pv = getVarObject(player, name);
  1901. +              
  1902. +           if (pv == null)
  1903. +               return null;
  1904. +
  1905. +           return pv.getValue();
  1906. +       }
  1907. +
  1908. +       public static long getVarTimeToExpireSQL(L2PcInstance player, String name)
  1909. +       {
  1910. +           long expireTime = 0;
  1911. +           try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  1912. +           {
  1913. +               PreparedStatement statement = con.prepareStatement("SELECT expire_time FROM character_memo_dungeon WHERE obj_id = ? AND name = ?");
  1914. +               statement.setLong(1, player.getObjectId());
  1915. +               statement.setString(2, name);
  1916. +               for (ResultSet rset = statement.executeQuery(); rset.next();)
  1917. +                   expireTime = rset.getLong("expire_time");
  1918. +                
  1919. +               con.close();
  1920. +               statement.close();
  1921. +           }
  1922. +           catch (Exception e)
  1923. +           {
  1924. +               e.printStackTrace();
  1925. +           }
  1926. +
  1927. +           return expireTime;
  1928. +       }
  1929. +
  1930. +       public static boolean getVarB(L2PcInstance player, String name, boolean defaultVal)
  1931. +       {
  1932. +           PlayerVar pv = getVarObject(player, name);
  1933. +          
  1934. +           if (pv == null)
  1935. +               return defaultVal;
  1936. +              
  1937. +           return pv.getValueBoolean();
  1938. +       }
  1939. +          
  1940. +       public static boolean getVarB(L2PcInstance player, String name)
  1941. +       {
  1942. +           return getVarB(player, name, false);
  1943. +       }
  1944. +          
  1945. +       public long getVarLong(L2PcInstance player, String name)
  1946. +       {
  1947. +           return getVarLong(player, name, 0L);
  1948. +       }
  1949. +          
  1950. +       public long getVarLong(L2PcInstance player, String name, long defaultVal)
  1951. +       {
  1952. +           long result = defaultVal;
  1953. +           String var = getVar(player, name);
  1954. +           if (var != null)
  1955. +               result = Long.parseLong(var);
  1956. +              
  1957. +           return result;
  1958. +       }
  1959. +
  1960. +       public static int getVarInt(L2PcInstance player, String name)
  1961. +       {
  1962. +           return getVarInt(player, name, 0);
  1963. +       }
  1964. +          
  1965. +       public static int getVarInt(L2PcInstance player, String name, int defaultVal)
  1966. +       {
  1967. +           int result = defaultVal;
  1968. +           String var = getVar(player, name);
  1969. +           if (var != null)
  1970. +           {
  1971. +               if(var.equalsIgnoreCase("true"))
  1972. +                   result = 1;
  1973. +               else if(var.equalsIgnoreCase("false"))
  1974. +                   result = 0;
  1975. +               else
  1976. +                   result = Integer.parseInt(var);
  1977. +           }
  1978. +           return result;
  1979. +       }
  1980. +      
  1981. +       public static void loadVariables(L2PcInstance player)
  1982. +       {
  1983. +           Connection con = null;
  1984. +           PreparedStatement offline = null;
  1985. +           ResultSet rs = null;
  1986. +           try
  1987. +           {
  1988. +               con = L2DatabaseFactory.getInstance().getConnection();
  1989. +               offline = con.prepareStatement("SELECT * FROM character_memo_dungeon WHERE obj_id = ?");
  1990. +               offline.setInt(1, player.getObjectId());
  1991. +               rs = offline.executeQuery();
  1992. +                  
  1993. +               while (rs.next())
  1994. +               {
  1995. +                   String name = rs.getString("name");
  1996. +                   String value = rs.getString("value");
  1997. +                   long expire_time = rs.getLong("expire_time");
  1998. +                   long curtime = System.currentTimeMillis();
  1999. +                  
  2000. +                   if ((expire_time <= curtime) && (expire_time > 0))
  2001. +                   {
  2002. +                       deleteExpiredVar(player, name, rs.getString("value")); //TODO: Remove the Var
  2003. +                       continue;
  2004. +                   }
  2005. +
  2006. +                   player.getMemos().put(name, new PlayerVar(player, name, value, expire_time));
  2007. +               }
  2008. +                
  2009. +               con.close();
  2010. +           }
  2011. +           catch (Exception e)
  2012. +           {
  2013. +               e.printStackTrace();
  2014. +           }
  2015. +           finally
  2016. +           {
  2017. +               Mysql.closeQuietly(con, offline, rs);
  2018. +           }
  2019. +       }
  2020. +
  2021. +       public static String getVarValue(L2PcInstance player, String var, String defaultString)
  2022. +       {
  2023. +           String value = null;
  2024. +           Connection con = null;
  2025. +           PreparedStatement offline = null;
  2026. +           ResultSet rs = null;
  2027. +           try
  2028. +           {
  2029. +               con = L2DatabaseFactory.getInstance().getConnection();
  2030. +               offline = con.prepareStatement("SELECT value FROM character_memo_dungeon WHERE obj_id = ? AND name = ?");
  2031. +               offline.setInt(1, player.getObjectId());
  2032. +               offline.setString(2, var);
  2033. +               rs = offline.executeQuery();
  2034. +               if (rs.next())
  2035. +                   value = rs.getString("value");
  2036. +
  2037. +               con.close();
  2038. +           }
  2039. +           catch (Exception e)
  2040. +           {
  2041. +               e.printStackTrace();
  2042. +           }
  2043. +           finally
  2044. +           {
  2045. +               Mysql.closeQuietly(con, offline, rs);
  2046. +           }
  2047. +           return value == null ? defaultString : value;
  2048. +       }
  2049. +      
  2050. +       public static String getVarValue(int objectId, String var, String defaultString)
  2051. +       {
  2052. +           String value = null;
  2053. +           Connection con = null;
  2054. +           PreparedStatement offline = null;
  2055. +           ResultSet rs = null;
  2056. +           try
  2057. +           {
  2058. +               con = L2DatabaseFactory.getInstance().getConnection();
  2059. +               offline = con.prepareStatement("SELECT value FROM character_memo_dungeon WHERE obj_id = ? AND name = ?");
  2060. +               offline.setInt(1, objectId);
  2061. +               offline.setString(2, var);
  2062. +               rs = offline.executeQuery();
  2063. +               if (rs.next())
  2064. +                   value = rs.getString("value");
  2065. +
  2066. +               con.close();
  2067. +           }
  2068. +           catch (Exception e)
  2069. +           {
  2070. +               e.printStackTrace();
  2071. +           }
  2072. +           finally
  2073. +           {
  2074. +               Mysql.closeQuietly(con, offline, rs);
  2075. +           }
  2076. +           return value == null ? defaultString : value;
  2077. +       }
  2078. +
  2079. +   @Override
  2080. +   public boolean restoreMe()
  2081. +   {
  2082. +       // Restore previous variables.
  2083. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  2084. +       {
  2085. +           PreparedStatement st = con.prepareStatement(SELECT_QUERY);
  2086. +           st.setInt(1, _objectId);
  2087. +
  2088. +           ResultSet rset = st.executeQuery();
  2089. +           while (rset.next())
  2090. +               set(rset.getString("var"), rset.getString("val"));
  2091. +
  2092. +           rset.close();
  2093. +           st.close();
  2094. +       }
  2095. +       catch (SQLException e)
  2096. +       {
  2097. +           LOG.log(Level.SEVERE, "Couldn't restore variables for player id: " + _objectId, e);
  2098. +           return false;
  2099. +       }
  2100. +       finally
  2101. +       {
  2102. +           compareAndSetChanges(true, false);
  2103. +       }
  2104. +       return true;
  2105. +   }
  2106. +
  2107. +   @Override
  2108. +   public boolean storeMe()
  2109. +   {
  2110. +       // No changes, nothing to store.
  2111. +       if (!hasChanges())
  2112. +           return false;
  2113. +
  2114. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  2115. +       {
  2116. +           // Clear previous entries.
  2117. +           PreparedStatement st = con.prepareStatement(DELETE_QUERY);
  2118. +           st.setInt(1, _objectId);
  2119. +           st.execute();
  2120. +           st.close();
  2121. +
  2122. +           // Insert all variables.
  2123. +           st = con.prepareStatement(INSERT_QUERY);
  2124. +           st.setInt(1, _objectId);
  2125. +           for (Entry<String, Object> entry : entrySet())
  2126. +           {
  2127. +               st.setString(2, entry.getKey());
  2128. +               st.setString(3, String.valueOf(entry.getValue()));
  2129. +               st.addBatch();
  2130. +           }
  2131. +           st.executeBatch();
  2132. +           st.close();
  2133. +       }
  2134. +       catch (SQLException e)
  2135. +       {
  2136. +           LOG.log(Level.SEVERE, "Couldn't update variables for player id: " + _objectId, e);
  2137. +           return false;
  2138. +       }
  2139. +       finally
  2140. +       {
  2141. +           compareAndSetChanges(true, false);
  2142. +       }
  2143. +       return true;
  2144. +   }
  2145. +}
  2146.  
  2147.  
  2148. ### Eclipse Workspace Patch 1.0
  2149. #P L2jFrozen_GameServer
  2150. Index: head-src/Base/Memo/PlayerVar.java
  2151. ===================================================================
  2152. --- head-src/Base/Memo/PlayerVar.java (nonexistent)
  2153. +++ head-src/Base/Memo/PlayerVar.java    (working copy)
  2154. +package Base.Memo;
  2155. +
  2156. +import java.util.concurrent.ScheduledFuture;
  2157. +
  2158. +import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
  2159. +import com.l2jfrozen.gameserver.thread.ThreadPool;
  2160. +
  2161. +
  2162. +
  2163. +
  2164. +public class PlayerVar
  2165. +{
  2166. +   private L2PcInstance owner;
  2167. +   private String name;
  2168. +   private String value;
  2169. +   private long expire_time;
  2170. +  
  2171. +   @SuppressWarnings("rawtypes")
  2172. +   private ScheduledFuture task;
  2173. +  
  2174. +   public PlayerVar(L2PcInstance owner, String name, String value, long expire_time)
  2175. +   {
  2176. +       this.owner = owner;
  2177. +       this.name = name;
  2178. +       this.value = value;
  2179. +       this.expire_time = expire_time;
  2180. +      
  2181. +       if (expire_time > 0) // if expires schedule expiration
  2182. +       {
  2183. +           task = ThreadPool.schedule(new PlayerVarExpireTask(this), expire_time - System.currentTimeMillis());
  2184. +       }
  2185. +   }
  2186. +  
  2187. +   public String getName()
  2188. +   {
  2189. +       return name;
  2190. +   }
  2191. +  
  2192. +   public L2PcInstance getOwner()
  2193. +   {
  2194. +       return owner;
  2195. +   }
  2196. +  
  2197. +   public boolean hasExpired()
  2198. +   {
  2199. +       return task == null || task.isDone();
  2200. +   }
  2201. +  
  2202. +   public long getTimeToExpire()
  2203. +   {
  2204. +       return expire_time - System.currentTimeMillis();
  2205. +   }
  2206. +  
  2207. +   public String getValue()
  2208. +   {
  2209. +       return value;
  2210. +   }
  2211. +  
  2212. +   public boolean getValueBoolean()
  2213. +   {
  2214. +       if (isNumeric(value))
  2215. +           return Integer.parseInt(value) > 0;
  2216. +      
  2217. +       return value.equalsIgnoreCase("true");
  2218. +   }
  2219. +  
  2220. +   public void setValue(String val)
  2221. +   {
  2222. +       value = val;
  2223. +   }
  2224. +  
  2225. +   public void stopExpireTask()
  2226. +   {
  2227. +       if (task != null && !task.isDone())
  2228. +       {
  2229. +           task.cancel(true);
  2230. +       }
  2231. +   }
  2232. +  
  2233. +   private static class PlayerVarExpireTask implements Runnable
  2234. +   {
  2235. +       private PlayerVar _pv;
  2236. +      
  2237. +       public PlayerVarExpireTask(PlayerVar pv)
  2238. +       {
  2239. +           _pv = pv;
  2240. +       }
  2241. +      
  2242. +       @Override
  2243. +       public void run()
  2244. +       {
  2245. +           L2PcInstance pc = _pv.getOwner();
  2246. +           if (pc == null)
  2247. +           {
  2248. +               return;
  2249. +           }
  2250. +          
  2251. +           PlayerMemo.unsetVar(pc, _pv.getName());
  2252. +       }
  2253. +   }
  2254. +  
  2255. +   public boolean isNumeric(String str)
  2256. +   {
  2257. +       try
  2258. +       {
  2259. +           @SuppressWarnings("unused")
  2260. +           double d = Double.parseDouble(str);
  2261. +       }
  2262. +       catch (NumberFormatException nfe)
  2263. +       {
  2264. +           return false;
  2265. +       }
  2266. +       return true;
  2267. +   }
  2268. +}
  2269.  
  2270.  
  2271. ### Eclipse Workspace Patch 1.0
  2272. #P L2jFrozen_GameServer
  2273. Index: head-src/Base/Util/Mysql.java
  2274. ===================================================================
  2275. --- head-src/Base/Util/Mysql.java (nonexistent)
  2276. +++ head-src/Base/Util/Mysql.java    (working copy)
  2277. +package Base.Util;
  2278. +
  2279. +import java.sql.Connection;
  2280. +import java.sql.PreparedStatement;
  2281. +import java.sql.ResultSet;
  2282. +import java.sql.SQLException;
  2283. +import java.sql.Statement;
  2284. +import java.util.logging.Logger;
  2285. +
  2286. +import com.l2jfrozen.util.database.L2DatabaseFactory;
  2287. +
  2288. +
  2289. +
  2290. +
  2291. +
  2292. +public abstract class Mysql
  2293. +{
  2294. +   public static final Logger _log = Logger.getLogger(Mysql.class.getName());
  2295. +
  2296. +   /**
  2297. +    * Performs a simple sql queries where unnecessary control parameters <BR>
  2298. +    * NOTE: In this method, the parameters passed are not valid for SQL-injection!
  2299. +    * @param db
  2300. +    * @param query
  2301. +    * @param vars
  2302. +    * @return
  2303. +    */
  2304. +   public static boolean setEx(L2DatabaseFactory db, String query, Object... vars)
  2305. +   {
  2306. +       Connection con = null;
  2307. +       Statement statement = null;
  2308. +       PreparedStatement pstatement = null;
  2309. +       boolean successed = true;
  2310. +      
  2311. +       try
  2312. +       {
  2313. +           if(db == null)
  2314. +               db = L2DatabaseFactory.getInstance();
  2315. +
  2316. +           con = db.getConnection();
  2317. +           if(vars.length == 0)
  2318. +           {
  2319. +               statement = con.createStatement();
  2320. +               statement.executeUpdate(query);
  2321. +               statement.close();
  2322. +           }
  2323. +           else
  2324. +           {
  2325. +               pstatement = con.prepareStatement(query);
  2326. +               setVars(pstatement, vars);
  2327. +               pstatement.executeUpdate();
  2328. +               pstatement.close();
  2329. +           }
  2330. +           con.close();
  2331. +       }
  2332. +       catch(Exception e)
  2333. +       {
  2334. +           _log.warning("Could not execute update '" + query + "': " + e);
  2335. +           e.printStackTrace();
  2336. +           successed = false;
  2337. +       }
  2338. +       finally
  2339. +       {
  2340. +           closeQuietly(con, pstatement);
  2341. +           closeQuietly(statement);
  2342. +       }
  2343. +       return successed;
  2344. +   }
  2345. +
  2346. +   public static void setVars(PreparedStatement statement, Object... vars) throws SQLException
  2347. +   {
  2348. +       Number n;
  2349. +       long long_val;
  2350. +       double double_val;
  2351. +       for(int i = 0; i < vars.length; i++)
  2352. +           if(vars[i] instanceof Number)
  2353. +           {
  2354. +               n = (Number) vars[i];
  2355. +               long_val = n.longValue();
  2356. +               double_val = n.doubleValue();
  2357. +               if(long_val == double_val)
  2358. +                   statement.setLong(i + 1, long_val);
  2359. +               else
  2360. +                   statement.setDouble(i + 1, double_val);
  2361. +           }
  2362. +           else if(vars[i] instanceof String)
  2363. +               statement.setString(i + 1, (String) vars[i]);
  2364. +   }
  2365. +
  2366. +   public static boolean set(String query, Object... vars)
  2367. +   {
  2368. +       return setEx(null, query, vars);
  2369. +   }
  2370. +
  2371. +   public static boolean set(String query)
  2372. +   {
  2373. +       return setEx(null, query);
  2374. +   }
  2375. +  
  2376. +   public static void closeQuietly(Connection conn)
  2377. +   {
  2378. +       try {
  2379. +           close(conn);
  2380. +       } catch (SQLException e) { // NOPMD
  2381. +           // quiet
  2382. +       }
  2383. +   }
  2384. +
  2385. +   public static void closeQuietly(Connection conn, Statement stmt, ResultSet rs) {
  2386. +
  2387. +       try {
  2388. +            closeQuietly(rs);
  2389. +        } finally {
  2390. +            try {
  2391. +                closeQuietly(stmt);
  2392. +            } finally {
  2393. +                closeQuietly(conn);
  2394. +            }
  2395. +        }
  2396. +    }
  2397. +  
  2398. +   public static void closeQuietly(Connection conn, Statement stmt)
  2399. +    {
  2400. +       try {
  2401. +           closeQuietly(stmt);
  2402. +       } finally {
  2403. +           closeQuietly(conn);
  2404. +       }
  2405. +    }
  2406. +
  2407. +   public static void closeQuietly(ResultSet rs) {
  2408. +        try {
  2409. +            close(rs);
  2410. +        } catch (SQLException e) { // NOPMD
  2411. +            // quiet
  2412. +        }
  2413. +    }
  2414. +
  2415. +    public static void closeQuietly(Statement stmt) {
  2416. +        try {
  2417. +            close(stmt);
  2418. +        } catch (SQLException e) { // NOPMD
  2419. +            // quiet
  2420. +        }
  2421. +    }
  2422. +
  2423. +    public static void close(Connection conn) throws SQLException {
  2424. +        if (conn != null) {
  2425. +            conn.close();
  2426. +        }
  2427. +    }
  2428. +
  2429. +    public static void close(ResultSet rs) throws SQLException {
  2430. +        if (rs != null) {
  2431. +            rs.close();
  2432. +        }
  2433. +    }
  2434. +
  2435. +    public static void close(Statement stmt) throws SQLException {
  2436. +        if (stmt != null) {
  2437. +            stmt.close();
  2438. +        }
  2439. +    }
  2440. +  
  2441. +}
  2442.  
  2443.  
  2444. ### Eclipse Workspace Patch 1.0
  2445. #P L2jFrozen_GameServer
  2446. Index: head-src/Base/XML/XMLDocumentFactory.java
  2447. ===================================================================
  2448. --- head-src/Base/XML/XMLDocumentFactory.java (nonexistent)
  2449. +++ head-src/Base/XML/XMLDocumentFactory.java    (working copy)
  2450. +package Base.XML;
  2451. +
  2452. +import java.io.File;
  2453. +
  2454. +import javax.xml.parsers.DocumentBuilder;
  2455. +import javax.xml.parsers.DocumentBuilderFactory;
  2456. +
  2457. +import org.w3c.dom.Document;
  2458. +
  2459. +/**
  2460. + * @author Forsaiken
  2461. + */
  2462. +public final class XMLDocumentFactory
  2463. +{
  2464. +   public static final XMLDocumentFactory getInstance()
  2465. +   {
  2466. +       return SingletonHolder._instance;
  2467. +   }
  2468. +  
  2469. +   private final DocumentBuilder _builder;
  2470. +  
  2471. +   protected XMLDocumentFactory() throws Exception
  2472. +   {
  2473. +       try
  2474. +       {
  2475. +           final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  2476. +           factory.setValidating(false);
  2477. +           factory.setIgnoringComments(true);
  2478. +          
  2479. +           _builder = factory.newDocumentBuilder();
  2480. +       }
  2481. +       catch (Exception e)
  2482. +       {
  2483. +           throw new Exception("Failed initializing", e);
  2484. +       }
  2485. +   }
  2486. +  
  2487. +   public final Document loadDocument(final String filePath) throws Exception
  2488. +   {
  2489. +       return loadDocument(new File(filePath));
  2490. +   }
  2491. +  
  2492. +   public final Document loadDocument(final File file) throws Exception
  2493. +   {
  2494. +       if (!file.exists() || !file.isFile())
  2495. +           throw new Exception("File: " + file.getAbsolutePath() + " doesn't exist and/or is not a file.");
  2496. +      
  2497. +       return _builder.parse(file);
  2498. +   }
  2499. +  
  2500. +   public final Document newDocument()
  2501. +   {
  2502. +       return _builder.newDocument();
  2503. +   }
  2504. +  
  2505. +   private static class SingletonHolder
  2506. +   {
  2507. +       protected static final XMLDocumentFactory _instance;
  2508. +      
  2509. +       static
  2510. +       {
  2511. +           try
  2512. +           {
  2513. +               _instance = new XMLDocumentFactory();
  2514. +           }
  2515. +           catch (Exception e)
  2516. +           {
  2517. +               throw new ExceptionInInitializerError(e);
  2518. +           }
  2519. +       }
  2520. +   }
  2521. +}
  2522.  
  2523. ### Eclipse Workspace Patch 1.0
  2524. #P L2jFrozen_GameServer
  2525. Index: head-src/Base/Config/ExProperties.java
  2526. ===================================================================
  2527. --- head-src/Base/Config/ExProperties.java (nonexistent)
  2528. +++ head-src/Base/Config/ExProperties.java    (working copy)
  2529. +/*
  2530. + * This program is free software: you can redistribute it and/or modify it under
  2531. + * the terms of the GNU General Public License as published by the Free Software
  2532. + * Foundation, either version 3 of the License, or (at your option) any later
  2533. + * version.
  2534. + *
  2535. + * This program is distributed in the hope that it will be useful, but WITHOUT
  2536. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  2537. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  2538. + * details.
  2539. + *
  2540. + * You should have received a copy of the GNU General Public License along with
  2541. + * this program. If not, see <http://www.gnu.org/licenses/>.
  2542. + */
  2543. +package Base.Config;
  2544. +
  2545. +import java.io.File;
  2546. +import java.io.FileInputStream;
  2547. +import java.io.IOException;
  2548. +import java.io.InputStream;
  2549. +import java.util.Properties;
  2550. +
  2551. +/**
  2552. + * @author G1ta0
  2553. + */
  2554. +public class ExProperties extends Properties
  2555. +{
  2556. +   private static final long serialVersionUID = 1L;
  2557. +  
  2558. +   public static final String defaultDelimiter = "[\\s,;]+";
  2559. +  
  2560. +   public void load(final String fileName) throws IOException
  2561. +   {
  2562. +       load(new File(fileName));
  2563. +   }
  2564. +  
  2565. +   public void load(final File file) throws IOException
  2566. +   {
  2567. +       try (InputStream is = new FileInputStream(file))
  2568. +       {
  2569. +           load(is);
  2570. +       }
  2571. +   }
  2572. +  
  2573. +   public boolean getProperty(final String name, final boolean defaultValue)
  2574. +   {
  2575. +       boolean val = defaultValue;
  2576. +      
  2577. +       final String value;
  2578. +      
  2579. +       if ((value = super.getProperty(name, null)) != null)
  2580. +           val = Boolean.parseBoolean(value);
  2581. +      
  2582. +       return val;
  2583. +   }
  2584. +  
  2585. +   public int getProperty(final String name, final int defaultValue)
  2586. +   {
  2587. +       int val = defaultValue;
  2588. +      
  2589. +       final String value;
  2590. +      
  2591. +       if ((value = super.getProperty(name, null)) != null)
  2592. +           val = Integer.parseInt(value);
  2593. +      
  2594. +       return val;
  2595. +   }
  2596. +  
  2597. +   public long getProperty(final String name, final long defaultValue)
  2598. +   {
  2599. +       long val = defaultValue;
  2600. +      
  2601. +       final String value;
  2602. +      
  2603. +       if ((value = super.getProperty(name, null)) != null)
  2604. +           val = Long.parseLong(value);
  2605. +      
  2606. +       return val;
  2607. +   }
  2608. +  
  2609. +   public double getProperty(final String name, final double defaultValue)
  2610. +   {
  2611. +       double val = defaultValue;
  2612. +      
  2613. +       final String value;
  2614. +      
  2615. +       if ((value = super.getProperty(name, null)) != null)
  2616. +           val = Double.parseDouble(value);
  2617. +      
  2618. +       return val;
  2619. +   }
  2620. +  
  2621. +   public String[] getProperty(final String name, final String[] defaultValue)
  2622. +   {
  2623. +       return getProperty(name, defaultValue, defaultDelimiter);
  2624. +   }
  2625. +  
  2626. +   public String[] getProperty(final String name, final String[] defaultValue, final String delimiter)
  2627. +   {
  2628. +       String[] val = defaultValue;
  2629. +       final String value;
  2630. +      
  2631. +       if ((value = super.getProperty(name, null)) != null)
  2632. +           val = value.split(delimiter);
  2633. +      
  2634. +       return val;
  2635. +   }
  2636. +  
  2637. +   public boolean[] getProperty(final String name, final boolean[] defaultValue)
  2638. +   {
  2639. +       return getProperty(name, defaultValue, defaultDelimiter);
  2640. +   }
  2641. +  
  2642. +   public boolean[] getProperty(final String name, final boolean[] defaultValue, final String delimiter)
  2643. +   {
  2644. +       boolean[] val = defaultValue;
  2645. +       final String value;
  2646. +      
  2647. +       if ((value = super.getProperty(name, null)) != null)
  2648. +       {
  2649. +           final String[] values = value.split(delimiter);
  2650. +           val = new boolean[values.length];
  2651. +           for (int i = 0; i < val.length; i++)
  2652. +               val[i] = Boolean.parseBoolean(values[i]);
  2653. +       }
  2654. +      
  2655. +       return val;
  2656. +   }
  2657. +  
  2658. +   public int[] getProperty(final String name, final int[] defaultValue)
  2659. +   {
  2660. +       return getProperty(name, defaultValue, defaultDelimiter);
  2661. +   }
  2662. +  
  2663. +   public int[] getProperty(final String name, final int[] defaultValue, final String delimiter)
  2664. +   {
  2665. +       int[] val = defaultValue;
  2666. +       final String value;
  2667. +      
  2668. +       if ((value = super.getProperty(name, null)) != null)
  2669. +       {
  2670. +           final String[] values = value.split(delimiter);
  2671. +           val = new int[values.length];
  2672. +           for (int i = 0; i < val.length; i++)
  2673. +               val[i] = Integer.parseInt(values[i]);
  2674. +       }
  2675. +      
  2676. +       return val;
  2677. +   }
  2678. +  
  2679. +   public long[] getProperty(final String name, final long[] defaultValue)
  2680. +   {
  2681. +       return getProperty(name, defaultValue, defaultDelimiter);
  2682. +   }
  2683. +  
  2684. +   public long[] getProperty(final String name, final long[] defaultValue, final String delimiter)
  2685. +   {
  2686. +       long[] val = defaultValue;
  2687. +       final String value;
  2688. +      
  2689. +       if ((value = super.getProperty(name, null)) != null)
  2690. +       {
  2691. +           final String[] values = value.split(delimiter);
  2692. +           val = new long[values.length];
  2693. +           for (int i = 0; i < val.length; i++)
  2694. +               val[i] = Long.parseLong(values[i]);
  2695. +       }
  2696. +      
  2697. +       return val;
  2698. +   }
  2699. +  
  2700. +   public double[] getProperty(final String name, final double[] defaultValue)
  2701. +   {
  2702. +       return getProperty(name, defaultValue, defaultDelimiter);
  2703. +   }
  2704. +  
  2705. +   public double[] getProperty(final String name, final double[] defaultValue, final String delimiter)
  2706. +   {
  2707. +       double[] val = defaultValue;
  2708. +       final String value;
  2709. +      
  2710. +       if ((value = super.getProperty(name, null)) != null)
  2711. +       {
  2712. +           final String[] values = value.split(delimiter);
  2713. +           val = new double[values.length];
  2714. +           for (int i = 0; i < val.length; i++)
  2715. +               val[i] = Double.parseDouble(values[i]);
  2716. +       }
  2717. +      
  2718. +       return val;
  2719. +   }
  2720. +}
  2721.  
  2722. ### Eclipse Workspace Patch 1.0
  2723. #P L2jFrozen_GameServer
  2724. Index: head-src/com/l2jfrozen/gameserver/thread/ThreadPool.java
  2725. ===================================================================
  2726. --- head-src/com/l2jfrozen/gameserver/thread/ThreadPool.java   (nonexistent)
  2727. +++ head-src/com/l2jfrozen/gameserver/thread/ThreadPool.java    (working copy)
  2728. +package com.l2jfrozen.gameserver.thread;
  2729. +
  2730. +import java.util.concurrent.ArrayBlockingQueue;
  2731. +import java.util.concurrent.ScheduledFuture;
  2732. +import java.util.concurrent.ScheduledThreadPoolExecutor;
  2733. +import java.util.concurrent.ThreadPoolExecutor;
  2734. +import java.util.concurrent.TimeUnit;
  2735. +import java.util.logging.Logger;
  2736. +
  2737. +import com.l2jfrozen.Config;
  2738. +
  2739. +/**
  2740. + * This class handles thread pooling system. It relies on two ThreadPoolExecutor arrays, which poolers number is generated using config.
  2741.  +* <p>
  2742.  +* Those arrays hold following pools :
  2743.  +* </p>
  2744.  +* <ul>
  2745.  +* <li>Scheduled pool keeps a track about incoming, future events.</li>
  2746.  +* <li>Instant pool handles short-life events.</li>
  2747.  +* </ul>
  2748.  +*/
  2749. +public final class ThreadPool
  2750. +{
  2751. +   protected static final Logger LOG = Logger.getLogger(ThreadPool.class.getName());
  2752. +  
  2753. +   private static final long MAX_DELAY = TimeUnit.NANOSECONDS.toMillis(Long.MAX_VALUE - System.nanoTime()) / 2;
  2754. +  
  2755. +   private static int _threadPoolRandomizer;
  2756. +  
  2757. +   protected static ScheduledThreadPoolExecutor[] _scheduledPools;
  2758. +   protected static ThreadPoolExecutor[] _instantPools;
  2759. +  
  2760. +   /**
  2761. +    * Init the different pools, based on Config. It is launched only once, on Gameserver instance.
  2762. +    */
  2763. +   public static void init()
  2764. +   {
  2765. +       // Feed scheduled pool.
  2766. +       int poolCount = Config.SCHEDULED_THREAD_POOL_COUNT;
  2767. +       if (poolCount == -1)
  2768. +           poolCount = Runtime.getRuntime().availableProcessors();
  2769. +      
  2770. +       _scheduledPools = new ScheduledThreadPoolExecutor[poolCount];
  2771. +       for (int i = 0; i < poolCount; i++)
  2772. +           _scheduledPools[i] = new ScheduledThreadPoolExecutor(Config.THREADS_PER_SCHEDULED_THREAD_POOL);
  2773. +      
  2774. +       // Feed instant pool.
  2775. +       poolCount = Config.INSTANT_THREAD_POOL_COUNT;
  2776. +       if (poolCount == -1)
  2777. +           poolCount = Runtime.getRuntime().availableProcessors();
  2778. +      
  2779. +       _instantPools = new ThreadPoolExecutor[poolCount];
  2780. +       for (int i = 0; i < poolCount; i++)
  2781. +           _instantPools[i] = new ThreadPoolExecutor(Config.THREADS_PER_INSTANT_THREAD_POOL, Config.THREADS_PER_INSTANT_THREAD_POOL, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100000));
  2782. +      
  2783. +       // Prestart core threads.
  2784. +       for (ScheduledThreadPoolExecutor threadPool : _scheduledPools)
  2785. +           threadPool.prestartAllCoreThreads();
  2786. +      
  2787. +       for (ThreadPoolExecutor threadPool : _instantPools)
  2788. +           threadPool.prestartAllCoreThreads();
  2789. +      
  2790. +       // Launch purge task.
  2791. +       scheduleAtFixedRate(new Runnable()
  2792. +       {
  2793. +           @Override
  2794. +           public void run()
  2795. +           {
  2796. +               for (ScheduledThreadPoolExecutor threadPool : _scheduledPools)
  2797. +                   threadPool.purge();
  2798. +              
  2799. +               for (ThreadPoolExecutor threadPool : _instantPools)
  2800. +                   threadPool.purge();
  2801. +           }
  2802. +       }, 600000, 600000);
  2803. +      
  2804. +       LOG.info("ThreadPool: Initialized " + getPoolSize(_scheduledPools) + "/" + getMaximumPoolSize(_scheduledPools) + " scheduled, " + getPoolSize(_instantPools) + "/" + getMaximumPoolSize(_instantPools) + " instant thread(s).");
  2805. +   }
  2806. +  
  2807. +   /**
  2808. +    * Schedules a one-shot action that becomes enabled after a delay. The pool is chosen based on pools activity.
  2809. +    * @param r : the task to execute.
  2810. +    * @param delay : the time from now to delay execution.
  2811. +    * @return a ScheduledFuture representing pending completion of the task and whose get() method will return null upon completion.
  2812. +    */
  2813. +   public static ScheduledFuture<?> schedule(Runnable r, long delay)
  2814. +   {
  2815. +       try
  2816. +       {
  2817. +           return getPool(_scheduledPools).schedule(new TaskWrapper(r), validate(delay), TimeUnit.MILLISECONDS);
  2818. +       }
  2819. +       catch (Exception e)
  2820. +       {
  2821. +           return null;
  2822. +       }
  2823. +   }
  2824. +  
  2825. +   /**
  2826. +    * Schedules a periodic action that becomes enabled after a delay. The pool is chosen based on pools activity.
  2827. +    * @param r : the task to execute.
  2828. +    * @param delay : the time from now to delay execution.
  2829. +    * @param period : the period between successive executions.
  2830. +    * @return a ScheduledFuture representing pending completion of the task and whose get() method will throw an exception upon cancellation.
  2831. +    */
  2832. +   public static ScheduledFuture<?> scheduleAtFixedRate(Runnable r, long delay, long period)
  2833. +   {
  2834. +       try
  2835. +       {
  2836. +           return getPool(_scheduledPools).scheduleAtFixedRate(new TaskWrapper(r), validate(delay), validate(period), TimeUnit.MILLISECONDS);
  2837. +       }
  2838. +       catch (Exception e)
  2839. +       {
  2840. +           return null;
  2841. +       }
  2842. +   }
  2843. +  
  2844. +   /**
  2845. +    * Executes the given task sometime in the future.
  2846. +    * @param r : the task to execute.
  2847. +    */
  2848. +   public static void execute(Runnable r)
  2849. +   {
  2850. +       try
  2851. +       {
  2852. +           getPool(_instantPools).execute(new TaskWrapper(r));
  2853. +       }
  2854. +       catch (Exception e)
  2855. +       {
  2856. +       }
  2857. +   }
  2858. +  
  2859. +   /**
  2860. +    * Retrieve stats of current running thread pools.
  2861. +    */
  2862. +   public static void getStats()
  2863. +   {
  2864. +       for (int i = 0; i < _scheduledPools.length; i++)
  2865. +       {
  2866. +           final ScheduledThreadPoolExecutor threadPool = _scheduledPools[i];
  2867. +          
  2868. +           LOG.info("=================================================");
  2869. +           LOG.info("Scheduled pool #" + i + ":");
  2870. +           LOG.info("\tgetActiveCount: ...... " + threadPool.getActiveCount());
  2871. +           LOG.info("\tgetCorePoolSize: ..... " + threadPool.getCorePoolSize());
  2872. +           LOG.info("\tgetPoolSize: ......... " + threadPool.getPoolSize());
  2873. +           LOG.info("\tgetLargestPoolSize: .. " + threadPool.getLargestPoolSize());
  2874. +           LOG.info("\tgetMaximumPoolSize: .. " + threadPool.getMaximumPoolSize());
  2875. +           LOG.info("\tgetCompletedTaskCount: " + threadPool.getCompletedTaskCount());
  2876. +           LOG.info("\tgetQueuedTaskCount: .. " + threadPool.getQueue().size());
  2877. +           LOG.info("\tgetTaskCount: ........ " + threadPool.getTaskCount());
  2878. +       }
  2879. +      
  2880. +       for (int i = 0; i < _instantPools.length; i++)
  2881. +       {
  2882. +           final ThreadPoolExecutor threadPool = _instantPools[i];
  2883. +          
  2884. +           LOG.info("=================================================");
  2885. +           LOG.info("Instant pool #" + i + ":");
  2886. +           LOG.info("\tgetActiveCount: ...... " + threadPool.getActiveCount());
  2887. +           LOG.info("\tgetCorePoolSize: ..... " + threadPool.getCorePoolSize());
  2888. +           LOG.info("\tgetPoolSize: ......... " + threadPool.getPoolSize());
  2889. +           LOG.info("\tgetLargestPoolSize: .. " + threadPool.getLargestPoolSize());
  2890. +           LOG.info("\tgetMaximumPoolSize: .. " + threadPool.getMaximumPoolSize());
  2891. +           LOG.info("\tgetCompletedTaskCount: " + threadPool.getCompletedTaskCount());
  2892. +           LOG.info("\tgetQueuedTaskCount: .. " + threadPool.getQueue().size());
  2893. +           LOG.info("\tgetTaskCount: ........ " + threadPool.getTaskCount());
  2894. +       }
  2895. +   }
  2896. +  
  2897. +   /**
  2898. +    * Shutdown thread pooling system correctly. Send different informations.
  2899. +    */
  2900. +   public static void shutdown()
  2901. +   {
  2902. +       try
  2903. +       {
  2904. +           System.out.println("ThreadPool: Shutting down.");
  2905. +          
  2906. +           for (ScheduledThreadPoolExecutor threadPool : _scheduledPools)
  2907. +               threadPool.shutdownNow();
  2908. +          
  2909. +           for (ThreadPoolExecutor threadPool : _instantPools)
  2910. +               threadPool.shutdownNow();
  2911. +       }
  2912. +       catch (Throwable t)
  2913. +       {
  2914. +           t.printStackTrace();
  2915. +       }
  2916. +   }
  2917. +  
  2918. +   /**
  2919. +    * @param <T> : The pool type.
  2920. +    * @param threadPools : The pool array to check.
  2921. +    * @return the less fed pool.
  2922. +    */
  2923. +   private static <T> T getPool(T[] threadPools)
  2924. +   {
  2925. +       return threadPools[_threadPoolRandomizer++ % threadPools.length];
  2926. +   }
  2927. +  
  2928. +   /**
  2929. +    * @param delay : The delay to validate.
  2930. +    * @return a secured value, from 0 to MAX_DELAY.
  2931. +    */
  2932. +   private static long validate(long delay)
  2933. +   {
  2934. +       return Math.max(0, Math.min(MAX_DELAY, delay));
  2935. +   }
  2936. +  
  2937. +   /**
  2938. +    * @param threadPools : The pool array to check.
  2939. +    * @return the overall actual pools size.
  2940. +    */
  2941. +   private static long getPoolSize(ThreadPoolExecutor[] threadPools)
  2942. +   {
  2943. +       long result = 0;
  2944. +      
  2945. +       for (ThreadPoolExecutor threadPool : threadPools)
  2946. +           result += threadPool.getPoolSize();
  2947. +      
  2948. +       return result;
  2949. +   }
  2950. +  
  2951. +   /**
  2952. +    * @param threadPools : The pool array to check.
  2953. +    * @return the overall maximum pools size.
  2954. +    */
  2955. +   private static long getMaximumPoolSize(ThreadPoolExecutor[] threadPools)
  2956. +   {
  2957. +       long result = 0;
  2958. +      
  2959. +       for (ThreadPoolExecutor threadPool : threadPools)
  2960. +           result += threadPool.getMaximumPoolSize();
  2961. +      
  2962. +       return result;
  2963. +   }
  2964. +  
  2965. +   public static final class TaskWrapper implements Runnable
  2966. +   {
  2967. +       private final Runnable _runnable;
  2968. +      
  2969. +       public TaskWrapper(Runnable runnable)
  2970. +       {
  2971. +           _runnable = runnable;
  2972. +       }
  2973. +      
  2974. +       @Override
  2975. +       public void run()
  2976. +       {
  2977. +           try
  2978. +           {
  2979. +               _runnable.run();
  2980. +           }
  2981. +           catch (RuntimeException e)
  2982. +           {
  2983. +               LOG.warning("Exception in a Runnable execution:" + e);
  2984. +           }
  2985. +       }
  2986. +   }
  2987. +}
  2988.  
  2989.  
  2990. ### Eclipse Workspace Patch 1.0
  2991. #P L2jFrozen_GameServer
  2992. Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/NpcHtmlMessage.java
  2993. ===================================================================
  2994. --- head-src/com/l2jfrozen/gameserver/network/serverpackets/NpcHtmlMessage.java   (nonexistent)
  2995. +++ head-src/com/l2jfrozen/gameserver/network/serverpackets/NpcHtmlMessage.java    (working copy)
  2996.  
  2997.  
  2998.     /**
  2999.      * Gets the content.
  3000.      * @return the content
  3001.      */
  3002.     public String getContent()
  3003.     {
  3004.         return _html;
  3005.     }
  3006.  
  3007. +   /**
  3008. +    * @return
  3009. +    */
  3010. +   public String getHtml()
  3011. +   {
  3012. +       return _html;
  3013. +   }
  3014.  
  3015.  
  3016. ### Eclipse Workspace Patch 1.0
  3017. #P L2jFrozen_GameServer
  3018. Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/SocialAction.java
  3019. ===================================================================
  3020. --- head-src/com/l2jfrozen/gameserver/network/serverpackets/SocialAction.java   (nonexistent)
  3021. +++ head-src/com/l2jfrozen/gameserver/network/serverpackets/SocialAction.java     (working copy)
  3022.  
  3023. package com.l2jfrozen.gameserver.network.serverpackets;
  3024.  
  3025. +import com.l2jfrozen.gameserver.model.actor.instance.L2DungeonManagerInstance;
  3026.  
  3027.  
  3028.  
  3029.  
  3030.     /**
  3031.      * 0x3d SocialAction dd
  3032.      * @param playerId
  3033.      * @param actionId
  3034.      */
  3035.     public SocialAction(final int playerId, final int actionId)
  3036.     {
  3037.         _charObjId = playerId;
  3038.         _actionId = actionId;
  3039.     }
  3040.    
  3041. +   /**
  3042. +    * 0x3d SocialAction dd
  3043. +    * @param l2DungeonManagerInstance
  3044. +    * @param actionId
  3045. +    */
  3046. +   public SocialAction(final L2DungeonManagerInstance l2DungeonManagerInstance, final int actionId)
  3047. +   {
  3048. +       this._charObjId = 0;
  3049. +       _actionId = actionId;
  3050. +   }  
  3051.  
  3052.  
  3053.  
  3054.  
  3055. ### Eclipse Workspace Patch 1.0
  3056. #P L2jFrozen_GameServer
  3057. Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2DungeonMobInstance.java
  3058. ===================================================================
  3059. --- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2DungeonMobInstance.java   (nonexistent)
  3060. +++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2DungeonMobInstance.java    (working copy)
  3061. +/*
  3062. + * This program is free software: you can redistribute it and/or modify it under
  3063. + * the terms of the GNU General Public License as published by the Free Software
  3064. + * Foundation, either version 3 of the License, or (at your option) any later
  3065. + * version.
  3066. + *
  3067. + * This program is distributed in the hope that it will be useful, but WITHOUT
  3068. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  3069. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  3070. + * details.
  3071. + *
  3072. + * You should have received a copy of the GNU General Public License along with
  3073. + * this program. If not, see <http://www.gnu.org/licenses/>.
  3074. + */
  3075. +package com.l2jfrozen.gameserver.model.actor.instance;
  3076. +
  3077. +import com.l2jfrozen.gameserver.model.L2Character;
  3078. +import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
  3079. +import com.l2jfrozen.gameserver.thread.ThreadPool;
  3080. +
  3081. +import Base.Dev.Dungeon.Dungeon;
  3082. +
  3083. +
  3084. +
  3085. +/**
  3086. + * @author Juvenil Walker
  3087. + *
  3088. + */
  3089. +
  3090. +
  3091. +public class L2DungeonMobInstance extends L2MonsterInstance
  3092. +{
  3093. +   private Dungeon dungeon;
  3094. +  
  3095. +   public L2DungeonMobInstance(int objectId, L2NpcTemplate template)
  3096. +   {
  3097. +       super(objectId, template);
  3098. +   }
  3099. +  
  3100. +   @Override
  3101. +   public boolean doDie(L2Character killer)
  3102. +   {
  3103. +       if (!super.doDie(killer))
  3104. +           return false;
  3105. +      
  3106. +       if(dungeon != null) // It will be dungeon == null when mob is spawned from admin and not from dungeon
  3107. +           ThreadPool.schedule(() -> dungeon.onMobKill(this), 1000*2);
  3108. +      
  3109. +       return true;
  3110. +   }
  3111. +  
  3112. +   public void setDungeon(Dungeon dungeon)
  3113. +   {
  3114. +       this.dungeon = dungeon;
  3115. +   }
  3116. +}
  3117.  
  3118. ### Eclipse Workspace Patch 1.0
  3119. #P L2jFrozen_GameServer
  3120. Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2DungeonManagerInstance.java
  3121. ===================================================================
  3122. --- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2DungeonManagerInstance.java  (nonexistent)
  3123. +++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2DungeonManagerInstance.java   (working copy)
  3124. +package com.l2jfrozen.gameserver.model.actor.instance;
  3125. +
  3126. +import java.util.StringTokenizer;
  3127. +
  3128. +
  3129. +
  3130. +
  3131. +import com.l2jfrozen.Config;
  3132. +import com.l2jfrozen.gameserver.ai.CtrlIntention;
  3133. +import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
  3134. +import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed;
  3135. +import com.l2jfrozen.gameserver.network.serverpackets.ExShowScreenMessage;
  3136. +import com.l2jfrozen.gameserver.network.serverpackets.MyTargetSelected;
  3137. +import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
  3138. +import com.l2jfrozen.gameserver.network.serverpackets.SocialAction;
  3139. +import com.l2jfrozen.gameserver.network.serverpackets.ValidateLocation;
  3140. +import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
  3141. +import com.l2jfrozen.util.random.Rnd;
  3142. +
  3143. +import Base.Dev.Dungeon.DungeonManager;
  3144. +
  3145. +
  3146. +
  3147. +public class L2DungeonManagerInstance extends L2NpcInstance
  3148. +{
  3149. +   public L2DungeonManagerInstance(int objectId, L2NpcTemplate template)
  3150. +   {
  3151. +       super(objectId, template);
  3152. +   }
  3153. +
  3154. +   @Override
  3155. +   public void onAction(L2PcInstance player)
  3156. +   {
  3157. +       if (this != player.getTarget())
  3158. +       {
  3159. +           player.setTarget(this);
  3160. +           player.sendPacket(new MyTargetSelected(getObjectId(), player.getLevel() - getLevel()));
  3161. +           player.sendPacket(new ValidateLocation(this));
  3162. +       }
  3163. +       else if (isInsideRadius(player, INTERACTION_DISTANCE, false, false))
  3164. +       {
  3165. +           SocialAction sa = new SocialAction(this, Rnd.get(8));
  3166. +           broadcastPacket(sa);
  3167. +           showChatWindow(player);
  3168. +           player.sendPacket(ActionFailed.STATIC_PACKET);
  3169. +       }
  3170. +       else
  3171. +       {
  3172. +           player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this);
  3173. +           player.sendPacket(ActionFailed.STATIC_PACKET);
  3174. +       }
  3175. +   }
  3176. +
  3177. +
  3178. +  
  3179. +   public static String getPlayerStatus(L2PcInstance player, int dungeonId)
  3180. +   {
  3181. +       String s = "You can enter";
  3182. +      
  3183. +       String ip = player.getIP(); // Is ip or hwid?
  3184. +       if (DungeonManager.getInstance().getPlayerData().containsKey(ip) && DungeonManager.getInstance().getPlayerData().get(ip)[dungeonId] > 0)
  3185. +       {
  3186. +           long total = (DungeonManager.getInstance().getPlayerData().get(ip)[dungeonId] + (1000*60*60*12)) - System.currentTimeMillis();
  3187. +          
  3188. +           if (total > 0)
  3189. +           {
  3190. +               int hours = (int) (total/1000/60/60);
  3191. +               int minutes = (int) ((total/1000/60) - hours*60);
  3192. +               int seconds = (int) ((total/1000) - (hours*60*60 + minutes*60));
  3193. +              
  3194. +               s = String.format("%02d:%02d:%02d", hours, minutes, seconds);
  3195. +           }
  3196. +       }
  3197. +      
  3198. +       return s;
  3199. +   }
  3200. +
  3201. +   @Override
  3202. +   public void onBypassFeedback(L2PcInstance player, String command)
  3203. +   {
  3204. +       if (command.startsWith("dungeon"))
  3205. +       {
  3206. +
  3207. +                      
  3208. +           if (DungeonManager.getInstance().isInDungeon(player) || player.isInOlympiadMode())
  3209. +           {
  3210. +               player.sendMessage("You are currently unable to enter a Dungeon. Please try again later.");
  3211. +               return;
  3212. +           }
  3213. +          
  3214. +           if (player.isAio())
  3215. +           {
  3216. +               player.sendMessage("AioBuffer: cannot leave You have been teleported to the nearest village.");
  3217. +               return;
  3218. +           }
  3219. +          
  3220. +           if (player.destroyItemByItemId("Donate Coin", Config.DUNGEON_COIN_ID, Config.CONT_DUNGEON_ITEM, null, true))
  3221. +           {
  3222. +               int dungeonId = Integer.parseInt(command.substring(8));
  3223. +              
  3224. +               if(dungeonId == 1 || dungeonId == 2)
  3225. +               {
  3226. +                   DungeonManager.getInstance().enterDungeon(dungeonId, player);
  3227. +               }
  3228. +              
  3229. +               else if (player.isOnline2())
  3230. +               {
  3231. +                   player.sendPacket(new ExShowScreenMessage("Your character Cont Item." +" "+ ItemTable.getInstance().getTemplate(Config.DUNGEON_COIN_ID).getName() + " " + Config.CONT_DUNGEON_ITEM , 6000, 2, true));
  3232. +
  3233. +                   mainHtml(player, 0);
  3234. +               }
  3235. +              
  3236. +           }
  3237. +           else
  3238. +           {
  3239. +               mainHtml(player, 0);
  3240. +               player.sendPacket(new ExShowScreenMessage("Your character Cont Item." +" "+ ItemTable.getInstance().getTemplate(Config.DUNGEON_COIN_ID).getName() + " " + Config.CONT_DUNGEON_ITEM , 6000, 2, true));
  3241. +              
  3242. +           }
  3243. +       }
  3244. +
  3245. +   }
  3246. +
  3247. +   public static void mainHtml(L2PcInstance activeChar, int time)
  3248. +   {
  3249. +      
  3250. +       if (activeChar.isOnline2())
  3251. +       {
  3252. +           NpcHtmlMessage nhm = new NpcHtmlMessage(5);
  3253. +           StringBuilder html1 = new StringBuilder("");
  3254. +           html1.append("<html><head><title>Dungeon</title></head><body><center>");
  3255. +           html1.append("<br>");
  3256. +           html1.append("Your character Cont Item.");
  3257. +           html1.append("</center>");
  3258. +           html1.append("</body></html>");
  3259. +           nhm.setHtml(html1.toString());
  3260. +           activeChar.sendPacket(nhm);
  3261. +       }
  3262. +      
  3263. +   }
  3264. +  
  3265. +   @Override
  3266. +   public void showChatWindow(L2PcInstance player, int val)
  3267. +   {
  3268. +       NpcHtmlMessage htm = new NpcHtmlMessage(getObjectId());
  3269. +       htm.setFile("data/html/mods/Dungeon-L2JDev/"+getNpcId()+(val == 0 ? "" : "-"+val)+".htm");
  3270. +      
  3271. +       String[] s = htm.getHtml().split("%");
  3272. +       for (int i = 0; i < s.length; i++)
  3273. +       {
  3274. +           if (i % 2 > 0 && s[i].contains("dung "))
  3275. +           {
  3276. +               StringTokenizer st = new StringTokenizer(s[i]);
  3277. +               st.nextToken();
  3278. +               htm.replace("%"+s[i]+"%", getPlayerStatus(player, Integer.parseInt(st.nextToken())));
  3279. +           }
  3280. +       }
  3281. +      
  3282. +       htm.replace("%objectId%", getObjectId()+"");
  3283. +      
  3284. +       player.sendPacket(htm);
  3285. +   }
  3286. +}
  3287.  
  3288.  
  3289. ### Eclipse Workspace Patch 1.0
  3290. #P L2jFrozen_GameServer
  3291. Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java
  3292. ===================================================================
  3293. --- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java  (nonexistent)
  3294. +++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java   (working copy)
  3295. import com.l2jfrozen.util.random.Rnd;
  3296. +import Base.Dev.Dungeon.Instance;
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302.     /**
  3303.      * Sets the custom npc instance.
  3304.      * @param arg the new custom npc instance
  3305.      */
  3306.     public void setCustomNpcInstance(final L2CustomNpcInstance arg)
  3307.     {
  3308.         _customNpcInstance = arg;
  3309.     }
  3310.    
  3311.     /**
  3312.      * Throws an action command to L2BufferTeonInstance.<br>
  3313.      * @param player --> Target player
  3314.      * @param buffTemplate --> Name of the Buff Template to Add
  3315.      */
  3316.     public void makeBuffs(final L2PcInstance player, final String buffTemplate)
  3317.     {
  3318.         int _templateId = 0;
  3319.         try
  3320.         {
  3321.             _templateId = Integer.parseInt(buffTemplate);
  3322.         }
  3323.         catch (final NumberFormatException e)
  3324.         {
  3325.             if (Config.ENABLE_ALL_EXCEPTIONS)
  3326.                 e.printStackTrace();
  3327.            
  3328.             player.sendMessage("Buff ID doesn't exist");
  3329.         }
  3330.         if (_templateId > 0)
  3331.         {
  3332.             L2BufferInstance.makeBuffs(player, _templateId, this, true);
  3333.             this.updateEffectIcons();
  3334.         }
  3335.     }
  3336. +   /**
  3337. +    * @param instance
  3338. +    * @param b
  3339. +    */
  3340. +   public void setInstance(Instance instance, boolean b)
  3341. +   {
  3342. +       return;    
  3343. +   }  
  3344.  
  3345.  
  3346.  
  3347. ### Eclipse Workspace Patch 1.0
  3348. #P L2jFrozen_GameServer
  3349. Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java
  3350. ===================================================================
  3351. --- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java  (nonexistent)
  3352. +++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java   (working copy)
  3353.  
  3354. import com.l2jfrozen.util.random.Rnd;
  3355. +import Base.Dev.Dungeon.Dungeon;
  3356. +import Base.Dev.Dungeon.Instance;
  3357. +import Base.Manager.NewCharTaskManager;
  3358. +import Base.Memo.PlayerMemo;
  3359. +import Base.Util.Mysql;
  3360.  
  3361.  
  3362.  
  3363.                     CursedWeaponsManager.getInstance().activate(this, item);
  3364.                 }
  3365.                
  3366.                 item = null;
  3367.             }
  3368.         }
  3369.     }
  3370.    
  3371.     /**
  3372.      * Adds item to Inventory and send a Server->Client InventoryUpdate packet to the L2PcInstance.
  3373.      * @param process : String Identifier of process triggering this action
  3374.      * @param itemId : int Item Identifier of the item to be added
  3375.      * @param count : int Quantity of items to be added
  3376.      * @param reference : L2Object Object referencing current action like NPC selling item or previous item in transformation
  3377.      * @param sendMessage : boolean Specifies whether to send message to Client about this action
  3378.      * @return
  3379.      */
  3380. +   public L2ItemInstance addItemDungeon(final String process, final int itemId, final int count, final L2Object reference, final boolean sendMessage)
  3381. +   {
  3382. +       if (count > 0)
  3383. +       {
  3384. +           // Retrieve the template of the item.
  3385. +           final L2Item item = ItemTable.getInstance().getTemplate(itemId);
  3386. +           if (item == null)
  3387. +           {
  3388. +
  3389. +               return null;
  3390. +           }          
  3391. +          
  3392. +           // Sends message to client if requested
  3393. +           if (sendMessage && (!isCastingNow() && ItemTable.getInstance().createDummyItem(itemId).getItemType() == L2EtcItemType.HERB || ItemTable.getInstance().createDummyItem(itemId).getItemType() != L2EtcItemType.HERB))
  3394. +           {
  3395. +               if (count > 1)
  3396. +               {
  3397. +                   if (process.equalsIgnoreCase("sweep") || process.equalsIgnoreCase("Quest"))
  3398. +                   {
  3399. +                       SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
  3400. +                       sm.addItemName(itemId);
  3401. +                       sm.addNumber(count);
  3402. +                       sendPacket(sm);
  3403. +                       sm = null;
  3404. +                   }
  3405. +                   else
  3406. +                   {
  3407. +                       SystemMessage sm = new SystemMessage(SystemMessageId.YOU_PICKED_UP_S1_S2);
  3408. +                       sm.addItemName(itemId);
  3409. +                       sm.addNumber(count);
  3410. +                       sendPacket(sm);
  3411. +                       sm = null;
  3412. +                   }
  3413. +               }
  3414. +               else
  3415. +               {
  3416. +                   if (process.equalsIgnoreCase("sweep") || process.equalsIgnoreCase("Quest"))
  3417. +                   {
  3418. +                       SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_ITEM);
  3419. +                       sm.addItemName(itemId);
  3420. +                       sendPacket(sm);
  3421. +                       sm = null;
  3422. +                   }
  3423. +                   else
  3424. +                   {
  3425. +                       SystemMessage sm = new SystemMessage(SystemMessageId.YOU_PICKED_UP_S1);
  3426. +                       sm.addItemName(itemId);
  3427. +                       sendPacket(sm);
  3428. +                       sm = null;
  3429. +                   }
  3430. +               }
  3431. +           }
  3432. +           // Auto use herbs - autoloot
  3433. +           if (ItemTable.getInstance().createDummyItem(itemId).getItemType() == L2EtcItemType.HERB) // If item is herb dont add it to iv :]
  3434. +           {
  3435. +               if (!isCastingNow() && !isCastingPotionNow())
  3436. +               {
  3437. +                   L2ItemInstance herb = new L2ItemInstance(_charId, itemId);
  3438. +                   IItemHandler handler = ItemHandler.getInstance().getItemHandler(herb.getItemId());
  3439. +                  
  3440. +                   if (handler == null)
  3441. +                   {
  3442. +                       LOGGER.warn("No item handler registered for Herb - item ID " + herb.getItemId() + ".");
  3443. +                   }
  3444. +                   else
  3445. +                   {
  3446. +                       handler.useItem(this, herb);
  3447. +                      
  3448. +                       if (_herbstask >= 100)
  3449. +                       {
  3450. +                           _herbstask -= 100;
  3451. +                       }
  3452. +                      
  3453. +                       handler = null;
  3454. +                   }
  3455. +                  
  3456. +                   herb = null;
  3457. +               }
  3458. +               else
  3459. +               {
  3460. +                   _herbstask += 100;
  3461. +                   ThreadPoolManager.getInstance().scheduleAi(new HerbTask(process, itemId, count, reference, sendMessage), _herbstask);
  3462. +               }
  3463. +           }
  3464. +           else
  3465. +           {
  3466. +               // Add the item to inventory
  3467. +               L2ItemInstance createdItem = _inventory.addItem(process, itemId, count, this, reference);
  3468. +              
  3469. +               // Send inventory update packet
  3470. +               if (!Config.FORCE_INVENTORY_UPDATE)
  3471. +               {
  3472. +                   InventoryUpdate playerIU = new InventoryUpdate();
  3473. +                   playerIU.addItem(createdItem);
  3474. +                   sendPacket(playerIU);
  3475. +                   playerIU = null;
  3476. +               }
  3477. +               else
  3478. +               {
  3479. +                   sendPacket(new ItemList(this, false));
  3480. +               }
  3481. +              
  3482. +               // Update current load as well
  3483. +               StatusUpdate su = new StatusUpdate(getObjectId());
  3484. +               su.addAttribute(StatusUpdate.CUR_LOAD, getCurrentLoad());
  3485. +               sendPacket(su);
  3486. +               su = null;
  3487. +              
  3488. +               // If over capacity, drop the item
  3489. +               if (!isGM() && !_inventory.validateCapacity(item))
  3490. +               {
  3491. +                   dropItem("InvDrop", createdItem, null, true, true);
  3492. +               }
  3493. +               else if (CursedWeaponsManager.getInstance().isCursed(createdItem.getItemId()))
  3494. +               {
  3495. +                   CursedWeaponsManager.getInstance().activate(this, createdItem);
  3496. +               }
  3497. +              
  3498. +               return createdItem;
  3499. +           }
  3500. +       }
  3501. +       return null;
  3502. +   }      
  3503.    
  3504.    
  3505.    
  3506.    
  3507.    
  3508.    
  3509.     /**
  3510.      * Destroy item from inventory and send a Server->Client InventoryUpdate packet to the L2PcInstance.
  3511.      * @param process : String Identifier of process triggering this action
  3512.      * @param item : L2ItemInstance to be destroyed
  3513.      * @param reference : L2Object Object referencing current action like NPC selling item or previous item in transformation
  3514.      * @param sendMessage : boolean Specifies whether to send message to Client about this action
  3515.      * @return boolean informing if the action was successfull
  3516.      */
  3517.     public boolean destroyItem(final String process, L2ItemInstance item, final L2Object reference, final boolean sendMessage)
  3518.     {
  3519.  
  3520.  
  3521.  
  3522.  
  3523.  
  3524.  
  3525.  
  3526.  
  3527.  
  3528.  
  3529.  
  3530.  
  3531.  
  3532.  
  3533.  
  3534.  
  3535.  
  3536.  
  3537.  
  3538.     /** The _original karma vip. */
  3539.     public int _originalNameColourVIP, _originalKarmaVIP;
  3540.  
  3541.  
  3542. +   private final PlayerMemo _vars2 = new PlayerMemo(getObjectId());
  3543.  
  3544.  
  3545.  
  3546.  
  3547.             else if (CursedWeaponsManager.getInstance().isCursed(newitem.getItemId()))
  3548.             {
  3549.                 CursedWeaponsManager.getInstance().activate(this, newitem);
  3550.             }
  3551.             newitem = null;
  3552.         }
  3553. +           if (isNewChar())
  3554. +           NewCharTaskManager.getInstance().add(this);
  3555.  
  3556.  
  3557.  
  3558.  
  3559.  
  3560.  
  3561.  
  3562.  
  3563.  
  3564.  
  3565.  
  3566.  
  3567.  
  3568.  
  3569.  
  3570.  
  3571.  
  3572.  
  3573.     /**
  3574.      * Update L2PcInstance stats in the characters table of the database.<BR>
  3575.      * <BR>
  3576.      */
  3577.     public synchronized void store()
  3578.     {
  3579.         store(false);
  3580.     }
  3581.    
  3582. +   /**
  3583. +    * @return player memos.
  3584. +    */
  3585. +   public PlayerMemo getMemos()
  3586. +   {
  3587. +       return _vars2;
  3588. +   }  
  3589. +  
  3590. +  
  3591. +  
  3592. +   public String getIP()
  3593. +   {
  3594. +       if (getClient().getConnection() == null)
  3595. +           return "N/A IP";
  3596. +      
  3597. +       return getClient().getConnection().getInetAddress().getHostAddress();
  3598. +   }
  3599. +  
  3600. +  
  3601. +       public static void doNewChar(L2PcInstance player, int time)
  3602. +       {
  3603. +           player.setNewChar(true);
  3604. +           NewCharTaskManager.getInstance().add(player);
  3605. +           long remainingTime = player.getMemos().getLong("newEndTime", 0);
  3606. +           if (remainingTime > 0)
  3607. +           {
  3608. +               player.getMemos().set("newEndTime", remainingTime + TimeUnit.MINUTES.toMillis(time));
  3609. +           }
  3610. +           else
  3611. +           {
  3612. +               player.getMemos().set("newEndTime", System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(time));
  3613. +               player.broadcastUserInfo();
  3614. +           }
  3615. +       }
  3616. +      
  3617. +       public static void removeNewChar(L2PcInstance player)
  3618. +       {
  3619. +           NewCharTaskManager.getInstance().remove(player);
  3620. +           player.getMemos().set("newEndTime", 0);
  3621. +           player.setNewChar(false);
  3622. +           player.broadcastUserInfo();
  3623. +          
  3624. +       }
  3625. +       private boolean _isnewChar;
  3626. +       public boolean isNewChar()
  3627. +       {
  3628. +           return _isnewChar;
  3629. +       }
  3630. +      
  3631. +       public void setNewChar(boolean b)
  3632. +       {
  3633. +           _isnewChar = b;
  3634. +       }
  3635. +       private Dungeon dungeon = null;
  3636. +       public void setDungeon(Dungeon val)
  3637. +       {
  3638. +           dungeon = val;
  3639. +       }
  3640. +      
  3641. +       public Dungeon getDungeon()
  3642. +       {
  3643. +           return dungeon;
  3644. +       }
  3645. +  
  3646. +       public void deleteTempItem(int itemObjectID)
  3647. +       {
  3648. +           boolean destroyed = false;
  3649. +           if (getInventory().getItemByObjectId(itemObjectID) != null)
  3650. +           {
  3651. +               sendMessage("Your "+ItemTable.getInstance().getTemplate(getInventory().getItemByObjectId(itemObjectID).getItemId()).getName()+" has expired.");
  3652. +               destroyItem("tempItemDestroy", itemObjectID, 1, this, true);
  3653. +               getInventory().updateDatabase();
  3654. +               sendPacket(new ItemList(this, true));
  3655. +              
  3656. +               destroyed = true;
  3657. +           }
  3658. +          
  3659. +           if (!destroyed)
  3660. +           {
  3661. +               Connection con = null;
  3662. +               PreparedStatement statement = null;
  3663. +               ResultSet rset = null;
  3664. +               try
  3665. +               {
  3666. +                   con = L2DatabaseFactory.getInstance().getConnection();
  3667. +                   statement = con.prepareStatement("DELETE FROM items WHERE object_id=?");
  3668. +                   statement.setInt(1, itemObjectID);
  3669. +                   statement.execute();
  3670. +               }
  3671. +               catch (Exception e)
  3672. +               {
  3673. +                   e.printStackTrace();
  3674. +               }
  3675. +               finally
  3676. +               {
  3677. +                   Mysql.closeQuietly(con, statement, rset);
  3678. +               }
  3679. +           }
  3680. +       }
  3681. +       private boolean _isInClanDungeonZone;
  3682. +       public boolean isInClanDungeonZone()
  3683. +       {
  3684. +           return _isInClanDungeonZone;
  3685. +       }
  3686. +      
  3687. +       public void setClanDungeonZone(boolean isInClanDungeonZone)
  3688. +       {
  3689. +           _isInClanDungeonZone = isInClanDungeonZone;
  3690. +       }
  3691. +       /**
  3692. +        * @param instance
  3693. +        * @param b
  3694. +        */
  3695. +       public void setInstance(Instance instance, boolean b)
  3696. +       {
  3697. +           return;
  3698. +          
  3699. +       }  
  3700. +  
  3701. +       public final void broadcastCharInfo()
  3702. +       {
  3703. +           for (L2PcInstance player : getKnownList().getKnownType(L2PcInstance.class))
  3704. +           {
  3705. +               player.sendPacket(new CharInfo(this));
  3706. +              
  3707. +               final int relation = getRelation(player);
  3708. +               player.sendPacket(new RelationChanged(this, relation, isAutoAttackable(player)));
  3709. +               if (getPet() != null)
  3710. +                   player.sendPacket(new RelationChanged(getPet(), relation, isAutoAttackable(player)));
  3711. +           }
  3712. +       }      
  3713. +  
  3714. +       /**
  3715. +        * @return True if the Player is online.
  3716. +        */
  3717. +       public boolean isOnline2()
  3718. +       {
  3719. +           return _isOnline;
  3720. +       }  
  3721. +      
  3722.  
  3723. ### Eclipse Workspace Patch 1.0
  3724. #P L2jFrozen_GameServer
  3725. Index: head-src/com/l2jfrozen/gameserver/model/L2Character.java
  3726. ===================================================================
  3727. --- head-src/com/l2jfrozen/gameserver/model/L2Character.java  (nonexistent)
  3728. +++ head-src/com/l2jfrozen/gameserver/model/L2Character.java   (working copy)
  3729.  
  3730.     /** The _last skill cast. */
  3731.     private L2Skill _lastSkillCast;
  3732.    
  3733. +   protected boolean _showSummonAnimation = false;
  3734.  
  3735.  
  3736.  
  3737.  
  3738.  
  3739.  
  3740.  
  3741.  
  3742.  
  3743.  
  3744.  
  3745.  
  3746.  
  3747.     synchronized public void reloadShots(final boolean isMagic)
  3748.     {
  3749.         if (this instanceof L2PcInstance)
  3750.         {
  3751.             ((L2PcInstance) this).rechargeAutoSoulShot(!isMagic, isMagic, false);
  3752.         }
  3753.         else if (this instanceof L2Summon)
  3754.         {
  3755.             ((L2Summon) this).getOwner().rechargeAutoSoulShot(!isMagic, isMagic, true);
  3756.         }
  3757.     }
  3758.  
  3759. +   public void teleToLocation(int x, int y, int z, int randomOffset)
  3760. +   {
  3761. +       // Stop movement
  3762. +       stopMove(null);
  3763. +       abortAttack();
  3764. +       abortCast();
  3765. +      
  3766. +       setIsTeleporting(true);
  3767. +       setTarget(null);
  3768. +      
  3769. +       getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
  3770. +      
  3771. +       if (randomOffset > 0)
  3772. +       {
  3773. +           x += Rnd.get(-randomOffset, randomOffset);
  3774. +           y += Rnd.get(-randomOffset, randomOffset);
  3775. +       }
  3776. +      
  3777. +       z += 5;
  3778. +      
  3779. +       // Send TeleportToLocationt to the L2Character AND to all Player in the _KnownPlayers of the L2Character
  3780. +       broadcastPacket(new TeleportToLocation(this, x, y, z));
  3781. +      
  3782. +       // remove the object from its old location
  3783. +       decayMe();
  3784. +      
  3785. +       // Set the x,y,z position of the L2Object and if necessary modify its _worldRegion
  3786. +       getPosition().setXYZ(x, y, z);
  3787. +      
  3788. +       if (!(this instanceof L2PcInstance) || (((L2PcInstance) this).getClient() != null && ((L2PcInstance)
  3789. + this).getClient().isDetached()))
  3790. +           onTeleported();
  3791. +      
  3792. +       revalidateZone(true);
  3793. +   }  
  3794. +  
  3795. +   public void teleToLocation(Location loc, int randomOffset)
  3796. +   {
  3797. +       int x = loc.getX();
  3798. +       int y = loc.getY();
  3799. +       int z = loc.getZ();
  3800. +      
  3801. +       if (this instanceof L2PcInstance && DimensionalRiftManager.getInstance().checkIfInRiftZone(getX(), getY(), getZ(), true)) //
  3802. + true -> ignore waiting room :)
  3803. +       {
  3804. +           L2PcInstance player = (L2PcInstance) this;
  3805. +           player.sendMessage("You have been sent to the waiting room.");
  3806. +           if (player.isInParty() && player.getParty().isInDimensionalRift())
  3807. +           {
  3808. +               player.getParty().getDimensionalRift().usedTeleport(player);
  3809. +           }
  3810. +           int[] newCoords = DimensionalRiftManager.getInstance().getRoom((byte) 0, (byte) 0).getTeleportCoords();
  3811. +           x = newCoords[0];
  3812. +           y = newCoords[1];
  3813. +           z = newCoords[2];
  3814. +       }
  3815. +       teleToLocation(x, y, z, randomOffset);
  3816. +   }
  3817. +  
  3818. +   public void teleToLocation2(TeleportWhereType teleportWhere)
  3819. +   {
  3820. +       teleToLocation(MapRegionTable.getInstance().getTeleToLocation(this, teleportWhere), 20);
  3821. +   }  
  3822.  
  3823. +   /**
  3824. +    * @return Returns the showSummonAnimation.
  3825. +    */
  3826. +   public boolean isShowSummonAnimation()
  3827. +   {
  3828. +       return _showSummonAnimation;
  3829. +   }
  3830. +  
  3831. +   /**
  3832. +    * @param showSummonAnimation The showSummonAnimation to set.
  3833. +    */
  3834. +   public void setShowSummonAnimation(boolean showSummonAnimation)
  3835. +   {
  3836. +       _showSummonAnimation = showSummonAnimation;
  3837. +   }
  3838.  
  3839.  
  3840.  
  3841. ### Eclipse Workspace Patch 1.0
  3842. #P L2jFrozen_GameServer
  3843. Index: head-src/com/l2jfrozen/gameserver/model/spawn/L2Spawn.java
  3844. ===================================================================
  3845. --- head-src/com/l2jfrozen/gameserver/model/spawn/L2Spawn.java  (nonexistent)
  3846. +++ head-src/com/l2jfrozen/gameserver/model/spawn/L2Spawn.java   (working copy)
  3847.     public L2NpcTemplate getTemplate()
  3848.     {
  3849.         return _template;
  3850.     }
  3851.    
  3852.     public int getInstanceId()
  3853.     {
  3854.         return _instanceId;
  3855.     }
  3856.    
  3857.     public void setInstanceId(final int instanceId)
  3858.     {
  3859.         _instanceId = instanceId;
  3860.     }
  3861.  
  3862. +   public L2NpcInstance doSpawn(boolean isSummonSpawn)
  3863. +   {
  3864. +       L2NpcInstance mob = null;
  3865. +       try
  3866. +       {
  3867. +           // Check if the L2Spawn is not a L2Pet or L2Minion
  3868. +           if (_template.isType("L2Pet") || _template.isType("L2Minion"))
  3869. +               return mob;
  3870. +          
  3871. +           // Get L2Npc Init parameters and its generate an Identifier
  3872. +           Object[] parameters =
  3873. +           {
  3874. +               IdFactory.getInstance().getNextId(),
  3875. +               _template
  3876. +           };
  3877. +          
  3878. +           // Call the constructor of the L2Npc
  3879. +           // (can be a L2ArtefactInstance, L2FriendlyMobInstance, L2GuardInstance, L2MonsterInstance, L2SiegeGuardInstance, L2BoxInstance,
  3880. +           // L2FeedableBeastInstance, L2TamedBeastInstance, L2NpcInstance)
  3881. +           Object tmp = _constructor.newInstance(parameters);
  3882. +          
  3883. +           if (isSummonSpawn && tmp instanceof L2Character)
  3884. +               ((L2Character) tmp).setShowSummonAnimation(isSummonSpawn);
  3885. +          
  3886. +           // Check if the Instance is a L2Npc
  3887. +           if (!(tmp instanceof L2NpcInstance))
  3888. +               return mob;
  3889. +          
  3890. +           mob = (L2NpcInstance) tmp;
  3891. +           return intializeNpcInstance(mob);
  3892. +       }
  3893. +       catch (Exception e)
  3894. +       {
  3895. +  
  3896. +       }
  3897. +       return mob;
  3898. +   }
  3899. +  
  3900. +   /**
  3901. +    * @return
  3902. +    */
  3903. +   public L2NpcInstance getNpc()
  3904. +   {
  3905. +       return _lastSpawn;
  3906. +   }  
  3907.  
  3908. ### Eclipse Workspace Patch 1.0
  3909. #P L2jFrozen_GameServer
  3910. Index: head-src/com/l2jfrozen/gameserver/templates/L2NpcTemplate.java
  3911. ===================================================================
  3912. --- head-src/com/l2jfrozen/gameserver/templates/L2NpcTemplate.java  (nonexistent)
  3913. +++ head-src/com/l2jfrozen/gameserver/templates/L2NpcTemplate.java  (working copy)
  3914.  
  3915.     public final String type;
  3916. +   private final String _type;
  3917.  
  3918.  
  3919.  
  3920.         type = set.getString("type");
  3921. +       _type = set.getString("type");
  3922.  
  3923.  
  3924.  
  3925.  
  3926.     public final boolean isCustom()
  3927.     {
  3928.         return _custom;
  3929.     }
  3930.  
  3931. +   /**
  3932. +    * Checks types, ignore case.
  3933. +    * @param t the type to check.
  3934. +    * @return true if the type are the same, false otherwise.
  3935. +    */
  3936. +   public boolean isType(String t)
  3937. +   {
  3938. +       return _type.equalsIgnoreCase(t);
  3939. +   }
  3940.  
  3941.  
  3942.  
  3943. ### Eclipse Workspace Patch 1.0
  3944. #P L2jFrozen_GameServer
  3945. Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java
  3946. ===================================================================
  3947. --- head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java    (nonexistent)
  3948. +++ head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java      (working copy)
  3949.  
  3950.     @Override
  3951.     protected void runImpl()
  3952.     {
  3953.         final L2PcInstance activeChar = getClient().getActiveChar();
  3954.    
  3955.         if (activeChar == null)
  3956.         {
  3957.             LOGGER.warn("EnterWorld failed! activeChar is null...");
  3958.             getClient().closeNow();
  3959.             return;
  3960.         }
  3961.        
  3962. +       // Set NewChar
  3963. +       switch (activeChar.getClassId().getId())
  3964. +       {
  3965. +           case 0:
  3966. +           case 10:
  3967. +           case 18:
  3968. +           case 25:
  3969. +           case 31:
  3970. +           case 38:
  3971. +           case 44:
  3972. +           case 49:
  3973. +           case 53:
  3974. +               L2PcInstance.doNewChar(activeChar, 1);
  3975. +               break;
  3976. +       }
  3977.  
  3978.  
  3979.  
  3980.  
  3981.  
  3982.  
  3983.  
  3984.         EnterGM(activeChar);
  3985.        
  3986. +       if (activeChar.getMemos().getLong("newEndTime", 0) > 0)
  3987. +           onEnterNewChar(activeChar);
  3988.  
  3989.  
  3990.  
  3991.  
  3992.  
  3993.     private void onEnterAio(final L2PcInstance activeChar)
  3994.     {
  3995.         final long now = Calendar.getInstance().getTimeInMillis();
  3996.         final long endDay = activeChar.getAioEndTime();
  3997.        
  3998.         if (now > endDay)
  3999.         {
  4000.             activeChar.setAio(false);
  4001.             activeChar.setAioEndTime(0);
  4002.             activeChar.lostAioSkills();
  4003.             activeChar.sendMessage("[Aio System]: Removed your Aio stats... period ends.");
  4004.         }
  4005.         else
  4006.         {
  4007.             final Date dt = new Date(endDay);
  4008.             _daysleft = (endDay - now) / 86400000;
  4009.             if (_daysleft > 30)
  4010.                 activeChar.sendMessage("[Aio System]: Aio period ends in " + df.format(dt) + ". enjoy the Game.");
  4011.             else if (_daysleft > 0)
  4012.                 activeChar.sendMessage("[Aio System]: Left " + (int) _daysleft + " for Aio period ends.");
  4013.             else if (_daysleft < 1)
  4014.             {
  4015.                 final long hour = (endDay - now) / 3600000;
  4016.                 activeChar.sendMessage("[Aio System]: Left " + (int) hour + " hours to Aio period ends.");
  4017.             }
  4018.         }
  4019.     }
  4020.    
  4021. +   private static void onEnterNewChar(L2PcInstance activeChar)
  4022. +   {
  4023. +       long now = Calendar.getInstance().getTimeInMillis();
  4024. +       long endDay = activeChar.getMemos().getLong("newEndTime");
  4025. +
  4026. +       if (now > endDay)
  4027. +           L2PcInstance.removeNewChar(activeChar);
  4028. +       else
  4029. +       {
  4030. +           activeChar.setNewChar(true);
  4031. +           activeChar.broadcastUserInfo();
  4032. +       }
  4033. +   }      
  4034.    
  4035.    
  4036.    
  4037.     /**
  4038.      * @param cha
  4039.      */
  4040.     private void engage(final L2PcInstance cha)
  4041.  
  4042.  
  4043.  
  4044.  
  4045. ### Eclipse Workspace Patch 1.0
  4046. #P L2jFrozen_GameServer
  4047. Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java
  4048. ===================================================================
  4049. --- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java     (nonexistent)
  4050. +++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java       (working copy)
  4051. import com.l2jterius.gameserver.model.actor.instance.L2ClassMasterInstance;
  4052. +import com.l2jterius.gameserver.model.actor.instance.L2ItemInstance;
  4053.  
  4054.  
  4055.  
  4056.  
  4057. import com.l2jfrozen.gameserver.util.GMAudit;
  4058. +import Base.Dev.Dungeon.InstanceManager;
  4059. +import Base.Memo.PlayerMemo;
  4060.  
  4061.  
  4062.  
  4063.  
  4064.             else if (_command.startsWith("player_help "))
  4065.             {
  4066.                 playerHelp(activeChar, _command.substring(12));
  4067.             }
  4068.            
  4069.            
  4070. +           if (_command.startsWith("bp_reward"))
  4071. +           {
  4072. +               int type = Integer.parseInt(_command.substring(10));
  4073. +               int itemId = 0;
  4074. +               int count = 1;
  4075. +              
  4076. +               switch (type)
  4077. +               {
  4078. +                   case 0:
  4079. +                   {
  4080. +                       itemId = Config.DUNGEON_ITEM_RENEWAL0;
  4081. +                      
  4082. +                       break;
  4083. +                   }
  4084. +                   case 1:
  4085. +                   {
  4086. +                       itemId = Config.DUNGEON_ITEM_RENEWAL1;
  4087. +                      
  4088. +                       break;
  4089. +                   }
  4090. +                   case 2:
  4091. +                   {
  4092. +                       itemId = Config.DUNGEON_ITEM_RENEWAL2;
  4093. +                      
  4094. +                       break;
  4095. +                   }
  4096. +                   case 3:
  4097. +                   {
  4098. +                       itemId = Config.DUNGEON_ITEM_RENEWAL3;
  4099. +                      
  4100. +                       break;
  4101. +                   }
  4102. +                   case 4:
  4103. +                   {
  4104. +                       itemId = Config.DUNGEON_ITEM_RENEWAL4;
  4105. +                      
  4106. +                       break;
  4107. +                   }
  4108. +                   case 5:
  4109. +                   {
  4110. +                       itemId = Config.DUNGEON_ITEM_RENEWAL5;
  4111. +                      
  4112. +                       break;
  4113. +                   }
  4114. +                   case 6:
  4115. +                   {
  4116. +                       itemId = Config.DUNGEON_ITEM_RENEWAL6;
  4117. +                      
  4118. +                       break;
  4119. +                   }
  4120. +                   case 7:
  4121. +                   {
  4122. +                       itemId = Config.DUNGEON_ITEM_RENEWAL7;
  4123. +                      
  4124. +                       break;
  4125. +                   }
  4126. +                   case 8:
  4127. +                   {
  4128. +                       itemId = Config.DUNGEON_ITEM_RENEWAL8;
  4129. +                      
  4130. +                       break;
  4131. +                   }
  4132. +                   case 9:
  4133. +                   {
  4134. +                       itemId = Config.DUNGEON_ITEM_RENEWAL9;
  4135. +                      
  4136. +                       break;
  4137. +                   }
  4138. +                   case 10:
  4139. +                   {
  4140. +                       itemId = Config.DUNGEON_ITEM_RENEWAL10;
  4141. +                      
  4142. +                       break;
  4143. +                   }
  4144. +               }
  4145. +              
  4146. +               if (itemId == 0)
  4147. +               {
  4148. +                   System.out.println(activeChar.getName() + " tried to send custom id on dungeon solo rewards.");
  4149. +                   return;
  4150. +               }
  4151. +                               if(activeChar.getDungeon() != null)
  4152. +                               {                            
  4153. +                                   L2ItemInstance item = activeChar.addItemDungeon("dungeon reward", itemId, count, null, true);
  4154. +                                   item.setEnchantLevel(25);
  4155. +                                   activeChar.getInventory().equipItemAndRecord(item);
  4156. +                                   PlayerMemo.setVar(activeChar, "delete_temp_item_" + item.getObjectId(), item.getObjectId(), System.currentTimeMillis() + (1000 *60 *60 *5));
  4157. +                                   InstanceManager.getInstance().getInstance(0);
  4158. +                                   activeChar.setDungeon(null);                       
  4159. +                                   activeChar.teleToLocation(Config.DUNGEON_SPAWN_X, Config.DUNGEON_SPAWN_Y, Config.DUNGEON_SPAWN_Z, Config.DUNGEON_SPAWN_RND);                                                           
  4160. +                               }
  4161. +                               else
  4162. +                               {
  4163. +                                activeChar.sendMessage("No puedes recibir el premio");  
  4164. +                               }
  4165. +           }                              
  4166.                    
  4167.             else if (_command.startsWith("npc_"))
  4168.  
  4169.  
  4170.  
  4171. ### Eclipse Workspace Patch 1.0
  4172. #P L2jFrozen_GameServer
  4173. Index: Frozen 1132\gameserver\events\Dungeon.xml
  4174. ===================================================================
  4175. --- Frozen 1132\gameserver\events\Dungeon.xml     (nonexistent)
  4176. +++ Frozen 1132\gameserver\events\Dungeon.xml       (working copy)
  4177. +<?xml version="1.0" encoding="UTF-8"?>
  4178. +<list>
  4179. +   <dungeon id="1" name="Solo Story Mode" players="1" rewards="57,200000" rewardHtm="data/html/mods/Dungeon-L2JDev/solo_rewards.htm">
  4180. +       <stage order="1" loc="174122,-76173,-5106" teleport="true" minutes="5">
  4181. +           <mob npcId="65515" locs="174527,-75636,-5106;174654,-75987,-5106;174647,-76483,-5106;174160,-76758,-5106"/>
  4182. +       </stage>
  4183. +       <stage order="2" loc="174082,-78151,-5106" teleport="false" minutes="5">
  4184. +           <mob npcId="65515" locs="174527,-75636,-5106;174654,-75987,-5106;174647,-76483,-5106;174160,-76758,-5106"/>
  4185. +       </stage>
  4186. +       <stage order="3" loc="174038,-80727,-5106" teleport="true" minutes="5">
  4187. +           <mob npcId="65515" locs="173739,-81254,-5122;173736,-81613,-5122;173729,-82232,-5122;174041,-82539,-5122;174377,-82379,-5122;174451,-81893,-5122;174433,-81342,-5122;174152,-81560,-5122"/>
  4188. +       </stage>
  4189. +       <stage order="4" loc="174230,-87512,-5116" teleport="true" minutes="15">
  4190. +           <mob npcId="65515" locs="174229,-86659,-5106"/>
  4191. +       </stage>
  4192. +   </dungeon>
  4193. +   <dungeon id="2" name="Quatro Hard Mode" players="4" rewards="57,1000000" rewardHtm="NULL">
  4194. +       <stage order="1" loc="174122,-76173,-5106" teleport="true" minutes="5">
  4195. +           <mob npcId="65515" locs="174527,-75636,-5106;174654,-75987,-5106;174647,-76483,-5106;174160,-76758,-5106"/>
  4196. +       </stage>
  4197. +       <stage order="2" loc="174082,-78151,-5106" teleport="false" minutes="5">
  4198. +           <mob npcId="65515" locs="174527,-75636,-5106;174654,-75987,-5106;174647,-76483,-5106;174160,-76758,-5106"/>
  4199. +       </stage>
  4200. +       <stage order="3" loc="174038,-80727,-5106" teleport="true" minutes="5">
  4201. +           <mob npcId="65515" locs="173739,-81254,-5122;173736,-81613,-5122;173729,-82232,-5122;174041,-82539,-5122;174377,-82379,-5122;174451,-81893,-5122;174433,-81342,-5122;174152,-81560,-5122"/>
  4202. +       </stage>
  4203. +       <stage order="4" loc="174056,-83856,-5106" teleport="true" minutes="5">
  4204. +           <mob npcId="65515" locs="174742,-84194,-5106;174745,-84526,-5106;174726,-85127,-5106;174231,-85361,-5106"/>
  4205. +       </stage>
  4206. +       <stage order="5" loc="174229,-86659,-5106" teleport="true" minutes="5">
  4207. +           <mob npcId="65515" locs="174742,-84194,-5106;174745,-84526,-5106;174726,-85127,-5106;174231,-85361,-5106"/>
  4208. +       </stage>
  4209. +       <stage order="6" loc="174229,-86659,-5106" teleport="false" minutes="5">
  4210. +           <mob npcId="65515" locs="174229,-86659,-5106"/>
  4211. +       </stage>
  4212. +       <stage order="7" loc="174229,-86659,-5106" teleport="false" minutes="10">
  4213. +           <mob npcId="65515" locs="174229,-86659,-5106"/>
  4214. +       </stage>
  4215. +   </dungeon>
  4216. +</list>
  4217.  
  4218.  
  4219. ### Eclipse Workspace Patch 1.0
  4220. #P L2jFrozen_GameServer
  4221. Index: Frozen 1132\gameserver\events\Dungeon_Html_Reward.properties
  4222. ===================================================================
  4223. --- Frozen 1132\gameserver\events\Dungeon_Html_Reward.properties     (nonexistent)
  4224. +++ Frozen 1132\gameserver\events\Dungeon_Html_Reward.properties       (working copy)
  4225. +#Item Id Prince L2DungeonManager
  4226. +DungeonCoinId = 57
  4227. +# ID of the item that will be Buy to Dungeon
  4228. +DungeonContItem = 1
  4229. +#Cordenadas para la vuelta del jugador al terminar el evento Idea por: jeriko90
  4230. +DungeonSpawnX = 82732
  4231. +DungeonSpawnY = 149316
  4232. +DungeonSpawnZ = -3495
  4233. +DungeonSpawnRnd = 25
  4234. +
  4235. +#Renewal Dungeon Open Html Finishi!
  4236. +DungeonRenewalHtml0 = 6657
  4237. +DungeonRenewalHtml1 = 6656
  4238. +DungeonRenewalHtml2 = 6658
  4239. +DungeonRenewalHtml3 = 6659
  4240. +DungeonRenewalHtml4 = 6660
  4241. +DungeonRenewalHtml5 = 8191
  4242. +DungeonRenewalHtml6 = 49997
  4243. +DungeonRenewalHtml7 = 49998
  4244. +DungeonRenewalHtml8 = 50000
  4245. +DungeonRenewalHtml9 = 59989
  4246. +DungeonRenewalHtml10 = 52366
  4247.  
  4248.  
  4249.  
  4250.  
  4251.  
  4252.  
  4253. Custom_Npc.sql
  4254.  
  4255. INSERT INTO `custom_npc` VALUES ('65514', '31228', 'Dungeon Manager', '1', 'L2J-FROZEN', '1', 'Monster.cat_the_cat', '9.00', '16.00', '70', 'male', 'L2DungeonManager', '40', '3862', '1493', '11.85', '2.78', '40', '43', '30', '21', '20', '10', '490', '10', '1335', '470', '780', '382', '278', '0', '333', '0', '0', '0', '88', '132', '', '0', '0', '0', 'LAST_HIT');
  4256. INSERT INTO `custom_npc` VALUES ('65515', '29031', 'Dungeon Mob', '1', '', '0', 'Monster2.ifrit', '10.00', '42.00', '80', 'male', 'L2DungeonMob', '40', '33984', '1859', '55.62', '4.16', '40', '43', '30', '21', '20', '10', '0', '0', '10275', '2307', '6886', '937', '278', '0', '333', '0', '0', '0', '41', '187', 'fire_clan', '300', '0', '0', 'LAST_HIT');
  4257.  
  4258.  
  4259.  
  4260.  
  4261.  
Add Comment
Please, Sign In to add comment