|
@@ -12,22 +12,9 @@
|
|
|
* You should have received a copy of the GNU General Public License along with
|
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
*/
|
|
|
-
|
|
|
package com.l2jserver.gameserver.model.event;
|
|
|
|
|
|
-import com.l2jserver.gameserver.Announcements;
|
|
|
-import com.l2jserver.gameserver.ThreadPoolManager;
|
|
|
-import com.l2jserver.gameserver.datatables.ItemTable;
|
|
|
-import com.l2jserver.gameserver.datatables.EventDroplist;
|
|
|
-import com.l2jserver.gameserver.datatables.NpcTable;
|
|
|
-import com.l2jserver.gameserver.model.Location;
|
|
|
-import com.l2jserver.gameserver.model.L2DropData;
|
|
|
-import com.l2jserver.gameserver.model.quest.Quest;
|
|
|
-import com.l2jserver.gameserver.script.DateRange;
|
|
|
-
|
|
|
import java.io.File;
|
|
|
-import java.io.FileNotFoundException;
|
|
|
-import java.io.IOException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
@@ -42,53 +29,58 @@ import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
import org.w3c.dom.Document;
|
|
|
import org.w3c.dom.Node;
|
|
|
|
|
|
+import com.l2jserver.gameserver.Announcements;
|
|
|
+import com.l2jserver.gameserver.ThreadPoolManager;
|
|
|
+import com.l2jserver.gameserver.datatables.EventDroplist;
|
|
|
+import com.l2jserver.gameserver.datatables.ItemTable;
|
|
|
+import com.l2jserver.gameserver.datatables.NpcTable;
|
|
|
+import com.l2jserver.gameserver.model.L2DropData;
|
|
|
+import com.l2jserver.gameserver.model.Location;
|
|
|
+import com.l2jserver.gameserver.model.quest.Quest;
|
|
|
+import com.l2jserver.gameserver.script.DateRange;
|
|
|
+
|
|
|
/**
|
|
|
- ** @author GKR
|
|
|
- **
|
|
|
- ** Parent class for long time events. Maintains config reading, spawn of NPC's, adding of event's drop;
|
|
|
+ * Parent class for long time events.<br>
|
|
|
+ * Maintains config reading, spawn of NPC's, adding of event's drop.
|
|
|
+ * @author GKR
|
|
|
*/
|
|
|
public class LongTimeEvent extends Quest
|
|
|
{
|
|
|
protected final static Logger _log = Logger.getLogger(LongTimeEvent.class.getName());
|
|
|
-
|
|
|
+
|
|
|
private String _eventName;
|
|
|
-
|
|
|
+
|
|
|
// Messages
|
|
|
private String _onEnterMsg = "Event is in process";
|
|
|
- private String _endMsg = "Event ends!";
|
|
|
-
|
|
|
- private DateRange _eventPeriod = null;
|
|
|
- private DateRange _dropPeriod;
|
|
|
-
|
|
|
+ protected String _endMsg = "Event ends!";
|
|
|
+
|
|
|
+ private DateRange _eventPeriod = null;
|
|
|
+ private DateRange _dropPeriod;
|
|
|
+
|
|
|
// NPC's to spawm and their spawn points
|
|
|
- private List<NpcSpawn> _spawnList = new ArrayList<NpcSpawn>();
|
|
|
-
|
|
|
+ private final List<NpcSpawn> _spawnList = new ArrayList<>();
|
|
|
+
|
|
|
// Drop data for event
|
|
|
- private List<L2DropData> _dropList = new ArrayList<L2DropData>();
|
|
|
+ private final List<L2DropData> _dropList = new ArrayList<>();
|
|
|
|
|
|
private class NpcSpawn
|
|
|
{
|
|
|
protected final Location loc;
|
|
|
protected final int npcId;
|
|
|
+
|
|
|
protected NpcSpawn(int pNpcId, Location spawnLoc)
|
|
|
{
|
|
|
loc = spawnLoc;
|
|
|
- npcId = pNpcId;
|
|
|
+ npcId = pNpcId;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public LongTimeEvent(int questId, String name, String descr)
|
|
|
{
|
|
|
super(questId, name, descr);
|
|
|
- try
|
|
|
- {
|
|
|
- loadConfig();
|
|
|
- }
|
|
|
- catch(FileNotFoundException fnfe)
|
|
|
- {
|
|
|
- _log.log(Level.WARNING, getScriptName() + " event: not found config XML, event ignored " + fnfe.getMessage(), fnfe);
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
+ loadConfig();
|
|
|
+
|
|
|
if (_eventPeriod != null)
|
|
|
{
|
|
|
if (_eventPeriod.isWithinRange(new Date()))
|
|
@@ -98,19 +90,21 @@ public class LongTimeEvent extends Quest
|
|
|
}
|
|
|
else if (_eventPeriod.getStartDate().after(new Date()))
|
|
|
{
|
|
|
- long delay = _eventPeriod.getStartDate().getTime() - System.currentTimeMillis();
|
|
|
+ long delay = _eventPeriod.getStartDate().getTime() - System.currentTimeMillis();
|
|
|
ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStart(), delay);
|
|
|
_log.info("Event " + _eventName + " will be started at " + _eventPeriod.getEndDate());
|
|
|
}
|
|
|
else
|
|
|
- _log.info("Event " + _eventName + " has passed... Ignored ");
|
|
|
+ {
|
|
|
+ _log.info("Event " + _eventName + " has passed... Ignored ");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* Load event configuration file
|
|
|
*/
|
|
|
- private void loadConfig() throws FileNotFoundException
|
|
|
+ private void loadConfig()
|
|
|
{
|
|
|
File configFile = new File("data/scripts/events/" + getScriptName() + "/config.xml");
|
|
|
try
|
|
@@ -125,7 +119,7 @@ public class LongTimeEvent extends Quest
|
|
|
_eventName = doc.getDocumentElement().getAttributes().getNamedItem("name").getNodeValue();
|
|
|
String period = doc.getDocumentElement().getAttributes().getNamedItem("active").getNodeValue();
|
|
|
_eventPeriod = DateRange.parse(period, new SimpleDateFormat("dd MM yyyy", Locale.US));
|
|
|
-
|
|
|
+
|
|
|
if (doc.getDocumentElement().getAttributes().getNamedItem("dropPeriod") != null)
|
|
|
{
|
|
|
String dropPeriod = doc.getDocumentElement().getAttributes().getNamedItem("dropPeriod").getNodeValue();
|
|
@@ -134,20 +128,20 @@ public class LongTimeEvent extends Quest
|
|
|
if (!_eventPeriod.isWithinRange(_dropPeriod.getStartDate()) || !_eventPeriod.isWithinRange(_dropPeriod.getEndDate()))
|
|
|
{
|
|
|
_dropPeriod = _eventPeriod;
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
_dropPeriod = _eventPeriod; // Drop period, if not specified, assumes all event period.
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (_eventPeriod == null)
|
|
|
{
|
|
|
throw new NullPointerException("WARNING!!! " + getScriptName() + " event: illegal event period");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Date today = new Date();
|
|
|
-
|
|
|
+
|
|
|
if (_eventPeriod.getStartDate().after(today) || _eventPeriod.isWithinRange(today))
|
|
|
{
|
|
|
Node first = doc.getDocumentElement().getFirstChild();
|
|
@@ -167,31 +161,31 @@ public class LongTimeEvent extends Quest
|
|
|
int maxCount = Integer.parseInt(d.getAttributes().getNamedItem("max").getNodeValue());
|
|
|
String chance = d.getAttributes().getNamedItem("chance").getNodeValue();
|
|
|
int finalChance = 0;
|
|
|
-
|
|
|
+
|
|
|
if (!chance.isEmpty() && chance.endsWith("%"))
|
|
|
{
|
|
|
- finalChance = Integer.parseInt(chance.substring(0, chance.length()-1)) * 10000;
|
|
|
+ finalChance = Integer.parseInt(chance.substring(0, chance.length() - 1)) * 10000;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (ItemTable.getInstance().getTemplate(itemId) == null)
|
|
|
{
|
|
|
_log.warning(getScriptName() + " event: " + itemId + " is wrong item id, item was not added in droplist");
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (minCount > maxCount)
|
|
|
{
|
|
|
_log.warning(getScriptName() + " event: item " + itemId + " - min greater than max, item was not added in droplist");
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- if (finalChance < 10000 || finalChance > L2DropData.MAX_CHANCE)
|
|
|
+
|
|
|
+ if ((finalChance < 10000) || (finalChance > L2DropData.MAX_CHANCE))
|
|
|
{
|
|
|
_log.warning(getScriptName() + " event: item " + itemId + " - incorrect drop chance, item was not added in droplist");
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- _dropList.add (new L2DropData(itemId, minCount, maxCount, finalChance));
|
|
|
+
|
|
|
+ _dropList.add(new L2DropData(itemId, minCount, maxCount, finalChance));
|
|
|
}
|
|
|
catch (NumberFormatException nfe)
|
|
|
{
|
|
@@ -200,9 +194,9 @@ public class LongTimeEvent extends Quest
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
else if (n.getNodeName().equalsIgnoreCase("spawnlist"))
|
|
|
- {
|
|
|
+ {
|
|
|
// Loading spawnlist
|
|
|
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
|
|
|
{
|
|
@@ -215,23 +209,23 @@ public class LongTimeEvent extends Quest
|
|
|
int yPos = Integer.parseInt(d.getAttributes().getNamedItem("y").getNodeValue());
|
|
|
int zPos = Integer.parseInt(d.getAttributes().getNamedItem("z").getNodeValue());
|
|
|
int heading = d.getAttributes().getNamedItem("heading").getNodeValue() != null ? Integer.parseInt(d.getAttributes().getNamedItem("heading").getNodeValue()) : 0;
|
|
|
-
|
|
|
+
|
|
|
if (NpcTable.getInstance().getTemplate(npcId) == null)
|
|
|
{
|
|
|
_log.warning(getScriptName() + " event: " + npcId + " is wrong NPC id, NPC was not added in spawnlist");
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
_spawnList.add(new NpcSpawn(npcId, new Location(xPos, yPos, zPos, heading)));
|
|
|
}
|
|
|
catch (NumberFormatException nfe)
|
|
|
{
|
|
|
_log.warning("Wrong number format in config.xml spawnlist block for " + getScriptName() + " event");
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
else if (n.getNodeName().equalsIgnoreCase("messages"))
|
|
|
{
|
|
|
// Loading Messages
|
|
@@ -251,37 +245,33 @@ public class LongTimeEvent extends Quest
|
|
|
{
|
|
|
_onEnterMsg = msgText;
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- catch (IOException e)
|
|
|
+ catch (Exception e)
|
|
|
{
|
|
|
_log.log(Level.WARNING, getScriptName() + " event: error reading " + configFile.getAbsolutePath() + " ! " + e.getMessage(), e);
|
|
|
}
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
- * Maintenance event start - adds global drop, spawns event NPC's, shows start announcement
|
|
|
+ * Maintenance event start - adds global drop, spawns event NPC's, shows start announcement.
|
|
|
*/
|
|
|
- private void startEvent()
|
|
|
+ protected void startEvent()
|
|
|
{
|
|
|
// Add drop
|
|
|
if (_dropList != null)
|
|
|
{
|
|
|
for (L2DropData drop : _dropList)
|
|
|
{
|
|
|
- EventDroplist.getInstance().addGlobalDrop(new int[] { drop.getItemId() }, new int[] { drop.getMinDrop(), drop.getMaxDrop() }, (int) drop.getChance(), _dropPeriod);
|
|
|
+ EventDroplist.getInstance().addGlobalDrop(drop.getItemId(), drop.getMinDrop(), drop.getMaxDrop(), (int) drop.getChance(), _dropPeriod);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// Add spawns
|
|
|
Long millisToEventEnd = _eventPeriod.getEndDate().getTime() - System.currentTimeMillis();
|
|
|
if (_spawnList != null)
|
|
@@ -294,14 +284,14 @@ public class LongTimeEvent extends Quest
|
|
|
|
|
|
// Send message on begin
|
|
|
Announcements.getInstance().announceToAll(_onEnterMsg);
|
|
|
-
|
|
|
+
|
|
|
// Add announce for entering players
|
|
|
- Announcements.getInstance().addEventAnnouncement(_eventPeriod, new String[] { _onEnterMsg });
|
|
|
-
|
|
|
+ Announcements.getInstance().addEventAnnouncement(_eventPeriod, _onEnterMsg);
|
|
|
+
|
|
|
// Schedule event end (now only for message sending)
|
|
|
- ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEnd(), millisToEventEnd);
|
|
|
+ ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEnd(), millisToEventEnd);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* @return event period
|
|
|
*/
|
|
@@ -309,7 +299,7 @@ public class LongTimeEvent extends Quest
|
|
|
{
|
|
|
return _eventPeriod;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* @return {@code true} if now is event period
|
|
|
*/
|
|
@@ -317,7 +307,7 @@ public class LongTimeEvent extends Quest
|
|
|
{
|
|
|
return _eventPeriod.isWithinRange(new Date());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* @return {@code true} if now is drop period
|
|
|
*/
|
|
@@ -325,8 +315,8 @@ public class LongTimeEvent extends Quest
|
|
|
{
|
|
|
return _dropPeriod.isWithinRange(new Date());
|
|
|
}
|
|
|
-
|
|
|
- private class ScheduleStart implements Runnable
|
|
|
+
|
|
|
+ protected class ScheduleStart implements Runnable
|
|
|
{
|
|
|
@Override
|
|
|
public void run()
|
|
@@ -334,15 +324,14 @@ public class LongTimeEvent extends Quest
|
|
|
startEvent();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- private class ScheduleEnd implements Runnable
|
|
|
+
|
|
|
+ protected class ScheduleEnd implements Runnable
|
|
|
{
|
|
|
@Override
|
|
|
public void run()
|
|
|
{
|
|
|
// Send message on end
|
|
|
- Announcements.getInstance().announceToAll(_endMsg);
|
|
|
+ Announcements.getInstance().announceToAll(_endMsg);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|