Короче изменяю кота (менеджера), что бы он мог обнулять и всякое такое с чаром делать
Произошла проблема - как реализовать счётчик обнулений? т.е. за счёт чего? реализовывал через скилл, но часто происходит ошибка SQL (не пишет в базу просто, а тока находиться в кеше на сервере)
Прошу совета как поправить...
import javolution.lang.TextBuilder;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.Announcements;
import net.sf.l2j.gameserver.CharTemplateTable;
import net.sf.l2j.gameserver.SkillTable;
import net.sf.l2j.gameserver.ai.CtrlIntention;
import net.sf.l2j.gameserver.model.Inventory;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.base.ClassId;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.serverpackets.InventoryUpdate;
import net.sf.l2j.gameserver.serverpackets.MyTargetSelected;
import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage;
import net.sf.l2j.gameserver.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.serverpackets.ValidateLocation;
import net.sf.l2j.gameserver.templates.L2NpcTemplate;
/**
* This class ...
*
* @version $Revision: 1.4.2.1.2.7 $ $Date: 2005/03/27 15:29:32 $
*/
public final class L2ClassMasterInstance extends L2FolkInstance
{
/**
* @param template
*/
public L2ClassMasterInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
}
public void onAction(L2PcInstance player)
{
if (getObjectId() != player.getTargetId())
{
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null);
player.setTarget(this);
player.sendPacket(new MyTargetSelected(getObjectId(), player.getLevel() - getLevel()));
// correct location
player.sendPacket(new ValidateLocation(this));
}
else
{
if (!isInsideRadius(player, INTERACTION_DISTANCE, false, false))
{
player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this);
return;
}
NpcHtmlMessage html = new NpcHtmlMessage(1);
TextBuilder sb = new TextBuilder();
sb.append("<html><body>");
sb.append("Жрец магии АДМИНА:<br>");
sb.append("<br>");
ClassId classId = player.getClassId();
int level = player.getLevel();
int lvl = classId.level();
if ((level >= 20 && lvl == 0) || (level >= 40 && lvl == 1) || (level >= 76 && lvl == 2) || (level >= 80 ))
{
if ((lvl == 0 && Config.ALLOW_CLASS_MASTER_1) || (lvl == 1 && Config.ALLOW_CLASS_MASTER_2) || (lvl == 2 && Config.ALLOW_CLASS_MASTER_3))
{
sb.append("Это список профессий, которые вы можете активировать:<br>");
sb.append("<br>");
for (ClassId child : ClassId.values())
if (child.childOf(classId) && child.level() == lvl+1)
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (child.getId()) + "\">Advance to " + CharTemplateTable.getClassNameById(child.getId()) + "</a><br>");
sb.append("<br>");
}
else
{
sb.append("Вам доступно обнуление, на кого Вы хотите обнулиться ?:<br>");
sb.append("<br>");
sb.append("Люди:<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x00) + "\">Advance to " + CharTemplateTable.getClassNameById(0x00) + "</a><br>");
sb.append("<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x0a) + "\">Advance to " + CharTemplateTable.getClassNameById(0x0a) + "</a><br>");
sb.append("<br>");
sb.append("Эльфы:<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x12) + "\">Advance to " + CharTemplateTable.getClassNameById(0x12) + "</a><br>");
sb.append("<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x19) + "\">Advance to " + CharTemplateTable.getClassNameById(0x19) + "</a><br>");
sb.append("<br>");
sb.append("Тёмные Эльфы:<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x1f) + "\">Advance to " + CharTemplateTable.getClassNameById(0x1f) + "</a><br>");
sb.append("<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x26) + "\">Advance to " + CharTemplateTable.getClassNameById(0x26) + "</a><br>");
sb.append("<br>");
sb.append("Орки:<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x2c) + "\">Advance to " + CharTemplateTable.getClassNameById(0x2c) + "</a><br>");
sb.append("<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x31) + "\">Advance to " + CharTemplateTable.getClassNameById(0x31) + "</a><br>");
sb.append("<br>");
sb.append("Гномы:<br>");
sb.append("<a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (0x35) + "\">Advance to " + CharTemplateTable.getClassNameById(0x35) + "</a><br>");
sb.append("<br>");
}
}
else
{
switch (lvl)
{
case 0:
sb.append("Возвращайтесь ко мне, когда получите 20 level для прокачки следующего вашего класса (профессии).<br>");
break;
case 1:
sb.append("Возвращайтесь ко мне, когда получите 40 level для прокачки следующего вашего класса (профессии).<br>");
break;
case 2:
sb.append("Возвращайтесь ко мне, когда получите 76 level для прокачки следующего вашего класса (профессии).<br>");
break;
case 3:
sb.append("Этот класс являеться вашей финальной профессией, вы не можете его повысить.<br>");
break;
}
sb.append("<br>");
}
for (Quest q : Quest.findAllEvents())
sb.append("Event: <a action=\"bypass -h Quest " + q.getName() + "\">" + q.getDescr() + "</a><br>");
sb.append("</body></html>");
html.setHtml(sb.toString());
player.sendPacket(html);
player.sendPacket(new ActionFailed());
}
}
public void onBypassFeedback(L2PcInstance player, String command)
{
if (command.startsWith("change_class"))
{
int val = Integer.parseInt(command.substring(13));
int level = player.getLevel();
int jobLevel;
int newJobLevel;
//int ConObn = 1;
String mes = "<br>";
//ConObn = player.getSkillLevel(11098);
jobLevel = player.getClassId().level();
newJobLevel = ClassId.values()[val].level();
/*
if(jobLevel == 3) // no more job changes
{
if (ConObn < 2)
{
setTarget(player, 4, Inventory.PAPERDOLL_HEAD);
setTarget(player, 4, Inventory.PAPERDOLL_CHEST);
setTarget(player, 4, Inventory.PAPERDOLL_GLOVES);
setTarget(player, 4, Inventory.PAPERDOLL_RHAND);
setTarget(player, 4, Inventory.PAPERDOLL_LHAND);
setTarget(player, 4, Inventory.PAPERDOLL_LEGS);
setTarget(player, 4, Inventory.PAPERDOLL_FEET);
setTarget(player, 4, Inventory.PAPERDOLL_BACK);
setTarget(player, 4, Inventory.PAPERDOLL_LEAR);
setTarget(player, 4, Inventory.PAPERDOLL_REAR);
setTarget(player, 4, Inventory.PAPERDOLL_LFINGER);
setTarget(player, 4, Inventory.PAPERDOLL_RFINGER);
setTarget(player, 4, Inventory.PAPERDOLL_NECK);
setTarget(player, 4, Inventory.PAPERDOLL_UNDER);
ConObn = 1;
mes = ("Так как это ваше первое обнуление вся одежда и оружие, которое на вас одето - было заточено на +4.<br>");
L2Skill skillAdd = SkillTable.getInstance().getInfo(11098,(ConObn + 1));
player.removeExpAndSp((player.getExp() - 1), player.getSp());
player.addSkill(skillAdd);
Announcements sys = new Announcements();
sys.handleAnnounce("У нас есть впервые обнулённый " + player.getName(), 15);
}
else
if (ConObn >= 2 && ConObn < 5)
{
setTarget(player, 2, Inventory.PAPERDOLL_HEAD);
setTarget(player, 2, Inventory.PAPERDOLL_CHEST);
setTarget(player, 2, Inventory.PAPERDOLL_GLOVES);
setTarget(player, 2, Inventory.PAPERDOLL_RHAND);
setTarget(player, 2, Inventory.PAPERDOLL_LHAND);
setTarget(player, 2, Inventory.PAPERDOLL_LEGS);
setTarget(player, 2, Inventory.PAPERDOLL_FEET);
setTarget(player, 2, Inventory.PAPERDOLL_BACK);
setTarget(player, 2, Inventory.PAPERDOLL_LEAR);
setTarget(player, 2, Inventory.PAPERDOLL_REAR);
setTarget(player, 2, Inventory.PAPERDOLL_LFINGER);
setTarget(player, 2, Inventory.PAPERDOLL_RFINGER);
setTarget(player, 2, Inventory.PAPERDOLL_NECK);
setTarget(player, 2, Inventory.PAPERDOLL_UNDER);
mes = ("Это ваше " + ConObn + " обнуление - вся одежда и оружие, которое на вас одето - было заточено на +2.<br>");
L2Skill skillAdd = SkillTable.getInstance().getInfo(11098,(ConObn + 1));
player.removeExpAndSp((player.getExp() - 1), player.getSp());
player.addSkill(skillAdd);
}
else
if (ConObn >= 5)
{
NpcHtmlMessage html = new NpcHtmlMessage(1);
TextBuilder sb = new TextBuilder();
sb.append("<html><head><body>");
sb.append("Вы не можете сейчас иметь больше <font color=\"LEVEL\">" + ConObn + "</font> базовых профессий.");
sb.append("<br>");
sb.append("Для продолжения обнулений Вам необходимы следующие вещи в инвентаре:<br>");
sb.append("</body></html>");
html.setHtml(sb.toString());
player.sendPacket(html);
val = player.getClassIndex();
}
}
*/
// prevents changing between same level jobs
if(newJobLevel == jobLevel) return;
if (level < 20 && newJobLevel > 0) return;
if (level < 40 && newJobLevel > 1) return;
if (level < 75 && newJobLevel > 2) return;
// -- prevention ends
changeClass(player, val);
player.rewardSkills();
player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
if (newJobLevel == 3) player.sendPacket(new SystemMessage(1606)); // system sound 3rd occupation
else player.sendPacket(new SystemMessage(1308)); // system sound for 1st and 2nd occupation
NpcHtmlMessage html = new NpcHtmlMessage(1);
TextBuilder sb = new TextBuilder();
sb.append("<html><head><body>");
sb.append(mes);
sb.append("Вы получили профессию <font color=\"LEVEL\">" + CharTemplateTable.getClassNameById(player.getClassId().getId()) + "</font>, поздравляю!");
sb.append("</body></html>");
html.setHtml(sb.toString());
player.sendPacket(html);
}
else
{
super.onBypassFeedback(player, command);
}
}
private void changeClass(L2PcInstance player, int val)
{
player.setClassId(val);
if (player.isSubClassActive()) player.getSubClasses().get(player.getClassIndex()).setClassId(
player.getActiveClass());
else player.setBaseClass(player.getActiveClass());
player.broadcastUserInfo();
}
private void setTarget(L2PcInstance player, int ench ,int armorType)
{
// now we need to find the equipped weapon of the targeted character...
int curEnchant = 0; // display purposes only
int dropSlot = armorType;
boolean canEnchant = false;
L2ItemInstance parmorInstance = null;
L2ItemInstance armorToEnchant = null;
// only attempt to enchant if there is a weapon equipped
if ( canEnchant == false )
{
// check equip
parmorInstance = player.getInventory().getPaperdollItem(dropSlot);
if (parmorInstance != null && parmorInstance.getEquipSlot() == dropSlot )
{
armorToEnchant = parmorInstance;
curEnchant = armorToEnchant.getEnchantLevel();
canEnchant = true;
}
}
if ( canEnchant == true && armorToEnchant != null )
{
// set enchant value
player.getInventory().unEquipItemInSlotAndRecord(dropSlot);
parmorInstance.setEnchantLevel((curEnchant + ench));
player.getInventory().equipItemAndRecord(armorToEnchant);
InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(armorToEnchant);
player.sendPacket(iu);
SystemMessage sm = new SystemMessage(614);
sm.addString("Заточена вещь (" + armorToEnchant.getItem().getName() + ") с " + curEnchant + " до " + (ench + curEnchant) + ".");
player.sendPacket(sm);
}
else
{
// no item is equipped
// notify admin
SystemMessage smA = new SystemMessage(614);
smA.addString("Я не могу заточить вещь, так как она отсудствует в слоте одежды чара.");
player.sendPacket(smA);
return;
}
}
}