Update. Выдача и запоминание хиро статуса для победителей (+ оффлайн).
Хиро удаляется за 1 минуту, до конца события. Т.е. старым победителям удаляют и новым дают.
Не тестировал.
L2PursuitInstance.java
Скрытый текст
package net.sf.l2j.gameserver.model.actor.instance;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.StringTokenizer;
import javolution.text.TextBuilder;
import net.sf.l2j.database.DatabaseUtils;
import net.sf.l2j.database.FiltredPreparedStatement;
import net.sf.l2j.database.L2DatabaseFactory;
import net.sf.l2j.database.ThreadConnection;
import net.sf.l2j.gameserver.Announcements;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
import net.sf.l2j.gameserver.templates.L2NpcTemplate;
public class L2PursuitInstance extends L2FolkInstance
{
/** Config begin */
private static final int ITEM_ID = 4037; // ID предмета, который нужно сдавать NPC
private static final String ITEM_NAME = "Coin of Luck"; //Название предмета, для вывода сообщений
private static final int topCount = 10; // Количество игроков в топе
private static final int winnerCount = 3; // Количество игроков, которые получат приз
private static final String annons1 = "Хотите получить интерессный приз? Учавствуйте в евенте \"Сборщик\"!"; // Аннонс о прохождении евента
private static final String annons2 = "До конца евента \"Сборщик\" осталось 5 минут"; // Аннонс об окончании евента
private static final String annons3 = " выйграл евент \"Сборщик\" и получает статус героя!"; // Аннонс о выйгрые, вид: (имя_игрока, выйграл евент и т.д.)
/** Config end */
static Thread thr;
public L2PursuitInstance (int objectId, L2NpcTemplate template)
{
super(objectId, template);
}
@ Override
public void onAction(L2PcInstance player)
{
player.setLastFolkNPC(this);
super.onAction(player);
}
@ Override
public void onBypassFeedback(L2PcInstance player, String command)
{
if (command.startsWith("put"))
{
StringTokenizer st = new StringTokenizer(command.substring(3).trim());
if (st.countTokens() != 1)
return;
String token = st.nextToken();
int putCount = 0;
if (token.matches("[0-9]*"))
putCount = Integer.parseInt(token);
else
{
player.sendMessage("Неправильный ввод");
return;
}
if (putCount <= 0 || player.getInventory().getInventoryItemCount(ITEM_ID, 0) < putCount)
{
player.sendMessage("У вас не хватает предметов");
return;
}
InventoryUpdate ui = new InventoryUpdate();
if (player.getInventory().destroyItemByItemId("Pursuit", ITEM_ID, putCount, player, player) != null)
{
player.sendMessage("Вы вложили " + putCount + " " + ITEM_NAME);
updateBonusItem(player, charInBonusBD(player) + putCount);
ui.addModifiedItem(player.getInventory().getItemByItemId(ITEM_ID));
player.sendPacket(ui);
}
ui = null;
}
else if (command.startsWith("getInfo"))
{
int i = 1;
NpcHtmlMessage html = new NpcHtmlMessage(1);
TextBuilder tb = new TextBuilder("<html><title>Сборщик</title><body>");
tb.append("<table align=\"center\" border=\"1\"><tr><td width=\"20\">#</td><td width=\"150\">Имя персонажа</td><td width=\"150\">Количество</td></tr>");
ThreadConnection con = null;
FiltredPreparedStatement st = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("SELECT obj_Id, count FROM pursuit order by count desc limit " + topCount);
ResultSet result = st.executeQuery();
while (result.next())
{
int obj_Id = result.getInt("obj_Id");
int count = result.getInt("count");
tb.append("<tr><td width=\"10\">" + i + "</td><td width=\"200\">" + getNameForObjectId(obj_Id) + "</td><td width=\"200\">" + count + "</td></tr>");
i++;
}
tb.append("</body></html>");
html.setHtml(tb.toString());
player.sendPacket(html);
result.close();
}
catch (Exception e)
{
_log.warning("" + e);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
else
super.onBypassFeedback(player, command);
}
private static String getNameForObjectId(int objId)
{
ThreadConnection con = null;
FiltredPreparedStatement st = null;
String name = "error";
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("SELECT char_name FROM characters WHERE obj_Id=" + objId);
ResultSet rs = st.executeQuery();
while (rs.next())
name = rs.getString("char_name");
rs.close();
}
catch (Exception e)
{
_log.warning("" + e);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
return name;
}
private static int charInBonusBD(L2PcInstance player)
{
ThreadConnection con = null;
FiltredPreparedStatement st = null;
int count = 0;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("SELECT count from pursuit WHERE obj_Id=?");
st.setInt(1, player.getObjectId());
ResultSet rs = st.executeQuery();
while (rs.next())
count = Integer.parseInt(rs.getString("count"));
rs.close();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
return count;
}
private static void updateBonusItem(L2PcInstance player, int count)
{
ThreadConnection con = null;
FiltredPreparedStatement st = null;
if (player == null)
return;
if (charInBonusBD(player) != 0)
{
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("UPDATE pursuit SET count=" + count + " WHERE obj_Id=" + player.getObjectId());
st.executeUpdate();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
else
{
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("INSERT INTO pursuit (obj_Id, count) VALUES(?,?)");
st.setInt(1, player.getObjectId());
st.setInt(2, count);
st.execute();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
}
private static void toReward()
{
_log.info("toReward");
ThreadConnection con = null;
FiltredPreparedStatement st = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("SELECT obj_Id FROM pursuit order by count desc limit " + winnerCount);
ResultSet result = st.executeQuery();
while (result.next())
{
L2PcInstance player = L2World.getInstance().getPlayer(result.getInt("obj_Id"));
if (player == null)
setEnterHero(getNameForObjectId(result.getInt("obj_Id")));
else
{
setEnterHero(getNameForObjectId(result.getInt("obj_Id")));
player.setHero(true);
}
Announcements.getInstance().announceToAll(player.getName() + annons3);
player = null;
}
refreshEvent();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
private static void refreshEvent()
{
_log.info("refreshEvent");
ThreadConnection con = null;
FiltredPreparedStatement st = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("DELETE FROM pursuit");
st.execute();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
private static void deleteEnterHero(String name)
{
_log.info("deleteEnterHero");
if (!isEnterHero(name))
return;
L2PcInstance player = L2World.getInstance().getPlayer(name);
if (player != null)
player.setHero(false);
ThreadConnection con = null;
FiltredPreparedStatement st = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("DELETE FROM enterhero WHERE char_name=?");
st.setString(1, name);
st.execute();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
private static void setEnterHero(String name)
{
_log.info("setEnterHero");
if (isEnterHero(name))
return;
ThreadConnection con = null;
FiltredPreparedStatement st = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("INSERT INTO enterhero (char_name) values(?)");
st.setString(1, name);
st.execute();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
public static boolean isEnterHero(String name)
{
_log.info("isEnterHero");
ThreadConnection con = null;
FiltredPreparedStatement st = null;
int cnt = 0;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("SELECT COUNT(*) FROM enterhero WHERE char_name=?");
st.setString(1, name);
ResultSet rs = st.executeQuery();
if (rs.next())
cnt = 1;
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
if (cnt == 0)
return false;
else
return true;
}
public static void StartEventOfBonusItem()
{
thr = new Thread() {
@ Override
public void run()
{
while (true)
{
int minutes = Integer.parseInt(new SimpleDateFormat("mm").format(Calendar.getInstance().getTime()));
if (minutes == 5 || minutes == 15 || minutes == 25 || minutes == 35 || minutes == 45)
{
_log.info("5,15,25,35,45 min");
Announcements.getInstance().announceToAll(annons1);
}
else if (minutes == 55)
{
_log.info("55 min");
Announcements.getInstance().announceToAll(annons2);
}
else if (minutes == 59)
{
ThreadConnection con = null;
FiltredPreparedStatement st = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("SELECT * FROM enterhero");
ResultSet rs = st.executeQuery();
while (rs.next())
{
String name = rs.getString("char_name");
L2PcInstance player = L2World.getInstance().getPlayer(name);
if (player != null)
player.setHero(false);
deleteEnterHero(name);
Announcements.getInstance().announceToAll("Геройство с победителя евента \"Сборкищ\": + " + name + " снято!");
}
rs.close();
}
catch (Exception ex)
{
_log.warning("" + ex);
}
finally
{
DatabaseUtils.closeDatabaseCS(con, st);
}
}
else if (minutes == 0)
{
_log.info("reward");
toReward();
}
try
{
_log.info("sleep " + minutes);
Thread.sleep(60000);
}
catch (Exception ex)
{
_log.warning("" + ex);
}
}
}
};
thr.start();
}
}
В EnterWorld добавить:
Скрытый текст
if (L2PursuitInstance.isEnterHero(activeChar.getName()))
activeChar.setHero(true);
Сделать запрос в БД:
Скрытый текст
CREATE TABLE enterhero (
char_name varchar(35) NOT NULL,
PRIMARY KEY (char_name)
);