/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L2J DataPack is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package handlers.bypasshandlers;
import java.util.Calendar;
import java.util.List;
import java.util.logging.Level;
import com.l2jserver.Config;
import com.l2jserver.gameserver.SevenSigns;
import com.l2jserver.gameserver.SevenSignsFestival;
import com.l2jserver.gameserver.handler.IBypassHandler;
import com.l2jserver.gameserver.model.L2Party;
import com.l2jserver.gameserver.model.L2Party.messageType;
import com.l2jserver.gameserver.model.StatsSet;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2FestivalGuideInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.util.StringUtil;
public class Festival implements IBypassHandler
{
private static final String[] COMMANDS =
{
"festival",
"festivaldesc"
};
@Override
public boolean useBypass(String command, L2PcInstance activeChar, L2Character target)
{
if (!(target instanceof L2FestivalGuideInstance))
{
return false;
}
final L2FestivalGuideInstance npc = (L2FestivalGuideInstance) target;
try
{
final int val;
if (command.toLowerCase().startsWith(COMMANDS[1]))
{
val = Integer.parseInt(command.substring(13));
npc.showChatWindow(activeChar, val, null, true);
return true;
}
final L2Party party;
val = Integer.parseInt(command.substring(9, 10));
switch (val)
{
case 1: // Become a Participant
// Check if the festival period is active, if not then don't allow registration.
if (SevenSigns.getInstance().isSealValidationPeriod())
{
npc.showChatWindow(activeChar, 2, "a", false);
return true;
}
// Check if a festival is in progress, then don't allow registration yet.
if (SevenSignsFestival.getInstance().isFestivalInitialized())
{
activeChar.sendMessage("You cannot sign up while a festival is in progress.");
return true;
}
// Check if the player is in a formed party already.
if (!activeChar.isInParty())
{
npc.showChatWindow(activeChar, 2, "b", false);
return true;
}
party = activeChar.getParty();
// Check if the player is the party leader.
if (!party.isLeader(activeChar))
{
npc.showChatWindow(activeChar, 2, "c", false);
return true;
}
// Check to see if the party has at least 5 members.
if (party.getMemberCount() < Config.ALT_FESTIVAL_MIN_PLAYER)
{
npc.showChatWindow(activeChar, 2, "b", false);
return true;
}
// Check if all the party members are in the required level range.
if (party.getLevel() > SevenSignsFestival.getMaxLevelForFestival(npc.getFestivalType()))
{
npc.showChatWindow(activeChar, 2, "d", false);
return true;
}
// Check to see if the player has already signed up
if (activeChar.isFestivalParticipant())
{
SevenSignsFestival.getInstance().setParticipants(npc.getFestivalOracle(), npc.getFestivalType(), party);
npc.showChatWindow(activeChar, 2, "f", false);
return true;
}
npc.showChatWindow(activeChar, 1, null, false);
break;
case 2: // Seal Stones
final int stoneType = Integer.parseInt(command.substring(11));
final int stoneCount = npc.getStoneCount(stoneType);
if (stoneCount <= 0)
{
return false;
}
if (!activeChar.destroyItemByItemId("SevenSigns", stoneType, stoneCount, npc, true))
{
return false;
}
SevenSignsFestival.getInstance().setParticipants(npc.getFestivalOracle(), npc.getFestivalType(), activeChar.getParty());
SevenSignsFestival.getInstance().addAccumulatedBonus(npc.getFestivalType(), stoneType, stoneCount);
npc.showChatWindow(activeChar, 2, "e", false);
break;
case 3: // Score Registration
// Check if the festival period is active, if not then don't register the score.
if (SevenSigns.getInstance().isSealValidationPeriod())
{
npc.showChatWindow(activeChar, 3, "a", false);
return true;
}
// Check if a festival is in progress, if it is don't register the score.
if (SevenSignsFestival.getInstance().isFestivalInProgress())
{
activeChar.sendMessage("You cannot register a score while a festival is in progress.");
return true;
}
// Check if the player is in a party.
if (!activeChar.isInParty())
{
npc.showChatWindow(activeChar, 3, "b", false);
return true;
}
final List prevParticipants = SevenSignsFestival.getInstance().getPreviousParticipants(npc.getFestivalOracle(), npc.getFestivalType());
// Check if there are any past participants.
if ((prevParticipants == null) || prevParticipants.isEmpty() || !prevParticipants.contains(activeChar.getObjectId()))
{
npc.showChatWindow(activeChar, 3, "b", false);
return true;
}
// Check if this player was the party leader in the festival.
if (activeChar.getObjectId() != prevParticipants.get(0))
{
npc.showChatWindow(activeChar, 3, "b", false);
return true;
}
final L2ItemInstance bloodOfferings = activeChar.getInventory().getItemByItemId(SevenSignsFestival.FESTIVAL_OFFERING_ID);
// Check if the player collected any blood offerings during the festival.
if (bloodOfferings == null)
{
activeChar.sendMessage("You do not have any blood offerings to contribute.");
return true;
}
final long offeringScore = bloodOfferings.getCount() * SevenSignsFestival.FESTIVAL_OFFERING_VALUE;
if (!activeChar.destroyItem("SevenSigns", bloodOfferings, npc, false))
{
return true;
}
final boolean isHighestScore = SevenSignsFestival.getInstance().setFinalScore(activeChar, npc.getFestivalOracle(), npc.getFestivalType(), offeringScore);
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CONTRIB_SCORE_INCREASED_S1);
sm.addLong(offeringScore);
activeChar.sendPacket(sm);
if (isHighestScore)
{
npc.showChatWindow(activeChar, 3, "c", false);
}
else
{
npc.showChatWindow(activeChar, 3, "d", false);
}
break;
case 4: // Current High Scores
final StringBuilder strBuffer = StringUtil.startAppend(500, "Festival Guide:
These are the top scores of the week, for the ");
final StatsSet dawnData = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DAWN, npc.getFestivalType());
final StatsSet duskData = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DUSK, npc.getFestivalType());
final StatsSet overallData = SevenSignsFestival.getInstance().getOverallHighestScoreData(npc.getFestivalType());
final int dawnScore = dawnData.getInt("score");
final int duskScore = duskData.getInt("score");
int overallScore = 0;
// If no data is returned, assume there is no record, or all scores are 0.
if (overallData != null)
{
overallScore = overallData.getInt("score");
}
StringUtil.append(strBuffer, SevenSignsFestival.getFestivalName(npc.getFestivalType()), " festival.
");
if (dawnScore > 0)
{
StringUtil.append(strBuffer, "Dawn: ", calculateDate(dawnData.getString("date")), ". Score ", String.valueOf(dawnScore), "
", dawnData.getString("members"), "
");
}
else
{
strBuffer.append("Dawn: No record exists. Score 0
");
}
if (duskScore > 0)
{
StringUtil.append(strBuffer, "Dusk: ", calculateDate(duskData.getString("date")), ". Score ", String.valueOf(duskScore), "
", duskData.getString("members"), "
");
}
else
{
strBuffer.append("Dusk: No record exists. Score 0
");
}
if ((overallScore > 0) && (overallData != null))
{
final String cabalStr;
if (overallData.getString("cabal").equals("dawn"))
{
cabalStr = "Children of Dawn";
}
else
{
cabalStr = "Children of Dusk";
}
StringUtil.append(strBuffer, "Consecutive top scores: ", calculateDate(overallData.getString("date")), ". Score ", String.valueOf(overallScore), "
Affilated side: ", cabalStr, "
", overallData.getString("members"), "
");
}
else
{
strBuffer.append("Consecutive top scores: No record exists. Score 0
");
}
StringUtil.append(strBuffer, "Go back.");
final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
html.setHtml(strBuffer.toString());
activeChar.sendPacket(html);
break;
case 8: // Increase the Festival Challenge
if (!activeChar.isInParty())
{
return true;
}
if (!SevenSignsFestival.getInstance().isFestivalInProgress())
{
return true;
}
party = activeChar.getParty();
if (!party.isLeader(activeChar))
{
npc.showChatWindow(activeChar, 8, "a", false);
return true;
}
if (SevenSignsFestival.getInstance().increaseChallenge(npc.getFestivalOracle(), npc.getFestivalType()))
{
npc.showChatWindow(activeChar, 8, "b", false);
}
else
{
npc.showChatWindow(activeChar, 8, "c", false);
}
break;
case 9: // Leave the Festival
if (!activeChar.isInParty())
{
return true;
}
party = activeChar.getParty();
if (party.isLeader(activeChar))
{
SevenSignsFestival.getInstance().updateParticipants(activeChar, null);
}
else
{
if (party.getMemberCount() > Config.ALT_FESTIVAL_MIN_PLAYER)
{
party.removePartyMember(activeChar, messageType.Expelled);
}
else
{
activeChar.sendMessage("Only the party leader can leave a festival when a party has minimum number of members.");
}
}
break;
case 0: // Distribute Accumulated Bonus
if (!SevenSigns.getInstance().isSealValidationPeriod())
{
activeChar.sendMessage("Bonuses cannot be paid during the competition period.");
return true;
}
if (SevenSignsFestival.getInstance().distribAccumulatedBonus(activeChar) > 0)
{
npc.showChatWindow(activeChar, 0, "a", false);
}
else
{
npc.showChatWindow(activeChar, 0, "b", false);
}
break;
default:
npc.showChatWindow(activeChar, val, null, false);
}
return true;
}
catch (Exception e)
{
_log.log(Level.WARNING, "Exception in " + getClass().getSimpleName(), e);
}
return false;
}
private final String calculateDate(String milliFromEpoch)
{
long numMillis = Long.valueOf(milliFromEpoch);
Calendar calCalc = Calendar.getInstance();
calCalc.setTimeInMillis(numMillis);
return calCalc.get(Calendar.YEAR) + "/" + calCalc.get(Calendar.MONTH) + "/" + calCalc.get(Calendar.DAY_OF_MONTH);
}
@Override
public String[] getBypassList()
{
return COMMANDS;
}
}