package custom.ServiceManager;
import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.HashMap;
import java.util.Map;
import ru.catssoftware.gameserver.datatables.ItemTable;
import ru.catssoftware.gameserver.handler.IVoicedCommandHandler;
import ru.catssoftware.gameserver.handler.VoicedCommandHandler;
import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.quest.Quest;
import ru.catssoftware.gameserver.model.quest.QuestState;
import ru.catssoftware.gameserver.util.PcAction;
import ru.catssoftware.util.Log;
//import javolution.text.TextBuilder;
import ru.catssoftware.gameserver.network.serverpackets.PlaySound;
import ru.catssoftware.gameserver.network.serverpackets.PledgeSkillList;
import ru.catssoftware.gameserver.datatables.SkillTable;
public class ServiceManager extends Quest {
private static String qn = "ServiceManager";
private static class Price {
private int[] _itemId;
private int[] _prices;
public Price(int[] items, int[] count) {
_itemId = items;
_prices = count;
}
}
private static Map<Integer, Price> _premiumPrice = new HashMap<Integer, Price>();
private static Map<Integer, Price> _heroPrice = new HashMap<Integer, Price>();
private static Price _colorPrice = new Price(new int[]{4037}, new int[]{10});
private static Price _NoblesPrice = new Price(new int[]{4037}, new int[]{3});
private static Price _ClanSkills = new Price(new int[]{4037}, new int[]{35});
//private static Price _setNamePrice = new Price(new int[]{4037}, new int[]{10});
private static Price _nullPK = new Price(new int[]{4037}, new int[]{10});
private static Price _clanlvl8 = new Price(new int[]{4037}, new int[]{15});
private static Price _crp10k = new Price(new int[]{4037}, new int[]{3});
private String colorTable = "";
private String colorTable2 = "";
public ServiceManager() {
super(-1, qn, "quests");
// ================= ЦЕНЫ НА ДВОРЯНСТВО ========
// дни, new Price(new int[] {через , ИД предметов},new int[] {через , количество});
_premiumPrice.put(1, new Price(new int[]{4037}, new int[]{3}));
_premiumPrice.put(3, new Price(new int[]{4037}, new int[]{7}));
_premiumPrice.put(7, new Price(new int[]{4037}, new int[]{15}));
// ================ ЦЕНЫ НА ГЕРОИЗМ ===============
_heroPrice.put(3, new Price(new int[]{4037}, new int[]{12}));
_heroPrice.put(7, new Price(new int[]{4037}, new int[]{28}));
_heroPrice.put(14, new Price(new int[]{4037}, new int[]{50}));
_heroPrice.put(21, new Price(new int[]{4037}, new int[]{70}));
_heroPrice.put(31, new Price(new int[]{4037}, new int[]{100}));
// Таблица цветов из colors.table
File f = new File(getScriptFile());
try {
LineNumberReader lnr = new LineNumberReader(new FileReader(f.getParent() + "/colors.table"));
String line;
while ((line = lnr.readLine()) != null) {
String[] colors = line.split("\t");
colorTable += "<tr>";
colorTable2 += "<tr>";
for (int i = 0; i < colors.length; i++) {
colorTable += "<td><a action=\"bypass -h Quest " + qn + " color " + colors[i] + "\"><font color=\"" + colors[i] + "\">%name%</font></a></td>";
colorTable2 += "<td><a action=\"bypass -h Quest " + qn + " color2 " + colors[i] + "\"><font color=\"" + colors[i] + "\">%name%</font></a></td>";
}
colorTable += "</tr>";
colorTable2 += "</tr>";
}
lnr.close();
} catch (Exception e) {
System.out.println("Error reading " + f.getParent() + "/colors.table");
}
}
private boolean checkMoney(L2PcInstance player, Price price) {
for (int i = 0; i < price._itemId.length; i++) // Проверяем средства
{
if (player.getInventory().getItemByItemId(price._itemId[i]) == null
|| player.getInventory().getItemByItemId(price._itemId[i]).getCount() < price._prices[i]) {
return false; // Нет денег? Сории
}
}
for (int i = 0; i < price._itemId.length; i++) // Отнимаем средства у населения
{
if (!player.destroyItemByItemId(qn, price._itemId[i], price._prices[i], null, true)) {
return false;
}
}
return true;
}
@Override
public String onAdvEvent(String event, L2NpcInstance npc, L2PcInstance player) {
String[] args = event.split(" "); // Разбираем строку параметров
if (args[0].equals("premiumlist")) { // Формируем список доступных дней премиума
String html = "<html><body><br>Покупка премиума:<br><center>";
for (int days : _premiumPrice.keySet()) {
html += "<a action=\"bypass -h Quest " + qn + " premium " + days + "\">На " + days + " дней</a> -";
Price price = _premiumPrice.get(days);
for (int i = 0; i < price._itemId.length; i++) { // Формируем список стоимости
if (i != 0) // Добавляем ,
{
html += ",";
}
html += price._prices[i] + " " + ItemTable.getInstance().getTemplate(price._itemId[i]).getName();
}
}
html += "</center></body></html>";
return html;
} else if (args[0].equals("herolist")) { // Список достпуного геройства, аналогично премиуму
return "herolist.htm";
} else if (args[0].equals("nothing")) { // Список достпуного геройства, аналогично премиуму
return "nothing.htm";
} else if (args[0].equals("premium")) { // Выдаем премиум
if (player.getPremiumService() != 0) // Проверяем а не премимум ли чар?
{
return "already-premium"+player.getLang()+".htm";
}
int numDays = 0;
Price price = null;
try {
numDays = Integer.parseInt(args[1]); // В Java массивы нумеруются с 0
price = _premiumPrice.get(numDays); // Ищем цену в списке цен
} catch (Exception e) {
price = null;
}
if (price == null) // Не нашли. Что-то тут не то...
{
return "invalid-param"+player.getLang()+".htm";
}
if (!checkMoney(player, price)) // Проверяем деньги
{
return "no-money"+player.getLang()+".htm";
}
PcAction.addPremiumServices(player, numDays, player.getAccountName()); // Выдаем премиум
Log.donate("Premium", player.getFingerPrints());
// Показываем .premium меню
IVoicedCommandHandler premium = VoicedCommandHandler.getInstance().getVoicedCommandHandler("premium");
if (premium != null) {
premium.useVoicedCommand("premium", player, null);
} else {
return "success"+player.getLang()+".htm";
}
} else if (args[0].equals("noblese")) { // Дворянство
if (player.isNoble()) // Игрок уже нубл
{
return "already-noble"+player.getLang()+".htm";
}
if (!checkMoney(player, _NoblesPrice)) // Проверяем Деньги
{
return "no-money"+player.getLang()+".htm";
}
player.setNoble(true); // Даем нубла
Log.donate("Noble", player.getFingerPrints());
return "success"+player.getLang()+".htm";
}
else if (args[0].equals("service")) {
return "service"+player.getLang()+".htm";
}
else if (args[0].equals("shop")) {
return "shop"+player.getLang()+".htm";
}
else if (args[0].equals("nullpk")) {
return "nullpk"+player.getLang()+".htm";
}
else if (args[0].equals("clan")) {
return "clan"+player.getLang()+".htm";
}
else if (args[0].equals("skills"))
{
if (!player.isClanLeader()) // Игрок не кланлидер
{
return "noclan-leader"+player.getLang()+".htm";
}
if (!checkMoney(player, _ClanSkills)) // Проверяем Деньги
{
return "no-money"+player.getLang()+".htm";
}
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(370,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(371,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(372,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(373,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(374,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(375,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(376,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(377,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(378,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(379,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(380,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(381,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(382,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(383,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(384,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(385,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(386,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(387,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(388,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(389,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(390,3));
player.getClan().addNewSkill(SkillTable.getInstance().getInfo(391,1));
player.getClan().broadcastToOnlineMembers(new PledgeSkillList(player.getClan()));
player.sendPacket(new PlaySound("ItemSound.quest_finish"));
Log.donate("HeroStatus", player.getFingerPrints());
return "success"+player.getLang()+".htm";
}
else if (args[0].equals("hero")) { // Геройство
if (player.isHero()) {
return "already-hero"+player.getLang()+".htm";
}
int numDays = 0;
Price price = null;
try {
numDays = Integer.parseInt(args[1]); // В Java массивы нумеруются с 0
price = _premiumPrice.get(numDays); // Ищем цену в списке цен
} catch (Exception e) {
price = null;
}
if (price == null) // Не нашли. Что-то тут не то...
{
return "invalid-param"+player.getLang()+".htm";
}
if (!checkMoney(player, price)) // Проверяем Деньги
{
return "no-money"+player.getLang()+".htm";
}
PcAction.addHeroStatus(player, numDays); // Даем героя России.
Log.donate("HeroStatus", player.getFingerPrints());
return "success"+player.getLang()+".htm";
} else if (args[0].equals("colorlist")) { // Список цветов
String prices = "";
for (int i = 0; i < _colorPrice._itemId.length; i++) // Проверяем средства
{
prices += _colorPrice._prices[i] + " " + ItemTable.getInstance().getItemName(_colorPrice._itemId[i]) + "<br>";
}
return "<html><body><center>Цвет ника<br><br>Стоимость услуги: " + prices + "<br>"
+ "<button value=\"Продолжить\" action=\"bypass -h Quest ServiceManager colorlistok\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></center></body></html>.";
} else if (args[0].equals("colorlistok")) { // Список цветов
String html = "<html><body><br>Выбор цвета<table width=220>";
html += (colorTable.replace("%name%", player.getName()));
html += "</table></body></html>";
return html;
} else if (args[0].equals("color")) { //Смена цвета
if (!checkMoney(player, _colorPrice)) {
return "no-money"+player.getLang()+".htm";
}
int color = 0;
/*
try {
String nicknamess = (new TextBuilder(""+args[1])).reverse().toString();
color = Integer.decode((new StringBuilder()).append("0x").append(nicknamess).toString());
} catch (Exception e) {
color = 0;
}
if (color == 0) // Не нашли. Что-то тут не то...
{
return "invalid-param"+player.getLang()+".htm";
}
*/
try {
color = Integer.parseInt(args[1], 16); // Получаем цвет и меняем старший и младший байты
} catch (Exception e) {
color = 0;
}
if (color == 0) // Не нашли. Что-то тут не то...
{
return "invalid-param.htm";
}
color = (color & 0xFF) << 16 | (color & 0xff0000) >> 16 | (color & 0xff00);
// Меняем цвет и посылаем всем пакет что цвет сменен
player.getAppearance().setNameColor(color);
player.broadcastFullInfo();
Log.donate("Color", player.getFingerPrints() + ", NameColor: " + args[1]);
return "success"+player.getLang()+".htm";
} else if (args[0].equals("colorlist2")) { // Список цветов
String prices = "";
for (int i = 0; i < _colorPrice._itemId.length; i++) // Проверяем средства
{
prices += _colorPrice._prices[i] + " " + ItemTable.getInstance().getItemName(_colorPrice._itemId[i]) + "<br>";
}
return "<html><body><center>Цвет ника<br><br>Стоимость услуги: " + prices + "<br>"
+ "<button value=\"Продолжить\" action=\"bypass -h Quest ServiceManager colorlist2ok\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></center></body></html>.";
} else if (args[0].equals("colorlist2ok")) { // Список цветов
String html = "<html><body><br>Выбор цвета<table width=220>";
html += (colorTable2.replace("%name%", player.getName()));
html += "</table></body></html>";
return html;
} else if (args[0].equals("color2")) { //Смена цвета
if (!checkMoney(player, _colorPrice)) {
return "no-money"+player.getLang()+".htm";
}
int color = 0;
/*
try {
String nicknamess = (new TextBuilder(""+args[1])).reverse().toString();
color = Integer.decode((new StringBuilder()).append("0x").append(nicknamess).toString());
} catch (Exception e) {
color = 0;
}
if (color == 0) // Не нашли. Что-то тут не то...
{
return "invalid-param"+player.getLang()+".htm";
}
*/
try {
color = Integer.parseInt(args[1], 16); // Получаем цвет и меняем старший и младший байты
} catch (Exception e) {
color = 0;
}
if (color == 0) // Не нашли. Что-то тут не то...
{
return "invalid-param.htm";
}
color = (color & 0xFF) << 16 | (color & 0xff0000) >> 16 | (color & 0xff00);
// Меняем цвет и посылаем всем пакет что цвет сменен
player.getAppearance().setTitleColor(color);
player.broadcastFullInfo();
Log.donate("Color", player.getFingerPrints() + ", TitleColor: " + args[1]);
return "success"+player.getLang()+".htm";
} else if (args[0].equals("htmsetname")) { // Смена ника
return "setnamehtm"+player.getLang()+".htm";
} else if (args[0].equals("setname")) { // Смена ника
/*String nick = args[1];
if (nick.contains("?") || nick.contains("/") || nick.contains(";") || nick.contains(" ") || nick.contains(",")) {
player.sendMessage("Ник не может содержать ? или ; или , или /");//Проверили на некоторые символы, вернули страницу ошибки
return "invalid-param.htm";
}
if (player.isClanLeader()) {
player.sendMessage("Передайте клан другому персонажу на время смены ника!");//Проверили на Клство
return "invalid-param.htm";
}
if (!checkMoney(player, _setNamePrice)) // Проверяем Деньги
{
return "no-money.htm";
}
player.setName(nick);// даем новый ник
player.broadcastFullInfo();
player.sendMessage("Ваш ник удачно изменен на " + nick);
return "success.htm";*/
return "invalid-param"+player.getLang()+".htm";
} else if (args[0].equals("nullpk")) { // Обнуление пк и кармы
String prices = "";
for (int i = 0; i < _nullPK._itemId.length; i++) // Проверяем средства
{
prices += _nullPK._prices[i] + " " + ItemTable.getInstance().getItemName(_nullPK._itemId[i]) + "<br>";
}
return "<html><body><center>Обнуление ПК<br><br>Стоимость услуги: " + prices + "<br>"
+ "<button value=\"Продолжить\" action=\"bypass -h Quest ServiceManager nullpkok\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></body></center></html>.";
} else if (args[0].equals("nullpkok")) { // Обнуление пк и кармы
if (player.getPkKills() == 0) { // У игрока 0 пк
player.sendMessage("У вас 0 ПК");
return "invalid-param"+player.getLang()+".htm";
}
if (!checkMoney(player, _nullPK)) // Проверяем Деньги
{
return "no-money"+player.getLang()+".htm";
}
player.setPkKills(0); // Обнуляем ПК
player.setKarma(0); // Обнуляем карму
player.sendMessage("Теперь у вас 0 ПК и 0 кармы!");
Log.donate("nullpk", player.getFingerPrints());
//return "<html><body><center><br><br>Теперь у вас 0 ПК и 0 кармы!<img src=\"l2ui.squaregray\" width=\"295\" height=\"1\"><br><br><tr><td><button value=\"Назад\" action=\"bypass -h Quest ServiceManager\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></td></tr></center></body></html>.";
return "success"+player.getLang()+".htm";
} else if (args[0].equals("clanlvl8")) { // 8 clan lvl
if (player.getClan() == null || player.getClan().getLevel() < 5) //клан больше 5?
{
player.sendMessage("Уровень клана должен быть 5 или выше!");
//return "invalid-param"+player.getLang()+".htm";
return "<html><body><center><br><br>Уровень клана должен быть 5 или выше!<img src=\"l2ui.squaregray\" width=\"295\" height=\"1\"><br><br><tr><td><button value=\"Назад\" action=\"bypass -h Quest ServiceManager\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></td></tr></center></body></html>.";
}
if (player.getClan() == null || player.getClan().getLevel() >= 8) //клан больше 5?
{
player.sendMessage("Уровень клана должен быть меньше 8 лвл!");
//return "invalid-param"+player.getLang()+".htm";
return "<html><body><center><br><br>Уровень клана должен быть меньше 8 лвл!<img src=\"l2ui.squaregray\" width=\"295\" height=\"1\"><br><br><tr><td><button value=\"Назад\" action=\"bypass -h Quest ServiceManager\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></td></tr></center></body></html>.";
}
if (!checkMoney(player, _clanlvl8)) // Проверяем Деньги
{
return "no-money"+player.getLang()+".htm";
}
player.getClan().changeLevel(8); // Делаем 8 лвл клану
player.getClan().store();
player.sendMessage("Уровень клана: "+player.getClan().getLevel()+" лвл.");
Log.donate("clanlvl8", player.getFingerPrints());
return "success"+player.getLang()+".htm";
} else if (args[0].equals("crp10k")) { // клан 10k crp
if (player.getClan() == null || player.getClan().getLevel() <= 5) //клан больше 5?
{
player.sendMessage("Уровень клана должен быть 6 или выше!");
//return "invalid-param"+player.getLang()+".htm";
return "<html><body><center><br><br>Уровень клана должен быть 5 или выше!<img src=\"l2ui.squaregray\" width=\"295\" height=\"1\"><br><br><tr><td><button value=\"Назад\" action=\"bypass -h Quest ServiceManager\" width=93 height=22 back=\"saitan.But2\" fore=\"saitan.But3\"></td></tr></center></body></html>.";
}
if (!checkMoney(player, _crp10k)) // Проверяем Деньги
{
return "no-money"+player.getLang()+".htm";
}
player.getClan().setReputationScore(player.getClan().getReputationScore() + 10000, true); // даем 10к крп
//player.getClan().store();
player.sendMessage("Репутация клана: "+player.getClan().getReputationScore()+" очков.");
Log.donate("crp10k", player.getFingerPrints());
return "success"+player.getLang()+".htm";
}
else if (event.startsWith("lang")) {
try {
player.setChatLanguage(Integer.parseInt(event.substring(5)));
}
catch (Exception e) {
}
}
return "hello"+player.getLang()+".htm";
}
@Override
public String onFirstTalk(L2NpcInstance npc, L2PcInstance player) {
return onTalk(npc, player);
}
@Override
public String onTalk(L2NpcInstance npc, L2PcInstance player) {
QuestState qs = player.getQuestState(qn);
if (qs == null) {
qs = newQuestState(player);
}
return "hello"+player.getLang()+".htm";
}
public static void main(String[] args) {
ServiceManager ps = new ServiceManager();
ps.addFirstTalkId(50016); // Мы не хотим писать диалог для этого НПЦ
ps.addStartNpc(50016); // Автоматический контроль состояния квеста
ps.addTalkId(50016); // NPC с которым можно говорить.
}
}