ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Grind Team (https://forum.antichat.xyz/showthread.php?t=763887)

kick 06.08.2015 21:26

Сюда буду публиковать весь код, как выразился гринд раз я балабол то пускай все посмотрят и почитают данный код:

Цитата:

Сообщение от Спойлер

if(player.getVar("EnterAntharas") !=null)

return;


else

{

player.sendMessage(player.isLangRus() ? "Вы не можете находиться здесь." : "You can not be here.");

player.teleToLocation(82698, 148638, -3473);

}

Цитата:

Сообщение от Спойлер

if(player.getVar("EnterBaium") !=null)

return;


else

{

player.sendMessage(player.isLangRus() ? "Вы не можете находиться здесь." : "You can not be here.");

player.teleToLocation(147450, 27120, -2208);

}

Цитата:

Сообщение от Спойлер

if(player.getVar("EnterHellbound") !=null && player.getVar("EnterUrban") !=null && HellboundManager.getHellboundLevel() !=0 && (player.isQuestCompleted("_130_PathToHellbound") || player.isQuestCompleted("_133_ThatsBloodyHot")))

return;


else

{

player.sendMessage(player.isLangRus() ? "Вы не можете находиться здесь." : "You can not be here.");

player.teleToLocation(82698, 148638, -3473);

}

Цитата:

Сообщение от Спойлер

if(player.getVar("EnterHellbound") !=null && HellboundManager.getHellboundLevel() !=0 && (player.isQuestCompleted("_130_PathToHellbound") || player.isQuestCompleted("_133_ThatsBloodyHot")))

return;


else

{

player.sendMessage(player.isLangRus() ? "Вы не можете находиться здесь." : "You can not be here.");

player.teleToLocation(82698, 148638, -3473);

}

Цитата:

Сообщение от Спойлер

if(player.getVar("EnterValakas") !=null)

return;


else

{

player.sendMessage(player.isLangRus() ? "Вы не можете находиться здесь." : "You can not be here.");

player.teleToLocation(147725, -56517, -2780);

}

Вот так реализованы зоны у Grind-Team где реализован весь официальный контент, когда можно от многих багов избавиться глянув офф скрипты, но тут не суть даже в нём а суть в данном коде. Давайте насиловать бд и писать не нужное, а использовать статик методы видимо для лохов.

Elastic Heart 06.08.2015 21:37

Ну, как бы, тут все ясно:

Цитата:

Сообщение от Grind

Забивать базу xD Ты наверно из тех днарей, что тащат все в xml
Я уже давал комментарии по-поводу приоритета использования mysql для хранения любых данных, которые требуют хранения.
Чтобы "забить базу" или "нагрузить" надо очень сильно постараться.


kick 06.08.2015 21:43

Цитата:

Сообщение от Спойлер

public class HeroItems extends Functions

{

//TODO: Bonux, переделать, чтобы было мультиязычное!

private static final String[][] HERO_ITEMS = {

{

"6611",

"weapon_the_sword_of_hero_i00",

"Infinity Blade",

"During a critical attack, decreases one's P. Def and increases de-buff casting ability, damage shield effect, Max HP, Max MP, Max CP, and shield defense power. Also enhances damage to target during PvP.",

"524/230",

"Sword" },

{

"6612",

"weapon_the_two_handed_sword_of_hero_i00",

"Infinity Cleaver",

"Increases Max HP, Max CP, critical power and critical chance. Inflicts extra damage when a critical attack occurs and has possibility of reflecting the skill back on the player. Also enhances damage to target during PvP.",

"638/230",

"Two Handed Sword" },

{

"6613",

"weapon_the_axe_of_hero_i00",

"Infinity Axe",

"During a critical attack, it bestows one the ability to cause internal conflict to one's opponent. Damage shield function, Max HP, Max MP, Max CP as well as one's shield defense rate are increased. It also enhances damage to one's opponent during PvP.",

"524/230",

"Blunt" },

{

"6614",

"weapon_the_mace_of_hero_i00",

"Infinity Rod",

"When good magic is casted upon a target, increases MaxMP, MaxCP, Casting Spd, and MP regeneration rate. Also recovers HP 100% and enhances damage to target during PvP.",

"420/307",

"Blunt" },

{

"6615",

"weapon_the_hammer_of_hero_i00",

"Infinity Crusher",

"Increases MaxHP, MaxCP, and Atk. Spd. Stuns a target when a critical attack occurs and has possibility of reflecting the skill back on the player. Also enhances damage to target during PvP.",

"638/230",

"Blunt" },

{

"6616",

"weapon_the_staff_of_hero_i00",

"Infinity Scepter",

"When casting good magic, it can recover HP by 100% at a certain rate, increases MAX MP, MaxCP, M. Atk., lower MP Consumption, increases the Magic Critical rate, and reduce the Magic Cancel. Enhances damage to target during PvP.",

"511/337",

"Blunt" },

{

"6617",

"weapon_the_dagger_of_hero_i00",

"Infinity Stinger",

"Increases MaxMP, MaxCP, Atk. Spd., MP regen rate, and the success rate of Mortal and Deadly Blow from the back of the target. Silences the target when a critical attack occurs and has Vampiric Rage effect. Also enhances damage to target during PvP.",

"458/230",

"Dagger" },

{

"6618",

"weapon_the_fist_of_hero_i00",

"Infinity Fang",

"Increases MaxHP, MaxMP, MaxCP and evasion. Stuns a target when a critical attack occurs and has possibility of reflecting the skill back on the player at a certain probability rate. Also enhances damage to target during PvP.",

"638/230",

"Dual Fist" },

{

"6619",

"weapon_the_bow_of_hero_i00",

"Infinity Bow",

"Increases MaxMP/MaxCP and decreases re-use delay of a bow. Slows target when a critical attack occurs and has Cheap Shot effect. Also enhances damage to target during PvP.",

"952/230",

"Bow" },

{

"6620",

"weapon_the_dualsword_of_hero_i00",

"Infinity Wing",

"When a critical attack occurs, increases MaxHP, MaxMP, MaxCP and critical chance. Silences the target and has possibility of reflecting the skill back on the target. Also enhances damage to target during PvP.",

"638/230",

"Dual Sword" },

{

"6621",

"weapon_the_pole_of_hero_i00",

"Infinity Spear",

"During a critical attack, increases MaxHP, Max CP, Atk. Spd. and Accuracy. Casts dispel on a target and has possibility of reflecting the skill back on the target. Also enhances damage to target during PvP.",

"524/230",

"Pole" },

{

"9388",

"weapon_infinity_rapier_i00",

"Infinity Rapier",

"Decreases the target P. Def and increases the de-buff casting ability, the damage shield ability, and the Max HP/Max MP/Max CP on a critical attack. Increases damage inflicted during PvP.A critical attack will have a chance to increase P. Atk., M. Atk., and healing power, and decrease MP consumption during skill use, for you and your party members.",

"475/230",

"Rapier" },

{

"9389",

"weapon_infinity_sword_i00",

"Infinity Sword",

"Increases critical attack success rate/power, MaxHP, MaxCP, and damage inflicted during PvP. Also inflicts extra damage on critical attacks, and reflects debuff attacks back on enemies.",

"568/230",

"Ancient Sword" },

{

"9390",

"weapon_infinity_shooter_i00",

"Infinity Shooter",

"Produces the following effects when a critical attack occurs: the target is slowed, decrease MP consumption for skill use, and increase Max MP/Max CP. Enhances damage done to the target during PvP.",

"584/230",

"Crossbow" } };

public void rendershop(String[] val)

{

Player player = getSelf();

NpcInstance npc = getNpc();

if(player == null || npc == null)

return;

String fileName = OLYMPIAD_HTML_PATH;

boolean succ = true;

if(!player.isHero())

{

fileName += "monument_weapon_no_hero.htm";

succ = false;

}

else

{

for(String heroItem[] : HERO_ITEMS)

{

int itemId = Integer.parseInt(heroItem[0]);

if(player.getInventory().getItemByItemId(itemId) != null)

{

fileName += "monument_weapon_have.htm";

succ = false;

break;

}

}

}

if(!succ)

{

npc.showChatWindow(player, fileName);

return;

}

boolean isKamael = player.getRace() == Race.kamael;

String htmltext = "";

if(val[0].equalsIgnoreCase("list"))

{

htmltext = "List of Hero Weapons:";

for(int i = isKamael ? 11 : 0; i ";

htmltext += "";

htmltext += "[" + HERO_ITEMS[2] + "]";

htmltext += "Type: " + HERO_ITEMS[5] + ", Patk/Matk: " + HERO_ITEMS[4];

htmltext += "";

}

htmltext += "";

}

else if(Integer.parseInt(val[0]) >= 0 && Integer.parseInt(val[0]) 10 ? 2234 : 1484;

htmltext = "Item Information:";

htmltext += "";

htmltext += "";

htmltext += "";

htmltext += "";

htmltext += "[" + HERO_ITEMS[itemIndex][2] + "]";

htmltext += "Type: " + HERO_ITEMS[itemIndex][5] + ", Patk/Matk: " + HERO_ITEMS[itemIndex][4] + "";

htmltext += "";

htmltext += "" + HERO_ITEMS[itemIndex][3] + "";

htmltext += "
";

htmltext += "

";

htmltext += "";

}

show(htmltext, player, npc);

}

public void getweapon(String[] var)

{

Player player = getSelf();

if(player == null)

return;

int item = Integer.parseInt(var[0]);

if(item 6621 || item 9390)

{

System.out.println(player.getName() + " tried to obtain non hero item using hero weapon service. Ban him!");

return;

}

NpcInstance npc = getNpc();

if(npc == null)

return;

String fileName = OLYMPIAD_HTML_PATH;

if(player.isHero())

{

boolean have = false;

for(String heroItem[] : HERO_ITEMS)

{

int itemId = Integer.parseInt(heroItem[0]);

if(player.getInventory().getItemByItemId(itemId) != null)

{

fileName += "monument_weapon_have.htm";

have = true;

break;

}

}

if(!have)

{

ItemFunctions.addItem(player, item, 1, true);

fileName += "monument_weapon_give.htm";

}

}

else

fileName += "monument_weapon_no_hero.htm";

npc.showChatWindow(player, fileName);

}

public String getcir()

{

Player player = getSelf();

if(player == null)

return null;

NpcInstance npc = getNpc();

if(npc == null)

return null;

String fileName = OLYMPIAD_HTML_PATH;

if(player.isHero())

{

if(player.getInventory().getItemByItemId(6842) != null)

fileName += "monument_circlet_have.htm";

else

{

ItemFunctions.addItem(player, 6842, 1, true); //Wings of Destiny Circlet

fileName += "monument_circlet_give.htm";

}

}

else

fileName += "monument_circlet_no_hero.htm";

npc.showChatWindow(player, fileName);

return null;

}

}
[/I]



Госпади упаси мои глаза, зачем сделать инстанс и в нём проверку на хиро оружия? Лучше фейк сервисов с кучей левого кода.

Цитата:

Сообщение от Спойлер

package services;

import java.util.ArrayList;

import core.gameserver.Config;

import core.gameserver.model.SimpleSpawner;

import core.gameserver.scripts.Functions;

import core.gameserver.scripts.ScriptFile;

public class FightClub extends Functions implements ScriptFile

{

private static final ArrayList _spawns_fight_club_manager = new ArrayList();

public static int FIGHT_CLUB_MANAGER = 13112;

private void spawnFightClub()

{

final int FIGHT_CLUB_MANAGER_SPAWN[][] = {

{ 82248, 147544, -3494, 13828 }, // Giran

{ 147480, 27288, -2228, 49151 }, // Aden

{ 82536, 53144, -1521, 0 }, // Oren

{ 16184, 144440, -3054, 16383 }, // Dion

{ 112488, 220264, -3627, 32767 }, // Heine

{ -15048, 121944, -3074, 0 }, // Gludio

{ 147384, -55352, -2759, 60699 }, // Goddard

{ 87688, -143352, -1318, 29412 }, // Shuttgard

{ -84776, 150904, -3154, 0 }, // Gludin

{ 36312, -48232, -1120, 0 }, // Rune

};

SpawnNPCs(FIGHT_CLUB_MANAGER, FIGHT_CLUB_MANAGER_SPAWN, _spawns_fight_club_manager);

}

@Override

public void onLoad()

{

if(Config.FIGHT_CLUB_ENABLED)

spawnFightClub();

}

@Override

public void onReload()

{}

@Override

public void onShutdown()

{}

}

Не легче ли создать группу спавна и сделать менеджером или в самом спавнере.

Цитата:

Сообщение от Спойлер

package services;

import java.util.ArrayList;

import java.util.List;

import core.gameserver.model.Creature;

import core.gameserver.model.Player;

import core.gameserver.model.base.Race;

import core.gameserver.model.instances.NpcInstance;

import core.gameserver.network.l2.s2c.MagicSkillUse;

import core.gameserver.scripts.Functions;

import core.gameserver.tables.SkillTable;

public class SupportMagic extends Functions

{

private final static int[][] _mageBuff = new int[][]{

// minlevel maxlevel skill skilllevel

{6, 75, 4322, 1}, // windwalk

{6, 75, 4323, 1}, // shield

{6, 75, 5637, 1}, // Magic Barrier 1

{6, 75, 4328, 1}, // blessthesoul

{6, 75, 4329, 1}, // acumen

{6, 75, 4330, 1}, // concentration

{6, 75, 4331, 1}, // empower

{16, 34, 4338, 1}, // life cubic

};

private final static int[][] _warrBuff = new int[][]{

// minlevel maxlevel skill

{6, 75, 4322, 1}, // windwalk

{6, 75, 4323, 1}, // shield

{6, 75, 5637, 1}, // Magic Barrier 1

{6, 75, 4324, 1}, // btb

{6, 75, 4325, 1}, // vampirerage

{6, 75, 4326, 1}, // regeneration

{6, 39, 4327, 1}, // haste 1

{40, 75, 5632, 1}, // haste 2

{16, 34, 4338, 1}, // life cubic

};

private final static int[][] _summonBuff = new int[][]{

// minlevel maxlevel skill

{6, 75, 4322, 1}, // windwalk

{6, 75, 4323, 1}, // shield

{6, 75, 5637, 1}, // Magic Barrier 1

{6, 75, 4324, 1}, // btb

{6, 75, 4325, 1}, // vampirerage

{6, 75, 4326, 1}, // regeneration

{6, 75, 4328, 1}, // blessthesoul

{6, 75, 4329, 1}, // acumen

{6, 75, 4330, 1}, // concentration

{6, 75, 4331, 1}, // empower

{6, 39, 4327, 1}, // haste 1

{40, 75, 5632, 1}, // haste 2

};

private final static int minSupLvl = 6;

private final static int maxSupLvl = 75;

public void getSupportMagic()

{

Player player = getSelf();

NpcInstance npc = getNpc();

doSupportMagic(npc, player, false);

}

public void getSupportServitorMagic()

{

Player player = getSelf();

NpcInstance npc = getNpc();

doSupportMagic(npc, player, true);

}

public void getProtectionBlessing()

{

Player player = getSelf();

NpcInstance npc = getNpc();

// Не выдаём блессиг протекшена ПКшникам.

if(player.getKarma() > 0)

return;

if(player.getLevel() > 39 || player.getClassId().getLevel() >= 3)

{

show("default/newbie_blessing_no.htm", player, npc);

return;

}

npc.doCast(SkillTable.getInstance().getInfo(5182, 1), player, true);

}

public static void doSupportMagic(NpcInstance npc, Player player, boolean servitor)

{

// Prevent a cursed weapon weilder of being buffed

if(player.isCursedWeaponEquipped())

return;

int lvl = player.getLevel();

if(servitor && (player.getPet() == null || !player.getPet().isSummon()))

{

show("default/newbie_nosupport_servitor.htm", player, npc);

return;

}

else

{

if(lvl maxSupLvl)

{

show("default/newbie_nosupport_max.htm", player, npc);

return;

}

}

List target = new ArrayList();

if(servitor)

{

target.add(player.getPet());

for(int[] buff : _summonBuff)

if(lvl >= buff[0] && lvl = buff[0] && lvl = buff[0] && lvl ";

append += "Список доступных локаций:
";

}

else

{

append += "Teleport to catacomb or necropolis. ";

append += "You may teleport to any of the following hunting locations.
";

}

if(player.getLevel() ";

append += "[scripts_Util:Gatekeeper 45248 124223 -5408 0|The Pilgrim's Necropolis (30-40)]";

append += "[scripts_Util:Gatekeeper 110911 174013 -5439 0|Necropolis of Worship (40-50)]";

append += "[scripts_Util:Gatekeeper -22101 77383 -5173 0|The Patriot's Necropolis (50-60)]";

append += "[scripts_Util:Gatekeeper -52654 79149 -4741 0|Necropolis of Devotion (60-70)]";

append += "[scripts_Util:Gatekeeper 117884 132796 -4831 0|Necropolis of Martyrdom (60-70)]";

append += "[scripts_Util:Gatekeeper 82750 209250 -5401 0|The Saint's Necropolis (70-80)]";

append += "[scripts_Util:Gatekeeper 171897 -17606 -4901 0|Disciples Necropolis(70-80)]
";

append += "[scripts_Util:Gatekeeper 42322 143927 -5381 0|Catacomb of the Heretic (30-40)]";

append += "[scripts_Util:Gatekeeper 45841 170307 -4981 0|Catacomb of the Branded (40-50)]";

append += "[scripts_Util:Gatekeeper 77348 78445 -5125 0|Catacomb of the Apostate (50-60)]";

append += "[scripts_Util:Gatekeeper 139955 79693 -5429 0|Catacomb of the Witch (60-70)]";

append += "[scripts_Util:Gatekeeper -19827 13509 -4901 0|Catacomb of Dark Omens (70-80)]";

append += "[scripts_Util:Gatekeeper 113573 84513 -6541 0|Catacomb of the Forbidden Path (70-80)]";

}

else

{

append += "[scripts_Util:Gatekeeper -41567 209463 -5080 10000|Necropolis of Sacrifice (20-30) - 10000 Adena]";

append += "[scripts_Util:Gatekeeper 45248 124223 -5408 20000|The Pilgrim's Necropolis (30-40) - 20000 Adena]";

append += "[scripts_Util:Gatekeeper 110911 174013 -5439 30000|Necropolis of Worship (40-50) - 30000 Adena]";

append += "[scripts_Util:Gatekeeper -22101 77383 -5173 40000|The Patriot's Necropolis (50-60) - 40000 Adena]";

append += "[scripts_Util:Gatekeeper -52654 79149 -4741 50000|Necropolis of Devotion (60-70) - 50000 Adena]";

append += "[scripts_Util:Gatekeeper 117884 132796 -4831 50000|Necropolis of Martyrdom (60-70) - 50000 Adena]";

append += "[scripts_Util:Gatekeeper 82750 209250 -5401 60000|The Saint's Necropolis (70-80) - 60000 Adena]";

append += "[scripts_Util:Gatekeeper 171897 -17606 -4901 60000|Disciples Necropolis(70-80) - 60000 Adena]
";

append += "[scripts_Util:Gatekeeper 42322 143927 -5381 20000|Catacomb of the Heretic (30-40) - 20000 Adena]";

append += "[scripts_Util:Gatekeeper 45841 170307 -4981 30000|Catacomb of the Branded (40-50) - 30000 Adena]";

append += "[scripts_Util:Gatekeeper 77348 78445 -5125 40000|Catacomb of the Apostate (50-60) - 40000 Adena]";

append += "[scripts_Util:Gatekeeper 139955 79693 -5429 50000|Catacomb of the Witch (60-70) - 50000 Adena]";

append += "[scripts_Util:Gatekeeper -19827 13509 -4901 60000|Catacomb of Dark Omens (70-80) - 60000 Adena]";

append += "[scripts_Util:Gatekeeper 113573 84513 -6541 60000|Catacomb of the Forbidden Path (70-80) - 60000 Adena]";

}

return append;

}

}

Ну просто отличная реализация в катакомбы нечего сказать.

Остальные фейк сервисы(да да фейк, это не сервисы) я не стану расписывать т.к однотипно оно сделано, я пойду дальше в кб.

Цитата:

Сообщение от Спойлер

package services.community;

import java.util.StringTokenizer;

import core.gameserver.Config;

import core.gameserver.data.htm.HtmCache;

import core.gameserver.handler.bbs.CommunityBoardManager;

import core.gameserver.model.base.Element;

import core.gameserver.network.l2.s2c.ShowBoard;

import core.gameserver.scripts.Functions;

import core.gameserver.model.Player;

import core.gameserver.model.items.ItemInstance;

import core.gameserver.data.xml.holder.ItemHolder;

import core.gameserver.network.l2.s2c.InventoryUpdate;

import core.gameserver.handler.bbs.ICommunityBoardHandler ;

import core.gameserver.templates.item.EtcItemTemplate;

import core.gameserver.network.l2.components.SystemMsg;

import core.gameserver.model.base.TeamType;

import core.gameserver.templates.item.ItemTemplate;

import core.gameserver.scripts.ScriptFile;

import core.gameserver.templates.item.ArmorTemplate.Armor Type;

import core.gameserver.templates.item.support.EnchantItem ;

import core.gameserver.utils.BbsUtil;

import core.gameserver.utils.Log;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class ManageEnchant extends Functions implements ScriptFile, ICommunityBoardHandler

{

static final Logger _log = LoggerFactory.getLogger(ManageEnchant.class);

private int enchant_item = Config.COMMUNITYBOARD_ENCHANT_ITEM;

private int max_enchant = Config.COMMUNITYBOARD_MAX_ENCHANT;

private int[] enchant_level = Config.COMMUNITYBOARD_ENCHANT_LVL;

private int[] ench_price_weapon = Config.COMMUNITYBOARD_ENCHANT_PRICE_WEAPON;

private int[] ench_price_armor = Config.COMMUNITYBOARD_ENCHANT_PRICE_ARMOR;

private int[] atr_lvl_weapon = Config.COMMUNITYBOARD_ENCHANT_ATRIBUTE_LVL_WEAPON;

private int[] atr_price_weapon = Config.COMMUNITYBOARD_ENCHANT_ATRIBUTE_PRICE_WEAPO N;

private int[] atr_lvl_armor = Config.COMMUNITYBOARD_ENCHANT_ATRIBUTE_LVL_ARMOR;

private int[] atr_price_armor = Config.COMMUNITYBOARD_ENCHANT_ATRIBUTE_PRICE_ARMOR ;

private boolean atr_pvp = Config.COMMUNITYBOARD_ENCHANT_ATRIBUTE_PVP;

@Override

public void onLoad(){

if(Config.COMMUNITYBOARD_ENABLED)

{

_log.info("CommunityBoard: Enchant Community service loaded.");

CommunityBoardManager.getInstance().registerHandle r(this);

}

}

@Override

public void onReload(){

if(Config.COMMUNITYBOARD_ENABLED)

{

CommunityBoardManager.getInstance().removeHandler( this);

}

}

@Override

public void onShutdown(){}

@Override

public String[] getBypassCommands(){

return new String[] {

"_cbbsechant",

"_cbbsechantlist",

"_cbbsechantChus",

"_cbbsechantAtr",

"_cbbsechantgo",

"_cbbsechantuseAtr"

};

}

@Override

public void onBypassCommand(Player activeChar, String bypass){

if(!CheckCondition(activeChar))

return;

if (bypass.startsWith("_cbbsechant"))

{

String name = "None Name";

String html = HtmCache.getInstance().getNotNull(Config.BBS_HOME_ DIR + "pages/enchant.htm", activeChar);

name = ItemHolder.getInstance().getTemplate(enchant_item) .getName();

StringBuilder sb = new StringBuilder("");

sb.append("");

ItemInstance[] arr = activeChar.getInventory().getItems();

int len = arr.length;

for (int i = 0; i = 7816 && _item.getItemId() = (max_enchant + 1) || !_item.canBeEnchanted(true)

|| _item.getEquipSlot() == ItemTemplate.SLOT_HAIR || _item.getEquipSlot() == ItemTemplate.SLOT_DHAIR)

continue;

sb.append(new StringBuilder(""));

sb.append(new StringBuilder("" + _item.getTemplate().getName() + " " + (_item.getEnchantLevel() Заточено на: +" + _item.getEnchantLevel())) + ""));

sb.append(new StringBuilder("Заточка за: " + name + ""));

sb.append("");

sb.append("");

if(Config.ALLOW_BBS_ENCHANT_ELEMENTAR)

sb.append(new StringBuilder(""));

sb.append("");

if(Config.ALLOW_BBS_ENCHANT_ATT)

sb.append(new StringBuilder(""));

sb.append("");

}

sb.append("");

html = html.replace("%enchanter%", sb.toString());

html = BbsUtil.htmlBuff(html, activeChar);

ShowBoard.separateAndSend(html, activeChar);

}

if (bypass.startsWith("_cbbsechantlist"))

{

StringTokenizer st2 = new StringTokenizer(bypass, ";");

String[] mBypass = st2.nextToken().split(":");

int ItemForEchantObjID = Integer.parseInt(mBypass[1]);

String name = "None Name";

String html = HtmCache.getInstance().getNotNull(Config.BBS_HOME_ DIR + "pages/enchant.htm", activeChar);

name = ItemHolder.getInstance().getTemplate(enchant_item) .getName();

ItemInstance EhchantItem = activeChar.getInventory().getItemByObjectId(ItemFo rEchantObjID);

StringBuilder sb = new StringBuilder("");

sb.append("Для обычной заточки выбрана вещь:");

sb.append(new StringBuilder(" "));

sb.append(new StringBuilder("" + EhchantItem.getTemplate().getName() + " " + (EhchantItem.getEnchantLevel() Заточено на: +" + EhchantItem.getEnchantLevel())) + ""));

sb.append(new StringBuilder("Заточка производится за: " + name + ""));

sb.append("");

sb.append(new StringBuilder(" "));

sb.append("");

sb.append("");

sb.append("
");

sb.append("
");

sb.append("");

for(int i = 0; i "));

//sb.append("");

}

sb.append("");

html = html.replace("%enchanter%", sb.toString());

html = BbsUtil.htmlBuff(html, activeChar);

ShowBoard.separateAndSend(html, activeChar);

}

if (bypass.startsWith("_cbbsechantChus"))

{

StringTokenizer st2 = new StringTokenizer(bypass, ";");

String[] mBypass = st2.nextToken().split(":");

int ItemForEchantObjID = Integer.parseInt(mBypass[1]);

String name = "None Name";

String html = HtmCache.getInstance().getNotNull(Config.BBS_HOME_ DIR + "pages/enchant.htm", activeChar);

name = ItemHolder.getInstance().getTemplate(enchant_item) .getName();

ItemInstance EhchantItem = activeChar.getInventory().getItemByObjectId(ItemFo rEchantObjID);

StringBuilder sb = new StringBuilder("");

sb.append("Для заточки на атрибут выбрана вещь:
");

sb.append(new StringBuilder(" "));

sb.append(new StringBuilder("" + EhchantItem.getTemplate().getName() + " " + (EhchantItem.getEnchantLevel() Заточено на: +" + EhchantItem.getEnchantLevel())) + ""));

sb.append(new StringBuilder("Заточка производится за: " + name + ""));

sb.append("");

sb.append(new StringBuilder(" "));

sb.append("");

sb.append("");

sb.append("
");

sb.append("
");

sb.append("");

sb.append("
");

sb.append(new StringBuilder(""));

sb.append("

");

sb.append(new StringBuilder(""));

sb.append("

");

sb.append(new StringBuilder(""));

sb.append("");

sb.append("
");

sb.append(new StringBuilder(""));

sb.append("

");

sb.append(new StringBuilder(""));

sb.append("

");

sb.append(new StringBuilder(""));

sb.append("");

html = html.replace("%enchanter%", sb.toString());

html = BbsUtil.htmlBuff(html, activeChar);

ShowBoard.separateAndSend(html, activeChar);

}

if (bypass.startsWith("_cbbsechantAtr"))

{

StringTokenizer st2 = new StringTokenizer(bypass, ";");

String[] mBypass = st2.nextToken().split(":");

int AtributType = Integer.parseInt(mBypass[1]);

int ItemForEchantObjID = Integer.parseInt(mBypass[2]);

String ElementName = "";

if (AtributType == 0)

ElementName = "Fire";

else if (AtributType == 1)

ElementName = "Water";

else if (AtributType == 2)

ElementName = "Wind";

else if (AtributType == 3)

ElementName = "Earth";

else if (AtributType == 4)

ElementName = "Divine";

else if (AtributType == 5)

ElementName = "Dark";

String name = "None Name";

String html = HtmCache.getInstance().getNotNull(Config.BBS_HOME_ DIR + "pages/enchant.htm", activeChar);

name = ItemHolder.getInstance().getTemplate(enchant_item) .getName();

ItemInstance EhchantItem = activeChar.getInventory().getItemByObjectId(ItemFo rEchantObjID);

StringBuilder sb = new StringBuilder("");

sb.append(new StringBuilder("Выбран элемент: " + ElementName + " Для заточки выбрана вещь:"));

sb.append(new StringBuilder(" "));

sb.append(new StringBuilder("" + EhchantItem.getTemplate().getName() + " " + (EhchantItem.getEnchantLevel() Заточено на: +" + EhchantItem.getEnchantLevel())) + ""));

sb.append(new StringBuilder("Заточка производится за: " + name + ""));

sb.append("");

sb.append(new StringBuilder(" "));

sb.append("");

sb.append("");

sb.append("");

if (EhchantItem.getTemplate().getCrystalType() == ItemTemplate.Grade.S || EhchantItem.getTemplate().getCrystalType() == ItemTemplate.Grade.S80 || EhchantItem.getTemplate().getCrystalType() == ItemTemplate.Grade.S84)

{

sb.append("");

for(int i = 0; i "));

sb.append("");

}

sb.append("");

}

else if (EhchantItem.getTemplate().getCrystalType() == ItemTemplate.Grade.S || EhchantItem.getTemplate().getCrystalType() == ItemTemplate.Grade.S80 || EhchantItem.getTemplate().getCrystalType() == ItemTemplate.Grade.S84)

{

sb.append("");

for(int i = 0; i "));

sb.append("");

}

sb.append("");

sb.append("");

}

else

{

sb.append("");

sb.append("");

sb.append("");

sb.append("");

sb.append("");

sb.append("Заточка данной вещи не возможна!");

sb.append("");

sb.append("");

sb.append("");

sb.append("");

sb.append("");

}

sb.append("");

html = html.replace("%enchanter%", sb.toString());

html = BbsUtil.htmlBuff(html, activeChar);

ShowBoard.separateAndSend(html, activeChar);

}

if (bypass.startsWith("_cbbsechantgo"))

{

StringTokenizer st2 = new StringTokenizer(bypass, ";");

String[] mBypass = st2.nextToken().split(":");

int EchantVal = Integer.parseInt(mBypass[1]);

int EchantPrice = Integer.parseInt(mBypass[2]);

int EchantObjID = Integer.parseInt(mBypass[3]);

ItemTemplate item = ItemHolder.getInstance().getTemplate(enchant_item) ;

ItemInstance pay = activeChar.getInventory().getItemByItemId(item.get ItemId());

ItemInstance EhchantItem = activeChar.getInventory().getItemByObjectId(Echant ObjID);

if (pay != null && pay.getCount() >= EchantPrice)

{

activeChar.getInventory().destroyItem(pay, EchantPrice);

EhchantItem.setEnchantLevel(EchantVal);

activeChar.getInventory().equipItem(EhchantItem);

activeChar.sendPacket(new InventoryUpdate().addModifiedItem(EhchantItem));

activeChar.broadcastUserInfo(true);

activeChar.broadcastCharInfo();

activeChar.sendMessage(new StringBuilder("" + EhchantItem.getTemplate().getName() + " было заточено до " + EchantVal + ".").toString());

Log.add(new StringBuilder(activeChar.getName() + " enchant item:" + EhchantItem.getTemplate().getName() + " val: " + EchantVal + "").toString(), "wmzSeller");

onBypassCommand(activeChar, "_cbbsechant");

}

else

activeChar.sendPacket(SystemMsg.INCORRECT_ITEM_COU NT);

}

if (bypass.startsWith("_cbbsechantuseAtr"))

{

StringTokenizer st2 = new StringTokenizer(bypass, ";");

String[] mBypass = st2.nextToken().split(":");

int EchantVal = Integer.parseInt(mBypass[1]);

int AtrType = Integer.parseInt(mBypass[2]);

int EchantPrice = Integer.parseInt(mBypass[3]);

int EchantObjID = Integer.parseInt(mBypass[4]);

ItemTemplate item = ItemHolder.getInstance().getTemplate(enchant_item) ;

ItemInstance pay = activeChar.getInventory().getItemByItemId(item.get ItemId());

ItemInstance EhchantItem = activeChar.getInventory().getItemByObjectId(Echant ObjID);

if(EhchantItem.isWeapon()){

if (pay != null && pay.getCount() >= EchantPrice){

activeChar.getInventory().destroyItem(pay, EchantPrice);

activeChar.getInventory().unEquipItem(EhchantItem) ;

EhchantItem.setAttributeElement(getAttr(AtrType), EchantVal);

activeChar.getInventory().equipItem(EhchantItem);

activeChar.sendPacket(new InventoryUpdate().addModifiedItem(EhchantItem));

activeChar.broadcastUserInfo(true);

activeChar.sendMessage(new StringBuilder("Значение атрибута " + EhchantItem.getTemplate().getName() + " увеличено до " + EchantVal + ".").toString());

Log.add(new StringBuilder(activeChar.getName() + " enchant item:" + EhchantItem.getTemplate().getName() + " val: " + EchantVal + " AtributType:" + AtrType).toString(), "wmzSeller");

onBypassCommand(activeChar, "_cbbsechant");

}

else

activeChar.sendPacket(SystemMsg.INCORRECT_ITEM_COU NT);

}

else if(EhchantItem.isArmor()){

if(!canEnchantArmorAttribute(AtrType, EhchantItem)){

activeChar.sendMessage("Невозможно вставить аттрибут в броню, не соблюдены условия");

return;

}

if (pay != null && pay.getCount() >= EchantPrice){

activeChar.getInventory().destroyItem(pay, EchantPrice);

activeChar.getInventory().unEquipItem(EhchantItem) ;

EhchantItem.setAttributeElement(getAttr(AtrType), EchantVal);

activeChar.getInventory().equipItem(EhchantItem);

activeChar.sendPacket(new InventoryUpdate().addModifiedItem(EhchantItem));

activeChar.broadcastUserInfo(true);

activeChar.sendMessage(new StringBuilder("Значение атрибута " + EhchantItem.getTemplate().getName() + " увеличено до " + EchantVal + ".").toString());

Log.add(new StringBuilder(activeChar.getName() + " enchant item:" + EhchantItem.getTemplate().getName() + " val: " + EchantVal + " AtributType:" + AtrType).toString(), "wmzSeller");

onBypassCommand(activeChar, "_cbbsechant");

}

}

else{

if (activeChar.isLangRus())

activeChar.sendMessage("В данную вещь нельзя вставить атрибут.");

else

activeChar.sendMessage("In this thing you can not insert the attribute.");

}

}

}

public void onWriteCommand(Player player, String bypass, String arg1, String arg2, String arg3, String arg4, String arg5) {

//To change body of implemented methods use File | Settings | File Templates.

}

private boolean canEnchantArmorAttribute(int attr, ItemInstance item){

switch(attr)

{

case 0:

if(item.getDefenceWater() != 0)

return false;

break;

case 1:

if(item.getDefenceFire() != 0)

return false;

break;

case 2:

if(item.getDefenceEarth() != 0)

return false;

break;

case 3:

if(item.getDefenceWind() != 0)

return false;

break;

case 4:

if(item.getDefenceUnholy() != 0)

return false;

break;

case 5:

if(item.getDefenceHoly() != 0)

return false;

break;

}

return true;

}

private Element getAttr(int attr){

Element El = Element.NONE;

switch(attr)

{

case 0:

El = Element.FIRE;

break;

case 1:

El = Element.WATER;

break;

case 2:

El = Element.WIND;

break;

case 3:

El = Element.EARTH;

break;

case 4:

El = Element.HOLY;

break;

case 5:

El = Element.UNHOLY;

break;

}

return El;

}

private static boolean CheckCondition(Player player){

if(player == null)

return false;

if(player.isDead())

return false;

if((player.getPvpFlag() != 0 || player.isInDuel() || player.isInCombat() || player.isAttackingNow()))

{

if (player.isLangRus())

player.sendMessage("Во время боя нельзя использовать данную функцию.");

else

player.sendMessage("During combat, you can not use this feature.");

return false;

}

if (player.isInOlympiadMode())

{

if (player.isLangRus())

player.sendMessage("Во время Олимпиады нельзя использовать данную функцию.");

else

player.sendMessage("During the Olympics you can not use this feature.");

return false;

}

if (!Config.COMMUNITYBOARD_ENCHANT_ENABLED)

{

if (player.isLangRus())

player.sendMessage("Функция заточки отключена.");

else

player.sendMessage("Enchant off function.");

return false;

}

if (player.getTeam() != TeamType.NONE)

{

if (player.isLangRus())

player.sendMessage("Нельзя использовать заточку во время эвентов.");

else

player.sendMessage("You can not use the enchant during Events.");

return false;

}

return true;

}

}

Цитата:

Сообщение от Спойлер
[/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I][/I]



А теперь берём в руки hxd редактором и ловим веселье. Код просто отменного качества, достоин почёта и уважения. Остальные скрипты кб не стоит смотреть, там чёрт ногу сломит.

Цитата:

Сообщение от Спойлер

services/villagemaster

services/petelove

Не смотреть сюда, опасно может убить

[/I][/I][/I][/I]

kick 06.08.2015 21:46

Цитата:

Сообщение от Спойлер

package scriptconfig;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

import java.util.concurrent.ConcurrentHashMap;

import core.gameserver.scripts.Functions;

import core.gameserver.scripts.ScriptFile;

import core.gameserver.utils.Util;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class ScriptConfig extends Functions implements ScriptFile

{

private static final Logger _log = LoggerFactory.getLogger(ScriptConfig.class);

private static final String dir = "./config/ScripsConfig";

private static ConcurrentHashMap properties;

@Override

public void onLoad()

{

properties = new ConcurrentHashMap();

LoadConfig();

_log.info("Loaded Service: ScripsConfig");

}

@Override

public void onReload()

{

onLoad();

}

@Override

public void onShutdown()

{}

public static void LoadConfig()

{

File files = new File(dir);

if (!files.exists())

_log.warn("WARNING! " + dir + " not exists! Config not loaded!");

else

parseFiles(files.listFiles());

}

private static void parseFiles(File[] files)

{

for (File f : files)

{

if (f.isHidden())

continue;

if (f.isDirectory() && !f.getName().contains("defaults"))

parseFiles(f.listFiles());

else if (f.getName().endsWith(".ini"))

{

try

{

InputStream is = new FileInputStream(f);

Properties p = new Properties();

p.load(is);

loadProperties(p);

}

catch (FileNotFoundException e)

{

e.printStackTrace();

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

}

private static void loadProperties(Properties p)

{

for (String name : p.stringPropertyNames())

{

if (properties.get(name) != null)

{

properties.replace(name, p.getProperty(name).trim());

_log.info("Duplicate properties name \"" + name + "\" replaced with new value.");

}

else if (p.getProperty(name) == null)

_log.info("Null property for key " + name);

else

properties.put(name, p.getProperty(name).trim());

}

p.clear();

}

public static String get(String name)

{

if(properties.get(name) == null)

_log.warn("ConfigSystem: Null value for key: " + name);

return properties.get(name);

}

public static float getFloat(String name)

{

return getFloat(name, Float.MAX_VALUE);

}

public static boolean getBoolean(String name)

{

return getBoolean(name, false);

}

public static int getInt(String name)

{

return getInt(name, Integer.MAX_VALUE);

}

public static int[] getIntArray(String name)

{

return getIntArray(name, new int[0]);

}

public static int getIntHex(String name)

{

return getIntHex(name, Integer.decode("0xFFFFFF"));

}

public static byte getByte(String name)

{

return getByte(name, Byte.MAX_VALUE);

}

public static long getLong(String name)

{

return getLong(name, Long.MAX_VALUE);

}

public static double getDouble(String name)

{

return getDouble(name, Double.MAX_VALUE);

}

public static String get(String name, String def)

{

return get(name) == null ? def : get(name);

}

public static float getFloat(String name, float def)

{

return Float.parseFloat(get(name, String.valueOf(def)));

}

public static boolean getBoolean(String name, boolean def)

{

return Boolean.parseBoolean(get(name, String.valueOf(def)));

}

public static int getInt(String name, int def)

{

return Integer.parseInt(get(name, String.valueOf(def)));

}

public static int[] getIntArray(String name, int[] def)

{

return get(name, null) == null ? def : Util.parseCommaSeparatedIntegerArray(get(name, null));

}

public static int getIntHex(String name, int def)

{

if(!get(name, String.valueOf(def)).trim().startsWith("0x"))

return Integer.decode("0x"+get(name, String.valueOf(def)));

else

return Integer.decode(get(name, String.valueOf(def)));

}

public static byte getByte(String name, byte def)

{

return Byte.parseByte(get(name, String.valueOf(def)));

}

public static double getDouble(String name, double def)

{

return Double.parseDouble(get(name, String.valueOf(def)));

}

public static long getLong(String name, long def)

{

return Long.parseLong(get(name, String.valueOf(def)));

}

public static void set(String name, String param)

{

properties.replace(name, param);

}

public static void set(String name, Object obj)

{

set(name, String.valueOf(obj));

}

}

WTF? Мозгов что ли нету, что бы подобную хрень впиливать в эмуль так ещё и в сервисы

kick 06.08.2015 21:56

Квесты я не собираюсь тестить. Возьму для начала начальный квест

Проверка снабжения — Энциклопедия Lineage 2 смотрим. Теперь проверяем и видим, что квест то не верный, награда то выдаётся одна для всех, а посмотрим теперь на квест где заявлено, что реализован весь официальный контент:

[QUOTE="Спойлер"]
[COLOR="#363940"]
package quests;

import core.gameserver.model.base.ClassId;

import core.gameserver.model.instances.NpcInstance;

import core.gameserver.model.quest.Quest;

import core.gameserver.model.quest.QuestState;

import core.gameserver.network.l2.s2c.ExShowScreenMessage ;

import core.gameserver.network.l2.s2c.ExShowScreenMessage .ScreenMessageAlign;

import core.gameserver.scripts.ScriptFile;

public class _174_SupplyCheck extends Quest implements ScriptFile

{

@Override

public void onLoad()

{

}

@Override

public void onReload()

{

}

@Override

public void onShutdown()

{

}

int Marcela = 32173;

int Benis = 32170; // warehouse keeper

int Nika = 32167; // grocerer

//int Erinu = 32164; // weapon seller

//int Casca = 32139; // vice hierarch

int WarehouseManifest = 9792;

int GroceryStoreManifest = 9793;

//int WeaponShopManifest = 9794;

//int SupplyReport = 9795;

int WoodenBreastplate = 23;

int WoodenGaiters = 2386;

int LeatherTunic = 429;

int LeatherStockings = 464;

int WoodenHelmet = 43;

int LeatherShoes = 37;

int Gloves = 49;

public _174_SupplyCheck()

{

super(false);

addStartNpc(Marcela);

addTalkId(Benis, Nika); //Erinu, Casca

addQuestItem(WarehouseManifest, GroceryStoreManifest); // WeaponShopManifest, SupplyReport

}

@Override

public String onEvent(String event, QuestState qs, NpcInstance npc)

{

String htmltext = event;

if(event.equalsIgnoreCase("zerstorer_morsell_q0174 _04.htm"))

{

qs.setCond(1);

qs.setState(STARTED);

qs.playSound(SOUND_ACCEPT);

}

return htmltext;

}

@Override

public String onTalk(NpcInstance npc, QuestState st)

{

String htmltext = "noquest";

int npcId = npc.getNpcId();

int cond = st.getCond();

if(npcId == Marcela)

{

if(cond == 0)

{

if(st.getPlayer().getLevel() == 1)

{

st.exitCurrentQuest(true);

htmltext = "zerstorer_morsell_q0174_02.htm";

}

else

htmltext = "zerstorer_morsell_q0174_01.htm";

}

else if(cond == 1)

htmltext = "zerstorer_morsell_q0174_05.htm";

else if(cond == 2)

{

st.setCond(3);

st.takeItems(WarehouseManifest, -1);

htmltext = "zerstorer_morsell_q0174_06.htm";

}

else if(cond == 3)

htmltext = "zerstorer_morsell_q0174_07.htm";

else if(cond == 4)

{

if(st.getPlayer().getClassId().isMage() && !st.getPlayer().getClassId().equalsOrChildOf(Class Id.orcMage))

{

st.giveItems(LeatherTunic, 1);

st.giveItems(LeatherStockings, 1);

}

else

{

st.giveItems(WoodenBreastplate, 1);

st.giveItems(WoodenGaiters, 1);

}

st.giveItems(WoodenHelmet, 1);

st.giveItems(LeatherShoes, 1);

st.giveItems(Gloves, 1);

st.giveItems(ADENA_ID, 2466, true);

st.getPlayer().addExpAndSp(5672, 446);

if(st.getPlayer().getClassId().getLevel() == 1 && !st.getPlayer().getVarB("ng1"))

st.getPlayer().sendPacket(new ExShowScreenMessage(" Delivery duty complete.\nGo find the Newbie Guide.", 5000, ScreenMessageAlign.TOP_CENTER, true));

st.exitCurrentQuest(false);

htmltext = "zerstorer_morsell_q0174_12.htm";

}

/*

{

st.setCond(5);

st.takeItems(GroceryStoreManifest, -1);

htmltext = "zerstorer_morsell_q0174_08.htm";

}

else if(cond == 5)

htmltext = "zerstorer_morsell_q0174_09.htm";

else if(cond == 6)

{

st.setCond(7);

st.takeItems(WeaponShopManifest, -1);

st.giveItems(SupplyReport, 1);

htmltext = "zerstorer_morsell_q0174_10.htm";

}

else if(cond == 7)

htmltext = "zerstorer_morsell_q0174_11.htm";

else if(cond == 8)

{

if(st.getPlayer().getClassId().isMage() && !st.getPlayer().getClassId().equalsOrChildOf(Class Id.orcMage))

{

st.giveItems(LeatherTunic, 1);

st.giveItems(LeatherStockings, 1);

}

else

{

st.giveItems(WoodenBreastplate, 1);

st.giveItems(WoodenGaiters, 1);

}


st.giveItems(WoodenHelmet, 1);

st.giveItems(LeatherShoes, 1);

st.giveItems(Gloves, 1);

st.giveItems(ADENA_ID, 2466, true);

st.getPlayer().addExpAndSp(5672, 446, false, false);

if(st.getPlayer().getClassId().getLevel() == 1 && !st.getPlayer().getVarB("ng1"))

st.getPlayer().sendPacket(new ExShowScreenMessage(" Delivery duty complete.\nGo find the Newbie Guide.", 5000, ScreenMessageAlign.TOP_CENTER, true));

st.exitCurrentQuest(false);

htmltext = "zerstorer_morsell_q0174_12.htm";

}

*/

}

else if(npcId == Benis)

if(cond == 1)

{

st.setCond(2);

st.giveItems(WarehouseManifest, 1);

htmltext = "warehouse_keeper_benis_q0174_01.htm";

}

else

htmltext = "warehouse_keeper_benis_q0174_02.htm";

else if(npcId == Nika)

if(cond

kick 06.08.2015 22:12

Веселая система валидации байпасов который гордится гринд и заявляет типо он придумал и реализовал.

Смотрим и веселимся:

Цитата:

Сообщение от Спойлер

package core.gameserver.enums;

public enum HtmlActionScope

{

NPC_HTML,

NPC_QUEST_HTML,

COMMUNITY_BOARD_HTML,

TUTORIAL_HTML

}

Смотрим лыжу:

http://svn.l2jserver.com/trunk/L2J_S...tionScope.java

Видимо лыжа украла у гринда создав машину времени и раньше залив себе. а FBIagent вообще не достоин быть автором.

Дальше смотрим его мего защиту байпассов:

[QUOTE="Спойлер"]
[COLOR="#363940"]
package core.gameserver.utils;

import java.util.Locale;

import core.gameserver.enums.HtmlActionScope;

import core.gameserver.model.Player;

public class ActionCacheUtil

{

public static final char VAR_PARAM_START_CHAR = '$';

private static final void buildHtmlBypassCache(Player player, HtmlActionScope scope, String html)

{

String htmlLower = html.toLowerCase(Locale.ENGLISH);

int bypassEnd = 0;

int bypassStart = htmlLower.indexOf("=\"bypass ", bypassEnd);

int bypassStartEnd;

while (bypassStart != -1)

{

bypassStartEnd = bypassStart + 9;

bypassEnd = htmlLower.indexOf("\"", bypassStartEnd);

if (bypassEnd == -1)

{

break;

}

int hParamPos = htmlLower.indexOf("-h ", bypassStartEnd);

String bypass;

if ((hParamPos != -1) && (hParamPos _replaces = new ArrayList();

protected boolean have_appends = false;

public NpcHtmlMessage(Player player, int npcId, String filename, int val)

{

List appends = Scripts.dialogAppends.get(npcId);

if(appends != null && appends.size() > 0)

{

have_appends = true;

if(filename != null && filename.equalsIgnoreCase("npcdefault.htm"))

setHtml(""); // контент задается скриптами через DialogAppend_

else

setFile(filename);

String replaces = "";

// Добавить в конец странички текст, определенный в скриптах.

Object[] script_args = new Object[] { new Integer(val) };

for(ScriptClassAndMethod append : appends)

{

Object obj = Scripts.getInstance().callScripts(player, append.className, append.methodName, script_args);

if(obj != null)

replaces += obj;

}

if(!replaces.equals(""))

replace("", "\n" + Strings.bbParse(replaces) + "");

}

else

setFile(filename);

}

public NpcHtmlMessage(Player player, NpcInstance npc, String filename, int val)

{

this(player, npc.getNpcId(), filename, val);

_npcObjId = npc.getObjectId();

//FIXME [G1ta0] не есть истина, исправить

player.setLastNpc(npc);

replace("%npcId%", String.valueOf(npc.getNpcId()));

replace("%npcname%", npc.getName());

replace("%festivalMins%", SevenSignsFestival.getInstance().getTimeToNextFest ivalStr());

}

public NpcHtmlMessage(Player player, NpcInstance npc)

{

if(npc == null)

{

_npcObjId = 5;

player.setLastNpc(null);

}

else

{

_npcObjId = npc.getObjectId();

player.setLastNpc(npc);

}

}

public NpcHtmlMessage(int npcObjId)

{

_npcObjId = npcObjId;

}

public final NpcHtmlMessage setHtml(String text)

{

if(!text.contains(""))

text = "" + text + ""; //Message:

_html = text;

return this;

}

public final NpcHtmlMessage setFile(String file)

{

_file = file;

if(_file.startsWith("data/html/"))

{

_log.info("NpcHtmlMessage: need fix : " + file, new Exception());

_file = _file.replace("data/html/", "");

}

return this;

}

public NpcHtmlMessage replace(String pattern, String value)

{

if(pattern == null || value == null)

return this;

_replaces.add(pattern);

_replaces.add(value);

return this;

}

// npcstring-?.dat

public NpcHtmlMessage replaceNpcString(String pattern, NpcString npcString, Object... arg)

{

if(pattern == null)

return this;

if(npcString.getSize() != arg.length)

throw new IllegalArgumentException("Not valid size of parameters: " + npcString);

_replaces.add(pattern);

_replaces.add(HtmlUtils.htmlNpcString(npcString, arg));

return this;

}

@Override

protected void writeImpl()

{

Player player = getClient().getActiveChar();

if(player == null)

return;

if(_file != null) //TODO может быть не очень хорошо здесь это делать...

{

if(player.isGM())

Functions.sendDebugMessage(player, "HTML: " + _file);

String content = HtmCache.getInstance().getNotNull(_file, player);

String content2 = HtmCache.getInstance().getNullable(_file, player);

if(content2 == null)

setHtml(have_appends && _file.endsWith(".htm") ? "" : content);

else

setHtml(content);

}

for(int i = 0; i

kick 06.08.2015 22:14

А вот теперь задумайтесь, все его наработки так же могут быть портированы с l2j подобных сборок будьте осторожны

kick 06.08.2015 22:31

Опять таки вернёмся к реализации согласно официальному серверу. Давайте посмотрим такой механизм как Магазин(Итем-малл):

Смотрим пакеты:

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

public class RequestExBR_RecentProductList extends L2GameClientPacket

{

@Override

public void readImpl()

{

// триггер

}

@Override

public void runImpl()

{

/* L2Player activeChar = getClient().getActiveChar();

if(activeChar == null)

return;*/

//activeChar.sendMessage("triggered BrRecentProductList()");

}

}

Ага, а не реализован то пакет.

А реализации самих механизмов осталось на том же уровне, что предоставлено овером которая далеко не верная

kick 06.08.2015 22:38

Пошли по пакетам, которые до сих пор не реализованы:

Цитата:

Сообщение от Спойлер

public class WithdrawAlliance extends L2GameServerPacket

{

@Override

protected final void writeImpl()

{

writeC(0xAB);

//TODO d

}

}

ValidatePosition - сюда не смотреть, вы убьёте свои глаза и нервы

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

import core.gameserver.Config;

import core.gameserver.data.xml.holder.NpcHolder;

import core.gameserver.instancemanager.CursedWeaponsManag er;

import core.gameserver.model.Player;

import core.gameserver.model.Skill;

import core.gameserver.model.Zone;

import core.gameserver.model.base.Element;

import core.gameserver.model.base.Experience;

import core.gameserver.model.base.TeamType;

import core.gameserver.model.entity.events.GlobalEvent;

import core.gameserver.model.items.Inventory;

import core.gameserver.model.matching.MatchingRoom;

import core.gameserver.model.pledge.Alliance;

import core.gameserver.model.pledge.Clan;

import core.gameserver.skills.effects.EffectCubic;

import core.gameserver.utils.Location;

public class UserInfo extends L2GameServerPacket

{

private boolean can_writeImpl = false, partyRoom;

private int _runSpd, _walkSpd, _swimRunSpd, _swimWalkSpd, _flRunSpd, _flWalkSpd, _flyRunSpd, _flyWalkSpd, _relation;

private double move_speed, attack_speed, col_radius, col_height;

private int[][] _inv;

private Location _loc, _fishLoc;

private int obj_id, vehicle_obj_id, _race, sex, base_class, level, curCp, maxCp, _enchant, _weaponFlag;

private long _exp;

private int curHp, maxHp, curMp, maxMp, curLoad, maxLoad, rec_left, rec_have;

private int _str, _con, _dex, _int, _wit, _men, _sp, ClanPrivs, InventoryLimit;

private int _patk, _patkspd, _pdef, evasion, accuracy, crit, _matk, _matkspd;

private int _mdef, pvp_flag, karma, hair_style, hair_color, face, gm_commands, fame, vitality;

private int clan_id, clan_crest_id, ally_id, ally_crest_id, large_clan_crest_id;

private int private_store, can_crystalize, pk_kills, pvp_kills, class_id, agathion;

private int _abnormalEffect, _abnormalEffect2, noble, hero, mount_id, cw_level;

private int name_color, running, pledge_class, pledge_type, title_color, transformation;

private int defenceFire, defenceWater, defenceWind, defenceEarth, defenceHoly, defenceUnholy;

private int mount_type;

private String _name, title;

private EffectCubic[] cubics;

private Element attackElement;

private int attackElementValue;

private boolean isFlying, _allowMap;

private int talismans;

private boolean openCloak;

private double _expPercent;

private TeamType _team;

public UserInfo(Player player)

{

if(player.getTransformationName() != null)

{

_name = player.getTransformationName();

title = "";

clan_crest_id = 0;

ally_crest_id = 0;

large_clan_crest_id = 0;

cw_level = CursedWeaponsManager.getInstance().getLevel(player .getCursedWeaponEquippedId());

}

else

{

_name = player.getName();

Clan clan = player.getClan();

Alliance alliance = clan == null ? null : clan.getAlliance();

//

clan_id = clan == null ? 0 : clan.getClanId();

clan_crest_id = clan == null ? 0 : clan.getCrestId();

large_clan_crest_id = clan == null ? 0 : clan.getCrestLargeId();

//

ally_id = alliance == null ? 0 : alliance.getAllyId();

ally_crest_id = alliance == null ? 0 : alliance.getAllyCrestId();

cw_level = 0;

title = player.getTitle();

}

if(player.getPlayerAccess().GodMode && player.isInvisible())

title += "";

if(player.isPolymorphed())

if(NpcHolder.getInstance().getTemplate(player.getP olyId()) != null)

title += " - " + NpcHolder.getInstance().getTemplate(player.getPoly Id()).name;

else

title += " - Polymorphed";

if(player.isMounted())

{

_enchant = 0;

mount_id = player.getMountNpcId() + 1000000;

mount_type = player.getMountType();

}

else

{

_enchant = player.getEnchantEffect();

mount_id = 0;

mount_type = 0;

}

_weaponFlag = player.getActiveWeaponInstance() == null ? 0x14 : 0x28;

move_speed = player.getMovementSpeedMultiplier();

_runSpd = (int) (player.getRunSpeed() / move_speed);

_walkSpd = (int) (player.getWalkSpeed() / move_speed);

_flRunSpd = 0; // TODO

_flWalkSpd = 0; // TODO

if(player.isFlying())

{

_flyRunSpd = _runSpd;

_flyWalkSpd = _walkSpd;

}

else

{

_flyRunSpd = 0;

_flyWalkSpd = 0;

}

_swimRunSpd = player.getSwimSpeed();

_swimWalkSpd = player.getSwimSpeed();

_inv = new int[Inventory.PAPERDOLL_MAX][3];

for(int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)

{

_inv[PAPERDOLL_ID][0] = player.getInventory().getPaperdollObjectId(PAPERDO LL_ID);

_inv[PAPERDOLL_ID][1] = player.getInventory().getPaperdollItemId(PAPERDOLL _ID);

_inv[PAPERDOLL_ID][2] = player.getInventory().getPaperdollAugmentationId(P APERDOLL_ID);

}

_relation = player.isClanLeader() ? 0x40 : 0;

for(GlobalEvent e : player.getEvents())

_relation = e.getUserRelation(player, _relation);

_loc = player.getLoc();

obj_id = player.getObjectId();

vehicle_obj_id = player.isInBoat() ? player.getBoat().getObjectId() : 0x00;

_race = player.getRace().ordinal();

sex = player.getSex();

base_class = player.getBaseClassId();

level = player.getLevel();

_exp = player.getExp();

_expPercent = Experience.getExpPercent(player.getLevel(), player.getExp());

_str = player.getSTR();

_dex = player.getDEX();

_con = player.getCON();

_int = player.getINT();

_wit = player.getWIT();

_men = player.getMEN();

curHp = (int) player.getCurrentHp();

maxHp = player.getMaxHp();

curMp = (int) player.getCurrentMp();

maxMp = player.getMaxMp();

curLoad = player.getCurrentLoad();

maxLoad = player.getMaxLoad();

_sp = player.getIntSp();

_patk = player.getPAtk(null);

_patkspd = player.getPAtkSpd();

_pdef = player.getPDef(null);

evasion = player.getEvasionRate(null);

accuracy = player.getAccuracy();

crit = player.getCriticalHit(null, null);

_matk = player.getMAtk(null, null);

_matkspd = player.getMAtkSpd();

_mdef = player.getMDef(null, null);

pvp_flag = Config.RVRMODE_ENABLE ? 0 : player.getPvpFlag(); // 0=white, 1=purple, 2=purpleblink

karma = player.getKarma();

attack_speed = player.getAttackSpeedMultiplier();

col_radius = player.getColRadius();

col_height = player.getColHeight();

if(player.isBeautyShopWearing() && player.getWearHairStyle() != -1)

hair_style = player.getWearHairStyle();

else

hair_style = player.getHairStyle();

if(player.isBeautyShopWearing() && player.getWearHairColor() != -1)

hair_color = player.getWearHairColor();

else

hair_color = player.getHairColor();

if(player.isBeautyShopWearing() && player.getWearFace() != -1)

face = player.getWearFace();

else

face = player.getFace();

gm_commands = player.isGM() || player.getPlayerAccess().CanUseGMCommand ? 1 : 0;

// builder level активирует в клиенте админские команды

clan_id = player.getClanId();

ally_id = player.getAllyId();

private_store = player.getPrivateStoreType();

can_crystalize = player.getSkillLevel(Skill.SKILL_CRYSTALLIZE) > 0 ? 1 : 0;

pk_kills = player.getPkKills();

pvp_kills = player.getPvpKills();

cubics = player.getCubics().toArray(new EffectCubic[player.getCubics().size()]);

_abnormalEffect = player.getAbnormalEffect();

_abnormalEffect2 = player.getAbnormalEffect2();

ClanPrivs = player.getClanPrivileges();

rec_left = player.getRecomLeft(); //c2 recommendations remaining

rec_have = player.getRecomHave(); //c2 recommendations received

InventoryLimit = player.getInventoryLimit();

class_id = player.getClassId().getId();

maxCp = player.getMaxCp();

curCp = (int) player.getCurrentCp();

_team = player.getTeam();

noble = player.isNoble() || player.isGM() && Config.GM_HERO_AURA ? 1 : 0; //0x01: symbol on char menu ctrl+I

hero = player.isHero() || player.isFakeHero() || player.isGM() && Config.GM_HERO_AURA ? 1 : 0; //0x01: Hero Aura and symbol

//fishing = _cha.isFishing() ? 1 : 0; // Fishing Mode

_fishLoc = player.getFishLoc();

name_color = player.getNameColor();

running = player.isRunning() ? 0x01 : 0x00; //changes the Speed display on Status Window

pledge_class = player.getPledgeClass();

pledge_type = player.getPledgeType();

title_color = player.getTitleColor();

transformation = player.getTransformation();

attackElement = player.getAttackElement();

attackElementValue = player.getAttack(attackElement);

defenceFire = player.getDefence(Element.FIRE);

defenceWater = player.getDefence(Element.WATER);

defenceWind = player.getDefence(Element.WIND);

defenceEarth = player.getDefence(Element.EARTH);

defenceHoly = player.getDefence(Element.HOLY);

defenceUnholy = player.getDefence(Element.UNHOLY);

agathion = player.getAgathionId();

fame = player.getFame();

vitality = player.getNevitSystem().isBlessingActive() ? Config.VITALITY_LEVELS[4] : (int) player.getVitality();

partyRoom = player.getMatchingRoom() != null && player.getMatchingRoom().getType() == MatchingRoom.PARTY_MATCHING && player.getMatchingRoom().getLeader() == player;

isFlying = player.isInFlyingTransform();

talismans = player.getTalismanCount();

openCloak = player.getOpenCloak();

_allowMap = player.isActionBlocked(Zone.BLOCKED_ACTION_MINIMAP );

can_writeImpl = true;

}

@Override

protected final void writeImpl()

{

if(!can_writeImpl)

return;

writeC(0x32);

writeD(_loc.x);

writeD(_loc.y);

writeD(_loc.z + Config.CLIENT_Z_SHIFT);

writeD(vehicle_obj_id);

writeD(obj_id);

writeS(_name);

writeD(_race);

writeD(sex);

writeD(base_class);

writeD(level);

writeQ(_exp);

writeF(_expPercent);

writeD(_str);

writeD(_dex);

writeD(_con);

writeD(_int);

writeD(_wit);

writeD(_men);

writeD(maxHp);

writeD(curHp);

writeD(maxMp);

writeD(curMp);

writeD(_sp);

writeD(curLoad);

writeD(maxLoad);

writeD(_weaponFlag);

for(int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)

writeD(_inv[PAPERDOLL_ID][0]);

for(int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)

writeD(_inv[PAPERDOLL_ID][1]);

for(int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)

writeD(_inv[PAPERDOLL_ID][2]);

writeD(talismans);

writeD(openCloak ? 0x01 : 0x00);

writeD(_patk);

writeD(_patkspd);

writeD(_pdef);

writeD(evasion);

writeD(accuracy);

writeD(crit);

writeD(_matk);

writeD(_matkspd);

writeD(_patkspd);

writeD(_mdef);

writeD(pvp_flag);

writeD(karma);

writeD(_runSpd);

writeD(_walkSpd);

writeD(_swimRunSpd); // swimspeed

writeD(_swimWalkSpd); // swimspeed

writeD(_flRunSpd);

writeD(_flWalkSpd);

writeD(_flyRunSpd);

writeD(_flyWalkSpd);

writeF(move_speed);

writeF(attack_speed);

writeF(col_radius);

writeF(col_height);

writeD(hair_style);

writeD(hair_color);

writeD(face);

writeD(gm_commands);

writeS(title);

writeD(clan_id);

writeD(clan_crest_id);

writeD(ally_id);

writeD(ally_crest_id);

// 0x40 leader rights

// siege flags: attacker - 0x180 sword over name, defender - 0x80 shield, 0xC0 crown (|leader), 0x1C0 flag (|leader)

writeD(_relation);

writeC(mount_type); // mount type

writeC(private_store);

writeC(can_crystalize);

writeD(pk_kills);

writeD(pvp_kills);

writeH(cubics.length);

for(EffectCubic cubic : cubics)

writeH(cubic == null ? 0 : cubic.getId());

writeC(partyRoom ? 0x01 : 0x00); //1-find party members

writeD(_abnormalEffect);

writeC(isFlying ? 0x02 : 0x00);

writeD(ClanPrivs);

writeH(rec_left);

writeH(rec_have);

writeD(mount_id);

writeH(InventoryLimit);

writeD(class_id);

writeD(0x00); // special effects? circles around player...

writeD(maxCp);

writeD(curCp);

writeC(_enchant);

writeC(_team.ordinal());

writeD(large_clan_crest_id);

writeC(noble);

writeC(hero);

writeC(0x00);

writeD(_fishLoc.x);

writeD(_fishLoc.y);

writeD(_fishLoc.z);

writeD(name_color);

writeC(running);

writeD(pledge_class);

writeD(pledge_type);

writeD(title_color);

writeD(cw_level);

writeD(transformation); // Transformation id

// AttackElement (0 - Fire, 1 - Water, 2 - Wind, 3 - Earth, 4 - Holy, 5 - Dark, -2 - None)

writeH(attackElement.getId());

writeH(attackElementValue); // AttackElementValue

writeH(defenceFire); // DefAttrFire

writeH(defenceWater); // DefAttrWater

writeH(defenceWind); // DefAttrWind

writeH(defenceEarth); // DefAttrEarth

writeH(defenceHoly); // DefAttrHoly

writeH(defenceUnholy); // DefAttrUnholy

writeD(agathion);

// T2 Starts

writeD(fame); // Fame

writeD(_allowMap ? 1 : 0); // Minimap on Hellbound

writeD(vitality); // Vitality Points

writeD(_abnormalEffect2);

}

}




UserInfo.java - Откуда там нули? Ведь все реализовано согласно официальному серверу

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

import core.gameserver.model.Player;

import core.gameserver.model.instances.DoorInstance;

import core.gameserver.model.instances.StaticObjectInstan ce;

public class StaticObject extends L2GameServerPacket

{

private final int _staticObjectId;

private final int _objectId;

private final int _type;

private final int _isTargetable;

private final int _meshIndex;

private final int _isClosed;

private final int _isEnemy;

private final int _maxHp;

private final int _currentHp;

private final int _showHp;

private final int _damageGrade;

public StaticObject(StaticObjectInstance obj)

{

_staticObjectId = obj.getUId();

_objectId = obj.getObjectId();

_type = 0;

_isTargetable = 1;

_meshIndex = obj.getMeshIndex();

_isClosed = 0;

_isEnemy = 0;

_maxHp = 0;

_currentHp = 0;

_showHp = 0;

_damageGrade = 0;

}

public StaticObject(DoorInstance door, Player player)

{

_staticObjectId = door.getDoorId();

_objectId = door.getObjectId();

_type = 1;

_isTargetable = door.getTemplate().isTargetable() ? 1 : 0;

_meshIndex = 1;

_isClosed = door.isOpen() ? 0 : 1; //opened 0 /closed 1

_isEnemy = door.isAutoAttackable(player) ? 1 : 0;

_currentHp = (int) door.getCurrentHp();

_maxHp = door.getMaxHp();

_showHp = door.isHPVisible() ? 1 : 0; //TODO [G1ta0] статус двери для осаждающих

_damageGrade = door.getDamage();

}

@Override

protected final void writeImpl()

{

writeC(0x9f);

writeD(_staticObjectId);

writeD(_objectId);

writeD(_type);

writeD(_isTargetable);

writeD(_meshIndex);

writeD(_isClosed);

writeD(_isEnemy);

writeD(_currentHp);

writeD(_maxHp);

writeD(_showHp);

writeD(_damageGrade);

}

}

Всё так же не доделан статус двери для осаждающих

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class SkillRemainSec extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeC(0xD8);

//TODO ddddddd

}

}

Ну классные пакеты.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ShowRadar extends L2GameServerPacket

{

@Override

protected final void writeImpl()

{

writeC(0xAA);

//TODO ddddd

}

}

ShopPreviewList - Опять через жопу работает:

Цитата:

Сообщение от Спойлер

public static int getWearPrice(ItemTemplate item)

{

for(int costume : ItemTemplate.ITEM_ID_FORMAL_WEAR)

if(item.getItemId() == costume)

return 10000;

switch(item.getItemGrade())

{

case D:

return 50;

case C:

return 100;

//TODO: Не известно сколько на оффе стоит примерка B - S84 ранга.

case B:

return 200;

case A:

return 500;

case S:

return 1000;

case S80:

return 2000;

case S84:

return 2500;

default:

return 10;

}

}

И данный человек с 2011 года толком и ничего не сделал

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

/**

* Пример дампа:

* 0000: 92 2c 05 10 58 77 bb 0f 00 00 00 00 00 00 00 00 .,..Xw..........

* 0010: 54 ff ff b0 42 fe ff 14 ff ff ff 00 00 00 00 00 T...B...........

* 0020: 00 00 00 00 00 f0 3f 00 00 00 00 00 00 f0 3f 00 ......?.......?.

* 0030: 00 00 00 00 00 3e 40 00 00 00 00 00 00 3e 40 00 .....>@......>@.

* 0040: 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 ...............

*/

public class ServerObjectInfo extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeC(0x92);

// TODO ddSdddddffffdddd ServerObjectInfo ID:%d, ClassID:%d, CanBeAttacked:%d, X:%d, Y:%d, Z:%d

}

}

Не ну реализация оставляет желать лучшего. И это можно считать реализован весь официальный контент? Нет. Завтра дополню темам по пакетам.

kick 06.08.2015 22:43

Я вот помню, мне написал пойнтер(@b3trayer):

Цитата:


Вы никогда не задумывались какой максимальный размер у пакета в л2? Ну хотя бы приблизительно Подумайте над этим, а после этого скажите есть ли резон выделять по 64 кб на главный буфер и вспомогательные (принадлежащие конкретно клиентам). Так же, подумайте, чем отличается директ буфер от хип буфера в джаве и как директ буфер работает с сетевой картой и какой его размер наиболее эффективен. Так же рекомендую задуматься, как начинает работать селектор при количестве коннектов более 1000. Ну и конечно же провести микро-тесты, я уверяю, что Вы откроете много нового для себя. И это разьяснение только по одной, малой части, из мною перечисленного

Так вот сеть осталась та же ниошная ничем не изменилась у этих исходников. А теперь смотрим например даже эту тему DDOS гейм порта Классный эмулятор, достойный. Завтра продолжу писать про пакеты, и думаю многим разработчикам станет интересны некоторые офф фишки

kick 07.08.2015 11:26

Продолжаем про пакеты говорить:

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class RequestTimeCheck extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeC(0xC1);

//TODO d

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

public class RequestTimeCheck extends L2GameClientPacket

{

private int unk, unk2;

/**

* format: dd

*/

@Override

protected void readImpl()

{

unk = readD();

unk2 = readD();

}

@Override

protected void runImpl()

{

//TODO not implemented

}

}

А где реализация пакета? Да нету зачем, ведь у нас реализовано согласно официальному контенту, а этот пакет наверное масоны придумали но ладно.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

public class RequestTeleport extends L2GameClientPacket

{

private int unk, _type, unk2, unk3, unk4;

@Override

protected void readImpl()

{

unk = readD();

_type = readD();

if(_type == 2)

{

unk2 = readD();

unk3 = readD();

}

else if(_type == 3)

{

unk2 = readD();

unk3 = readD();

unk4 = readD();

}

}

@Override

protected void runImpl()

{

//TODO not implemented

}

}

Реализовано от бога просто, с унками которые так объясняют, что там сказано

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

public class RequestRemainTime extends L2GameClientPacket

{

@Override

protected void readImpl()

{

}

@Override

protected void runImpl()

{

//TODO not implemented

}

}

Чудо трава отпусти меня.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

/**

* format: chS

*/

public class RequestPCCafeCouponUse extends L2GameClientPacket

{

// format: (ch)S

private String _unknown;

@Override

protected void readImpl()

{

_unknown = readS();

}

@Override

protected void runImpl()

{

//TODO not implemented

}

}

Опа, а как же так одна из глобальных механик официального сервера и не реализовано, ну да зачем нам работа Pc Cafe купонов и не только нужна верная, ведь и так мы можем заявить типо у нас эмулятор реализован согласно официальному серверу

kick 07.08.2015 11:41

Немного отвлечемя от пакетов и посмотри на ивенты официального сервера, ну у гринда же типо всё по официальному серверу и смотрим:

April Fools - Happy April Fool's Day

Evas Inferno - Lineage 2 - Jagd auf Feuer-Geister - Eva´s Inferno hat begonnen - News auf PlayNation.de

Hallowen Event - Ивент - Хеллоуин

Raising Rudolph - Lineage II : The Chaotic Throne (Raising Rudolf)

Lovers Jubilee

April Fools 10

Так вот где они реализованы у человека которого всё согласно официальному серверу? Да нигде а теперь смотрим пакетку этих вещей:

Цитата:

Сообщение от Спойлер

public class RequestExBR_EventRankerList extends L2GameClientPacket

{

private int unk, unk2, unk3;

/**

* format: ddd

*/

@Override

protected void readImpl()

{

unk = readD();

unk2 = readD();

unk3 = readD();

}

@Override

protected void runImpl()

{

//TODO not implemented

}

}

Ну классный пакет для ивента по офф, но он не сделал.

Цитата:

Сообщение от Спойлер

package org.mmocore.gameserver.network.l2.s2c;

public class ExBR_BuffEventState extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xDB);

// TODO dddd

}

}

Ну что же опять не реализовано , но у нас же всё согласно официальному серверу.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExBR_LoadEventTopRankers extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xBD);

// TODO ddddd

}

}

Опять нету важного пакета для официального сервера.

Вот так вот у нас реализован официальный контент.

kick 07.08.2015 12:00

RequestEnchantItem.java - Сюда не смотреть там творится полный ад.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

import core.gameserver.model.Player;

import core.gameserver.network.l2.s2c.ExGetBookMarkInfo;

public class RequestDeleteBookMarkSlot extends L2GameClientPacket

{

private int slot;

@Override

protected void readImpl()

{

slot = readD();

}

@Override

protected void runImpl()

{

Player activeChar = getClient().getActiveChar();

if(activeChar != null)

{

//TODO Msg.THE_SAVED_TELEPORT_LOCATION_WILL_BE_DELETED_DO _YOU_WISH_TO_CONTINUE

activeChar.bookmarks.remove(slot);

activeChar.sendPacket(new ExGetBookMarkInfo(activeChar));

}

}

}

До сих пор остался тот шлак Msg.java . И даже сообщение не нашли верное для реализации

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class PledgeExtendedInfo extends L2GameServerPacket

{

@Override

protected final void writeImpl()

{

writeC(0x8A);

//TODO SddSddddddddSd

}

}

Ну вот опять почему не реализовано? Ну наверное, что было овером реализовано так и осталось.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class OustAllianceMemberPledge extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeC(0xAC);

//TODO d

}

}

Где реализация пакета? ГДЕ?

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

import org.apache.commons.lang3.StringUtils;

import core.gameserver.Config;

import core.gameserver.model.base.TeamType;

import core.gameserver.model.pledge.Alliance;

import core.gameserver.model.Creature;

import core.gameserver.model.pledge.Clan;

import core.gameserver.model.Summon;

import core.gameserver.model.instances.NpcInstance;

import core.gameserver.network.l2.components.NpcString;

import core.gameserver.utils.Location;

public class NpcInfo extends L2GameServerPacket

{

private boolean can_writeImpl = false;

private int _npcObjId, _npcId, running, incombat, dead, _showSpawnAnimation;

private int _runSpd, _walkSpd, _mAtkSpd, _pAtkSpd, _rhand, _lhand, _enchantEffect;

private int karma, pvp_flag, _abnormalEffect, _abnormalEffect2, clan_id, clan_crest_id, ally_id, ally_crest_id, _formId, _titleColor;

private double colHeight, colRadius, currentColHeight, currentColRadius;

private boolean _isAttackable, _isNameAbove, isFlying;

private Location _loc;

private String _name = StringUtils.EMPTY;

private String _title = StringUtils.EMPTY;

private boolean _showName;

private int _state;

private NpcString _nameNpcString = NpcString.NONE;

private NpcString _titleNpcString = NpcString.NONE;

private TeamType _team;

public NpcInfo(NpcInstance cha, Creature attacker)

{

_npcId = cha.getDisplayId() != 0 ? cha.getDisplayId() : cha.getTemplate().npcId;

_isAttackable = attacker != null && cha.isAutoAttackable(attacker);

_rhand = cha.getRightHandItem();

_lhand = cha.getLeftHandItem();

_enchantEffect = cha.getEnchantEffect();

if(Config.SERVER_SIDE_NPC_NAME || cha.getTemplate().displayId != 0 || cha.getName() != cha.getTemplate().name)

_name = cha.getName();

if(Config.SERVER_SIDE_NPC_TITLE || cha.getTemplate().displayId != 0 || cha.getTitle() != cha.getTemplate().title)

_title = cha.getTitle();

_showSpawnAnimation = cha.getSpawnAnimation();

_showName = cha.isShowName();

_state = cha.getNpcState();

_nameNpcString = cha.getNameNpcString();

_titleNpcString = cha.getTitleNpcString();

common(cha);

}

public NpcInfo(Summon cha, Creature attacker)

{

if(cha.getPlayer() != null && cha.getPlayer().isInvisible())

return;

_npcId = cha.getTemplate().npcId;

_isAttackable = cha.isAutoAttackable(attacker);

_rhand = 0;

_lhand = 0;

_enchantEffect = 0;

_showName = true;

_name = cha.getName();

_title = cha.getTitle();

_showSpawnAnimation = cha.getSpawnAnimation();

common(cha);

}

private void common(Creature cha)

{

colHeight = cha.getColHeight();

colRadius = cha.getColRadius();

currentColHeight = cha.getColHeight();

currentColRadius = cha.getColRadius();

_npcObjId = cha.getObjectId();

_loc = cha.getLoc();

_mAtkSpd = cha.getMAtkSpd();

//

Clan clan = cha.getClan();

Alliance alliance = clan == null ? null : clan.getAlliance();

//

clan_id = clan == null ? 0 : clan.getClanId();

clan_crest_id = clan == null ? 0 : clan.getCrestId();

//

ally_id = alliance == null ? 0 : alliance.getAllyId();

ally_crest_id = alliance == null ? 0 : alliance.getAllyCrestId();

_runSpd = cha.getRunSpeed();

_walkSpd = cha.getWalkSpeed();

karma = cha.getKarma();

pvp_flag = Config.RVRMODE_ENABLE ? 0 : cha.getPvpFlag();

_pAtkSpd = cha.getPAtkSpd();

running = cha.isRunning() ? 1 : 0;

incombat = cha.isInCombat() ? 1 : 0;

dead = cha.isAlikeDead() ? 1 : 0;

_abnormalEffect = cha.getAbnormalEffect();

_abnormalEffect2 = cha.getAbnormalEffect2();

isFlying = cha.isFlying();

_team = cha.getTeam();

_formId = cha.getFormId();

_isNameAbove = cha.isNameAbove();

_titleColor = (cha.isSummon() || cha.isPet()) ? 1 : 0;

can_writeImpl = true;

}

public NpcInfo update()

{

_showSpawnAnimation = 1;

return this;

}

@Override

protected final void writeImpl()

{

if(!can_writeImpl)

return;

writeC(0x0c);

//ddddddddddddddddddffffdddcccccSSddddddddccffddddcc d

writeD(_npcObjId);

writeD(_npcId + 1000000); // npctype id c4

writeD(_isAttackable ? 1 : 0);

writeD(_loc.x);

writeD(_loc.y);

writeD(_loc.z + Config.CLIENT_Z_SHIFT);

writeD(_loc.h);

writeD(0x00);

writeD(_mAtkSpd);

writeD(_pAtkSpd);

writeD(_runSpd);

writeD(_walkSpd);

writeD(_runSpd /*_swimRunSpd*//*0x32*/); // swimspeed

writeD(_walkSpd/*_swimWalkSpd*//*0x32*/); // swimspeed

writeD(_runSpd/*_flRunSpd*/);

writeD(_walkSpd/*_flWalkSpd*/);

writeD(_runSpd/*_flyRunSpd*/);

writeD(_walkSpd/*_flyWalkSpd*/);

writeF(1.100000023841858); // взято из клиента

writeF(_pAtkSpd / 277.478340719);

writeF(colRadius);

writeF(colHeight);

writeD(_rhand); // right hand weapon

writeD(0); //TODO chest

writeD(_lhand); // left hand weapon

writeC(_isNameAbove ? 1 : 0); // 2.2: name above char 1=true ... ??; 2.3: 1 - normal, 2 - dead

writeC(running);

writeC(incombat);

writeC(dead);

writeC(_showSpawnAnimation); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)

writeD(_nameNpcString.getId());

writeS(_name);

writeD(_titleNpcString.getId());

writeS(_title);

writeD(_titleColor); // 0- светло зеленый титул(моб), 1 - светло синий(пет)/отображение текущего МП

writeD(pvp_flag);

writeD(karma); // hmm karma ??

writeD(_abnormalEffect); // C2

writeD(clan_id);

writeD(clan_crest_id);

writeD(ally_id);

writeD(ally_crest_id);

writeC(isFlying ? 2 : 0); // C2

writeC(_team.ordinal()); // team aura 1-blue, 2-red

writeF(currentColRadius); // тут что-то связанное с colRadius

writeF(currentColHeight); // тут что-то связанное с colHeight

writeD(_enchantEffect); // C4

writeD(0x00); // writeD(_npc.isFlying() ? 1 : 0); // C6

writeD(0x00);

writeD(_formId);// great wolf type

writeC(_showName ? 0x01 : 0x00); // show name

writeC(_showName ? 0x01 : 0x00); // show title

writeD(_abnormalEffect2);

writeD(_state);

}

}

Опа, а почему тут присутствуют нули? Ведь всё реализовано согласно официальному серверу.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.c2s;

/**

* Format: (c) ddd

* d: dx

* d: dy

* d: dz

*/

public class MoveWithDelta extends L2GameClientPacket

{

@SuppressWarnings("unused")

private int _dx, _dy, _dz;

@Override

protected void readImpl()

{

_dx = readD();

_dy = readD();

_dz = readD();

}

@Override

protected void runImpl()

{

// TODO this

}

}

А потом вылазиют такие сообщения, админ у меня косячит движение и посмотрев пакет выше Validate Position можно вешаться.

Ну давайте посмотри все пакет GamePacketHandler:

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2;

import java.nio.BufferUnderflowException;

import java.nio.ByteBuffer;

import core.commons.net.nio.impl.IClientFactory;

import core.commons.net.nio.impl.IMMOExecutor;

import core.commons.net.nio.impl.IPacketHandler;

import core.commons.net.nio.impl.MMOConnection;

import core.commons.net.nio.impl.ReceivablePacket;

import core.gameserver.Config;

import core.gameserver.ThreadPoolManager;

import core.gameserver.network.l2.c2s.*;

//import GameGuard.network.l2.c2s.GameGuardReply;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public final class GamePacketHandler implements IPacketHandler, IClientFactory, IMMOExecutor

{

private static final Logger _log = LoggerFactory.getLogger(GamePacketHandler.class);

@SuppressWarnings("static-access")

@Override

public ReceivablePacket handlePacket(ByteBuffer buf, GameClient client)

{

int id = buf.get() & 0xFF;

ReceivablePacket msg = null;

try

{

int id2 = 0;

switch(client.getState())

{

case CONNECTED:

switch(id)

{

case 0x00:

msg = new RequestStatus();

break;

case 0x0e:

msg = new ProtocolVersion();

break;

case 0x2b:

msg = new AuthLogin();

break;

case 0xCB:

//msg = new GameGuardReply();

break;


default:

client.onUnknownPacket();

break;

}

break;

case AUTHED:

switch(id)

{

case 0x00:

msg = new Logout();

break;

case 0x0c:

msg = new CharacterCreate(); //RequestCharacterCreate();

break;

case 0x0d:

msg = new CharacterDelete(); //RequestCharacterDelete();

break;

case 0x12:

msg = new CharacterSelected(); //CharacterSelect();

break;

case 0x13:

msg = new NewCharacter(); //RequestNewCharacter();

break;

case 0x7b:

msg = new CharacterRestore(); //RequestCharacterRestore();

break;

case 0xCB:

//msg = new GameGuardReply();

break;


case 0xd0:

int id3 = buf.getShort() & 0xffff;

switch(id3)

{

case 0x36:

msg = new GotoLobby();

break;

case 0x93:

msg = new RequestEx2ndPasswordCheck();

break;

case 0x94:

msg = new RequestEx2ndPasswordVerify();

break;

case 0x95:

msg = new RequestEx2ndPasswordReq();

break;

default:

client.onUnknownPacket();

break;

}

break;

default:

client.onUnknownPacket();

break;

}

break;

case IN_GAME:

switch(id)

{

case 0x00:

msg = new Logout();

break;

case 0x01:

msg = new AttackRequest();

break;

case 0x02:

// msg = new ?();

break;


case 0x03:

msg = new RequestStartPledgeWar();

break;

case 0x04:

// msg = new ?();

break;


case 0x05:

msg = new RequestStopPledgeWar();

break;

case 0x06:

// msg = RequestSCCheck(); // ? Format: cdx

break;


case 0x07:

// msg = new ReplyGameGuardQuery();

//здесь совсем другой пакет ResponseAuthGameGuard[cddddd] (c) Drin

break;

case 0x08:

// msg = new ?();

break;


case 0x09:

msg = new RequestSetPledgeCrest();

break;

case 0x0a:

// msg = new ?();

break;


case 0x0b:

msg = new RequestGiveNickName();

break;

case 0x0c:

// wtf???

break;

case 0x0d:

// wtf???

break;


case 0x0f:

msg = new MoveBackwardToLocation();

break;

case 0x10:

// msg = new Say(); Format: cS // старый ?

break;


case 0x11:

msg = new EnterWorld();

break;

case 0x12:

// wtf???

break;


case 0x14:

msg = new RequestItemList();

break;

case 0x15:

// msg = new RequestEquipItem(); // старый?

// Format: cdd server id = %d Slot = %d

break;


case 0x16:

//msg = new RequestUnEquipItem();

break;

case 0x17:

msg = new RequestDropItem();

break;

case 0x18:

// msg = new ?();

break;


case 0x19:

msg = new UseItem();

break;

case 0x1a:

msg = new TradeRequest();

break;

case 0x1b:

msg = new AddTradeItem();

break;

case 0x1c:

msg = new TradeDone();

break;

case 0x1d:

// msg = new ?();

break;

case 0x1e:

// msg = new ?();

break;


case 0x1f:

msg = new Action();

break;

case 0x20:

// msg = new ?();

break;

case 0x21:

// msg = new ?();

break;


case 0x22:

// msg = new RequestLinkHtml();

break;

case 0x23:

msg = new RequestBypassToServer();

break;

case 0x24:

msg = new RequestBBSwrite(); //RequestBBSWrite();

break;

case 0x25:

msg = new RequestCreatePledge();

break;

case 0x26:

msg = new RequestJoinPledge();

break;

case 0x27:

msg = new RequestAnswerJoinPledge();

break;

case 0x28:

msg = new RequestWithdrawalPledge();

break;

case 0x29:

msg = new RequestOustPledgeMember();

break;

case 0x2a:

// msg = new ?();

break;


case 0x2c:

msg = new RequestGetItemFromPet();

break;

case 0x2d:

// RequestDismissParty

break;


case 0x2e:

msg = new RequestAllyInfo();

break;

case 0x2f:

msg = new RequestCrystallizeItem();

break;

case 0x30:

// RequestPrivateStoreManage, устарел

break;

case 0x31:

msg = new SetPrivateStoreSellList();

break;

case 0x32:

// RequestPrivateStoreManageCancel, устарел

break;


case 0x33:

msg = new RequestTeleport();

break;

case 0x34:

//msg = new RequestSocialAction();

break;

case 0x35:

// ChangeMoveType, устарел

break;

case 0x36:

// ChangeWaitType, устарел

break;


case 0x37:

msg = new RequestSellItem();

break;

case 0x38:

msg = new RequestMagicSkillList();

break;

case 0x39:

msg = new RequestMagicSkillUse();

break;

case 0x3a:

msg = new Appearing(); //Appering();

break;

case 0x3b:

if(Config.ALLOW_WAREHOUSE)

msg = new SendWareHouseDepositList();

break;

case 0x3c:

msg = new SendWareHouseWithDrawList();

break;

case 0x3d:

msg = new RequestShortCutReg();

break;

case 0x3e:

// msg = new RequestShortCutUse(); // Format: cddc ?

break;


case 0x3f:

msg = new RequestShortCutDel();

break;

case 0x40:

msg = new RequestBuyItem();

break;

case 0x41:

// msg = new RequestDismissPledge(); //Format: c ?

break;


case 0x42:

msg = new RequestJoinParty();

break;

case 0x43:

msg = new RequestAnswerJoinParty();

break;

case 0x44:

msg = new RequestWithDrawalParty();

break;

case 0x45:

msg = new RequestOustPartyMember();

break;

case 0x46:

msg = new RequestDismissParty();

break;

case 0x47:

msg = new CannotMoveAnymore();

break;

case 0x48:

msg = new RequestTargetCanceld();

break;

case 0x49:

msg = new Say2C();

break;

// -- maybe GM packet's

case 0x4a:

id2 = buf.get() & 0xff;

switch(id2)

{

case 0x00:

// msg = new SendCharacterInfo(); // Format: S

break;

case 0x01:

// msg = new SendSummonCmd(); // Format: S

break;

case 0x02:

// msg = new SendServerStatus(); // Format: (noargs)

break;

case 0x03:

// msg = new SendL2ParamSetting(); // Format: dd

break;

default:

client.onUnknownPacket();

break;

}

break;


case 0x4b:

// msg = new ?();

break;

case 0x4c:

// msg = new ?();

break;


case 0x4d:

msg = new RequestPledgeMemberList();

break;

case 0x4e:

// msg = new ?();

break;

case 0x4f:

// msg = new RequestMagicItem(); // Format: c ?

break;


case 0x50:

msg = new RequestSkillList(); // trigger

break;

case 0x51:

// msg = new ?();

break;


case 0x52:

msg = new MoveWithDelta();

break;

case 0x53:

msg = new RequestGetOnVehicle();

break;

case 0x54:

msg = new RequestGetOffVehicle();

break;

case 0x55:

msg = new AnswerTradeRequest();

break;

case 0x56:

msg = new RequestActionUse();

break;

case 0x57:

msg = new RequestRestart();

break;

case 0x58:

msg = new RequestSiegeInfo();

break;

case 0x59:

msg = new ValidatePosition();

break;

case 0x5a:

msg = new RequestSEKCustom();

break;

case 0x5b:

msg = new StartRotatingC();

break;

case 0x5c:

msg = new FinishRotatingC();

break;

case 0x5d:

// msg = new ?();

break;


case 0x5e:

msg = new RequestShowBoard();

break;

case 0x5f:

msg = new RequestEnchantItem();

break;

case 0x60:

msg = new RequestDestroyItem();

break;

case 0x61:

// msg = new ?();

break;


case 0x62:

msg = new RequestQuestList();

break;

case 0x63:

msg = new RequestQuestAbort(); //RequestDestroyQuest();

break;

case 0x64:

// msg = new ?();

break;


case 0x65:

msg = new RequestPledgeInfo();

break;

case 0x66:

msg = new RequestPledgeExtendedInfo();

break;

case 0x67:

msg = new RequestPledgeCrest();

break;

case 0x68:

// msg = new ?();

break;

case 0x69:

// msg = new ?();

break;

case 0x6a:

// msg = new ?();

break;


case 0x6b:

msg = new RequestSendL2FriendSay();

break;

case 0x6c:

msg = new RequestShowMiniMap(); //RequestOpenMinimap();

break;

case 0x6d:

msg = new RequestSendMsnChatLog();

break;

case 0x6e:

msg = new RequestReload(); // record video

break;

case 0x6f:

msg = new RequestHennaEquip();

break;

case 0x70:

msg = new RequestHennaUnequipList();

break;

case 0x71:

msg = new RequestHennaUnequipInfo();

break;

case 0x72:

msg = new RequestHennaUnequip();

break;

case 0x73:

msg = new RequestAquireSkillInfo(); //RequestAcquireSkillInfo();

break;

case 0x74:

msg = new SendBypassBuildCmd();

break;

case 0x75:

msg = new RequestMoveToLocationInVehicle();

break;

case 0x76:

msg = new CannotMoveAnymoreInVehicle();

break;

case 0x77:

msg = new RequestFriendInvite();

break;

case 0x78:

msg = new RequestFriendAddReply();

break;

case 0x79:

msg = new RequestFriendList();

break;

case 0x7a:

msg = new RequestFriendDel();

break;

case 0x7c:

msg = new RequestAquireSkill();

break;

case 0x7d:

msg = new RequestRestartPoint();

break;

case 0x7e:

msg = new RequestGMCommand();

break;

case 0x7f:

msg = new RequestPartyMatchConfig();

break;

case 0x80:

msg = new RequestPartyMatchList();

break;

case 0x81:

msg = new RequestPartyMatchDetail();

break;

case 0x82:

msg = new RequestPrivateStoreList();

break;

case 0x83:

msg = new RequestPrivateStoreBuy();

break;

case 0x84:

// msg = new ReviveReply(); // format: cd ?

break;


case 0x85:

msg = new RequestTutorialLinkHtml();

break;

case 0x86:

msg = new RequestTutorialPassCmdToServer();

break;

case 0x87:

msg = new RequestTutorialQuestionMark(); //RequestTutorialQuestionMarkPressed();

break;

case 0x88:

msg = new RequestTutorialClientEvent();

break;

case 0x89:

msg = new RequestPetition();

break;

case 0x8a:

msg = new RequestPetitionCancel();

break;

case 0x8b:

msg = new RequestGmList();

break;

case 0x8c:

msg = new RequestJoinAlly();

break;

case 0x8d:

msg = new RequestAnswerJoinAlly();

break;

case 0x8e:

// Команда /allyleave - выйти из альянса

msg = new RequestWithdrawAlly();

break;

case 0x8f:

// Команда /allydismiss - выгнать клан из альянса

msg = new RequestOustAlly();

break;

case 0x90:

// Команда /allydissolve - распустить альянс

msg = new RequestDismissAlly();

break;

case 0x91:

msg = new RequestSetAllyCrest();

break;

case 0x92:

msg = new RequestAllyCrest();

break;

case 0x93:

msg = new RequestChangePetName();

break;

case 0x94:

msg = new RequestPetUseItem();

break;

case 0x95:

msg = new RequestGiveItemToPet();

break;

case 0x96:

msg = new RequestPrivateStoreQuitSell();

break;

case 0x97:

msg = new SetPrivateStoreMsgSell();

break;

case 0x98:

msg = new RequestPetGetItem();

break;

case 0x99:

msg = new RequestPrivateStoreBuyManage();

break;

case 0x9a:

msg = new SetPrivateStoreBuyList();

break;

case 0x9b:

//

break;


case 0x9c:

msg = new RequestPrivateStoreQuitBuy();

break;

case 0x9d:

msg = new SetPrivateStoreMsgBuy();

break;

case 0x9e:

//

break;


case 0x9f:

msg = new RequestPrivateStoreBuySellList();

break;

case 0xa0:

msg = new RequestTimeCheck();

break;

case 0xa1:

// msg = new ?();

break;

case 0xa2:

// msg = new ?();

break;

case 0xa3:

// msg = new ?();

break;

case 0xa4:

// msg = new ?();

break;

case 0xa5:

// msg = new ?();

break;


case 0xa6:

//msg = new RequestSkillCoolTime(); //Deprecated ?

break;

case 0xa7:

msg = new RequestPackageSendableItemList();

break;

case 0xa8:

msg = new RequestPackageSend();

break;

case 0xa9:

msg = new RequestBlock();

break;

case 0xaa:

// msg = new RequestCastleSiegeInfo(); // format: cd ?

break;


case 0xab:

msg = new RequestCastleSiegeAttackerList();

break;

case 0xac:

msg = new RequestCastleSiegeDefenderList();

break;

case 0xad:

msg = new RequestJoinCastleSiege();

break;

case 0xae:

msg = new RequestConfirmCastleSiegeWaitingList();

break;

case 0xaf:

msg = new RequestSetCastleSiegeTime();

break;

case 0xb0:

msg = new RequestMultiSellChoose();

break;

case 0xb1:

msg = new NetPing();

break;

case 0xb2:

msg = new RequestRemainTime();

break;

case 0xb3:

msg = new BypassUserCmd();

break;

case 0xb4:

msg = new SnoopQuit();

break;

case 0xb5:

msg = new RequestRecipeBookOpen();

break;

case 0xb6:

msg = new RequestRecipeItemDelete();

break;

case 0xb7:

msg = new RequestRecipeItemMakeInfo();

break;

case 0xb8:

msg = new RequestRecipeItemMakeSelf();

break;

case 0xb9:

// msg = new RequestRecipeShopManageList(); deprecated // format: c

break;


case 0xba:

msg = new RequestRecipeShopMessageSet();

break;

case 0xbb:

msg = new RequestRecipeShopListSet();

break;

case 0xbc:

msg = new RequestRecipeShopManageQuit();

break;

case 0xbd:

msg = new RequestRecipeShopManageCancel();

break;

case 0xbe:

msg = new RequestRecipeShopMakeInfo();

break;

case 0xbf:

msg = new RequestRecipeShopMakeDo();

break;

case 0xc0:

msg = new RequestRecipeShopSellList();

break;

case 0xc1:

msg = new RequestObserverEnd();

break;

case 0xc2:

//msg = new VoteSociality(); // Recommend

break;


case 0xc3:

msg = new RequestHennaList(); //RequestHennaItemList();

break;

case 0xc4:

msg = new RequestHennaItemInfo();

break;

case 0xc5:

msg = new RequestBuySeed();

break;

case 0xc6:

msg = new ConfirmDlg();

break;

case 0xc7:

msg = new RequestPreviewItem();

break;

case 0xc8:

msg = new RequestSSQStatus();

break;

case 0xc9:

msg = new PetitionVote();

break;

case 0xca:

// msg = new ?();

break;

case 0xcb:

//msg = new GameGuardReply();

break;


case 0xcc:

msg = new RequestPledgePower();

break;

case 0xcd:

msg = new RequestMakeMacro();

break;

case 0xce:

msg = new RequestDeleteMacro();

break;

case 0xcf:

msg = new RequestProcureCrop(); // ?

break;

case 0xd0:

int id3 = buf.getShort() & 0xffff;

switch(id3)

{

case 0x00:

// msg = new ?();

break;


case 0x01:

msg = new RequestManorList();

break;

case 0x02:

msg = new RequestProcureCropList();

break;

case 0x03:

msg = new RequestSetSeed();

break;

case 0x04:

msg = new RequestSetCrop();

break;

case 0x05:

msg = new RequestWriteHeroWords();

break;

case 0x06:

msg = new RequestExMPCCAskJoin(); //RequestExAskJoinMPCC();

break;

case 0x07:

msg = new RequestExMPCCAcceptJoin(); //RequestExAcceptJoinMPCC();

break;

case 0x08:

msg = new RequestExOustFromMPCC();

break;

case 0x09:

msg = new RequestOustFromPartyRoom();

break;

case 0x0a:

msg = new RequestDismissPartyRoom();

break;

case 0x0b:

msg = new RequestWithdrawPartyRoom();

break;

case 0x0c:

msg = new RequestHandOverPartyMaster();

break;

case 0x0d:

msg = new RequestAutoSoulShot();

break;

case 0x0e:

msg = new RequestExEnchantSkillInfo();

break;

case 0x0f:

msg = new RequestExEnchantSkill();

break;

case 0x10:

msg = new RequestPledgeCrestLarge();

break;

case 0x11:

msg = new RequestSetPledgeCrestLarge();

break;

case 0x12:

msg = new RequestPledgeSetAcademyMaster();

break;

case 0x13:

msg = new RequestPledgePowerGradeList();

break;

case 0x14:

msg = new RequestPledgeMemberPowerInfo();

break;

case 0x15:

msg = new RequestPledgeSetMemberPowerGrade();

break;

case 0x16:

msg = new RequestPledgeMemberInfo();

break;

case 0x17:

msg = new RequestPledgeWarList();

break;

case 0x18:

msg = new RequestExFishRanking();

break;

case 0x19:

msg = new RequestPCCafeCouponUse();

break;

case 0x1a:

// msg = new ?();

// format: (ch)b, b - array размером в 64 байта

break;


case 0x1b:

msg = new RequestDuelStart();

break;

case 0x1c:

msg = new RequestDuelAnswerStart();

break;

case 0x1d:

msg = new RequestTutorialClientEvent(); //RequestExSetTutorial();

// Format: d / требует отладки, ИМХО, это совсем другой пакет (с) Drin

break;


case 0x1e:

msg = new RequestExRqItemLink(); // chat item links

break;

case 0x1f:

// CanNotMoveAnymore(AirShip)

// format: (ch)ddddd

break;


case 0x20:

msg = new RequestExMoveToLocationInAirShip();

break;

case 0x21:

msg = new RequestKeyMapping();

break;

case 0x22:

msg = new RequestSaveKeyMapping();

break;

case 0x23:

msg = new RequestExRemoveItemAttribute();

break;

case 0x24:

msg = new RequestSaveInventoryOrder(); // сохранение порядка инвентаря

break;

case 0x25:

msg = new RequestExitPartyMatchingWaitingRoom();

break;

case 0x26:

msg = new RequestConfirmTargetItem();

break;

case 0x27:

msg = new RequestConfirmRefinerItem();

break;

case 0x28:

msg = new RequestConfirmGemStone();

break;

case 0x29:

msg = new RequestOlympiadObserverEnd();

break;

case 0x2a:

msg = new RequestCursedWeaponList();

break;

case 0x2b:

msg = new RequestCursedWeaponLocation();

break;

case 0x2c:

msg = new RequestPledgeReorganizeMember();

break;

case 0x2d:

msg = new RequestExMPCCShowPartyMembersInfo();

break;

case 0x2e:

msg = new RequestExOlympiadObserverEnd(); // не уверен (в клиенте называется RequestOlympiadMatchList)

break;

case 0x2f:

msg = new RequestAskJoinPartyRoom();

break;

case 0x30:

msg = new AnswerJoinPartyRoom();

break;

case 0x31:

msg = new RequestListPartyMatchingWaitingRoom();

break;

case 0x32:

msg = new RequestExEnchantSkillSafe();

break;

case 0x33:

msg = new RequestExEnchantSkillUntrain();

break;

case 0x34:

msg = new RequestExEnchantSkillRouteChange();

break;

case 0x35:

msg = new RequestEnchantItemAttribute();

break;

case 0x36:

//RequestGotoLobby - случается при многократном нажатии кнопки "вход"

break;


case 0x38:

msg = new RequestExMoveToLocationAirShip();

break;

case 0x39:

msg = new RequestBidItemAuction();

break;

case 0x3a:

msg = new RequestInfoItemAuction();

break;

case 0x3b:

msg = new RequestExChangeName();

break;

case 0x3c:

msg = new RequestAllCastleInfo();

break;

case 0x3d:

msg = new RequestAllFortressInfo();

break;

case 0x3e:

msg = new RequestAllAgitInfo();

break;

case 0x3f:

msg = new RequestFortressSiegeInfo();

break;

case 0x40:

msg = new RequestGetBossRecord();

break;

case 0x41:

msg = new RequestRefine();

break;

case 0x42:

msg = new RequestConfirmCancelItem();

break;

case 0x43:

msg = new RequestRefineCancel();

break;

case 0x44:

msg = new RequestExMagicSkillUseGround();

break;

case 0x45:

msg = new RequestDuelSurrender();

break;

case 0x46:

msg = new RequestExEnchantSkillInfoDetail();

break;

/*case 0x47: ?*/

case 0x48:

msg = new RequestFortressMapInfo();

break;

case 0x49:

msg = new RequestPVPMatchRecord();

break;

case 0x4a:

msg = new SetPrivateStoreWholeMsg();

break;

case 0x4b:

msg = new RequestDispel();

break;

case 0x4c:

msg = new RequestExTryToPutEnchantTargetItem();

break;

case 0x4d:

msg = new RequestExTryToPutEnchantSupportItem();

break;

case 0x4e:

msg = new RequestExCancelEnchantItem();

break;

case 0x4f:

msg = new RequestChangeNicknameColor();

break;

case 0x50:

msg = new RequestResetNickname();

break;

case 0x51:

int id4 = buf.getInt();

switch(id4)

{

case 0x00:

msg = new RequestBookMarkSlotInfo();

break;

case 0x01:

msg = new RequestSaveBookMarkSlot();

break;

case 0x02:

msg = new RequestModifyBookMarkSlot();

break;

case 0x03:

msg = new RequestDeleteBookMarkSlot();

break;

case 0x04:

msg = new RequestTeleportBookMark();

break;

case 0x05:

msg = new RequestChangeBookMarkSlot();

break;

default:

client.onUnknownPacket();

break;

}

break;

case 0x52:

msg = new RequestWithDrawPremiumItem();

break;

case 0x53:

msg = new RequestExJump();

break;

case 0x54:

msg = new RequestExStartShowCrataeCubeRank();

break;

case 0x55:

msg = new RequestExStopShowCrataeCubeRank();

break;

case 0x56:

msg = new NotifyStartMiniGame();

break;

case 0x57:

msg = new RequestExJoinDominionWar();

break;

case 0x58:

msg = new RequestExDominionInfo();

break;

case 0x59:

msg = new RequestExCleftEnter();

break;

case 0x5A:

msg = new RequestExCubeGameChangeTeam();

break;

case 0x5B:

msg = new RequestExEndScenePlayer();

break;

case 0x5C:

msg = new RequestExCubeGameReadyAnswer();

break;

case 0x5D:

msg = new RequestExListMpccWaiting();

break;

case 0x5E:

msg = new RequestExManageMpccRoom();

break;

case 0x5F:

msg = new RequestExJoinMpccRoom();

break;

case 0x60:

msg = new RequestExOustFromMpccRoom();

break;

case 0x61:

msg = new RequestExDismissMpccRoom();

break;

case 0x62:

msg = new RequestExWithdrawMpccRoom();

break;

case 0x63:

msg = new RequestExSeedPhase();

break;

case 0x64:

msg = new RequestExMpccPartymasterList();

break;

case 0x65:

msg = new RequestExPostItemList();

break;

case 0x66:

msg = new RequestExSendPost();

break;

case 0x67:

msg = new RequestExRequestReceivedPostList();

break;

case 0x68:

msg = new RequestExDeleteReceivedPost();

break;

case 0x69:

msg = new RequestExRequestReceivedPost();

break;

case 0x6A:

msg = new RequestExReceivePost();

break;

case 0x6B:

msg = new RequestExRejectPost();

break;

case 0x6C:

msg = new RequestExRequestSentPostList();

break;

case 0x6D:

msg = new RequestExDeleteSentPost();

break;

case 0x6E:

msg = new RequestExRequestSentPost();

break;

case 0x6F:

msg = new RequestExCancelSentPost();

break;

case 0x70:

msg = new RequestExShowNewUserPetition();

break;

case 0x71:

msg = new RequestExShowStepTwo();

break;

case 0x72:

msg = new RequestExShowStepThree();

break;

case 0x73:

//msg = new ExRaidReserveResult();

break;


case 0x75:

msg = new RequestExRefundItem();

break;

case 0x76:

msg = new RequestExBuySellUIClose();

break;

case 0x77:

msg = new RequestExEventMatchObserverEnd();

break;

case 0x78:

msg = new RequestPartyLootModification();

break;

case 0x79:

msg = new AnswerPartyLootModification();

break;

case 0x7A:

msg = new AnswerCoupleAction();

break;

case 0x7B:

msg = new RequestExBR_EventRankerList();

break;

case 0x7C:

//msg = new RequestAskMemberShip();

break;


case 0x7D:

msg = new RequestAddExpandQuestAlarm();

break;

case 0x7E:

msg = new RequestVoteNew();

break;

case 0x7F:

_log.info("D0:7F");

break;

case 0x80:

_log.info("D0:80");

break;

case 0x81:

_log.info("D0:81");

break;

case 0x82:

_log.info("D0:82");

break;

case 0x83:

int id5 = buf.getInt();

switch(id5)

{

/* TODO:

case 0x01:

//msg = new RequestExAgitInitialize chd 0x01

break;

case 0x02:

//msg = new RequestExAgitDetailInfo chdcd 0x02

break;

case 0x03:

//msg = new RequestExMyAgitState chd 0x03

break;

case 0x04:

//msg = new RequestExRegisterAgitForBidStep1 chd 0x04

break;

case 0x05:

//msg = new RequestExRegisterAgitForBidStep2 chddQd 0x05

//msg = new RequestExRegisterAgitForBidStep3 chddQd 0x05 -no error? 0x05

break;

case 0x07:

//msg = new RequestExConfirmCancelRegisteringAgit chd 0x07

break;

case 0x08:

//msg = new RequestExProceedCancelRegisteringAgit chd 0x08

break;

case 0x09:

//msg = new RequestExConfirmCancelAgitBid chdd 0x09

break;

case 0x10:

//msg = new RequestExReBid chdd 0x10

break;

case 0x11:

//msg = new RequestExAgitListForLot chd 0x11

break;

case 0x12:

//msg = new RequestExApplyForAgitLotStep1 chdc 0x12

break;

case 0x13:

//msg = new RequestExApplyForAgitLotStep2 chdc 0x13

break;

case 0x14:

//msg = new RequestExAgitListForBid chdd 0x14

break;

case 0x0D:

//msg = new RequestExApplyForBidStep1 chdd 0x0D

break;

case 0x0E:

//msg = new RequestExApplyForBidStep2 chddQ 0x0E

break;

case 0x0F:

//msg = new RequestExApplyForBidStep3 chddQ 0x0F

break;

case 0x09:

//msg = new RequestExConfirmCancelAgitLot chdc 0x09

break;

case 0x0A:

//msg = new RequestExProceedCancelAgitLot chdc 0x0A

break;

case 0x0A:

//msg = new RequestExProceedCancelAgitBid chdd 0x0A

break;

*/

}

break;


case 0x84:

msg = new RequestExAddPostFriendForPostBox();

break;

case 0x85:

msg = new RequestExDeletePostFriendForPostBox();

break;

case 0x86:

msg = new RequestExShowPostFriendListForPostBox();

break;

case 0x87:

msg = new RequestExFriendListForPostBox();

break;

case 0x88:

msg = new RequestOlympiadMatchList();

break;

case 0x89:

msg = new RequestExBR_GamePoint();

break;

case 0x8A:

msg = new RequestExBR_ProductList();

break;

case 0x8B:

msg = new RequestExBR_ProductInfo();

break;

case 0x8C:

msg = new RequestExBR_BuyProduct();

break;

case 0x8D:

msg = new RequestExBR_RecentProductList();

break;

case 0x8E:

msg = new RequestBR_MiniGameLoadScores();

break;

case 0x8F:

msg = new RequestBR_MiniGameInsertScore();

break;

case 0x90:

msg = new RequestExBR_LectureMark();

break;

case 0x91:

msg = new RequestGoodsInventoryInfo();

break;

case 0x92:

//msg = new RequestUseGoodsInventoryItem();

break;


default:

client.onUnknownPacket();

break;

}

break;

default:

{

client.onUnknownPacket();

break;

}

}

break;

}

}

catch(BufferUnderflowException e)

{

client.onPacketReadFail();

}

return msg;

}

@Override

public GameClient create(MMOConnection con)

{

return new GameClient(con);

}

@Override

public void execute(Runnable r)

{

ThreadPoolManager.getInstance().execute(r);

}

}

Красным выделил, зачем комментить если это и так в сборке есть

Синим выделил, какая классная реализация пакетки, что закоменчено. P.S там их больше ещё пакетов для реализации надо. Но при этом заявление, реализация согласно официальному контенту.

И вообще данную вещь можно было переписать по нормальному.

kick 07.08.2015 12:16

Продолжаем дальше рассматривать пакетку:

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class FlySelfDestination extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x43);

// TODO dddd

}

}

И опять не реализованный пакет, мне это уже начинает надоедать.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExTutorialList extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x6B);

// todo writeB(new byte[128]);

}

}

И опять, не доделано

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExShowTerritory extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x89);

// TODO ddd[dd]

}

}

Опять не сделано

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExShowPetitionHtml extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xB1);

// TODO dx[dcS]

}

}

Опять не работает

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExShowLines extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xA5);

// TODO hdcc cx[ddd]

}

}

Чёрт, да сколько то можно.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExSetMpccRouting extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x37);

// TODO d

}

}

Когда я увижу нормальную реализацию, всё согласно официальному серверу.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExServerPrimitive extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x11);

// TODO Sdddddd {[c(Sdddd ddd ddd|)] Sddddddd}

}

}

?

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExRaidReserveResult extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xB6);

// TODO dx[dddd]

}

}

Боже мой, а реализации то нету.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExPVPMatchRecord extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x7E);

// TODO ddddd d[Sdd] d[Sdd] (currentState:%d blueTeamTotalKillCnt:%d, redTeamTotalKillCnt:%d)

}

}

:ROAD SO FAR: тут уже пора плакать, один из важных моментов официального сервера, а у нас тут такое творится.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExPartyMemberRenamed extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xA6);

// TODO ddd

}

}

Чёрт, где пакет реализованный?

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchUserInfo extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x02);

// TODO dSdddddddd

}

}

Цитата:

Сообщение от Спойлер

public class ExEventMatchTeamUnlocked extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x06);

// TODO dc

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

import java.util.ArrayList;

import java.util.List;

import core.gameserver.model.Player;

import core.gameserver.model.Summon;

public class ExEventMatchTeamInfo extends L2GameServerPacket

{

@SuppressWarnings("unused")

private int leader_id, loot;

private List members = new ArrayList();

public ExEventMatchTeamInfo(List party, Player exclude)

{

leader_id = party.get(0).getObjectId();

loot = party.get(0).getParty().getLootDistribution();

for(Player member : party)

if(!member.equals(exclude))

members.add(new EventMatchTeamInfo(member));

}

@Override

protected void writeImpl()

{

writeEx(0x1C);

// TODO dcd[dSdddddddddd]

}

public static class EventMatchTeamInfo

{

public String _name, pet_Name;

public int _id, curCp, maxCp, curHp, maxHp, curMp, maxMp, level, class_id, race_id;

public int pet_id, pet_NpcId, pet_curHp, pet_maxHp, pet_curMp, pet_maxMp, pet_level;

public EventMatchTeamInfo(Player member)

{

_name = member.getName();

_id = member.getObjectId();

curCp = (int) member.getCurrentCp();

maxCp = member.getMaxCp();

curHp = (int) member.getCurrentHp();

maxHp = member.getMaxHp();

curMp = (int) member.getCurrentMp();

maxMp = member.getMaxMp();

level = member.getLevel();

class_id = member.getClassId().getId();

race_id = member.getRace().ordinal();

Summon pet = member.getPet();

if(pet != null)

{

pet_id = pet.getObjectId();

pet_NpcId = pet.getNpcId() + 1000000;

pet_Name = pet.getName();

pet_curHp = (int) pet.getCurrentHp();

pet_maxHp = pet.getMaxHp();

pet_curMp = (int) pet.getCurrentMp();

pet_maxMp = pet.getMaxMp();

pet_level = pet.getLevel();

}

else

pet_id = 0;

}

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchScore extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x10);

// TODO ddd

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchObserver extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x0E);

// TODO dccSS

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchMessage extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x0F);

// TODO cS

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchManage extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x30);

// TODO dccScScd[ccdSdd]

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchFirecracker extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x05);

// TODO d

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchCreate extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x1D);

// TODO d

}

}

Вот это да супер реализация, механики официального сервера. Ну у нас же "Всё как на офф".

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchLockResult extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x0B);

// TODO пока не реализован даже в клиенте

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExEventMatchList extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0x0D);

// TODO пока не реализован даже в коиенте

}

}

Отмазался то как он, ну вообще то HF 5 есть эти пакеты

kick 07.08.2015 12:18

Продолжаем рассматривать пакеты:

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExCleftState extends L2GameServerPacket

{

public static final int CleftState_Total = 0;

public static final int CleftState_TowerDestroy = 1;

public static final int CleftState_CatUpdate = 2;

public static final int CleftState_Result = 3;

public static final int CleftState_PvPKill = 4;

private int CleftState = 0; //TODO

@Override

protected void writeImpl()

{

writeEx(0x95);

writeD(CleftState);

switch(CleftState)

{

case CleftState_Total:

//dddddSS - BTeam Point:%d CatID:%d CatName:%s RemainSec:%d RTeam Point:%d CatID:%d CatName:%s RemainSec:%d

//BlueTeam: d[dddd] - Total List TeamID:%d PlayerID:%d Kill:%d Death:%d Tower:%d

//RedTeam: d[dddd] - Total List TeamID:%d PlayerID:%d Kill:%d Death:%d Tower:%d

break;

case CleftState_TowerDestroy:

//ddddddddd - RemainSec:%d BlueTeamPt:%d RedTeamPt:%d TeamID:%d TowerType:%d PlayerID:%d CleftTowerCount:%d KillCount:%d DeathCount:%d

break;

case CleftState_CatUpdate:

//dddS - RemainSec:%d TeamID:%d CatID:%d CatName:%s

break;

case CleftState_Result:

//dd - WinTeamID:%d LoseTeamID:%d

break;

case CleftState_PvPKill:

//ddd - BTeamPoint:%d RTeamPoint:%d

//ddddd - PvPKill01 TeamID:%d PlayerID:%d CleftTowerCount:%d Kill:%d Death:%d RemainSec:%d

//ddddd - PvPKill02 TeamID:%d PlayerID:%d CleftTowerCount:%d Kill:%d Death:%d

break;

}

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExCleftList extends L2GameServerPacket

{

public static final int CleftType_Close = -1;

public static final int CleftType_Total = 0;

public static final int CleftType_Add = 1;

public static final int CleftType_Remove = 2;

public static final int CleftType_TeamChange = 3;

private int CleftType = 0; //TODO

@Override

protected void writeImpl()

{

writeEx(0x94);

writeD(CleftType);

switch(CleftType)

{

case CleftType_Total:

//dd (MinMemberCount:%d bBalancedMatch:%d)

// BlueTeam: d[dS] (PlayerID:%d PlayerName:%s)

// RedTeam: d[dS] (PlayerID:%d PlayerName:%s)

break;

case CleftType_Add:

//ddS - TeamID:%d PlayerID:%d PlayerName:%s

break;

case CleftType_Remove:

//dd - TeamID:%d PlayerID:%d

break;

case CleftType_TeamChange:

//ddd - PlayerID:%d From:%d To:%d

break;

case CleftType_Close:

break;

}

}

}

Как так то, у нас же всё согласно официальному серверу .

kick 07.08.2015 12:20

Вернусь обратно на немного к Магазину(Итем-маллу) и подкину ещё один супер пакет:

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExBR_RecentProductListPacket extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeEx(0xDC);

// TODO dx[dhddddcccccdd]

}

}

Так вот покажи мне официальную механику даже такой вещи

kick 07.08.2015 12:25

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExBlockUpSetState extends L2GameServerPacket

{

private int BlockUpStateType = 0; //TODO

@Override

protected void writeImpl()

{

writeEx(0x98);

writeD(BlockUpStateType);

switch(BlockUpStateType)

{

case 0:

//dddddd

break;

case 1:

//dd

break;

case 2:

//ddd

break;

}

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ExBlockUpSetList extends L2GameServerPacket

{

private int BlockUpType = 0; //TODO

@Override

protected void writeImpl()

{

writeEx(0x97);

writeD(BlockUpType);

switch(BlockUpType)

{

case 0:

//dd

//d[dS]

//d[dS]

break;

case 1:

//dddS

break;

case 2:

//ddd

break;

case 3:

//d

break;

case 4: //nothing

break;

case 5:

//ddd

break;

case -1: //nothing

break;

}

}

}

Вот это да, а как он будет слать таблицы правильные, но всё как на официальном сервере было заявлено, я не вижу.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class DismissAlliance extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeC(0xAD);

//TODO d

}

}

А где реализация?

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class DeleteRadar extends L2GameServerPacket

{

@Override

protected final void writeImpl()

{

writeC(0xB8);

//TODO ddd

}

}

Опять ничего не реализовано.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

public class ClientAction extends L2GameServerPacket

{

@Override

protected void writeImpl()

{

writeC(0x8F);

//TODO d

}

}

Круто. Молодец отлично реализовано, нет слов. Согласно официальному серверу.

Цитата:

Сообщение от Спойлер

package core.gameserver.network.l2.s2c;

import core.gameserver.Config;

import core.gameserver.instancemanager.CursedWeaponsManag er;

import core.gameserver.instancemanager.ReflectionManager;

import core.gameserver.model.Creature;

import core.gameserver.model.Player;

import core.gameserver.model.base.TeamType;

import core.gameserver.model.instances.DecoyInstance;

import core.gameserver.model.items.Inventory;

import core.gameserver.model.items.PcInventory;

import core.gameserver.model.matching.MatchingRoom;

import core.gameserver.model.pledge.Alliance;

import core.gameserver.model.pledge.Clan;

import core.gameserver.skills.effects.EffectCubic;

import core.gameserver.utils.Location;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class CharInfo extends L2GameServerPacket

{

private static final Logger _log = LoggerFactory.getLogger(CharInfo.class);

private int[][] _inv;

private int _mAtkSpd, _pAtkSpd;

private int _runSpd, _walkSpd, _swimSpd, _flRunSpd, _flWalkSpd, _flyRunSpd, _flyWalkSpd;

private Location _loc, _fishLoc;

private String _name, _title;

private int _objId, _race, _sex, base_class, pvp_flag, karma, rec_have;

private double speed_move, speed_atack, col_radius, col_height;

private int hair_style, hair_color, face, _abnormalEffect, _abnormalEffect2;

private int clan_id, clan_crest_id, large_clan_crest_id, ally_id, ally_crest_id, class_id;

private int _sit, _run, _combat, _dead, private_store, _enchant;

private int _noble, _hero, _fishing, mount_type;

private int plg_class, pledge_type, clan_rep_score, cw_level, mount_id;

private int _nameColor, _title_color, _transform, _agathion, _clanBoatObjectId;

private EffectCubic[] cubics;

private boolean _isPartyRoomLeader, _isFlying;

private TeamType _team;

public CharInfo(Player cha)

{

this((Creature) cha);

}

public CharInfo(DecoyInstance cha)

{

this((Creature) cha);

}

public CharInfo(Creature cha)

{

if(cha == null)

{

System.out.println("CharInfo: cha is null!");

Thread.dumpStack();

return;

}

if(cha.isInvisible())

return;

if(cha.isDeleted())

return;

Player player = cha.getPlayer();

if(player == null)

return;

if(player.isInBoat())

{

_loc = player.getInBoatPosition();

if(player.isClanAirShipDriver())

{

_clanBoatObjectId = player.getBoat().getObjectId();

}

}

if (_loc == null)

_loc = cha.getLoc();

_objId = cha.getObjectId();

// Проклятое оружие и трансформации для ТВ скрывают имя и все остальные опознавательные знаки

if(player.getTransformationName() != null || (player.getReflection() == ReflectionManager.GIRAN_HARBOR || player.getReflection() == ReflectionManager.PARNASSUS) && player.getPrivateStoreType() != Player.STORE_PRIVATE_NONE)

{

_name = player.getTransformationName() != null ? player.getTransformationName() : player.getName();

_title = "";

clan_id = 0;

clan_crest_id = 0;

ally_id = 0;

ally_crest_id = 0;

large_clan_crest_id = 0;

if(player.isCursedWeaponEquipped())

cw_level = CursedWeaponsManager.getInstance().getLevel(player .getCursedWeaponEquippedId());

}

else

{

_name = player.getName();

if(player.getPrivateStoreType() != Player.STORE_PRIVATE_NONE)

_title = "";

else if(!player.isConnected() && !player.isPhantom())

{

_title = Config.DEFAULT_LANG.equalsIgnoreCase("ru") ? "РАЗЪЕДИНЕН" : "DISCONNECTED";

_title_color = 255;

}

else

{

_title = player.getTitle();

_title_color = player.getTitleColor();

}

Clan clan = player.getClan();

Alliance alliance = clan == null ? null : clan.getAlliance();

//

clan_id = clan == null ? 0 : clan.getClanId();

clan_crest_id = clan == null ? 0 : clan.getCrestId();

large_clan_crest_id = clan == null ? 0 : clan.getCrestLargeId();

//

ally_id = alliance == null ? 0 : alliance.getAllyId();

ally_crest_id = alliance == null ? 0 : alliance.getAllyCrestId();

cw_level = 0;

}

if(player.isMounted())

{

_enchant = 0;

mount_id = player.getMountNpcId() + 1000000;

mount_type = player.getMountType();

}

else

{

_enchant = player.getEnchantEffect();

mount_id = 0;

mount_type = 0;

}

_inv = new int[PcInventory.PAPERDOLL_MAX][2];

for(int PAPERDOLL_ID : PAPERDOLL_ORDER)

{

_inv[PAPERDOLL_ID][0] = player.getInventory().getPaperdollItemId(PAPERDOLL _ID);

_inv[PAPERDOLL_ID][1] = player.getInventory().getPaperdollAugmentationId(P APERDOLL_ID);

}

_mAtkSpd = player.getMAtkSpd();

_pAtkSpd = player.getPAtkSpd();

speed_move = player.getMovementSpeedMultiplier();

_runSpd = (int) (player.getRunSpeed() / speed_move);

_walkSpd = (int) (player.getWalkSpeed() / speed_move);

_flRunSpd = 0; // TODO

_flWalkSpd = 0; // TODO

if(player.isFlying())

{

_flyRunSpd = _runSpd;

_flyWalkSpd = _walkSpd;

}

else

{

_flyRunSpd = 0;

_flyWalkSpd = 0;

}

_swimSpd = player.getSwimSpeed();

_race = player.getBaseTemplate().race.ordinal();

_sex = player.getSex();

base_class = player.getBaseClassId();

pvp_flag = Config.RVRMODE_ENABLE ? 0 : player.getPvpFlag();

karma = player.getKarma();

speed_atack = player.getAttackSpeedMultiplier();

col_radius = player.getColRadius();

col_height = player.getColHeight();

hair_style = player.getHairStyle();

hair_color = player.getHairColor();

face = player.getFace();

if(clan_id > 0 && player.getClan() != null)

clan_rep_score = player.getClan().getReputationScore();

else

clan_rep_score = 0;

_sit = player.isSitting() ? 0 : 1; // standing = 1 sitting = 0

_run = player.isRunning() ? 1 : 0; // running = 1 walking = 0

_combat = player.isInCombat() ? 1 : 0;

_dead = player.isAlikeDead() ? 1 : 0;

private_store = player.isInObserverMode() ? Player.STORE_OBSERVING_GAMES : player.getPrivateStoreType();

cubics = player.getCubics().toArray(new EffectCubic[player.getCubics().size()]);

_abnormalEffect = player.getAbnormalEffect();

_abnormalEffect2 = player.getAbnormalEffect2();

rec_have = player.isGM() ? 0 : player.getRecomHave();

class_id = player.getClassId().getId();

_team = player.getTeam();

_noble = player.isNoble() ? 1 : 0; // 0x01: symbol on char menu ctrl+I

_hero = player.isHero() || player.isFakeHero() || player.isGM() && Config.GM_HERO_AURA ? 1 : 0; // 0x01: Hero Aura

_fishing = player.isFishing() ? 1 : 0;

_fishLoc = player.getFishLoc();

_nameColor = player.getNameColor(); // New C5

plg_class = player.getPledgeClass();

pledge_type = player.getPledgeType();

_transform = player.getTransformation();

_agathion = player.getAgathionId();

_isPartyRoomLeader = player.getMatchingRoom() != null && player.getMatchingRoom().getType() == MatchingRoom.PARTY_MATCHING && player.getMatchingRoom().getLeader() == player;

_isFlying = player.isInFlyingTransform();

}

@Override

protected final void writeImpl()

{

Player activeChar = getClient().getActiveChar();

if(activeChar == null)

return;

if(_objId == 0){ return; }

if(activeChar.getObjectId() == _objId)

{

_log.error("You cant send CharInfo about his character to active user!!!");

return;

}

writeC(0x31);

writeD(_loc.x);

writeD(_loc.y);

writeD(_loc.z + Config.CLIENT_Z_SHIFT);

writeD(_clanBoatObjectId);

writeD(_objId);

writeS(_name);

writeD(_race);

writeD(_sex);

writeD(base_class);

for(int PAPERDOLL_ID : PAPERDOLL_ORDER)

writeD(_inv[PAPERDOLL_ID][0]);

for(int PAPERDOLL_ID : PAPERDOLL_ORDER)

writeD(_inv[PAPERDOLL_ID][1]);

writeD(0x01); //TODO talisman count(VISTALL)

writeD(0x00); //TODO cloak status(VISTALL)

writeD(pvp_flag);

writeD(karma);

writeD(_mAtkSpd);

writeD(_pAtkSpd);

writeD(0x00);

writeD(_runSpd);

writeD(_walkSpd);

writeD(_swimSpd);

writeD(_swimSpd);

writeD(_flRunSpd);

writeD(_flWalkSpd);

writeD(_flyRunSpd);

writeD(_flyWalkSpd);

writeF(speed_move); // _cha.getProperMultiplier()

writeF(speed_atack); // _cha.getAttackSpeedMultiplier()

writeF(col_radius);

writeF(col_height);

writeD(hair_style);

writeD(hair_color);

writeD(face);

writeS(_title);

writeD(clan_id);

writeD(clan_crest_id);

writeD(ally_id);

writeD(ally_crest_id);

writeC(_sit);

writeC(_run);

writeC(_combat);

writeC(_dead);

writeC(0x00); // is invisible

writeC(mount_type); // 1-on Strider, 2-on Wyvern, 3-on Great Wolf, 0-no mount

writeC(private_store);

writeH(cubics.length);

for(EffectCubic cubic : cubics)

writeH(cubic == null ? 0 : cubic.getId());

writeC(_isPartyRoomLeader ? 0x01 : 0x00); // find party members

writeD(_abnormalEffect);

writeC(_isFlying ? 0x02 : 0x00);

writeH(rec_have);

writeD(mount_id);

writeD(class_id);

writeD(0x00);

writeC(_enchant);

writeC(_team.ordinal()); // team circle around feet 1 = Blue, 2 = red

writeD(large_clan_crest_id);

writeC(_noble);

writeC(_hero);

writeC(_fishing);

writeD(_fishLoc.x);

writeD(_fishLoc.y);

writeD(_fishLoc.z);

writeD(_nameColor);

writeD(_loc.h);

writeD(plg_class);

writeD(pledge_type);

writeD(_title_color);

writeD(cw_level);

writeD(clan_rep_score);

writeD(_transform);

writeD(_agathion);

writeD(0x01); // T2

writeD(_abnormalEffect2);

}

public static final int[] PAPERDOLL_ORDER =

{

Inventory.PAPERDOLL_UNDER,

Inventory.PAPERDOLL_HEAD,

Inventory.PAPERDOLL_RHAND,

Inventory.PAPERDOLL_LHAND,

Inventory.PAPERDOLL_GLOVES,

Inventory.PAPERDOLL_CHEST,

Inventory.PAPERDOLL_LEGS,

Inventory.PAPERDOLL_FEET,

Inventory.PAPERDOLL_BACK,

Inventory.PAPERDOLL_LRHAND,

Inventory.PAPERDOLL_HAIR,

Inventory.PAPERDOLL_DHAIR,

Inventory.PAPERDOLL_RBRACELET,

Inventory.PAPERDOLL_LBRACELET,

Inventory.PAPERDOLL_DECO1,

Inventory.PAPERDOLL_DECO2,

Inventory.PAPERDOLL_DECO3,

Inventory.PAPERDOLL_DECO4,

Inventory.PAPERDOLL_DECO5,

Inventory.PAPERDOLL_DECO6,

Inventory.PAPERDOLL_BELT

};

}

Опять нули в пакетке, да как же так. А когда я увижу реализацию согласно официальному серверу?

[QUOTE="Спойлер"]
[COLOR="#363940"]
package core.gameserver.network.l2.s2c;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import java.util.List;

import core.commons.dbutils.DbUtils;

import core.gameserver.Config;

import core.gameserver.dao.CharacterDAO;

import core.gameserver.data.xml.holder.CharTemplateHolder ;

import core.gameserver.database.DatabaseFactory;

import core.gameserver.model.CharSelectInfoPackage;

import core.gameserver.model.base.Experience;

import core.gameserver.model.items.Inventory;

import core.gameserver.templates.PlayerTemplate;

import core.gameserver.utils.AutoBan;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class CharacterSelectionInfo extends L2GameServerPacket

{

// d (SdSddddddddddffdQdddddddddddddddddddddddddddddddd dddddddffdddchhd)

private static final Logger _log = LoggerFactory.getLogger(CharacterSelectionInfo.cla ss);

private String _loginName;

private int _sessionId;

private CharSelectInfoPackage[] _characterPackages;

public CharacterSelectionInfo(String loginName, int sessionId)

{

_sessionId = sessionId;

_loginName = loginName;

_characterPackages = loadCharacterSelectInfo(loginName);

}

public CharSelectInfoPackage[] getCharInfo()

{

return _characterPackages;

}

@Override

protected final void writeImpl()

{

int size = _characterPackages != null ? _characterPackages.length : 0;

writeC(0x09);

writeD(size);

writeD(0x07); //Kamael, 0x07 ?

writeC(0); //разрешает или запрещает создание игроков

long lastAccess = -1L;

int lastUsed = -1;

for(int i = 0; i -100 ? charInfoPackage.getDeleteTimer() : -1);

writeD(charInfoPackage.getClassId());

writeD(i == lastUsed ? 1 : 0);

writeC(Math.min(charInfoPackage.getPaperdollEnchan tEffect(Inventory.PAPERDOLL_RHAND), 127));

writeD(charInfoPackage.getPaperdollAugmentationId( Inventory.PAPERDOLL_RHAND));

int weaponId = charInfoPackage.getPaperdollItemId(Inventory.PAPER DOLL_RHAND);

if(weaponId == 8190) // Transform id (на оффе отображаются только КВ трансформации или вообще не отображаются

writeD(301);

else if(weaponId == 8689)

writeD(302);

else

writeD(0x00);

//TODO: Pet info?

writeD(0x00);

writeD(0x00);

writeD(0x00);

writeD(0x00);

writeF(0x00);

writeF(0x00);

writeD(charInfoPackage.getVitalityPoints());

}

}

public static CharSelectInfoPackage[] loadCharacterSelectInfo(String loginName)

{

CharSelectInfoPackage charInfopackage;

List characterList = new ArrayList();

Connection con = null;

PreparedStatement statement = null;

ResultSet rset = null;

try

{

con = DatabaseFactory.getInstance().getConnection();

statement = con.prepareStatement("SELECT * FROM characters AS c LEFT JOIN character_subclasses AS cs ON (c.obj_Id=cs.char_obj_id AND cs.active=1) WHERE account_name=? LIMIT 7");

statement.setString(1, loginName);

rset = statement.executeQuery();

while(rset.next()) // fills the package

{

charInfopackage = restoreChar(rset);

if(charInfopackage != null)

characterList.add(charInfopackage);

}

}

catch(Exception e)

{

_log.error("could not restore charinfo:", e);

}

finally

{

DbUtils.closeQuietly(con, statement, rset);

}

return characterList.toArray(new CharSelectInfoPackage[characterList.size()]);

}

private static int restoreBaseClassId(int objId)

{

int classId = 0;

Connection con = null;

PreparedStatement statement = null;

ResultSet rset = null;

try

{

con = DatabaseFactory.getInstance().getConnection();

statement = con.prepareStatement("SELECT class_id FROM character_subclasses WHERE char_obj_id=? AND isBase=1");

statement.setInt(1, objId);

rset = statement.executeQuery();

while(rset.next())

classId = rset.getInt("class_id");

}

catch(Exception e)

{

_log.error("could not restore base class id:", e);

}

finally

{

DbUtils.closeQuietly(con, statement, rset);

}

return classId;

}

private static CharSelectInfoPackage restoreChar(ResultSet chardata)

{

CharSelectInfoPackage charInfopackage = null;

try

{

int objectId = chardata.getInt("obj_Id");

int classid = chardata.getInt("class_id");

int baseClassId = classid;

boolean useBaseClass = chardata.getInt("isBase") > 0;

if(!useBaseClass)

baseClassId = restoreBaseClassId(objectId);

boolean female = chardata.getInt("sex") == 1;

PlayerTemplate templ = CharTemplateHolder.getInstance().getTemplate(baseC lassId, female);

if(templ == null)

{

_log.error("restoreChar fail | templ == null | objectId: " + objectId + " | classid: " + baseClassId + " | female: " + female);

return null;

}

String name = chardata.getString("char_name");

charInfopackage = new CharSelectInfoPackage(objectId, name);

charInfopackage.setLevel(chardata.getInt("level")) ;

charInfopackage.setMaxHp(chardata.getInt("maxHp")) ;

charInfopackage.setCurrentHp(chardata.getDouble("c urHp"));

charInfopackage.setMaxMp(chardata.getInt("maxMp")) ;

charInfopackage.setCurrentMp(chardata.getDouble("c urMp"));

charInfopackage.setX(chardata.getInt("x"));

charInfopackage.setY(chardata.getInt("y"));

charInfopackage.setZ(chardata.getInt("z"));

charInfopackage.setPk(chardata.getInt("pkkills"));

charInfopackage.setPvP(chardata.getInt("pvpkills") );

charInfopackage.setFace(chardata.getInt("face"));

charInfopackage.setHairStyle(chardata.getInt("hair style"));

charInfopackage.setHairColor(chardata.getInt("hair color"));

charInfopackage.setSex(female ? 1 : 0);

charInfopackage.setExp(chardata.getLong("exp"));

charInfopackage.setSp(chardata.getInt("sp"));

charInfopackage.setClanId(chardata.getInt("clanid" ));

charInfopackage.setKarma(chardata.getInt("karma")) ;

charInfopackage.setRace(templ.race.ordinal());

charInfopackage.setClassId(classid);

charInfopackage.setBaseClassId(baseClassId);

long deletetime = chardata.getLong("deletetime");

int deletedays = 0;

if(Config.DELETE_DAYS > 0)

if(deletetime > 0)

{

deletetime = (int) (System.currentTimeMillis() / 1000 - deletetime);

deletedays = (int) (deletetime / 3600 / 24);

if(deletedays >= Config.DELETE_DAYS)

{

CharacterDAO.getInstance().deleteCharByObjId(objec tId);

return null;

}

deletetime = Config.DELETE_DAYS * 3600 * 24 - deletetime;

}

else

deletetime = 0;

charInfopackage.setDeleteTimer((int) deletetime);

charInfopackage.setLastAccess(chardata.getLong("la stAccess") * 1000L);

charInfopackage.setAccessLevel(chardata.getInt("ac cesslevel"));

int points = chardata.getInt("vitality") + (int) ((System.currentTimeMillis() - charInfopackage.getLastAccess()) / 15.);

if(points > 20000)

points = 20000;

else if(points

kick 07.08.2015 12:39

Цитата:

Сообщение от Спойлер

package core.gameserver.utils;

import gnu.trove.map.hash.TIntIntHashMap;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

import java.util.concurrent.ConcurrentHashMap;

import core.gameserver.model.quest.Quest;

import core.gameserver.utils.Util;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class AddonsConfig

{

private static final Logger log = LoggerFactory.getLogger(AddonsConfig.class);

private static final String dir = "./config/Addons";

private static ConcurrentHashMap properties = new ConcurrentHashMap();

private static ConcurrentHashMap questRewardRates = new ConcurrentHashMap();

private static ConcurrentHashMap questDropRates = new ConcurrentHashMap();

public static void load()

{

File files = new File(dir);

if (!files.exists())

log.warn("WARNING! " + dir + " not exists! Config not loaded!");

else

parseFiles(files.listFiles());

}

public static void reload()

{

synchronized(properties)

{

synchronized(questRewardRates)

{

synchronized(questDropRates)

{

properties = new ConcurrentHashMap();

questRewardRates = new ConcurrentHashMap();

questDropRates = new ConcurrentHashMap();

load();

}

}

}

}

private static void parseFiles(File[] files)

{

for (File f : files)

{

if (f.isHidden())

continue;

if (f.isDirectory() && !f.getName().contains("defaults"))

parseFiles(f.listFiles());

if (f.getName().startsWith("quest_reward_rates"))

{

try

{

InputStream is = new FileInputStream(f);

Properties p = new Properties();

p.load(is);

loadQuestRewardRates(p);

}

catch (FileNotFoundException e)

{

e.printStackTrace();

}

catch (IOException e)

{

e.printStackTrace();

}

}

else if (f.getName().startsWith("quest_drop_rates"))

{

try

{

InputStream is = new FileInputStream(f);

Properties p = new Properties();

p.load(is);

loadQuestDropRates(p);

}

catch (FileNotFoundException e)

{

e.printStackTrace();

}

catch (IOException e)

{

e.printStackTrace();

}

}

else if (f.getName().endsWith(".ini"))

{

try

{

InputStream is = new FileInputStream(f);

Properties p = new Properties();

p.load(is);

loadProperties(p);

}

catch (FileNotFoundException e)

{

e.printStackTrace();

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

}

private static void loadQuestRewardRates(Properties p)

{

for (String name : p.stringPropertyNames())

{

int id;

try

{

id = Integer.parseInt(name);

}

catch (NumberFormatException nfe)

{

continue;

}

if(questRewardRates.get(id) != null)

{

questRewardRates.replace(id, Double.parseDouble(p.getProperty(name).trim()));

log.info("Duplicate quest id \"" + name + "\"");

}

else if (p.getProperty(name) == null)

log.info("Null property for quest id " + name);

else

questRewardRates.put(id, Double.parseDouble(p.getProperty(name).trim()));

}

p.clear();

}

private static void loadQuestDropRates(Properties p)

{

for (String name : p.stringPropertyNames())

{

int id;

try

{

id = Integer.parseInt(name);

} catch (NumberFormatException nfe)

{

continue;

}

if (questDropRates.get(id) != null)

{

questDropRates.replace(id, Double.parseDouble(p.getProperty(name).trim()));

log.info("Duplicate quest id \"" + name + "\"");

}

else if (p.getProperty(name) == null)

log.info("Null property for quest id " + name);

else

questDropRates.put(id, Double.parseDouble(p.getProperty(name).trim()));

}

p.clear();

}

private static void loadProperties(Properties p)

{

for (String name : p.stringPropertyNames())

{

if (properties.get(name) != null)

{

properties.replace(name, p.getProperty(name).trim());

log.info("Duplicate properties name \"" + name + "\" replaced with new value.");

}

else if (p.getProperty(name) == null)

log.info("Null property for key " + name);

else

properties.put(name, p.getProperty(name).trim());

}

p.clear();

}

public static double getQuestRewardRates(Quest q)

{

return questRewardRates.containsKey(q.getQuestIntId()) ? questRewardRates.get(q.getQuestIntId()) : 1.0;

}

public static double getQuestDropRates(Quest q)

{

return questDropRates.containsKey(q.getQuestIntId()) ? questDropRates.get(q.getQuestIntId()) : 1.0;

}

public static String get(String name)

{

if(properties.get(name) == null)

log.warn("ConfigSystem: Null value for key: " + name);

return properties.get(name);

}

public static float getFloat(String name)

{

return getFloat(name, Float.MAX_VALUE);

}

public static boolean getBoolean(String name)

{

return getBoolean(name, false);

}

public static int getInt(String name)

{

return getInt(name, Integer.MAX_VALUE);

}

public static int[] getIntArray(String name)

{

return getIntArray(name, new int[0]);

}

public static int getIntHex(String name)

{

return getIntHex(name, Integer.decode("0xFFFFFF"));

}

public static byte getByte(String name)

{

return getByte(name, Byte.MAX_VALUE);

}

public static long getLong(String name)

{

return getLong(name, Long.MAX_VALUE);

}

public static double getDouble(String name)

{

return getDouble(name, Double.MAX_VALUE);

}

public static String get(String name, String def)

{

return get(name) == null ? def : get(name);

}

public static float getFloat(String name, float def)

{

return Float.parseFloat(get(name, String.valueOf(def)));

}

public static boolean getBoolean(String name, boolean def)

{

return Boolean.parseBoolean(get(name, String.valueOf(def)));

}

public static int getInt(String name, int def)

{

return Integer.parseInt(get(name, String.valueOf(def)));

}

public static int[] getIntArray(String name, int[] def)

{

return get(name, null) == null ? def : Util.parseCommaSeparatedIntegerArray(get(name, null));

}

public static int getIntHex(String name, int def)

{

if(!get(name, String.valueOf(def)).trim().startsWith("0x"))

return Integer.decode("0x"+get(name, String.valueOf(def)));

else

return Integer.decode(get(name, String.valueOf(def)));

}

public static byte getByte(String name, byte def)

{

return Byte.parseByte(get(name, String.valueOf(def)));

}

public static double getDouble(String name, double def)

{

return Double.parseDouble(get(name, String.valueOf(def)));

}

public static long getLong(String name, long def)

{

return Long.parseLong(get(name, String.valueOf(def)));

}

public static void set(String name, String param)

{

properties.replace(name, param);

}

public static void set(String name, Object obj)

{

set(name, String.valueOf(obj));

}

public static TIntIntHashMap SKILL_DURATION_LIST;

public static TIntIntHashMap SKILL_REUSE_LIST;

public static void loadSkillDurationList()

{

if(getBoolean("EnableModifySkillDuration"))

{

String[] propertySplit = get("SkillDurationList").split(";");

SKILL_DURATION_LIST = new TIntIntHashMap(propertySplit.length);

for (String skill : propertySplit)

{

String[] skillSplit = skill.split(",");

if(skillSplit.length != 2)

log.warn(concat("[SkillDurationList]: invalid config property -> SkillDurationList \"", skill, "\""));

else

{

try

{

SKILL_DURATION_LIST.put(Integer.parseInt(skillSpli t[0]), Integer.parseInt(skillSplit[1]));

}

catch (NumberFormatException nfe)

{

if (!skill.isEmpty())

{

log.warn(concat("[SkillDurationList]: invalid config property -> SkillList \"", skillSplit[0], "\"", skillSplit[1]));

}

}

}

}

}

}

public static void loadSkillReuseList()

{

if(getBoolean("EnableModifySkillReuse"))

{

String[] propertySplit = get("SkillReuseList").split(";");

SKILL_REUSE_LIST = new TIntIntHashMap(propertySplit.length);

for (String skill : propertySplit)

{

String[] skillSplit = skill.split(",");

if (skillSplit.length != 2)

log.warn(concat("[SkillReuseList]: invalid config property -> SkillReuseList \"", skill, "\""));

else

{

try

{

SKILL_REUSE_LIST.put(Integer.valueOf(skillSplit[0]), Integer.valueOf(skillSplit[1]));

}

catch (NumberFormatException nfe)

{

if (!skill.isEmpty())

log.warn(concat("[SkillReuseList]: invalid config property -> SkillList \"", skillSplit[0], "\"", skillSplit[1]));

}

}

}

}

}

public static String concat(final String... strings)

{

final StringBuilder sbString = new StringBuilder(getLength(strings));

for (final String string : strings)

{

sbString.append(string);

}

return sbString.toString();

}

private static int getLength(final String[] strings)

{

int length = 0;

for (final String string : strings)

{

length += string.length();

}

return length;

}

}

Госпади, а зачем он ещё впиливал ScriptConfig. Одно другого хуже не разобрался как наверное реализовать по нормальному решил впилить шлак. Гавнокод в работе.

Цитата:

Сообщение от Спойлер

package core.gameserver.utils;

import core.gameserver.Config;

import core.gameserver.model.items.ItemInstance;

import core.gameserver.model.Player;

import core.gameserver.network.l2.s2c.InventoryUpdate;

public class FixEnchantOlympiad

{

public static void storeEnchantItemsOly(Player player)

{

ItemInstance[] arr = player.getInventory().getItems();

int len = arr.length;

StringBuilder items = new StringBuilder();

for (int i = 0; i Config.OLY_ENCHANT_LIMIT_WEAPON)

|| (item.isArmor() && item.getEnchantLevel() > Config.OLY_ENCHANT_LIMIT_ARMOR)

|| (item.isAccessory() && item.getEnchantLevel() > Config.OLY_ENCHANT_LIMIT_JEWEL))

return true;

return false;

}

public static void restoreEnchantItemsOly(Player player)

{

if(player.getVar("EnItemOlyRec") == null)

return;

String var;

var = player.getVar("EnItemOlyRec");

if(var != null)

{

String[] items = var.split(":");

for(String item : items)

{

if(item.equals(""))

continue;

String[] values = item.split(";");

if(values.length 0) // если он существует

{

if (last_modif >= lastModified(name)) // и новее оригинального файла

return Strings.bbParse(read(tmp)); // то вернуть локализованный

_log.warn("Last modify of " + name + " more then " + tmp); // если он существует но устарел - выругаться в лог

}

return Strings.bbParse(read(name)); // если локализованный файл отсутствует вернуть оригинальный

}

public static String langFileName(String name, String lang) {

if (lang == null || lang.equalsIgnoreCase("en"))

lang = "";

String tmp;

tmp = name.replaceAll("(.(\\.htm)", "$1-" + lang + "$2");

if (!tmp.equals(name) && lastModified(tmp) > 0)

return tmp;

tmp = name.replaceAll("(.(/[^/].+\\.htm)", "$1/" + lang + "$2");

if (!tmp.equals(name) && lastModified(tmp) > 0)

return tmp;

tmp = name.replaceAll("(.+?/html)/", "$1-" + lang + "/");

if (!tmp.equals(name) && lastModified(tmp) > 0)

return tmp;

if (lastModified(name) > 0)

return name;

return null;

}

public static long lastModified(String name) {

if (name == null)

return 0;

return new File(name).lastModified();

}

}

Госпади упаси от этого бреда. GameStats.java аналогично

А вот дальше пойдёт полная жопа.

Цитата:

Сообщение от Спойлер

package core.gameserver.utils;

import java.util.Arrays;

import java.util.Collection;

import java.util.ConcurrentModificationException;

import java.util.Iterator;

import java.util.NoSuchElementException;

import core.commons.util.Rnd;

/**

* Полный аналог ArrayList, но намного быстрее удаляет.

* Вместо сдвига всего массива перемещает последний элемент списка на место удаленного.

* Побочный эффект - размер массива при удалении элемента не меняется, но можно использовать clear.


*

* Базовая версия.

*

* @see core.Util.GCArray - конкуррентнобезопасная версия

* @see core.Util.GSArray - синхронизированная версия

* @see core.Util.GCSArray - конкуррентнобезопасная синхронизированная версия

*/

public class GArray implements Collection

{

protected transient E[] elementData;

protected transient int modCount = 0;

protected int size;

@SuppressWarnings("unchecked")

public GArray(int initialCapacity)

{

if(initialCapacity oldCapacity)

{

int newCapacity = oldCapacity * 3 / 2 + 1;

if(newCapacity T[] toArray(T[] a)

{

if(a.length size)

a[size] = null;

return a;

}

public E get(int index)

{

RangeCheck(index);

return elementData[index];

}

@SuppressWarnings("unchecked")

public boolean add(E e)

{

ensureCapacity(size + 1);

elementData[size++] = e;

return true;

}

public E getRandomize()

{

if (isEmpty())

return null;

int index = Rnd.get(size);

RangeCheck(index);

return elementData[index];

}

public boolean remove(Object o)

{

if(o == null)

{

for(int index = 0; index 0 ? remove(0) : null;

}

public E removeLast()

{

if(size > 0)

{

modCount++;

size--;

E old = elementData[size];

elementData[size] = null;

return old;

}

return null;

}

public E set(int index, E element)

{

RangeCheck(index);

E oldValue = elementData[index];

elementData[index] = element;

return oldValue;

}

public int indexOf(Object o)

{

if(o == null)

{

for(int i = 0; i c)

{

if(c == null)

return false;

boolean modified = false;

Iterator e = c.iterator();

while(e.hasNext())

if(add(e.next()))

modified = true;

return modified;

}

public boolean removeAll(Collection c)

{

boolean modified = false;

for(int i = 0; i c)

{

boolean modified = false;

for(int i = 0; i c)

{

for(int i = 0; i = size)

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);

}

@SuppressWarnings("unchecked")

public void clear()

{

modCount++;

int oldSize = size;

size = 0;

if(oldSize > 1000)

elementData = (E[]) new Object[10];

else

for(int i = 0; i iterator()

{

return new Itr();

}

private class Itr implements Iterator

{

int cursor = 0;

int lastRet = -1;

int expectedModCount = modCount;

public boolean hasNext()

{

return cursor ";

}

@SuppressWarnings("unchecked")

public void sort()

{

Object tmp[] = toArray();

Arrays.sort(tmp);

elementData = (E[]) tmp;

}

public boolean addIfNotContains(E e)

{

if (contains(e))

return false;

return add(e);

}

}[/I]

Цитата:

Сообщение от Спойлер

package core.gameserver.utils;

import java.util.Arrays;

import java.util.Collection;

import java.util.Iterator;

import java.util.NoSuchElementException;

/**

* Аналог ArrayList, ArrayList, но намного быстрее удаляет.

* Вместо сдвига всего массива перемещает последний элемент списка на место удаленного.

* Побочный эффект - размер массива при удалении элемента не меняется, но можно использовать clear.


*

* Конкуррентнобезопасная версия, для итерации создается копия списка.

* Метод remove для итератора не работает и возвращает IllegalStateException.

*

* @see core.Util.GArray - базовая версия

* @see core.Util.GSArray - синхронизированная версия

* @see core.Util.GCSArray - конкуррентнобезопасная синхронизированная версия

*/

public class GCArray implements Collection

{

private transient E[] elementData;

private int size;

@SuppressWarnings("unchecked")

public GCArray(int initialCapacity)

{

super();

if(initialCapacity oldCapacity)

{

int newCapacity = oldCapacity * 3 / 2 + 1;

if(newCapacity T[] toArray(T[] a)

{

if(a.length size)

a[size] = null;

return a;

}

public E get(int index)

{

RangeCheck(index);

return elementData[index];

}

public boolean add(E e)

{

ensureCapacity(size + 1);

elementData[size++] = e;

return true;

}

public boolean remove(Object o)

{

if(o == null)

{

for(int index = 0; index c)

{

boolean modified = false;

Iterator e = c.iterator();

while(e.hasNext())

if(add(e.next()))

modified = true;

return modified;

}

public boolean removeAll(Collection c)

{

boolean modified = false;

for(int i = 0; i c)

{

boolean modified = false;

for(int i = 0; i c)

{

for(int i = 0; i = size)

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);

}

@SuppressWarnings("unchecked")

public void clear()

{

int oldSize = size;

size = 0;

if(oldSize > 1000)

elementData = (E[]) new Object[10];

else

for(int i = 0; i iterator()

{

return new Itr();

}

private class Itr implements Iterator

{

E[] data = toNativeArray();

int size = data.length;

int cursor = 0;

public boolean hasNext()

{

return cursor != size;

}

public E next()

{

try

{

return data[cursor++];

}

catch(IndexOutOfBoundsException e)

{

throw new NoSuchElementException();

}

}

/**

* НЕ РАБОТАЕТ!

*/

public void remove()

{

throw new IllegalStateException();

}

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.utils;

import java.util.Arrays;

import java.util.Collection;

import java.util.Iterator;

import java.util.NoSuchElementException;

/**

* Аналог ArrayList, но намного быстрее удаляет.

* Вместо сдвига всего массива перемещает последний элемент списка на место удаленного.

* Побочный эффект - размер массива при удалении элемента не меняется, но можно использовать clear.

*

* Конкуррентнобезопасная синхронизированная версия, для итерации создается копия списка.

* Метод remove для итератора не работает и возвращает IllegalStateException.

*

* @see core.Util.GArray - базовая версия

* @see core.Util.GCArray - конкуррентнобезопасная версия

* @see core.Util.GSArray - синхронизированная версия

*/

public class GCSArray implements Collection

{

private transient E[] elementData;

private int size;

@SuppressWarnings("unchecked")

public GCSArray(int initialCapacity)

{

super();

if(initialCapacity oldCapacity)

{

int newCapacity = oldCapacity * 3 / 2 + 1;

if(newCapacity T[] toArray(T[] a)

{

if(a.length size)

a[size] = null;

return a;

}

public synchronized E get(int index)

{

RangeCheck(index);

return elementData[index];

}

public synchronized boolean add(E e)

{

ensureCapacity(size + 1);

elementData[size++] = e;

return true;

}

public synchronized boolean remove(Object o)

{

if(o == null)

{

for(int index = 0; index c)

{

boolean modified = false;

Iterator e = c.iterator();

while(e.hasNext())

if(add(e.next()))

modified = true;

return modified;

}

public synchronized boolean removeAll(Collection c)

{

boolean modified = false;

for(int i = 0; i c)

{

boolean modified = false;

for(int i = 0; i c)

{

for(int i = 0; i = size)

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);

}

@SuppressWarnings("unchecked")

public synchronized void clear()

{

int oldSize = size;

size = 0;

if(oldSize > 1000)

elementData = (E[]) new Object[10];

else

for(int i = 0; i iterator()

{

return new Itr();

}

private class Itr implements Iterator

{

E[] data = toNativeArray();

int size = data.length;

int cursor = 0;

public boolean hasNext()

{

return cursor != size;

}

public E next()

{

try

{

return data[cursor++];

}

catch(IndexOutOfBoundsException e)

{

throw new NoSuchElementException();

}

}

/**

* НЕ РАБОТАЕТ!

*/

public void remove()

{

throw new IllegalStateException();

}

}

}

Цитата:

Сообщение от Спойлер

package core.gameserver.utils;

import java.util.Arrays;

import java.util.Collection;

import java.util.ConcurrentModificationException;

import java.util.Iterator;

import java.util.NoSuchElementException;

/**

* Аналог ArrayList, но намного быстрее удаляет.

* Вместо сдвига всего массива перемещает последний элемент списка на место удаленного.

* Побочный эффект - размер массива при удалении элемента не меняется, но можно использовать clear.


*

* Синхронизированная версия.

*

* @see core.Util.GArray - базовая версия

* @see core.Util.GCArray - конкуррентнобезопасная версия

* @see core.Util.GCSArray - конкуррентнобезопасная синхронизированная версия

*/

public class GSArray implements Collection

{

private transient E[] elementData;

private transient int modCount = 0;

private int size;

@SuppressWarnings("unchecked")

public GSArray(int initialCapacity)

{

super();

if(initialCapacity oldCapacity)

{

int newCapacity = oldCapacity * 3 / 2 + 1;

if(newCapacity T[] toArray(T[] a)

{

if(a.length size)

a[size] = null;

return a;

}

public synchronized E get(int index)

{

RangeCheck(index);

return elementData[index];

}

public synchronized boolean add(E e)

{

ensureCapacity(size + 1);

elementData[size++] = e;

return true;

}

public synchronized boolean remove(Object o)

{

if(o == null)

{

for(int index = 0; index c)

{

boolean modified = false;

Iterator e = c.iterator();

while(e.hasNext())

if(add(e.next()))

modified = true;

return modified;

}

public synchronized boolean removeAll(Collection c)

{

boolean modified = false;

for(int i = 0; i c)

{

boolean modified = false;

for(int i = 0; i c)

{

for(int i = 0; i = size)

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);

}

@SuppressWarnings("unchecked")

public synchronized void clear()

{

modCount++;

int oldSize = size;

size = 0;

if(oldSize > 1000)

elementData = (E[]) new Object[10];

else

for(int i = 0; i iterator()

{

return new Itr();

}

private class Itr implements Iterator

{

int cursor = 0;

int lastRet = -1;

int expectedModCount = modCount;

public boolean hasNext()

{

return cursor != size();

}

public E next()

{

checkForComodification();

try

{

E next = get(cursor);

lastRet = cursor++;

return next;

}

catch(IndexOutOfBoundsException e)

{

checkForComodification();

throw new NoSuchElementException();

}

}

public void remove()

{

if(lastRet == -1)

throw new IllegalStateException();

checkForComodification();

try

{

GSArray.this.remove(lastRet);

if(lastRet banned_hwids = new GArray();

private static final GSArray>> bonus_hwids = new GSArray>>();

public static final HWIDComparator DefaultComparator = new HWIDComparator();

public static final HWIDComparator BAN_Comparator = new HWIDComparator();

public static final String SELECT_HWID = "SELECT HWID FROM " + GGConfig.HWID_BANS_TABLE;

public static final String REPLACE_HWID = "REPLACE INTO " + GGConfig.HWID_BANS_TABLE + " (hwid,comments) VALUES (?,?)";

public static final String DELETE_HWID = "DELETE FROM " + GGConfig.HWID_BANS_TABLE + " WHERE hwid=?";

public static void reloadBannedHWIDs()

{

synchronized (banned_hwids)

{

banned_hwids.clear();

}

Connection con = null;

PreparedStatement st = null;

ResultSet rs = null;

try

{

con = DatabaseFactory.getInstance().getConnection();

st = con.prepareStatement(SELECT_HWID);

rs = st.executeQuery();

synchronized (banned_hwids)

{

while (rs.next())

banned_hwids.add(new HardwareID(rs.getString("HWID")));

}

_log.info("Protection: Loaded " + banned_hwids.size() + " banned HWIDs");

}

catch(final Exception e)

{

_log.warn("Protection: Failed to load banned HWIDs", e);

}

finally

{

DbUtils.closeQuietly(con, st, rs);

}

}

public static boolean checkHWIDBanned(final HardwareID hwid)

{

synchronized (banned_hwids)

{

return hwid != null && BAN_Comparator.contains(hwid, banned_hwids);

}

}

public static String handleBanHWID(final String[] argv)

{

if(!GGConfig.ALLOW_GUARD_SYSTEM || !GGConfig.PROTECT_GS_ENABLE_HWID_BANS)

return "HWID bans feature disabled";

if(argv == null || argv.length 3)

{

for(int i = 3; i getPlayersByHWID(final HardwareID hwid)

{

final GArray result = new GArray();

if(hwid != null)

for(final Player cha : GameObjectsStorage.getAllPlayers())

if(!cha.isInOfflineMode() && cha.getNetConnection() != null && cha.getNetConnection().protect_used && hwid.equals(cha.getHWID()))

result.add(cha);

return result;

}

/**

* Возвращает список всех HWID, кторые попадают под условия компаратора.

*/

public static GArray>> getAllMatches(final HardwareID hwid, final HWIDComparator comparator)

{

final GArray>> ret = new GArray>>();

synchronized (bonus_hwids)

{

for(final Entry> entry : bonus_hwids)

if(comparator.compare(entry.getKey(), hwid) == HWIDComparator.EQUALS)

ret.add(entry);

}

return ret;

}

public static class HardwareID

{

public final String Full;

public HardwareID(final String s)

{

Full = s;

}

@Override

public int hashCode()

{

return Full.hashCode();

}

@Override

public boolean equals(final Object obj)

{

if(obj == null || !(obj instanceof HardwareID))

return false;

return DefaultComparator.compare(this, (HardwareID) obj) == HWIDComparator.EQUALS;

}

@Override

public String toString()

{

return String.format("%s", Full);

}

}

public static class HWIDComparator implements Comparator

{

public static final int EQUALS = 0;

public static final int NOT_EQUALS = 1;

public HWIDComparator()

{}

@Override

public int compare(final HardwareID o1, final HardwareID o2)

{

if(o1 == null || o2 == null)

return o1 == o2 ? EQUALS : NOT_EQUALS;

return EQUALS;

}

public int find(final HardwareID hwid, final List in)

{

for(int i = 0; i in)

{

return find(hwid, in) != -1;

}

public boolean remove(final HardwareID hwid, final List in)

{

final int i = find(hwid, in);

return i == -1 ? false : in.remove(i) != null;

}

public int find(final HardwareID hwid, final GArray in)

{

for(int i = 0; i in)

{

return find(hwid, in) != -1;

}

public boolean remove(final HardwareID hwid, final GArray in)

{

final int i = find(hwid, in);

return i == -1 ? false : in.remove(i) != null;

}

@Override

public String toString()

{

return "HWIDComparator";

}

}

private static final class Entry implements Map.Entry

{

private final K _key;

private V _value;

public Entry(final K key, final V value)

{

_key = key;

_value = value;

}

@Override

public K getKey()

{

return _key;

}

@Override

public V getValue()

{

return _value;

}

@Override

public V setValue(final V value)

{

return _value = value;

}

}

}


kick 07.08.2015 12:48

ItemFunctions.java приведу маленькие вырезки из кода:

[QUOTE="Спойлер"]
[COLOR="#363940"]
public final static boolean isClanApellaItem(int itemId)

{

return itemId >= 7860 && itemId = 9830 && itemId = 7850 && itemId = 8723 && itemId = 9573 && itemId = 10483 && itemId = 14166 && itemId = 16160 && itemId = 12754 && itemId = 12840 && itemId

kick 07.08.2015 12:51

Приведу в пример ItemTemplate ещё:

[QUOTE="Спойлер"]
[COLOR="#363940"]
/** Item ID для замковых корон */

public static final int[] ITEM_ID_CASTLE_CIRCLET = { 0, // no castle - no circlet..

6838, // Circlet of Gludio

6835, // Circlet of Dion

6839, // Circlet of Giran

6837, // Circlet of Oren

6840, // Circlet of Aden

6834, // Circlet of Innadril

6836, // Circlet of Goddard

8182, // Circlet of Rune

8183, // Circlet of Schuttgart

};

public static final int[] ITEM_ID_FORMAL_WEAR = { 80026, // Steel Costume

80002, // Vampire Hunter Costume

80003, // Camouflage Suit

80004, // Maids Costume

80005, // Shadows Costume

80006, // Wanderer Costume

80007, // Chinese Dress A

80008, // Chinese Dress B

80009, // Chinese Dress C

80010, // Chinese Dress D

80001, // Christmas Wear

6408, // Wedding Wear

80011, // Swimwear A

80012, // Swimwear B

80013, // Swimwear C

80014, // Swimwear D

80015, // Swimwear E

80016, // Swimwear F

80017, // Underwear Tattoos A

80018, // Underwear Tattoos B

80019, // Underwear Tattoos C

};

/**

* Является ли вещь аденой или камнем печати

*/

public boolean isAdena()

{

return _itemId == 57 || _itemId == 6360 || _itemId == 6361 || _itemId == 6362;

}

public boolean isLifeStone()

{

return (_itemId >= 8723 && _itemId = 9573 && _itemId = 10483 && _itemId = 12754 && _itemId = 12840 && _itemId = 14166 && _itemId = 16160 && _itemId = 6569 && _itemId = 17255 && _itemId = 22314 && _itemId = 949 && _itemId = 729 && _itemId = 10549 && _itemId = 12768 && _itemId = 14170 && _itemId = 17034 && _itemId = 12811 && _itemId = 13078 || _itemId == 10119;

}

public boolean isTerritoryAccessory()

{

return _itemId >= 13740 && _itemId = 14592 && _itemId = 14664 && _itemId = 14801 && _itemId = 15282 && _itemId = 9625 && _itemId = 9546 && _itemId = 9552 && _itemId = 9558 && _itemId = 9564 && _itemId = 6611 && _itemId = 9388 && _itemId

kick 07.08.2015 12:54

Давайте теперь мы посмотрим предметы и реализацию распаковок:

[QUOTE="Спойлер"]
[COLOR="#363940"]
package handler.items;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.lang3.ArrayUtils;

import core.commons.util.Rnd;

import core.gameserver.handler.items.IItemHandler;

import core.gameserver.handler.items.ItemHandler;

import core.gameserver.cache.Msg;

import core.gameserver.model.Playable;

import core.gameserver.model.Player;

import core.gameserver.model.items.ItemInstance;

import core.gameserver.network.l2.s2c.SystemMessage;

import core.gameserver.scripts.Functions;

import core.gameserver.scripts.ScriptFile;

//TODO [G1ta0] вынести в датапак

public class Extractable extends SimpleItemHandler implements ScriptFile

{

private static final int[] ITEM_IDS = new int[]{8534,

9171,

9172,

9173,

9174,

9175,

9176,

8535,

8536,

8537,

8538,

8539,

8540,

5916,

5944,

14841,

5955,

14847,

5966,

5967,

5968,

5969,

6007,

6008,

6009,

6010,

7725,

7637,

7636,

7629,

7630,

7631,

7632,

7633,

7634,

7635,

10408,

10473,

9599,

20069,

20070,

20071,

20072,

20073,

20074,

20210,

20211,

20215,

20216,

20217,

20218,

20219,

20220,

20227,

20228,

20229,

20233,

20234,

20235,

20239,

20240,

20241,

20242,

20243,

20244,

20251,

20254,

20278,

20279,

20041,

20042,

20043,

20044,

20035,

20036,

20037,

20038,

20039,

20040,

20060,

20061,

22000,

22001,

22002,

22003,

22004,

22005,

20326,

20327,

20329,

20330,

20059,

20494,

20493,

20395,

13281,

13282,

13283,

13284,

13285,

13286,

13287,

13288,

13289,

13290,

14267,

14268,

14269,

13280,

22087,

22088,

13713,

13714,

13715,

13716,

13717,

13718,

13719,

13720,

13721,

14549,

14550,

14551,

14552,

14553,

14554,

14555,

14556,

14557,

13695,

13696,

13697,

13698,

13699,

13700,

13701,

13702,

13703,

14531,

14532,

14533,

14534,

14535,

14536,

14537,

14538,

14539,

13704,

13705,

13706,

13707,

13708,

13709,

13710,

13711,

13712,

14540,

14541,

14542,

14543,

14544,

14545,

14546,

14547,

14548,

14884,

14885,

14886,

14887,

14888,

14889,

14890,

14891,

14892,

14893,

14894,

14895,

14896,

14897,

14898,

14899,

14900,

14901,

14616,

20575,

20804,

20807,

20805,

20808,

20806,

20809,

20842,

20843,

20844,

20845,

20846,

20847,

20848,

20849,

20850,

20851,

20852,

20853,

20854,

20855,

20856,

20857,

20858,

20859,

20860,

20861,

20862,

20863,

20864,

20811,

20812,

20813,

20814,

20815,

20816,

20817,

20810,

20865,

20748,

20749,

20750,

20751,

20752,

20195,

20196,

20197,

20198,

13777,

13778,

13779,

13780,

13781,

13782,

13783,

13784,

13785,

13786,

14849,

14834,

14833,

13988,

13989,

13003,

13004,

13005,

13006,

13007,

13990,

13991,

13992,

14850,

14713,

14714,

14715,

14716,

14717,

14718,

17138,

15482,

15483,

13270,

13271,

13272,

14231,

14232,

21747,

21748,

21749,

17169,

21169,

21753,

21752,

17069,

20515,

20516,

20081,

22310,

22311,

17073,

22203,

22340,

22339,

20635,

20636,

20637,

20638,

21092,

21091,

43214,

43215};

@Override

public boolean pickupItem(Playable playable, ItemInstance item)

{

return true;

}

@Override

public void onLoad()

{

ItemHandler.getInstance().registerItemHandler(this );

}

@Override

public void onReload()

{

}

@Override

public void onShutdown()

{

}

@Override

public int[] getItemIds()

{

return ITEM_IDS;

}

@Override

protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)

{

int itemId = item.getItemId();

if(!canBeExtracted(player, item))

return false;

if(!useItem(player, item, 1))

return false;

switch(itemId)

{

case 8534:

use8534(player, ctrl);

break;

case 8535:

use8535(player, ctrl);

break;

case 8536:

use8536(player, ctrl);

break;

case 8537:

use8537(player, ctrl);

break;

case 8538:

use8538(player, ctrl);

break;

case 8539:

use8539(player, ctrl);

break;

case 8540:

use8540(player, ctrl);

break;

case 5916:

use5916(player, ctrl);

break;

case 5944:

use5944(player, ctrl);

break;

case 14841:

use14841(player, ctrl);

break;

case 5955:

use5955(player, ctrl);

break;

case 14847:

use14847(player, ctrl);

break;

case 5966:

use5966(player, ctrl);

break;

case 5967:

use5967(player, ctrl);

break;

case 5968:

use5968(player, ctrl);

break;

case 5969:

use5969(player, ctrl);

break;

case 6007:

use6007(player, ctrl);

break;

case 6008:

use6008(player, ctrl);

break;

case 6009:

use6009(player, ctrl);

break;

case 6010:

use6010(player, ctrl);

break;

case 7725:

use7725(player, ctrl);

break;

case 7637:

use7637(player, ctrl);

break;

case 7636:

use7636(player, ctrl);

break;

case 7629:

use7629(player, ctrl);

break;

case 7630:

use7630(player, ctrl);

break;

case 7631:

use7631(player, ctrl);

break;

case 7632:

use7632(player, ctrl);

break;

case 7633:

use7633(player, ctrl);

break;

case 7634:

use7634(player, ctrl);

break;

case 7635:

use7635(player, ctrl);

break;

case 10408:

use10408(player, ctrl);

break;

case 10473:

use10473(player, ctrl);

break;

case 9599:

use9599(player, ctrl);

break;

case 20069:

use20069(player, ctrl);

break;

case 20070:

use20070(player, ctrl);

break;

case 20071:

use20071(player, ctrl);

break;

case 20072:

use20072(player, ctrl);

break;

case 20073:

use20073(player, ctrl);

break;

case 20074:

use20074(player, ctrl);

break;

case 20210:

use20210(player, ctrl);

break;

case 20211:

use20211(player, ctrl);

break;

case 20215:

use20215(player, ctrl);

break;

case 20216:

use20216(player, ctrl);

break;

case 20217:

use20217(player, ctrl);

break;

case 20218:

use20218(player, ctrl);

break;

case 20219:

use20219(player, ctrl);

break;

case 20220:

use20220(player, ctrl);

break;

case 20227:

use20227(player, ctrl);

break;

case 20228:

use20228(player, ctrl);

break;

case 20229:

use20229(player, ctrl);

break;

case 20233:

use20233(player, ctrl);

break;

case 20234:

use20234(player, ctrl);

break;

case 20235:

use20235(player, ctrl);

break;

case 20239:

use20239(player, ctrl);

break;

case 20240:

use20240(player, ctrl);

break;

case 20241:

use20241(player, ctrl);

break;

case 20242:

use20242(player, ctrl);

break;

case 20243:

use20243(player, ctrl);

break;

case 20244:

use20244(player, ctrl);

break;

case 20251:

use20251(player, ctrl);

break;

case 20254:

use20254(player, ctrl);

break;

case 20278:

use20278(player, ctrl);

break;

case 20279:

use20279(player, ctrl);

break;

case 20041:

use20041(player, ctrl);

break;

case 20042:

use20042(player, ctrl);

break;

case 20043:

use20043(player, ctrl);

break;

case 20044:

use20044(player, ctrl);

break;

case 20035:

use20035(player, ctrl);

break;

case 20036:

use20036(player, ctrl);

break;

case 20037:

use20037(player, ctrl);

break;

case 20038:

use20038(player, ctrl);

break;

case 20039:

use20039(player, ctrl);

break;

case 20040:

use20040(player, ctrl);

break;

case 20060:

use20060(player, ctrl);

break;

case 20061:

use20061(player, ctrl);

break;

case 22000:

use22000(player, ctrl);

break;

case 22001:

use22001(player, ctrl);

break;

case 22002:

use22002(player, ctrl);

break;

case 22003:

use22003(player, ctrl);

break;

case 22004:

use22004(player, ctrl);

break;

case 22005:

use22005(player, ctrl);

break;

case 20326:

use20326(player, ctrl);

break;

case 20327:

use20327(player, ctrl);

break;

case 20329:

use20329(player, ctrl);

break;

case 20330:

use20330(player, ctrl);

break;

case 20059:

use20059(player, ctrl);

break;

case 20494:

use20494(player, ctrl);

break;

case 20493:

use20493(player, ctrl);

break;

case 20395:

use20395(player, ctrl);

break;

case 13281:

use13281(player, ctrl);

break;

case 13282:

use13282(player, ctrl);

break;

case 13283:

use13283(player, ctrl);

break;

case 13284:

use13284(player, ctrl);

break;

case 13285:

use13285(player, ctrl);

break;

case 13286:

use13286(player, ctrl);

break;

case 13287:

use13287(player, ctrl);

break;

case 13288:

use13288(player, ctrl);

break;

case 13289:

use13289(player, ctrl);

break;

case 13290:

use13290(player, ctrl);

break;

case 14267:

use14267(player, ctrl);

break;

case 14268:

use14268(player, ctrl);

break;

case 14269:

use14269(player, ctrl);

break;

case 13280:

use13280(player, ctrl);

break;

case 22087:

use22087(player, ctrl);

break;

case 22088:

use22088(player, ctrl);

break;

case 13713:

use13713(player, ctrl);

break;

case 13714:

use13714(player, ctrl);

break;

case 13715:

use13715(player, ctrl);

break;

case 13716:

use13716(player, ctrl);

break;

case 13717:

use13717(player, ctrl);

break;

case 13718:

use13718(player, ctrl);

break;

case 13719:

use13719(player, ctrl);

break;

case 13720:

use13720(player, ctrl);

break;

case 13721:

use13721(player, ctrl);

break;

case 14549:

use14549(player, ctrl);

break;

case 14550:

use14550(player, ctrl);

break;

case 14551:

use14551(player, ctrl);

break;

case 14552:

use14552(player, ctrl);

break;

case 14553:

use14553(player, ctrl);

break;

case 14554:

use14554(player, ctrl);

break;

case 14555:

use14555(player, ctrl);

break;

case 14556:

use14556(player, ctrl);

break;

case 14557:

use14557(player, ctrl);

break;

case 13695:

use13695(player, ctrl);

break;

case 13696:

use13696(player, ctrl);

break;

case 13697:

use13697(player, ctrl);

break;

case 13698:

use13698(player, ctrl);

break;

case 13699:

use13699(player, ctrl);

break;

case 13700:

use13700(player, ctrl);

break;

case 13701:

use13701(player, ctrl);

break;

case 13702:

use13702(player, ctrl);

break;

case 13703:

use13703(player, ctrl);

break;

case 14531:

use14531(player, ctrl);

break;

case 14532:

use14532(player, ctrl);

break;

case 14533:

use14533(player, ctrl);

break;

case 14534:

use14534(player, ctrl);

break;

case 14535:

use14535(player, ctrl);

break;

case 14536:

use14536(player, ctrl);

break;

case 14537:

use14537(player, ctrl);

break;

case 14538:

use14538(player, ctrl);

break;

case 14539:

use14539(player, ctrl);

break;

case 13704:

use13704(player, ctrl);

break;

case 13705:

use13705(player, ctrl);

break;

case 13706:

use13706(player, ctrl);

break;

case 13707:

use13707(player, ctrl);

break;

case 13708:

use13708(player, ctrl);

break;

case 13709:

use13709(player, ctrl);

break;

case 13710:

use13710(player, ctrl);

break;

case 13711:

use13711(player, ctrl);

break;

case 13712:

use13712(player, ctrl);

break;

case 14540:

use14540(player, ctrl);

break;

case 14541:

use14541(player, ctrl);

break;

case 14542:

use14542(player, ctrl);

break;

case 14543:

use14543(player, ctrl);

break;

case 14544:

use14544(player, ctrl);

break;

case 14545:

use14545(player, ctrl);

break;

case 14546:

use14546(player, ctrl);

break;

case 14547:

use14547(player, ctrl);

break;

case 14548:

use14548(player, ctrl);

break;

case 14884:

use14884(player, ctrl);

break;

case 14885:

use14885(player, ctrl);

break;

case 14886:

use14886(player, ctrl);

break;

case 14887:

use14887(player, ctrl);

break;

case 14888:

use14888(player, ctrl);

break;

case 14889:

use14889(player, ctrl);

break;

case 14890:

use14890(player, ctrl);

break;

case 14891:

use14891(player, ctrl);

break;

case 14892:

use14892(player, ctrl);

break;

case 14893:

use14893(player, ctrl);

break;

case 14894:

use14894(player, ctrl);

break;

case 14895:

use14895(player, ctrl);

break;

case 14896:

use14896(player, ctrl);

break;

case 14897:

use14897(player, ctrl);

break;

case 14898:

use14898(player, ctrl);

break;

case 14899:

use14899(player, ctrl);

break;

case 14900:

use14900(player, ctrl);

break;

case 14901:

use14901(player, ctrl);

break;

case 14616:

use14616(player, ctrl);

break;

case 20575:

use20575(player, ctrl);

break;

case 20804:

use20804(player, ctrl);

break;

case 20807:

use20807(player, ctrl);

break;

case 20805:

use20805(player, ctrl);

break;

case 20808:

use20808(player, ctrl);

break;

case 20806:

use20806(player, ctrl);

break;

case 20809:

use20809(player, ctrl);

break;

case 20842:

use20842(player, ctrl);

break;

case 20843:

use20843(player, ctrl);

break;

case 20844:

use20844(player, ctrl);

break;

case 20845:

use20845(player, ctrl);

break;

case 20846:

use20846(player, ctrl);

break;

case 20847:

use20847(player, ctrl);

break;

case 20848:

use20848(player, ctrl);

break;

case 20849:

use20849(player, ctrl);

break;

case 20850:

use20850(player, ctrl);

break;

case 20851:

use20851(player, ctrl);

break;

case 20852:

use20852(player, ctrl);

break;

case 20853:

use20853(player, ctrl);

break;

case 20854:

use20854(player, ctrl);

break;

case 20855:

use20855(player, ctrl);

break;

case 20856:

use20856(player, ctrl);

break;

case 20857:

use20857(player, ctrl);

break;

case 20858:

use20858(player, ctrl);

break;

case 20859:

use20859(player, ctrl);

break;

case 20860:

use20860(player, ctrl);

break;

case 20861:

use20861(player, ctrl);

break;

case 20862:

use20862(player, ctrl);

break;

case 20863:

use20863(player, ctrl);

break;

case 20864:

use20864(player, ctrl);

break;

case 20811:

use20811(player, ctrl);

break;

case 20812:

use20812(player, ctrl);

break;

case 20813:

use20813(player, ctrl);

break;

case 20814:

use20814(player, ctrl);

break;

case 20815:

use20815(player, ctrl);

break;

case 20816:

use20816(player, ctrl);

break;

case 20817:

use20817(player, ctrl);

break;

case 20810:

use20810(player, ctrl);

break;

case 20865:

use20865(player, ctrl);

break;

case 20748:

use20748(player, ctrl);

break;

case 20749:

use20749(player, ctrl);

break;

case 20750:

use20750(player, ctrl);

break;

case 20751:

use20751(player, ctrl);

break;

case 20752:

use20752(player, ctrl);

break;

case 20195:

use20195(player, ctrl);

break;

case 20196:

use20196(player, ctrl);

break;

case 20197:

use20197(player, ctrl);

break;

case 20198:

use20198(player, ctrl);

break;

case 13777:

use13777(player, ctrl);

break;

case 13778:

use13778(player, ctrl);

break;

case 13779:

use13779(player, ctrl);

break;

case 13780:

use13780(player, ctrl);

break;

case 13781:

use13781(player, ctrl);

break;

case 13782:

use13782(player, ctrl);

break;

case 13783:

use13783(player, ctrl);

break;

case 13784:

use13784(player, ctrl);

break;

case 13785:

use13785(player, ctrl);

break;

case 13786:

use13786(player, ctrl);

break;

case 14849:

use14849(player, ctrl);

break;

case 14834:

use14834(player, ctrl);

break;

case 14833:

use14833(player, ctrl);

break;

case 13988:

use13988(player, ctrl);

break;

case 13989:

use13989(player, ctrl);

break;

case 13003:

use13003(player, ctrl);

break;

case 13004:

use13004(player, ctrl);

break;

case 13005:

use13005(player, ctrl);

break;

case 13006:

use13006(player, ctrl);

break;

case 13007:

use13007(player, ctrl);

break;

case 13990:

use13990(player, ctrl);

break;

case 13991:

use13991(player, ctrl);

break;

case 13992:

use13992(player, ctrl);

break;

case 14850:

use14850(player, ctrl);

break;

case 14713:

use14713(player, ctrl);

break;

case 14714:

use14714(player, ctrl);

break;

case 14715:

use14715(player, ctrl);

break;

case 14716:

use14716(player, ctrl);

break;

case 14717:

use14717(player, ctrl);

break;

case 14718:

use14718(player, ctrl);

break;

case 17138:

use17138(player, ctrl);

break;

case 15482:

use15482(player, ctrl);

break;

case 15483:

use15483(player, ctrl);

break;

case 13270:

use13270(player, ctrl);

break;

case 13271:

use13271(player, ctrl);

break;

case 13272:

use13272(player, ctrl);

break;

case 14231:

use14231(player, ctrl);

break;

case 14232:

use14232(player, ctrl);

break;

case 21747:

use21747(player, ctrl);

break;

case 21748:

use21748(player, ctrl);

break;

case 21749:

use21749(player, ctrl);

break;

case 17169:

use17169(player, ctrl);

break;

case 21169:

use21169(player, ctrl);

break;

case 21753:

use21753(player, ctrl);

break;

case 21752:

use21752(player, ctrl);

break;

case 17069:

use17069(player, ctrl);

break;

case 20515:

use20515(player, ctrl);

break;

case 20516:

use20516(player, ctrl);

break;

case 20081:

use20081(player, ctrl);

break;

case 22310:

use22310(player, ctrl);

break;

case 22311:

use22311(player, ctrl);

break;

case 17073:

use17073(player, ctrl);

break;

case 22203:

use22203(player, ctrl);

break;

case 22340:

use22340(player, ctrl);

break;

case 22339:

use22339(player, ctrl);

break;

case 9171:

use9171(player, ctrl);

break;

case 9172:

use9172(player, ctrl);

break;

case 9173:

use9173(player, ctrl);

break;

case 9174:

use9174(player, ctrl);

break;

case 9175:

use9175(player, ctrl);

break;

case 9176:

use9176(player, ctrl);

break;

case 20635:

use20635(player, ctrl);

break;

case 20636:

use20636(player, ctrl);

break;

case 20637:

use20637(player, ctrl);

break;

case 20638:

use20638(player, ctrl);

break;

case 21092:

use21092(player, ctrl);

break;

case 21091:

use21091(player, ctrl);

break;

case 43214:

use43214(player, ctrl);

break;

case 43215:

use43215(player, ctrl);

break;

default:

return false;

}

return true;

}

// Red Philosopher's Stone

public void use9171(Player player, Boolean ctrl)

{

int[] list = new int[] {9177, 9184, 9191, 9198, 9153, 9146, 9150, 8678, 8682, 9156, 9157, 1540, 1539};

int[] chances = new int[] {2, 2, 2, 2, 15, 15, 15, 1, 1, 9, 9, 15, 15};

int[] counts = new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

extract_item_r(list, chances, counts, player);

}

// Blue Philisopher's Stone

public void use9172(Player player, Boolean ctrl)

{

int[] list = new int[] {9178, 9185, 9192, 9199, 9147, 9151, 9149, 8685, 8679, 9156, 9157, 1540, 1539};

int[] counts = new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

int[] chances = new int[] {2, 2, 2, 2, 15, 15, 15, 1, 1, 9, 9, 15, 15};

extract_item_r(list, counts, chances, player);

}

// Orange Philisopher's Stone

public void use9173(Player player, Boolean ctrl)

{

int[] list = new int[] {9180, 9187, 9194, 9201, 9149, 9155, 9150, 8688, 8680, 9156, 9157, 1540, 1539};

int[] counts = new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

int[] chances = new int[] {2, 2, 2, 2, 15, 15, 15, 1, 1, 9, 9, 15, 15};

extract_item_r(list, counts, chances, player);

}

// Black Philisopher's Stone

public void use9174(Player player, Boolean ctrl)

{

int[] list = new int[] {9182, 9189, 9196, 9203, 9148, 9146, 9154, 8681, 8687, 9156, 9157, 1540, 1539};

int[] counts = new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

int[] chances = new int[] {2, 2, 2, 2, 15, 15, 15, 1, 1, 9, 9, 15, 15};

extract_item_r(list, counts, chances, player);

}

// White Philisopher's Stone

public void use9175(Player player, Boolean ctrl)

{

int[] list = new int[] {9183, 9190, 9197, 9204, 9152, 9155, 9147, 8685, 8683, 9156, 9157, 1540, 1539};

int[] counts = new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

int[] chances = new int[] {2, 2, 2, 2, 15, 15, 15, 1, 1, 9, 9, 15, 15};

extract_item_r(list, counts, chances, player);

}

// Green Philisopher's Stone

public void use9176(Player player, Boolean ctrl)

{

int[] list = new int[] {9179, 9186, 9193, 9200, 9148, 9152, 9154, 8686, 8684, 9156, 9157, 1540, 1539};

int[] counts = new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

int[] chances = new int[] {2, 2, 2, 2, 15, 15, 15, 1, 1, 9, 9, 15, 15};

extract_item_r(list, counts, chances, player);

}

// ------ Adventurer's Boxes ------

// Adventurer's Box: C-Grade Accessory (Low Grade)

private void use8534(Player player, boolean ctrl)

{

int[] list = new int[]{853, 916, 884};

int[] chances = new int[]{17, 17, 17};

int[] counts = new int[]{1, 1, 1};

extract_item_r(list, counts, chances, player);

}

// Adventurer's Box: C-Grade Accessory (Medium Grade)

private void use8535(Player player, boolean ctrl)

{

int[] list = new int[]{854, 917, 885};

int[] chances = new int[]{17, 17, 17};

int[] counts = new int[]{1, 1, 1};

extract_item_r(list, counts, chances, player);

}

// Adventurer's Box: C-Grade Accessory (High Grade)

private void use8536(Player player, boolean ctrl)

{

int[] list = new int[]{855, 119, 886};

int[] chances = new int[]{17, 17, 17};

int[] counts = new int[]{1, 1, 1};

extract_item_r(list, counts, chances, player);

}

// Adventurer's Box: B-Grade Accessory (Low Grade)

private void use8537(Player player, boolean ctrl)

{

int[] list = new int[]{856, 918, 887};

int[] chances = new int[]{17, 17, 17};

int[] counts = new int[]{1, 1, 1};

extract_item_r(list, counts, chances, player);

}

// Adventurer's Box: B-Grade Accessory (High Grade)

private void use8538(Player player, boolean ctrl)

{

int[] list = new int[]{864, 926, 895};

int[] chances = new int[]{17, 17, 17};

int[] counts = new int[]{1, 1, 1};

extract_item_r(list, counts, chances, player);

}

// Adventurer's Box: Hair Accessory

private void use8539(Player player, boolean ctrl)

{

int[] list = new int[]{8179, 8178, 8177};

int[] chances = new int[]{10, 20, 30};

int[] counts = new int[]{1, 1, 1};

extract_item_r(list, counts, chances, player);

}

// Adventurer's Box: Cradle of Creation

private void use8540(Player player, boolean ctrl)

{

if(Rnd.chance(30))

Functions.addItem(player, 8175, 1);

}

// Quest 370: A Wiseman Sows Seeds

private void use5916(Player player, boolean ctrl)

{

int[] list = new int[]{5917, 5918, 5919, 5920, 736};

int[] counts = new int[]{1, 1, 1, 1, 1};

extract_item(list, counts, player);

}

// Quest 376: Giants Cave Exploration, Part 1

private void use5944(Player player, boolean ctrl)

{

int[] list = {5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943};

int[] counts = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 5944, Functions.getItemCount(player, 5944));

for(int[] res : mass_extract_item(item_count, list, counts, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item(list, counts, player);

}

// Quest 376: Giants Cave Exploration, Part 1

private void use14841(Player player, boolean ctrl)

{

int[] list = {14836, 14837, 14838, 14839, 14840};

int[] counts = {1, 1, 1, 1, 1};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 14841, Functions.getItemCount(player, 14841));

for(int[] res : mass_extract_item(item_count, list, counts, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item(list, counts, player);

}

// Quest 377: Giants Cave Exploration, Part 2, old

private void use5955(Player player, boolean ctrl)

{

int[] list = {5942, 5943, 5945, 5946, 5947, 5948, 5949, 5950, 5951, 5952, 5953, 5954};

int[] counts = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 5955, Functions.getItemCount(player, 5955));

for(int[] res : mass_extract_item(item_count, list, counts, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item(list, counts, player);

}

// Quest 377: Giants Cave Exploration, Part 2, new

private void use14847(Player player, boolean ctrl)

{

int[] list = {14842, 14843, 14844, 14845, 14846};

int[] counts = {1, 1, 1, 1, 1};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 14847, Functions.getItemCount(player, 14847));

for(int[] res : mass_extract_item(item_count, list, counts, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item(list, counts, player);

}

// Quest 372: Legacy of Insolence

private void use5966(Player player, boolean ctrl)

{

int[] list = new int[]{5970, 5971, 5977, 5978, 5979, 5986, 5993, 5994, 5995, 5997, 5983, 6001};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

extract_item(list, counts, player);

}

// Quest 372: Legacy of Insolence

private void use5967(Player player, boolean ctrl)

{

int[] list = new int[]{5970, 5971, 5975, 5976, 5980, 5985, 5993, 5994, 5995, 5997, 5983, 6001};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

extract_item(list, counts, player);

}

// Quest 372: Legacy of Insolence

private void use5968(Player player, boolean ctrl)

{

int[] list = new int[]{5973, 5974, 5981, 5984, 5989, 5990, 5991, 5992, 5996, 5998, 5999, 6000, 5988, 5983, 6001};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

extract_item(list, counts, player);

}

// Quest 372: Legacy of Insolence

private void use5969(Player player, boolean ctrl)

{

int[] list = new int[]{5970, 5971, 5982, 5987, 5989, 5990, 5991, 5992, 5996, 5998, 5999, 6000, 5972, 6001};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

extract_item(list, counts, player);

}

/**

* Quest 373: Supplier of Reagents, from Hallate's Maid, Reagent Pouch (Gray)

* 2x Quicksilver (6019) 30%

* 2x Moonstone Shard (6013) 30%

* 1x Rotten Bone Piece (6014) 20%

* 1x Infernium Ore (6016) 20%

*/

private void use6007(Player player, boolean ctrl)

{

int[] list = new int[]{6019, 6013, 6014, 6016};

int[] counts = new int[]{2, 2, 1, 1};

int[] chances = new int[]{30, 30, 20, 20};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 6007, Functions.getItemCount(player, 6007));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

/**

* Quest 373: Supplier of Reagents, from Platinum Tribe Shaman, Reagent Pouch (Yellow)

* 2x Blood Root (6017) 10%

* 2x Sulfur (6020) 20%

* 1x Rotten Bone Piece (6014) 35%

* 1x Infernium Ore (6016) 35%

*/

private void use6008(Player player, boolean ctrl)

{

int[] list = new int[]{6017, 6020, 6014, 6016};

int[] counts = new int[]{2, 2, 1, 1};

int[] chances = new int[]{10, 20, 35, 35};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 6008, Functions.getItemCount(player, 6008));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

/**

* Quest 373: Supplier of Reagents, from Hames Orc Shaman, Reagent Pouch (Brown)

* 1x Lava Stone (6012) 20%

* 2x Volcanic Ash (6018) 20%

* 2x Quicksilver (6019) 20%

* 1x Moonstone Shard (6013) 40%

*/

private void use6009(Player player, boolean ctrl)

{

int[] list = new int[]{6012, 6018, 6019, 6013};

int[] counts = new int[]{1, 2, 2, 1};

int[] chances = new int[]{20, 20, 20, 40};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 6009, Functions.getItemCount(player, 6009));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

/**

* Quest 373: Supplier of Reagents, from Platinum Guardian Shaman, Reagent Box

* 2x Blood Root (6017) 20%

* 2x Sulfur (6020) 20%

* 1x Infernium Ore (6016) 35%

* 2x Demon's Blood (6015) 25%

*/

private void use6010(Player player, boolean ctrl)

{

int[] list = new int[]{6017, 6020, 6016, 6015};

int[] counts = new int[]{2, 2, 1, 2};

int[] chances = new int[]{20, 20, 35, 25};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 6010, Functions.getItemCount(player, 6010));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

// Quest 628: Hunt of Golden Ram

private void use7725(Player player, boolean ctrl)

{

int[] list = new int[]{6035, 1060, 735, 1540, 1061, 1539};

int[] counts = new int[]{1, 1, 1, 1, 1, 1};

int[] chances = new int[]{7, 39, 7, 3, 12, 32};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 7725, Functions.getItemCount(player, 7725));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

// Quest 628: Hunt of Golden Ram

private void use7637(Player player, boolean ctrl)

{

int[] list = new int[]{4039, 4041, 4043, 4044, 4042, 4040};

int[] counts = new int[]{4, 1, 4, 4, 2, 2};

int[] chances = new int[]{20, 10, 20, 20, 15, 15};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 7637, Functions.getItemCount(player, 7637));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

// Quest 628: Hunt of Golden Ram

private void use7636(Player player, boolean ctrl)

{

int[] list = new int[]{1875, 1882, 1880, 1874, 1877, 1881, 1879, 1876};

int[] counts = new int[]{3, 3, 4, 1, 3, 1, 3, 6};

int[] chances = new int[]{10, 20, 10, 10, 10, 12, 12, 16};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 7636, Functions.getItemCount(player, 7636));

for(int[] res : mass_extract_item_r(item_count, list, counts, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, counts, chances, player);

}

// Looted Goods - White Cargo box

private void use7629(Player player, boolean ctrl)

{

int[] list = new int[]{6688, 6689, 6690, 6691, 6693, 6694, 6695, 6696, 6697, 7579, 57};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 330000};

int[] chances = new int[]{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10};

extract_item_r(list, counts, chances, player);

}

// Looted Goods - Blue Cargo box #All chances of 8 should be 8.5, must be fixed if possible!!

private void use7630(Player player, boolean ctrl)

{

int[] list = new int[]{6703, 6704, 6705, 6706, 6708, 6709, 6710, 6712, 6713, 6714, 57};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 292000};

int[] chances = new int[]{8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20};

extract_item_r(list, counts, chances, player);

}

// Looted Goods - Yellow Cargo box

private void use7631(Player player, boolean ctrl)

{

int[] list = new int[]{6701, 6702, 6707, 6711, 57};

int[] counts = new int[]{1, 1, 1, 1, 930000};

int[] chances = new int[]{20, 20, 20, 20, 20};

extract_item_r(list, counts, chances, player);

}

// Looted Goods - Red Filing Cabinet

private void use7632(Player player, boolean ctrl)

{

int[] list;

list = new int[]{6857, 6859, 6861, 6863, 6867, 6869, 6871, 6875, 6877, 6879, 13100, 57};

int[] counts = new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 340000};

int[] chances = new int[]{8, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 7};

extract_item_r(list, counts, chances, player);

}

// Looted Goods - Purple Filing Cabinet

private void use7633(Player player, boolean ctrl)

{

int[] list;

list = new int[]{6853, 6855, 6865, 6873, 57};

int[] counts = new int[]{1, 1, 1, 1, 850000};

int[] chances = new int[]{20, 20, 20, 20, 20};

extract_item_r(list, counts, chances, player);

}

// Looted Goods - Brown Pouch

private void use7634(Player player, boolean ctrl)

{

int[] list = new int[]{1874, 1875, 1876, 1877, 1879, 1880, 1881, 1882, 57};

int[] counts = new int[]{20, 20, 20, 20, 20, 20, 20, 20, 150000};

int[] chances = new int[]{10, 10, 16, 11, 10, 5, 10, 18, 10};

extract_item_r(list, counts, chances, player);

}

// Looted Goods - Gray Pouch

private void use7635(Player player, boolean ctrl)

{

int[] list = new int[]{4039, 4040, 4041, 4042, 4043, 4044, 57};

int[] counts = new int[]{4, 4, 4, 4, 4, 4, 160000};

int[] chances = new int[]{20, 10, 10, 10, 20, 20, 10};

extract_item_r(list, counts, chances, player);

}

// Old Agathion

private void use10408(Player player, boolean ctrl)

{

Functions.addItem(player, 6471, 20);

Functions.addItem(player, 5094, 40);

Functions.addItem(player, 9814, 3);

Functions.addItem(player, 9816, 4);

Functions.addItem(player, 9817, 4);

Functions.addItem(player, 9815, 2);

Functions.addItem(player, 57, 6000000);

}

// Magic Armor Set

private void use10473(Player player, boolean ctrl)

{

Functions.addItem(player, 10470, 2); // Shadow Item - Red Crescent

Functions.addItem(player, 10471, 2); // Shadow Item - Ring of Devotion

Functions.addItem(player, 10472, 1); // Shadow Item - Necklace of Devotion

}

// Ancient Tome of the Demon

private void use9599(Player player, boolean ctrl)

{

int[] list = new int[]{9600, 9601, 9602};

int[] count_min = new int[]{1, 1, 1};

int[] count_max = new int[]{2, 2, 1};

int[] chances = new int[]{4, 10, 1};

if(ctrl)

{

long item_count = 1 + Functions.removeItem(player, 9599, Functions.getItemCount(player, 9599));

for(int[] res : mass_extract_item_r(item_count, list, count_min, count_max, chances, player))

Functions.addItem(player, res[0], res[1]);

}

else

extract_item_r(list, count_min, count_max, chances, player);

}

// Baby Panda Agathion Pack

private void use20069(Player player, boolean ctrl)

{

Functions.addItem(player, 20063, 1);

}

// Bamboo Panda Agathion Pack

private void use20070(Player player, boolean ctrl)

{

Functions.addItem(player, 20064, 1);

}

// Sexy Panda Agathion Pack

private void use20071(Player player, boolean ctrl)

{

Functions.addItem(player, 20065, 1);

}

// Agathion of Baby Panda 15 Day Pack

private void use20072(Player player, boolean ctrl)

{

Functions.addItem(player, 20066, 1);

}

// Bamboo Panda Agathion 15 Day Pack

private void use20073(Player player, boolean ctrl)

{

Functions.addItem(player, 20067, 1);

}

// Agathion of Sexy Panda 15 Day Pack

private void use20074(Player player, boolean ctrl)

{

Functions.addItem(player, 20068, 1);

}

// Charming Valentine Gift Set

private void use20210(Player player, boolean ctrl)

{

Functions.addItem(player, 20212, 1);

}

// Naughty Valentine Gift Set

private void use20211(Player player, boolean ctrl)

{

Functions.addItem(player, 20213, 1);

}

// White Maneki Neko Agathion Pack

private void use20215(Player player, boolean ctrl)

{

Functions.addItem(player, 20221, 1);

}

// Black Maneki Neko Agathion Pack

private void use20216(Player player, boolean ctrl)

{

Functions.addItem(player, 20222, 1);

}

// Brown Maneki Neko Agathion Pack

private void use20217(Player player, boolean ctrl)

{

Functions.addItem(player, 20223, 1);

}

// White Maneki Neko Agathion 7-Day Pack

private void use20218(Player player, boolean ctrl)

{

Functions.addItem(player, 20224, 1);

}

// Black Maneki Neko Agathion 7-Day Pack

private void use20219(Player player, boolean ctrl)

{

Functions.addItem(player, 20225, 1);

}

// Brown Maneki Neko Agathion 7-Day Pack

private void use20220(Player player, boolean ctrl)

{

Functions.addItem(player, 20226, 1);

}

// One-Eyed Bat Drove Agathion Pack

private void use20227(Player player, boolean ctrl)

{

Functions.addItem(player, 20230, 1);

}

// One-Eyed Bat Drove Agathion 7-Day Pack

private void use20228(Player player, boolean ctrl)

{

Functions.addItem(player, 20231, 1);

}

// One-Eyed Bat Drove Agathion 7-Day Pack

private void use20229(Player player, boolean ctrl)

{

Functions.addItem(player, 20232, 1);

}

// Pegasus Agathion Pack

private void use20233(Player player, boolean ctrl)

{

Functions.addItem(player, 20236, 1);

}

// Pegasus Agathion 7-Day Pack

private void use20234(Player player, boolean ctrl)

{

Functions.addItem(player, 20237, 1);

}

// Pegasus Agathion 7-Day Pack

private void use20235(Player player, boolean ctrl)

{

Functions.addItem(player, 20238, 1);

}

// Yellow-Robed Tojigong Pack

private void use20239(Player player, boolean ctrl)

{

Functions.addItem(player, 20245, 1);

}

// Blue-Robed Tojigong Pack

private void use20240(Player player, boolean ctrl)

{

Functions.addItem(player, 20246, 1);

}

// Green-Robed Tojigong Pack

private void use20241(Player player, boolean ctrl)

{

Functions.addItem(player, 20247, 1);

}

// Yellow-Robed Tojigong 7-Day Pack

private void use20242(Player player, boolean ctrl)

{

Functions.addItem(player, 20248, 1);

}

// Blue-Robed Tojigong 7-Day Pack

private void use20243(Player player, boolean ctrl)

{

Functions.addItem(player, 20249, 1);

}

// Green-Robed Tojigong 7-Day Pack

private void use20244(Player player, boolean ctrl)

{

Functions.addItem(player, 20250, 1);

}

// Bugbear Agathion Pack

private void use20251(Player player, boolean ctrl)

{

Functions.addItem(player, 20252, 1);

}

// Agathion of Love Pack (Event)

private void use20254(Player player, boolean ctrl)

{

Functions.addItem(player, 20253, 1);

}

// Gold Afro Hair Pack

private void use20278(Player player, boolean ctrl)

{

Functions.addItem(player, 20275, 1);

}

// Pink Afro Hair Pack

private void use20279(Player player, boolean ctrl)

{

Functions.addItem(player, 20276, 1);

}

// Plaipitak Agathion Pack

private void use20041(Player player, boolean ctrl)

{

Functions.addItem(player, 20012, 1);

}

// Plaipitak Agathion 30-Day Pack

private void use20042(Player player, boolean ctrl)

{

Functions.addItem(player, 20013, 1);

}

// Plaipitak Agathion 30-Day Pack

private void use20043(Player player, boolean ctrl)

{

Functions.addItem(player, 20014, 1);

}

// Plaipitak Agathion 30-Day Pack

private void use20044(Player player, boolean ctrl)

{

Functions.addItem(player, 20015, 1);

}

// Majo Agathion Pack

private void use20035(Player player, boolean ctrl)

{

Functions.addItem(player, 20006, 1);

}

// Gold Crown Majo Agathion Pack

private void use20036(Player player, boolean ctrl)

{

Functions.addItem(player, 20007, 1);

}

// Black Crown Majo Agathion Pack

private void use20037(Player player, boolean ctrl)

{

Functions.addItem(player, 20008, 1);

}

// Majo Agathion 30-Day Pack

private void use20038(Player player, boolean ctrl)

{

Functions.addItem(player, 20009, 1);

}

// Gold Crown Majo Agathion 30-Day Pack

private void use20039(Player player, boolean ctrl)

{

Functions.addItem(player, 20010, 1);

}

// Black Crown Majo Agathion 30-Day Pack

private void use20040(Player player, boolean ctrl)

{

Functions.addItem(player, 20011, 1);

}

// Kat the Cat Hat Pack

private void use20060(Player player, boolean ctrl)

{

Functions.addItem(player, 20031, 1);

}

// Skull Hat Pack

private void use20061(Player player, boolean ctrl)

{

Functions.addItem(player, 20032, 1);

}

// ****** Start Item Mall ******

// Small fortuna box

private void use22000(Player player, boolean ctrl)

{

int[][] list = new int[][]{{22006, 3}, {22007, 2}, {22008, 1}, {22014, 1}, {22022, 3}, {22023, 3}, {22024, 1}, {8743, 1}, {8744, 1}, {8745, 1}, {8753, 1}, {8754, 1}, {8755, 1}, {22025, 5}};

double[] chances = new double[]{20.55555, 14.01515, 6.16666, 0.86999, 3.19444, 6.38888, 5.75, 10, 8.33333, 6.94444, 2, 1.6666, 1.38888, 12.77777};

extractRandomOneItem(player, list, chances);

}

// Middle fortuna box

private void use22001(Player player, boolean ctrl)

{

int[][] list = new int[][]{{22007, 3}, {22008, 2}, {22009, 1}, {22014, 1}, {22015, 1}, {22022, 5}, {22023, 5}, {22024, 2}, {8746, 1}, {8747, 1}, {8748, 1}, {8756, 1}, {8757, 1}, {8758, 1}, {22025, 10}};

double[] chances = new double[]{27.27272, 9, 5, 0.93959, 0.32467, 3.75, 7.5, 5.625, 9.11458, 7.875, 6.5625, 1.82291, 1.575, 1.3125, 12.5};

extractRandomOneItem(player, list, chances);

}

// Large fortuna box

private void use22002(Player player, boolean ctrl)

{

int[][] list = new int[][]{{22008, 2}, {22009, 1}, {22014, 1}, {22015, 1}, {22018, 1}, {22019, 1}, {22022, 10}, {22023, 10}, {22024, 5}, {8749, 1}, {8750, 1}, {8751, 1}, {8759, 1}, {8760, 1}, {8761, 1}, {22025, 20}};

double[] chances = new double[]{27, 15, 0.78299, 0.27056, 0.00775, 0.0027, 3.75, 7.5, 4.5, 9.75, 8.125, 6.77083, 1.95, 1.625, 1.35416, 12.5};

extractRandomOneItem(player, list, chances);

}

// Small fortuna cube

private void use22003(Player player, boolean ctrl)

{

int[][] list = new int[][]{{22010, 3}, {22011, 2}, {22012, 1}, {22016, 1}, {22022, 3}, {22023, 3}, {22024, 1}, {8743, 1}, {8744, 1}, {8745, 1}, {8753, 1}, {8754, 1}, {8755, 1}, {22025, 5}};

double[] chances = new double[]{20.22222, 13.78787, 6.06666, 0.69599, 3.47222, 6.94444, 6.25, 9.5, 7.91666, 6.59722, 1.9, 1.58333, 1.31944, 13.88888};

extractRandomOneItem(player, list, chances);

}

// Middle fortuna cube

private void use22004(Player player, boolean ctrl)

{

int[][] list = new int[][]{{22011, 3}, {22012, 2}, {22013, 1}, {22016, 1}, {22017, 1}, {22022, 5}, {22023, 5}, {22024, 2}, {8746, 1}, {8747, 1}, {8748, 1}, {8756, 1}, {8757, 1}, {8758, 1}, {22025, 10}};

double[] chances = new double[]{26.51515, 8.75, 4.86111, 0.91349, 0.31565, 3.75, 7.5, 5.625, 9.54861, 8.25, 6.875, 1.90972, 1.65, 1.375, 12.5};

extractRandomOneItem(player, list, chances);

}

// Large fortuna cube

private void use22005(Player player, boolean ctrl)

{

int[][] list = new int[][]{{22012, 2}, {22013, 1}, {22016, 1}, {22017, 1}, {22020, 1}, {22021, 1}, {22022, 10}, {22023, 10}, {22024, 5}, {8749, 1}, {8750, 1}, {8751, 1}, {8759, 1}, {8760, 1}, {8761, 1}, {22025, 20}};

double[] chances = new double[]{26.25, 14.58333, 0.69599, 0.24049, 0.00638, 0.0022, 3.95833, 7.91666, 4.75, 9.58333, 7.98611, 6.65509, 1.91666, 1.59722, 1.33101, 13.19444};

extractRandomOneItem(player, list, chances);

}

// Beast Soulshot Pack

private void use20326(Player player, boolean ctrl)

{

Functions.addItem(player, 20332, 5000);

}

// Beast Spiritshot Pack

private void use20327(Player player, boolean ctrl)

{

Functions.addItem(player, 20333, 5000);

}

// Beast Soulshot Large Pack

private void use20329(Player player, boolean ctrl)

{

Functions.addItem(player, 20332, 10000);

}

// Beast Spiritshot Large Pack

private void use20330(Player player, boolean ctrl)

{

Functions.addItem(player, 20333, 10000);

}

// Light Purple Maned Horse Bracelet 30-Day Pack

private void use20059(Player player, boolean ctrl)

{

Functions.addItem(player, 20030, 1);

}

// Steam Beatle Mounting Bracelet 7 Day Pack

private void use20494(Player player, boolean ctrl)

{

Functions.addItem(player, 20449, 1);

}

// Light Purple Maned Horse Mounting Bracelet 7 Day Pack

private void use20493(Player player, boolean ctrl)

{

Functions.addItem(player, 20448, 1);

}

// Steam Beatle Mounting Bracelet Pack

private void use20395(Player player, boolean ctrl)

{

Functions.addItem(player, 20396, 1);

}

// Pumpkin Transformation Stick 7 Day Pack

private void use13281(Player player, boolean ctrl)

{

Functions.addItem(player, 13253, 1);

}

// Kat the Cat Hat 7-Day Pack

private void use13282(Player player, boolean ctrl)

{

Functions.addItem(player, 13239, 1);

}

// Feline Queen Hat 7-Day Pack

private void use13283(Player player, boolean ctrl)

{

Functions.addItem(player, 13240, 1);

}

// Monster Eye Hat 7-Day Pack

private void use13284(Player player, boolean ctrl)

{

Functions.addItem(player, 13241, 1);

}

// Brown Bear Hat 7-Day Pack

private void use13285(Player player, boolean ctrl)

{

Functions.addItem(player, 13242, 1);

}

// Fungus Hat 7-Day Pack

private void use13286(Player player, boolean ctrl)

{

Functions.addItem(player, 13243, 1);

}

// Skull Hat 7-Day Pack

private void use13287(Player player, boolean ctrl)

{

Functions.addItem(player, 13244, 1);

}

// Ornithomimus Hat 7-Day Pack

private void use13288(Player player, boolean ctrl)

{

Functions.addItem(player, 13245, 1);

}

// Feline King Hat 7-Day Pack

private void use13289(Player player, boolean ctrl)

{

Functions.addItem(player, 13246, 1);

}

// Kai the Cat Hat 7-Day Pack

private void use13290(Player player, boolean ctrl)

{

Functions.addItem(player, 13247, 1);

}

// Sudden Agathion 7 Day Pack

private void use14267(Player player, boolean ctrl)

{

Functions.addItem(player, 14093, 1);

}

// Shiny Agathion 7 Day Pack

private void use14268(Player player, boolean ctrl)

{

Functions.addItem(player, 14094, 1);

}

// Sobbing Agathion 7 Day Pack

private void use14269(Player player, boolean ctrl)

{

Functions.addItem(player, 14095, 1);

}

// Agathion of Love 7-Day Pack

private void use13280(Player player, boolean ctrl)

{

Functions.addItem(player, 20201, 1);

}

// A Scroll Bundle of Fighter

private void use22087(Player player, boolean ctrl)

{

Functions.addItem(player, 22039, 1);

Functions.addItem(player, 22040, 1);

Functions.addItem(player, 22041, 1);

Functions.addItem(player, 22042, 1);

Functions.addItem(player, 22043, 1);

Functions.addItem(player, 22044, 1);

Functions.addItem(player, 22047, 1);

Functions.addItem(player, 22048, 1);

}

// A Scroll Bundle of Mage

private void use22088(Player player, boolean ctrl)

{

Functions.addItem(player, 22045, 1);

Functions.addItem(player, 22046, 1);

Functions.addItem(player, 22048, 1);

Functions.addItem(player, 22049, 1);

Functions.addItem(player, 22050, 1);

Functions.addItem(player, 22051, 1);

Functions.addItem(player, 22052, 1);

Functions.addItem(player, 22053, 1);

}

// ****** End Item Mall ******

// ****** Belts ******

// Gludio Supply Box - Belt: Grade B, C

private void use13713(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Belt: Grade B, C

private void use13714(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Belt: Grade B, C

private void use13715(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Belt: Grade B, C

private void use13716(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Belt: Grade B, C

private void use13717(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Belt: Grade B, C

private void use13718(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Belt: Grade B, C

private void use13719(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Belt: Grade B, C

private void use13720(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Belt: Grade B, C

private void use13721(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13894, 1); // Cloth Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13895, 1); // Leather Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Gludio Supply Box - Belt: Grade S, A

private void use14549(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Belt: Grade S, A

private void use14550(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Belt: Grade S, A

private void use14551(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Belt: Grade S, A

private void use14552(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Belt: Grade S, A

private void use14553(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Belt: Grade S, A

private void use14554(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Belt: Grade S, A

private void use14555(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Belt: Grade S, A

private void use14556(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Belt: Grade S, A

private void use14557(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13896, 1); // Iron Belt

else if(Rnd.chance(50))

Functions.addItem(player, 13897, 1); // Mithril Belt

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// ****** Magic Pins ******

// Gludio Supply Box - Magic Pin: Grade B, C

private void use13695(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Magic Pin: Grade B, C

private void use13696(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Magic Pin: Grade B, C

private void use13697(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Magic Pin: Grade B, C

private void use13698(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Magic Pin: Grade B, C

private void use13699(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Magic Pin: Grade B, C

private void use13700(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Magic Pin: Grade B, C

private void use13701(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Magic Pin: Grade B, C

private void use13702(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Magic Pin: Grade B, C

private void use13703(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13898, 1); // Sealed Magic Pin (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13899, 1); // Sealed Magic Pin (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Gludio Supply Box - Magic Pin: Grade S, A

private void use14531(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Magic Pin: Grade S, A

private void use14532(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Magic Pin: Grade S, A

private void use14533(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Magic Pin: Grade S, A

private void use14534(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Magic Pin: Grade S, A

private void use14535(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Magic Pin: Grade S, A

private void use14536(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Magic Pin: Grade S, A

private void use14537(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Magic Pin: Grade S, A

private void use14538(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Magic Pin: Grade S, A

private void use14539(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13900, 1); // Sealed Magic Pin (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13901, 1); // Sealed Magic Pin (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// ****** Magic Pouchs ******

// Gludio Supply Box - Magic Pouch: Grade B, C

private void use13704(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Magic Pouch: Grade B, C

private void use13705(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Magic Pouch: Grade B, C

private void use13706(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Magic Pouch: Grade B, C

private void use13707(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Magic Pouch: Grade B, C

private void use13708(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Magic Pouch: Grade B, C

private void use13709(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Magic Pouch: Grade B, C

private void use13710(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Magic Pouch: Grade B, C

private void use13711(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Magic Pouch: Grade B, C

private void use13712(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13918, 1); // Sealed Magic Pouch (C-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13919, 1); // Sealed Magic Pouch (B-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Gludio Supply Box - Magic Pouch: Grade S, A

private void use14540(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Magic Pouch: Grade S, A

private void use14541(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Magic Pouch: Grade S, A

private void use14542(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Magic Pouch: Grade S, A

private void use14543(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Magic Pouch: Grade S, A

private void use14544(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Magic Pouch: Grade S, A

private void use14545(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Magic Pouch: Grade S, A

private void use14546(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Magic Pouch: Grade S, A

private void use14547(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Magic Pouch: Grade S, A

private void use14548(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 13920, 1); // Sealed Magic Pouch (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 13921, 1); // Sealed Magic Pouch (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// ****** Magic Rune Clip ******

// Gludio Supply Box - Magic Rune Clip: Grade S, A

private void use14884(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Magic Rune Clip: Grade S, A

private void use14885(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Magic Rune Clip: Grade S, A

private void use14886(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Magic Rune Clip: Grade S, A

private void use14887(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Magic Rune Clip: Grade S, A

private void use14888(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Magic Rune Clip: Grade S, A

private void use14889(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Magic Rune Clip: Grade S, A

private void use14890(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Magic Rune Clip: Grade S, A

private void use14891(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Magic Rune Clip: Grade S, A

private void use14892(Player player, boolean ctrl)

{

if(Rnd.chance(50))

Functions.addItem(player, 14902, 1); // Sealed Magic Rune Clip (A-Grade)

else if(Rnd.chance(50))

Functions.addItem(player, 14903, 1); // Sealed Magic Rune Clip (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// ****** Magic Ornament ******

// Gludio Supply Box - Magic Ornament: Grade S, A

private void use14893(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Dion Supply Box - Magic Ornament: Grade S, A

private void use14894(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Giran Supply Box - Magic Ornament: Grade S, A

private void use14895(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Oren Supply Box - Magic Ornament: Grade S, A

private void use14896(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Aden Supply Box - Magic Ornament: Grade S, A

private void use14897(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Innadril Supply Box - Magic Ornament: Grade S, A

private void use14898(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Goddard Supply Box - Magic Ornament: Grade S, A

private void use14899(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Rune Supply Box - Magic Ornament: Grade S, A

private void use14900(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Schuttgart Supply Box - Magic Ornament: Grade S, A

private void use14901(Player player, boolean ctrl)

{

if(Rnd.chance(20))

Functions.addItem(player, 14904, 1); // Sealed Magic Ornament (A-Grade)

else if(Rnd.chance(20))

Functions.addItem(player, 14905, 1); // Sealed Magic Ornament (S-Grade)

else

player.sendPacket(Msg.THERE_WAS_NOTHING_FOUND_INSI DE_OF_THAT);

}

// Gift from Santa Claus

private void use14616(Player player, boolean ctrl)

{

// Santa Claus' Weapon Exchange Ticket - 12 Hour Expiration Period

Functions.addItem(player, 20107, 1);

// Christmas Red Sock

Functions.addItem(player, 14612, 1);

// Special Christmas Tree

if(Rnd.chance(30))

Functions.addItem(player, 5561, 1);

// Christmas Tree

if(Rnd.chance(50))

Functions.addItem(player, 5560, 1);

// Agathion Seal Bracelet - Rudolph (постоянный предмет)

if(Functions.getItemCount(player, 10606) == 0 && Rnd.chance(5))

Functions.addItem(player, 10606, 1);

// Agathion Seal Bracelet: Rudolph - 30 дней со скилом на виталити

if(Functions.getItemCount(player, 20094) == 0 && Rnd.chance(3))

Functions.addItem(player, 20094, 1);

// Chest of Experience (Event)

if(Rnd.chance(30))

Functions.addItem(player, 20575, 1);

}

// Chest of Experience (Event)

private void use20575(Player player, boolean ctrl)

{

Functions.addItem(player, 20335, 1); // Rune of Experience: 30% - 5 hour limited time

Functions.addItem(player, 20341, 1); // Rune of SP 30% - 5 Hour Expiration Period

}

// Nepal Snow Agathion Pack

private void use20804(Player player, boolean ctrl)

{

Functions.addItem(player, 20782, 1);

}

// Nepal Snow Agathion 7-Day Pack - Snow's Haste

private void use20807(Player player, boolean ctrl)

{

Functions.addItem(player, 20785, 1);

}

// Round Ball Snow Agathion Pack

private void use20805(Player player, boolean ctrl)

{

Functions.addItem(player, 20783, 1);

}

// Round Ball Snow Agathion 7-Day Pack - Snow's Acumen

private void use20808(Player player, boolean ctrl)

{

Functions.addItem(player, 20786, 1);

}

// Ladder Snow Agathion Pack

private void use20806(Player player, boolean ctrl)

{

Functions.addItem(player, 20784, 1);

}

// Ladder Snow Agathion 7-Day Pack - Snow's Wind Walk

private void use20809(Player player, boolean ctrl)

{

Functions.addItem(player, 20787, 1);

}

// Iken Agathion Pack

private void use20842(Player player, boolean ctrl)

{

Functions.addItem(player, 20818, 1);

}

// Iken Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20843(Player player, boolean ctrl)

{

Functions.addItem(player, 20819, 1);

}

// Lana Agathion Pack

private void use20844(Player player, boolean ctrl)

{

Functions.addItem(player, 20820, 1);

}

// Lana Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20845(Player player, boolean ctrl)

{

Functions.addItem(player, 20821, 1);

}

// Gnocian Agathion Pack

private void use20846(Player player, boolean ctrl)

{

Functions.addItem(player, 20822, 1);

}

// Gnocian Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20847(Player player, boolean ctrl)

{

Functions.addItem(player, 20823, 1);

}

// Orodriel Agathion Pack

private void use20848(Player player, boolean ctrl)

{

Functions.addItem(player, 20824, 1);

}

// Orodriel Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20849(Player player, boolean ctrl)

{

Functions.addItem(player, 20825, 1);

}

// Lakinos Agathion Pack

private void use20850(Player player, boolean ctrl)

{

Functions.addItem(player, 20826, 1);

}

// Lakinos Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20851(Player player, boolean ctrl)

{

Functions.addItem(player, 20827, 1);

}

// Mortia Agathion Pack

private void use20852(Player player, boolean ctrl)

{

Functions.addItem(player, 20828, 1);

}

// Mortia Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20853(Player player, boolean ctrl)

{

Functions.addItem(player, 20829, 1);

}

// Hayance Agathion Pack

private void use20854(Player player, boolean ctrl)

{

Functions.addItem(player, 20830, 1);

}

// Hayance Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20855(Player player, boolean ctrl)

{

Functions.addItem(player, 20831, 1);

}

// Meruril Agathion Pack

private void use20856(Player player, boolean ctrl)

{

Functions.addItem(player, 20832, 1);

}

// Meruril Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20857(Player player, boolean ctrl)

{

Functions.addItem(player, 20833, 1);

}

// Taman ze Lapatui Agathion Pack

private void use20858(Player player, boolean ctrl)

{

Functions.addItem(player, 20834, 1);

}

// Taman ze Lapatui Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20859(Player player, boolean ctrl)

{

Functions.addItem(player, 20835, 1);

}

// Kaurin Agathion Pack

private void use20860(Player player, boolean ctrl)

{

Functions.addItem(player, 20836, 1);

}

// Kaurin Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20861(Player player, boolean ctrl)

{

Functions.addItem(player, 20837, 1);

}

// Ahertbein Agathion Pack

private void use20862(Player player, boolean ctrl)

{

Functions.addItem(player, 20838, 1);

}

// Ahertbein Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20863(Player player, boolean ctrl)

{

Functions.addItem(player, 20839, 1);

}

// Naonin Agathion Pack

private void use20864(Player player, boolean ctrl)

{

Functions.addItem(player, 20840, 1);

}

// Rocket Gun Hat Pack Continuous Fireworks

private void use20811(Player player, boolean ctrl)

{

Functions.addItem(player, 20789, 1);

}

// Yellow Paper Hat 7-Day Pack Bless the Body

private void use20812(Player player, boolean ctrl)

{

Functions.addItem(player, 20790, 1);

}

// Pink Paper Mask Set 7-Day Pack Bless the Soul

private void use20813(Player player, boolean ctrl)

{

Functions.addItem(player, 20791, 1);

}

// Flavorful Cheese Hat Pack

private void use20814(Player player, boolean ctrl)

{

Functions.addItem(player, 20792, 1);

}

// Sweet Cheese Hat Pack

private void use20815(Player player, boolean ctrl)

{

Functions.addItem(player, 20793, 1);

}

// Flavorful Cheese Hat 7-Day Pack Scent of Flavorful Cheese

private void use20816(Player player, boolean ctrl)

{

Functions.addItem(player, 20794, 1);

}

// Sweet Cheese Hat 7-Day Pack Scent of Sweet Cheese

private void use20817(Player player, boolean ctrl)

{

Functions.addItem(player, 20795, 1);

}

// Flame Box Pack

private void use20810(Player player, boolean ctrl)

{

Functions.addItem(player, 20725, 1);

}

// Naonin Agathion 7-Day Pack Prominent Outsider Adventurer's Ability

private void use20865(Player player, boolean ctrl)

{

Functions.addItem(player, 20841, 1);

}

// Shiny Mask of Giant Hercules 7 day Pack

private void use20748(Player player, boolean ctrl)

{

Functions.addItem(player, 20743, 1);

}

// Shiny Mask of Silent Scream 7 day Pack

private void use20749(Player player, boolean ctrl)

{

Functions.addItem(player, 20744, 1);

}

// Shiny Spirit of Wrath Mask 7 day Pack

private void use20750(Player player, boolean ctrl)

{

Functions.addItem(player, 20745, 1);

}

// Shiny Undecaying Corpse Mask 7 Day Pack

private void use20751(Player player, boolean ctrl)

{

Functions.addItem(player, 20746, 1);

}

// Shiny Planet X235 Alien Mask 7 day Pack

private void use20752(Player player, boolean ctrl)

{

Functions.addItem(player, 20747, 1);

}

// Simple Valentine Cake

private void use20195(Player player, boolean ctrl)

{

// Velvety Valentine Cake

if(Rnd.chance(20))

Functions.addItem(player, 20196, 1);

else

{

// Dragon Bomber Transformation Scroll

// Unicorn Transformation Scroll

if(Rnd.chance(5))

{

Functions.addItem(player, 20371, 1);

Functions.addItem(player, 20367, 1);

}

// Quick Healing Potion

if(Rnd.chance(10))

Functions.addItem(player, 1540, 1);

// Greater Healing Potion

if(Rnd.chance(15))

Functions.addItem(player, 1539, 1);

}

}

// Velvety Valentine Cake

private void use20196(Player player, boolean ctrl)

{

// Delectable Valentine Cake

if(Rnd.chance(15))

Functions.addItem(player, 20197, 1);

else

{

// Scroll: Enchant Armor (C)

if(Rnd.chance(10))

Functions.addItem(player, 952, 1);

// Scroll: Enchant Armor (B)

if(Rnd.chance(5))

Functions.addItem(player, 948, 1);

// Blessed Scroll of Escape

if(Rnd.chance(10))

Functions.addItem(player, 1538, 1);

// Blessed Scroll of Resurrection

if(Rnd.chance(5))

Functions.addItem(player, 3936, 1);

// Agathion of Love - 3 Day Expiration Period

if(Rnd.chance(10))

Functions.addItem(player, 20200, 1);

}

}

// Delectable Valentine Cake

private void use20197(Player player, boolean ctrl)

{

// Decadent Valentine Cake

if(Rnd.chance(10))

Functions.addItem(player, 20198, 1);

else

{

// Scroll: Enchant Weapon (C)

if(Rnd.chance(10))

Functions.addItem(player, 951, 1);

// Scroll: Enchant Weapon (B)

if(Rnd.chance(5))

Functions.addItem(player, 947, 1);

// Agathion of Love - 7 Day Expiration Period

if(Rnd.chance(5))

Functions.addItem(player, 20201, 1);

}

}

// Decadent Valentine Cake

private void use20198(Player player, boolean ctrl)

{

// Scroll: Enchant Weapon (S)

if(Rnd.chance(5))

Functions.addItem(player, 959, 1);

// Scroll: Enchant Weapon (A)

if(Rnd.chance(10))

Functions.addItem(player, 729, 1);

// Agathion of Love - 15 Day Expiration Period

if(Rnd.chance(10))

Functions.addItem(player, 20202, 1);

// Agathion of Love - 30 Day Expiration Period

if(Rnd.chance(5))

Functions.addItem(player, 20203, 1);

}

private static final int[] SOI_books = {14209, // Forgotten Scroll - Hide

14212, // Forgotten Scroll - Enlightenment - Wizard

14213, // Forgotten Scroll - Enlightenment - Healer

10554, // Forgotten Scroll - Anti-Magic Armor

14208, // Forgotten Scroll - Final Secret

10577 // Forgotten Scroll - Excessive Loyalty

};

// Jewel Ornamented Duel Supplies

private void use13777(Player player, boolean ctrl)

{

int rnd = Rnd.get(100);

if(rnd = 4) //Low C-Grade rewards

items = new int[]{160, 298, 72, 193, 192, 281, 7887, 226, 2524, 191, 71, 263};

Functions.addItem(player, items[Rnd.get(items.length)], 1);

}

// Experienced Adventurer's Treasure Sack

private void use21748(Player player, boolean ctrl)

{

int group = Rnd.get(10);

int[] items = new int[0];

if(group = 7 && group = 5 && group talismans = new ArrayList();

//9914-9965

for(int i = 9914; i mass_extract_item(long source_count, int[] list, int[] counts, Player player)

{

List result = new ArrayList((int) Math.min(list.length, source_count));

for(int n = 1; n mass_extract_item_r(long source_count, int[] list, int[] count_min, int[] count_max, int[] chances, Player player)

{

int[] counts = count_min;

for(int i = 0; i mass_extract_item_r(long source_count, int[] list, int[] counts, int[] chances, Player player)

{

List result = new ArrayList((int) Math.min(list.length, source_count));

int sum = 0;

for(int i = 0; i = 3 || player.getInventory().getSize() > player.getInventoryLimit() - 10)

{

player.sendPacket(Msg.YOUR_INVENTORY_IS_FULL, new SystemMessage(SystemMessage.S1_CANNOT_BE_USED_DUE_ TO_UNSUITABLE_TERMS).addItemName(item.getItemId()) );

return false;

}

return true;

}

private static boolean extractRandomOneItem(Player player, int[][] items, double[] chances)

{

if(items.length != chances.length)

return false;

double extractChance = 0;

for(double c : chances)

extractChance += c;

if(Rnd.chance(extractChance))

{

int[] successfulItems = new int[0];

while(successfulItems.length == 0)

for(int i = 0; i

kick 07.08.2015 13:18

Как говорит гринд, масоны придумали офф скрипты, хорошо смотрим офф скрипты:

Цитата:

Сообщение от Спойлер

item_begin armor 6844 [hair_pin_of_lady] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*귀부인의헤어핀*/ item_end

item_begin armor 7682 [maidens_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*숙녀의헤어핀*/ item_end

item_begin armor 7695 [forget_me_not_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*물망초헤어핀*/ item_end

item_begin armor 7696 [daisy_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*데이지꽃헤어핀*/ item_end

item_begin armor 7846 [pccafe_maidens_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*숙녀의헤어핀-이벤트용*/ item_end

item_begin armor 7847 [pccafe_hair_pin_of_lady] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*귀부인의헤어핀-이벤트용*/ item_end

item_begin armor 7848 [pccafe_forget_me_not_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*물망초헤어핀-이벤트용*/ item_end

item_begin armor 7849 [pccafe_daisy_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*데이지꽃헤어핀-이벤트용*/ item_end

item_begin armor 8912 [cluster_of_flower] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=steel crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*꽃한송이*/ item_end

item_begin armor 8913 [butterfly_hearpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=steel crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*나비머리핀*/ item_end

item_begin armor 8917 [goddess_circlet] item_type=armor slot_bit_type={hairall} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=steel crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*여신서클릿*/ item_end

item_begin armor 8923 [scar] item_type=armor slot_bit_type={hair} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=500000 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=steel crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;0}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*흉터*/ item_end

item_begin armor 14772 [flower_coronet_whiteday_event] item_type=armor slot_bit_type={hairall} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*화관*/ item_end

item_begin armor 17141 [ev_ribbon_band] item_type=armor slot_bit_type={hairall} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=0 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*리본헤어밴드*/ item_end

item_begin armor 20023 [br_ribbon_band] item_type=armor slot_bit_type={hair} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=15 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=0 can_move=1 is_premium=1 /*리본헤어밴드*/ item_end

item_begin armor 20024 [br_visor] item_type=armor slot_bit_type={hairall} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=15 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;0}} is_olympiad_can_use=0 can_move=1 is_premium=1 /*바이저*/ item_end

item_begin armor 22156 [br_cash_daisy_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=1 is_premium=0 /*데이지꽃헤어핀*/ item_end

item_begin armor 22157 [br_cash_forget_me_not_hairpin] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=1 is_premium=0 /*물망초헤어핀*/ item_end

item_begin armor 22166 [br_cash_hair_pin_of_lady] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=1 is_premium=0 /*귀부인의헤어핀*/ item_end

item_begin armor 20323 [br_horn_hairband] item_type=armor slot_bit_type={hair} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=9 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=1 is_premium=1 /*뿔헤어밴드*/ item_end

item_begin armor 20420 [br_ribbon_band_reflect_7d] item_type=armor slot_bit_type={hair} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=10080 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_br_ribbon_band_reflect_7d] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=0 can_move=0 is_premium=1 /*리본헤어밴드*/ item_end

item_begin armor 20421 [br_visor_meditate_7d] item_type=armor slot_bit_type={hairall} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=10080 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_br_visor_meditate_7d] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;0}} is_olympiad_can_use=0 can_move=0 is_premium=1 /*바이저*/ item_end

item_begin armor 20428 [br_horn_hairband_reflect_7d] item_type=armor slot_bit_type={hair} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=10080 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_br_horn_hairband_reflect_7d] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=0 can_move=0 is_premium=1 /*뿔헤어밴드*/ item_end

item_begin armor 20431 [br_cash_daisy_hairpin_resist_unholy_7d] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=10080 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_br_cash_daisy_hairpin_resist_unholy_7d] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=0 can_move=0 is_premium=1 /*데이지꽃헤어핀*/ item_end

item_begin armor 20432 [br_cash_forget_me_not_hairpin_wind_7d] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=10080 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_br_cash_forget_me_not_hairpin_wind_7d] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=0 can_move=0 is_premium=1 /*물망초헤어핀*/ item_end

item_begin armor 20441 [br_cash_hair_pin_of_lady_death_7d] item_type=armor slot_bit_type={hair2} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=10080 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_br_cash_hair_pin_of_lady_death_7d] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=0 can_move=0 is_premium=1 /*귀부인의헤어핀*/ item_end

item_begin armor 8559 [flower_coronet] item_type=armor slot_bit_type={hairall} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=10 default_action=action_equip consume_type=consume_type_normal initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=wood crystal_type=none crystal_count=0 is_trade=1 is_drop=1 is_destruct=1 is_private_store=1 keep_type=7 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={{ec_sex;1}} is_olympiad_can_use=1 can_move=0 is_premium=0 /*화관*/ item_end

А вот теперь давайте посмотри на пример и увидим, какая реализация у гринда согласно официальному серверу и увидим, что сервер у гринда для геев,

да да т.к на птс идёт конд на определение ec_sex и 1 или же 0, а у гринда нету проверки и мужской пол может одевать женского пола, а женский пол одевать мужского. Для этого возьму 2 случайных предмета из этого списка.

Например 8923.

Смотрим на реализацию, согласную официальному серверу:



















Не ну круто, что а где конд на проверку пола? А не где. Мне влом идти на бд руофа и искать ему пруф, по этому идём сюда:

http://l2kc.ru/item/8923 и читаем Шрам. Мужской аксессуар. А теперь создаем персонажа женским полом и выдаём себе этот предмет, и что мы видим баба мужик .

Беру теперь другой предмет 7682.



















Опять таки где реализация официального контента? Хорошо идём смотрим бд

http://l2kc.ru/item/7682 смотрим Головной аксессуар. Только для персонажей женского пола. А теперь заходим на данный сервер и смотрим. Что мужской пол может одеть для женского. Прям гей пати. Ну да офф скрипты придумали масоны и это не как не слитые были с птс офф скрипты. Откуда такая инфа. А база данных тоже врёт ведь единственный офф на Grind-Team и не более

kick 07.08.2015 13:24

Идём в скилы и осуществляем поиск и вы будете шокированы:

Классная реализация и таких 20 файлов забиты подобным бредом. Ну классная реализация скилов, наверное тоже согласно официальному серверу. А сама то реализация у них

kick 07.08.2015 13:25

Предметы не лучше реализованы и большинство их реализовывать надо

kick 07.08.2015 13:26

Прошу совета Как я и писал, но гринд назвал балаболом. Ладно смотрим дальше как это гавно реализовано

kick 07.08.2015 13:28

И при этом он может называть все команды гавном, а свою разработку самой лучшей и согласно официальному серверу и заявлять типо офф скриптов не существует. А так же если напишешь, что его эмулятор хлам то ты балабол

kick 07.08.2015 13:29

Если вы хотите выбрать эмулятор хф, запрашивайте всегда тест сервер и тестируйте с командой и вы сразу увидите разницу. К тому же, что сделано у гринда? Да ничего осталось на уровне 2012 года. К тому же обращайте как человек ведёт себя в обществе если он матерится на каждом углу и позволяет называть каждый эмулятор гавном, я бы задумался а стоит ли вообще покупать такой эмулятор

kick 07.08.2015 13:34

Комментарий от разработчика emerald-game, и видно, что гринд как скрипты вешает себе чужие проекты:

kick 07.08.2015 13:35

Классный комментарий от его же клиентов?

kick 07.08.2015 13:49

Небольшой квестик с огромной подсказкой и так смотрим:

Ищем код в таком стиле:

Убиваем моба, спавнится другой моб которые используют GameObjectStorage притом весь используется и ищет моба с которого он вылупился.

А теперь представьте 1к игроков лупит такого же моба и 1к раз происходит цикл перебора всех в мире.

Дипломированный специалист однако вам скажу.

kick 07.08.2015 13:53

Как я говорил про аугментацию в том посте? Так а что там изменилось, ничего осталось на том же уровне.

[QUOTE="Спойлер"]
[COLOR="#363940"]
package core.gameserver.tables;

import gnu.trove.list.array.TDoubleArrayList;

import gnu.trove.map.hash.TIntObjectHashMap;

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.StringTokenizer;

import javax.xml.parsers.DocumentBuilderFactory;

import core.commons.crypt.CryptUtil;

import core.commons.util.Rnd;

import core.gameserver.Config;

import core.gameserver.stats.Stats;

import core.gameserver.stats.funcs.Func;

import core.gameserver.stats.funcs.FuncAdd;

import core.gameserver.stats.triggers.TriggerInfo;

import core.gameserver.stats.triggers.TriggerType;

import core.gameserver.templates.item.ItemTemplate;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.w3c.dom.Document;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

public class AugmentationData

{

private static final Logger _log = LoggerFactory.getLogger(AugmentationData.class);

private static AugmentationData _Instance;

public static AugmentationData getInstance()

{

if(_Instance == null)

_Instance = new AugmentationData();

return _Instance;

}

// stats

private static final int STAT_START = 1;

private static final int STAT_END = 14560;

private static final int STAT_BLOCKSIZE = 3640;

//private static final int STAT_NUMBEROF_BLOCKS = 4;

private static final int STAT_SUBBLOCKSIZE = 91;

//private static final int STAT_NUMBEROF_SUBBLOCKS = 40;

private static final int STAT_NUM = 13;

private static final byte[] STATS1_MAP = new byte[STAT_SUBBLOCKSIZE];

private static final byte[] STATS2_MAP = new byte[STAT_SUBBLOCKSIZE];

// skills

private static final int BLUE_START = 14561;

// private static final int PURPLE_START = 14578;

// private static final int RED_START = 14685;

private static final int SKILLS_BLOCKSIZE = 178;

// basestats

private static final int BASESTAT_STR = 16341;

private static final int BASESTAT_CON = 16342;

private static final int BASESTAT_INT = 16343;

private static final int BASESTAT_MEN = 16344;

// accessory

private static final int ACC_START = 16669;

private static final int ACC_BLOCKS_NUM = 10;

private static final int ACC_STAT_SUBBLOCKSIZE = 21;

private static final int ACC_STAT_NUM = 6;

private static final int ACC_RING_START = ACC_START;

private static final int ACC_RING_SKILLS = 18;

private static final int ACC_RING_BLOCKSIZE = ACC_RING_SKILLS + 4 * ACC_STAT_SUBBLOCKSIZE;

private static final int ACC_RING_END = ACC_RING_START + ACC_BLOCKS_NUM * ACC_RING_BLOCKSIZE - 1;

private static final int ACC_EAR_START = ACC_RING_END + 1;

private static final int ACC_EAR_SKILLS = 18;

private static final int ACC_EAR_BLOCKSIZE = ACC_EAR_SKILLS + 4 * ACC_STAT_SUBBLOCKSIZE;

private static final int ACC_EAR_END = ACC_EAR_START + ACC_BLOCKS_NUM * ACC_EAR_BLOCKSIZE - 1;

private static final int ACC_NECK_START = ACC_EAR_END + 1;

private static final int ACC_NECK_SKILLS = 24;

private static final int ACC_NECK_BLOCKSIZE = ACC_NECK_SKILLS + 4 * ACC_STAT_SUBBLOCKSIZE;

private static final int ACC_END = ACC_NECK_START + ACC_BLOCKS_NUM * ACC_NECK_BLOCKSIZE;

private static final byte[] ACC_STATS1_MAP = new byte[ACC_STAT_SUBBLOCKSIZE];

private static final byte[] ACC_STATS2_MAP = new byte[ACC_STAT_SUBBLOCKSIZE];

private List[] _augStats = new ArrayList[4];

private List[] _augAccStats = new ArrayList[4];

private List[] _blueSkills = new ArrayList[10];

private List[] _purpleSkills = new ArrayList[10];

private List[] _redSkills = new ArrayList[10];

private List[] _yellowSkills = new ArrayList[10];

private TIntObjectHashMap _allSkills = new TIntObjectHashMap();

public AugmentationData()

{

_log.info("Initializing AugmentationData.");

_augStats[0] = new ArrayList();

_augStats[1] = new ArrayList();

_augStats[2] = new ArrayList();

_augStats[3] = new ArrayList();

_augAccStats[0] = new ArrayList();

_augAccStats[1] = new ArrayList();

_augAccStats[2] = new ArrayList();

_augAccStats[3] = new ArrayList();

// Lookup tables structure: STAT1 represent first stat, STAT2 - second.

// If both values are the same - use solo stat, if different - combined.

int idx;

// weapon augmentation block: solo values first

// 00-00, 01-01 ... 11-11,12-12

for(idx = 0; idx ();

_purpleSkills[I]= new ArrayList();

_redSkills[I]= new ArrayList();

_yellowSkills[I]= new ArrayList();

}

load();

// Use size*4: since theres 4 blocks of stat-data with equivalent size

_log.info("AugmentationData: Loaded: " + _augStats[0].size() * 4 + " augmentation stats.");

_log.info("AugmentationData: Loaded: " + _augAccStats[0].size() * 4 + " accessory augmentation stats.");

for(int i = 0; i = _singleSize || i = _combinedSize || i ) _blueSkills[k]).add(augmentationId);

else if(type.equalsIgnoreCase("purple"))

((List) _purpleSkills[k]).add(augmentationId);

else if(type.equalsIgnoreCase("red"))

((List) _redSkills[k]).add(augmentationId);

_allSkills.put(augmentationId, new TriggerInfo(skillId, skillLvL, t, chance));

}

if(badAugmantData != 0)

_log.info("AugmentationData: " + badAugmantData + " bad skill(s) were skipped.");

}

catch(Exception e)

{

_log.error("Error parsing augmentation_skillmap.xml.", e);

return;

}

// Load the stats from xml

for(int i = 1; i ) _augStats[(i - 1)]).add(new augmentationStat(Stats.valueOfXml(statName), soloValues, combinedValues));

}

}

catch(Exception e)

{

_log.error("Error parsing augmentation_stats" + i + ".xml.", e);

return;

}

try

{

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setValidating(false);

factory.setIgnoringComments(true);

File file = new File(Config.DATAPACK_ROOT, "data/xml/augmentation/augmentation_jewel_stats" + i + ".xml");

FileInputStream stream = new FileInputStream(file);

InputStream output;

if((byte)stream.read() == 0x00)

{

byte[] bytes = new byte[0];

output = new ByteArrayInputStream(bytes);

output = CryptUtil.decrypt(stream, output);

}

else

output = new FileInputStream(file);

Document doc = factory.newDocumentBuilder().parse(output);

for(Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())

if("list".equalsIgnoreCase(n.getNodeName()))

for(Node d = n.getFirstChild(); d != null; d = d.getNextSibling())

if("stat".equalsIgnoreCase(d.getNodeName()))

{

NamedNodeMap attrs = d.getAttributes();

String statName = attrs.getNamedItem("name").getNodeValue();

double soloValues[] = null, combinedValues[] = null;

for(Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling())

if("table".equalsIgnoreCase(cd.getNodeName()))

{

attrs = cd.getAttributes();

String tableName = attrs.getNamedItem("name").getNodeValue();

StringTokenizer data = new StringTokenizer(cd.getFirstChild().getNodeValue()) ;

TDoubleArrayList array = new TDoubleArrayList();

while(data.hasMoreTokens())

array.add(Double.parseDouble(data.nextToken()));

if(tableName.equalsIgnoreCase("#soloValues"))

{

soloValues = new double[array.size()];

int x = 0;

for(double value : array.toArray())

soloValues[x++] = value;

}

else

{

combinedValues = new double[array.size()];

int x = 0;

for(double value : array.toArray())

combinedValues[x++] = value;

}

}

// store this stat

((List) _augAccStats[(i - 1)]).add(new augmentationStat(Stats.valueOfXml(statName), soloValues, combinedValues));

}

}

catch(Exception e)

{

_log.error("Error parsing jewel augmentation_stats" + i + ".xml.", e);

return;

}

}

}

public int generateRandomAugmentation(int lifeStoneLevel, int lifeStoneGrade, int bodyPart)

{

switch(bodyPart)

{

case ItemTemplate.SLOT_L_FINGER:

case ItemTemplate.SLOT_R_FINGER:

case ItemTemplate.SLOT_L_FINGER | ItemTemplate.SLOT_R_FINGER:

case ItemTemplate.SLOT_L_EAR:

case ItemTemplate.SLOT_R_EAR:

case ItemTemplate.SLOT_L_EAR | ItemTemplate.SLOT_R_EAR:

case ItemTemplate.SLOT_NECK:

return generateRandomAccessoryAugmentation(lifeStoneLevel , bodyPart);

default:

return generateRandomWeaponAugmentation(lifeStoneLevel, lifeStoneGrade);

}

}

private int generateRandomWeaponAugmentation(int lifeStoneLevel, int lifeStoneGrade)

{

// Note that stat12 stands for stat 1 AND 2 (same for stat34 ;p )

// this is because a value can contain up to 2 stat modifications

// (there are two int values packed in one integer value, meaning 4 stat modifications at max)

// for more info take a look at getAugStatsById(...)

// Note: lifeStoneGrade: (0 means low grade, 3 top grade)

// First: determine whether we will add a skill/baseStatModifier or not

// because this determine which color could be the result

int stat12 = 0;

int stat34 = 0;

boolean generateSkill = false;

boolean generateGlow = false;

//lifestonelevel is used for stat Id and skill level, but here the max level is 9

lifeStoneLevel = Math.min(lifeStoneLevel, 9);

switch(lifeStoneGrade)

{

case 0:

generateSkill = Rnd.chance(Config.AUGMENTATION_NG_SKILL_CHANCE);

generateGlow = Rnd.chance(Config.AUGMENTATION_NG_GLOW_CHANCE);

break;

case 1:

generateSkill = Rnd.chance(Config.AUGMENTATION_MID_SKILL_CHANCE);

generateGlow = Rnd.chance(Config.AUGMENTATION_MID_GLOW_CHANCE);

break;

case 2:

generateSkill = Rnd.chance(Config.AUGMENTATION_HIGH_SKILL_CHANCE);

generateGlow = Rnd.chance(Config.AUGMENTATION_HIGH_GLOW_CHANCE);

break;

case 3:

generateSkill = Rnd.chance(Config.AUGMENTATION_TOP_SKILL_CHANCE);

generateGlow = Rnd.chance(Config.AUGMENTATION_TOP_GLOW_CHANCE);

break;

}

if(!generateSkill && Rnd.get(1, 100) = 2)

offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + (temp - 2) * STAT_BLOCKSIZE + lifeStoneGrade * 10 * STAT_SUBBLOCKSIZE + 1;

else

offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + (temp - 2) * STAT_BLOCKSIZE + Rnd.get(0, 1) * 10 * STAT_SUBBLOCKSIZE + 1;

}

else if(!generateGlow)

offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + Rnd.get(0, 1) * STAT_BLOCKSIZE + 1;

else

offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + Rnd.get(0, 1) * STAT_BLOCKSIZE + (lifeStoneGrade + resultColor) / 2 * 10 * STAT_SUBBLOCKSIZE + 1;

stat12 = Rnd.get(offset, offset + STAT_SUBBLOCKSIZE - 1);

return ((stat34

kick 07.08.2015 13:57

Прежде чем называть, что у всех гавно прочитать следует данный стих:

От всенощной вечор идя домой (Пушкин) — Викитека

melcor 07.08.2015 14:01

Я конечно извиняюсь, но тему тогда можно переименовывать, ибо 99% кода из оригинального овера. Выводы очевидны - работы было сделано маловато.

kick 07.08.2015 14:05

Цитата:

Сообщение от melcor

Я конечно извиняюсь, но тему тогда можно переименовывать, ибо 99% кода из оригинального овера. Выводы очевидны - работы было сделано маловато.

Нет, это всё вранье

https://grind-team.net/index.php?/to...ge-2-emulator/

Работа над данной игровой платформой была начата в 2012 году. За 3 года они достигли успехов в реализации

kick 07.08.2015 14:13

Смотрим каптчу и видим порт с некстгена.

Давайте посмотрим рыбалку и её реализацию. Рыбалка осталась на том же уровне, притом и награда за неё и прочее. Так вот а как же дневная и ночная рыбалка? как бы есть оно, но тут такого нету.

Цитата:

Сообщение от Спойлер

public class ExFishingStart extends L2GameServerPacket

{

private int _charObjId;

private Location _loc;

private int _fishType;

private boolean _isNightLure;

public ExFishingStart(Creature character, int fishType, Location loc, boolean isNightLure)

{

_charObjId = character.getObjectId();

_fishType = fishType;

_loc = loc;

_isNightLure = isNightLure;

}

@Override

protected final void writeImpl()

{

writeEx(0x1e);

writeD(_charObjId);

writeD(_fishType); // fish type

writeD(_loc.x); // x poisson

writeD(_loc.y); // y poisson

writeD(_loc.z); // z poisson

writeC(_isNightLure ? 0x01 : 0x00); // 0 = day lure 1 = night lure

writeC(0x01); // result Button

}

}

У нас забита нулями, что не верно.

kick 07.08.2015 14:16

Краски смотрим офф скрипт и смотрим реализацию у гринда:

Цитата:

Сообщение от Спойлер

dye_begin dye_name=[dye_s1c3_d] dye_id=1 dye_item_id=4445 dye_level=28 str=1 con=-3 dex=0 int=0 men=0 wit=0 need_count=10 wear_fee=37000 cancel_count=5 cancel_fee=7400 wear_class={11;26;39;1;4;7;19;22;32;35;45;47;54;56 ;15;29;42;50;125;126} dye_end

Цитата:

Сообщение от Спойлер














































И смотрим а где реализация dye_level=28 need_count=10 wear_fee=37000 cancel_count=5 cancel_fee=7400 ? Правильно не где. Но при этом заявление сборка реализована согласна официальному серверу

kick 07.08.2015 14:21

Давайте посмотрим ту же реализацию трансформов которая реализована не верно.

Цитата:

Сообщение от Спойлер

transform_begin // 오닉스 비스트

id = 1 type = COMBAT can_swim = 0 normal_attackable = 1

female_begin

common_begin

collision_box = {12;14.5}

moving_speed = {30; 125; 50; 50; 0; 0; 0; 0}

skill = {[s_transform_power_claw1];[s_transform_fast_moving1];[s_transform_dispel1];[s_transform_slow_attack1]}

additional_skill = {}

action = {1;2;3;4;5;6;7;8;9;11;15;16;17;18;19;21;22;23;32;3 6;39;40;41;42;43;44;45;46;47;48;50;52;53;54;55;56; 57;63;64;65;70;1000;1001;1003;1004;1005;1006;1007; 1008;1009;1010;1011;1012;1013;1014;1015;1016;1017; 1018;1019;1020;1021;1022;1023;1024;1025;1026;1027; 1028;1029;1030;1031;1032;1033;1034;1035;1036;1037; 1038;1039;1040;1041;1042;1043;1044;1045;1046;1047; 1048;1049;1050;1051;1052;1053;1054;1055;1056;1057; 1058;1059;1060;1061;1062;1063;1064;1065;1066;1067; 1068;1069;1070;1071;1072;1073;1074;1075;1076;1077; 1078;1079;1080;1081;1082;1083;1084;1089;1090;1091; 1092;1093;1094;1095;1096;1097;1098}

base_attack_type = sword

// 맨손인 경우에 필요한 것들

base_attack_range = 20

base_random_damage = 10

base_attack_speed = 300

base_critical_prob = 5

base_physical_attack = 5

base_magical_attack = 5

common_end

combat_begin

basic_stat= {40;21;43;30;11;25} // str;int;con;dex;wit;men

base_defend = {31;18;12;7;8;3;1} //맨몸 방어력. {상체;하체;투구;부츠;장갑;속옷;망토} 순서.

base_magic_defend = {9;9;5;5;13} //맨몸 마법 방어력. {오른귀걸이;왼귀걸이;오른반지;왼반 ;목} 순서.

//HP, MP, CP 기본 회복량 : {Lv1; Lv2; Lv3; ... ; Lv99}의 각 레벨별 회복량 집합

org_hp_regen = {2;2.05;2.1;2.15;2.2;2.25;2.3;2.35;2.4;2.45;2.5;2. 6;2.7;2.8;2.9;3;3.1;3.2;3.3;3.4;3.5;3.6;3.7;3.8;3. 9;4;4.1;4.2;4.3;4.4;4.5;4.6;4.7;4.8;4.9;5;5.1;5.2; 5.3;5.4;5.5;5.6;5.7;5.8;5.9;6;6.1;6.2;6.3;6.4;6.5; 6.6;6.7;6.8;6.9;7;7.1;7.2;7.3;7.4;7.5;7.6;7.7;7.8; 7.9;8;8.1;8.2;8.3;8.4;8.5;8.6;8.7;8.8;8.9;9;9.1;9. 2;9.3;9.4;9.5;9.6;9.7;9.8;9.9;10;10.1;10.2;10.3;10 .4;10.5;10.6;10.7;10.8;10.9;11;11.1;11.2;11.3}

org_mp_regen = {0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;1.2;1.2;1 .2;1.2;1.2;1.2;1.2;1.2;1.2;1.2;1.5;1.5;1.5;1.5;1.5 ;1.5;1.5;1.5;1.5;1.5;1.8;1.8;1.8;1.8;1.8;1.8;1.8;1 .8;1.8;1.8;2.1;2.1;2.1;2.1;2.1;2.1;2.1;2.1;2.1;2.1 ;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.7;2.7;2 .7;2.7;2.7;2.7;2.7;2.7;2.7;2.7;3;3;3;3;3;3;3;3;3;3 ;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3}

org_cp_regen = {2;2;2;2;2;2;2;2;2;2;2.5;2.5;2.5;2.5;2.5;2.5;2.5;2 .5;2.5;2.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5 ;4.5;4.5;4.5;4.5;4.5;4.5;4.5;4.5;4.5;4.5;5.5;5.5;5 .5;5.5;5.5;5.5;5.5;5.5;5.5;5.5;6.5;6.5;6.5;6.5;6.5 ;6.5;6.5;6.5;6.5;6.5;7.5;7.5;7.5;7.5;7.5;7.5;7.5;7 .5;7.5;7.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5 ;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8 .5;8.5;8.5;8.5;8.5;8.5;8.5}

level_bonus = {0.90;0.91;0.92;0.93;0.94;0.95;0.96;0.97;0.98;0.99 ;1.00;1.01;1.02;1.03;1.04;1.05;1.06;1.07;1.08;1.09 ;1.10;1.11;1.12;1.13;1.14;1.15;1.16;1.17;1.18;1.19 ;1.20;1.21;1.22;1.23;1.24;1.25;1.26;1.27;1.28;1.29 ;1.30;1.31;1.32;1.33;1.34;1.35;1.36;1.37;1.38;1.39 ;1.40;1.41;1.42;1.43;1.44;1.45;1.46;1.47;1.48;1.49 ;1.50;1.51;1.52;1.53;1.54;1.55;1.56;1.57;1.58;1.59 ;1.60;1.61;1.62;1.63;1.64;1.65;1.66;1.67;1.68;1.69 ;1.70;1.71;1.72;1.73;1.74;1.75;1.76;1.77;1.78;1.79 ;1.80;1.81;1.82;1.83;1.84;1.85;1.86;1.87;1.88}

str_bonus = {-70;-69;-68;-66;-65;-64;-63;-61;-60;-58;-57;-55;-54;-52;-50;-49;-47;-45;-43;-41;-39;-37;-34;-32;-29;-27;-24;-22;-19;-16;-13;-10;-6;-3;1;4;8;12;16;20;24;29;33;38;43;48;54;59;65;71;77; 83;90;97;104;111;119;127;135;143;152;161;171;180;1 91;201;212;223;235;247;259;272;286;299;314;329;344 ;360;377;394;412;430;449;469;489;511;533;555;579;6 03;629;655;682;710;739;770;801;833;867}

int_bonus = {-45;-44;-43;-42;-41;-39;-38;-37;-36;-35;-33;-32;-31;-29;-28;-26;-25;-23;-22;-20;-19;-17;-15;-14;-12;-10;-8;-6;-5;-3;-1;1;3;5;7;10;12;14;16;19;21;23;26;28;31;34;36;39;4 2;45;47;50;53;57;60;63;66;69;73;76;80;83;87;91;95; 99;102;107;111;115;119;124;128;133;137;142;147;152 ;157;162;167;173;178;184;189;195;201;207;213;219;2 26;232;239;246;253;260;267;274;282}

con_bonus = {-54;-53;-52;-50;-49;-47;-46;-44;-42;-41;-39;-37;-35;-33;-31;-29;-27;-25;-23;-20;-18;-15;-13;-10;-7;-5;-2;1;4;7;10;14;17;21;24;28;32;36;40;44;48;53;58;62; 67;72;77;83;88;94;100;106;112;118;125;131;138;145; 153;160;168;176;184;193;202;211;220;230;240;250;26 0;271;282;294;306;318;330;343;356;370;384;399;414; 429;445;461;478;496;513;532;551;570;590;611;633;65 4;677;700;724}

dex_bonus = {-15;-14;-14;-13;-12;-11;-10;-10;-9;-8;-7;-6;-6;-5;-4;-3;-2;-1;0;1;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18 ;19;20;21;22;24;25;26;27;28;29;30;32;33;34;35;36;3 8;39;40;41;43;44;45;47;48;49;51;52;53;55;56;57;59; 60;62;63;65;66;68;69;71;72;74;75;77;78;80;82;83;85 ;87;88;90;92;93;95;97;99;100;102;104}

wit_bonus = {-60;-58;-56;-54;-52;-49;-47;-44;-42;-39;-36;-32;-29;-25;-22;-18;-14;-9;-5;0;5;10;16;22;28;34;41;48;55;63;71;80;89;98;108;1 18;129;141;153;165;179;193;207;223;239;256;273;292 ;312;332;354;376;400;425;452;479;508;539;570;604;6 39;676;715;756;799;843;891;940;992;1047;1104;1164; 1227;1294;1364;1437;1514;1594;1679;1768;1861;1959; 2062;2170;2284;2403;2528;2660;2798;2943;3095;3255; 3422;3598;3783;3977;4181;4395;4620}

men_bonus = {1;2;3;4;5;6;7;8;9;11;12;13;14;15;16;17;19;20;21;2 2;23;25;26;27;28;30;31;32;34;35;36;38;39;40;42;43; 45;46;48;49;50;52;53;55;57;58;60;61;63;65;66;68;70 ;71;73;75;76;78;80;82;84;85;87;89;91;93;95;97;99;1 01;103;105;107;109;111;113;115;117;120;122;124;126 ;129;131;133;135;138;140;143;145;147;150;152;155;1 58;160;163;165;168}

hp_table = {80.8;92.7483;104.8279;117.0388;129.381;143.259;15 5.9886;168.8508;181.8456;194.973;210.2745;223.7984 ;237.4562;251.2479;265.1735;281.944;296.2752;310.7 416;325.3432;340.08;374.535;406.0035;437.7555;469. 791;502.11;539.805;573.0042;606.4896;640.2612;674. 319;715.3485;750.3054;785.5512;821.0859;856.9095;9 01.368;938.1096;975.1428;1012.4676;1050.084;1110.8 19;1162.2234;1214.0202;1266.2094;1318.791;1384.35; 1438.206;1492.458;1547.106;1616.715;1672.659;1729. 0026;1785.7458;1826.286;1883.31;1923.087;1980.3774 ;2019.3624;2057.6742;2075.535;2091.621;2105.9106;2 139.78;2129.0142;2137.785;2144.673;2149.6566;2176. 902;2178.5808;2178.294;2176.02;2171.7372;2165.424; 2184.7134;2203.11;2220.603;2237.1816;2252.835;2267 .5524;2281.323;2294.136;2305.9806;2316.846;2326.72 14;2335.596;2343.459;2350.2996;2356.107;2360.8704; 2364.579;2367.222;2368.7886;2369.268;2368.6494;236 6.922;2364.075;2360.0976;2354.979;2348.7084}

mp_table = {30.3;35.8146;41.3898;47.0256;52.722;59.058;64.933 2;70.8696;76.8672;82.926;89.919;96.1608;102.4644;1 08.8298;115.257;122.928;129.5424;136.2192;142.9584 ;149.76;161.595;172.0845;182.6685;193.347;204.12;2 17.035;228.1014;239.2632;250.5204;261.873;275.8995 ;287.5518;299.3004;311.1453;323.0865;338.256;350.5 032;362.8476;375.2892;387.828;412.674;434.0925;455 .6745;477.42;499.329;526.185;548.625;571.23;594;62 2.5435;645.8535;669.33;692.973;710.325;734.085;751 .119;774.99;791.694;808.1175;816.48;824.103;830.97 75;845.55;842.445;847.02;850.8105;853.8075;865.62; 867.24;868.041;868.014;867.15;865.44;873.9375;882. 063;889.812;897.18;904.1625;910.755;916.953;922.75 2;928.1475;933.135;937.71;941.868;945.6045;948.915 ;951.795;954.24;956.2455;957.807;958.92;959.58;959 .7825;959.523;958.797;957.6;955.9275;953.775}

cp_table = {40.4;46.37415;52.41395;58.5194;64.6905;71.6295;77 .9943;84.4254;90.9228;97.4865;105.13725;111.8992;1 18.7281;125.62395;132.58675;140.972;148.1376;155.3 708;162.6716;170.04;187.2675;203.00175;218.87775;2 34.8955;251.055;269.9025;286.5021;303.2448;320.130 6;337.1595;357.67425;375.1527;392.7756;410.54295;4 28.45475;450.684;469.0548;487.5714;506.2338;525.04 2;555.4095;581.1117;607.0101;633.1047;659.3955;692 .175;719.103;746.229;773.553;808.3575;836.3295;864 .5013;892.8729;913.143;941.655;961.5435;990.1887;1 009.6812;1028.8371;1037.7675;1045.8105;1052.9553;1 069.89;1064.5071;1068.8925;1072.3365;1074.8283;108 8.451;1089.2904;1089.147;1088.01;1085.8686;1082.71 2;1092.3567;1101.555;1110.3015;1118.5908;1126.4175 ;1133.7762;1140.6615;1147.068;1152.9903;1158.423;1 163.3607;1167.798;1171.7295;1175.1498;1178.0535;11 80.4352;1182.2895;1183.611;1184.3943;1184.634;1184 .3247;1183.461;1182.0375;1180.0488;1177.4895;1174. 3542}

combat_end

female_end

male_begin

common_begin

collision_box = {12;14.5}

moving_speed = {30; 125; 50; 50; 0; 0; 0; 0}

skill = {[s_transform_power_claw1];[s_transform_fast_moving1];[s_transform_dispel1];[s_transform_slow_attack1]}

additional_skill = {}

action = {1;2;3;4;5;6;7;8;9;11;15;16;17;18;19;21;22;23;32;3 6;39;40;41;42;43;44;45;46;47;48;50;52;53;54;55;56; 57;63;64;65;70;1000;1001;1003;1004;1005;1006;1007; 1008;1009;1010;1011;1012;1013;1014;1015;1016;1017; 1018;1019;1020;1021;1022;1023;1024;1025;1026;1027; 1028;1029;1030;1031;1032;1033;1034;1035;1036;1037; 1038;1039;1040;1041;1042;1043;1044;1045;1046;1047; 1048;1049;1050;1051;1052;1053;1054;1055;1056;1057; 1058;1059;1060;1061;1062;1063;1064;1065;1066;1067; 1068;1069;1070;1071;1072;1073;1074;1075;1076;1077; 1078;1079;1080;1081;1082;1083;1084;1089;1090;1091; 1092;1093;1094;1095;1096;1097;1098}

base_attack_type = sword

// 맨손인 경우에 필요한 것들

base_attack_range = 20

base_random_damage = 10

base_attack_speed = 300

base_critical_prob = 5

base_physical_attack = 5

base_magical_attack = 5

common_end

combat_begin

basic_stat= {40;21;43;30;11;25}

base_defend = {31;18;12;7;8;3;1} //맨몸 방어력. {상체;하체;투구;부츠;장갑;속옷;망토} 순서.

base_magic_defend = {9;9;5;5;13} //맨몸 마법 방어력. {오른귀걸이;왼귀걸이;오른반지;왼반 ;목} 순서.

//HP, MP, CP 기본 회복량 : {Lv1; Lv2; Lv3; ... ; Lv99}의 각 레벨별 회복량 집합

org_hp_regen = {2;2.05;2.1;2.15;2.2;2.25;2.3;2.35;2.4;2.45;2.5;2. 6;2.7;2.8;2.9;3;3.1;3.2;3.3;3.4;3.5;3.6;3.7;3.8;3. 9;4;4.1;4.2;4.3;4.4;4.5;4.6;4.7;4.8;4.9;5;5.1;5.2; 5.3;5.4;5.5;5.6;5.7;5.8;5.9;6;6.1;6.2;6.3;6.4;6.5; 6.6;6.7;6.8;6.9;7;7.1;7.2;7.3;7.4;7.5;7.6;7.7;7.8; 7.9;8;8.1;8.2;8.3;8.4;8.5;8.6;8.7;8.8;8.9;9;9.1;9. 2;9.3;9.4;9.5;9.6;9.7;9.8;9.9;10;10.1;10.2;10.3;10 .4;10.5;10.6;10.7;10.8;10.9;11;11.1;11.2;11.3}

org_mp_regen = {0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;1.2;1.2;1 .2;1.2;1.2;1.2;1.2;1.2;1.2;1.2;1.5;1.5;1.5;1.5;1.5 ;1.5;1.5;1.5;1.5;1.5;1.8;1.8;1.8;1.8;1.8;1.8;1.8;1 .8;1.8;1.8;2.1;2.1;2.1;2.1;2.1;2.1;2.1;2.1;2.1;2.1 ;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.4;2.7;2.7;2 .7;2.7;2.7;2.7;2.7;2.7;2.7;2.7;3;3;3;3;3;3;3;3;3;3 ;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3}

org_cp_regen = {2;2;2;2;2;2;2;2;2;2;2.5;2.5;2.5;2.5;2.5;2.5;2.5;2 .5;2.5;2.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5;3.5 ;4.5;4.5;4.5;4.5;4.5;4.5;4.5;4.5;4.5;4.5;5.5;5.5;5 .5;5.5;5.5;5.5;5.5;5.5;5.5;5.5;6.5;6.5;6.5;6.5;6.5 ;6.5;6.5;6.5;6.5;6.5;7.5;7.5;7.5;7.5;7.5;7.5;7.5;7 .5;7.5;7.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5 ;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8.5;8 .5;8.5;8.5;8.5;8.5;8.5;8.5}

level_bonus = {0.90;0.91;0.92;0.93;0.94;0.95;0.96;0.97;0.98;0.99 ;1.00;1.01;1.02;1.03;1.04;1.05;1.06;1.07;1.08;1.09 ;1.10;1.11;1.12;1.13;1.14;1.15;1.16;1.17;1.18;1.19 ;1.20;1.21;1.22;1.23;1.24;1.25;1.26;1.27;1.28;1.29 ;1.30;1.31;1.32;1.33;1.34;1.35;1.36;1.37;1.38;1.39 ;1.40;1.41;1.42;1.43;1.44;1.45;1.46;1.47;1.48;1.49 ;1.50;1.51;1.52;1.53;1.54;1.55;1.56;1.57;1.58;1.59 ;1.60;1.61;1.62;1.63;1.64;1.65;1.66;1.67;1.68;1.69 ;1.70;1.71;1.72;1.73;1.74;1.75;1.76;1.77;1.78;1.79 ;1.80;1.81;1.82;1.83;1.84;1.85;1.86;1.87;1.88}

str_bonus = {-70;-69;-68;-66;-65;-64;-63;-61;-60;-58;-57;-55;-54;-52;-50;-49;-47;-45;-43;-41;-39;-37;-34;-32;-29;-27;-24;-22;-19;-16;-13;-10;-6;-3;1;4;8;12;16;20;24;29;33;38;43;48;54;59;65;71;77; 83;90;97;104;111;119;127;135;143;152;161;171;180;1 91;201;212;223;235;247;259;272;286;299;314;329;344 ;360;377;394;412;430;449;469;489;511;533;555;579;6 03;629;655;682;710;739;770;801;833;867}

int_bonus = {-45;-44;-43;-42;-41;-39;-38;-37;-36;-35;-33;-32;-31;-29;-28;-26;-25;-23;-22;-20;-19;-17;-15;-14;-12;-10;-8;-6;-5;-3;-1;1;3;5;7;10;12;14;16;19;21;23;26;28;31;34;36;39;4 2;45;47;50;53;57;60;63;66;69;73;76;80;83;87;91;95; 99;102;107;111;115;119;124;128;133;137;142;147;152 ;157;162;167;173;178;184;189;195;201;207;213;219;2 26;232;239;246;253;260;267;274;282}

con_bonus = {-54;-53;-52;-50;-49;-47;-46;-44;-42;-41;-39;-37;-35;-33;-31;-29;-27;-25;-23;-20;-18;-15;-13;-10;-7;-5;-2;1;4;7;10;14;17;21;24;28;32;36;40;44;48;53;58;62; 67;72;77;83;88;94;100;106;112;118;125;131;138;145; 153;160;168;176;184;193;202;211;220;230;240;250;26 0;271;282;294;306;318;330;343;356;370;384;399;414; 429;445;461;478;496;513;532;551;570;590;611;633;65 4;677;700;724}

dex_bonus = {-15;-14;-14;-13;-12;-11;-10;-10;-9;-8;-7;-6;-6;-5;-4;-3;-2;-1;0;1;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18 ;19;20;21;22;24;25;26;27;28;29;30;32;33;34;35;36;3 8;39;40;41;43;44;45;47;48;49;51;52;53;55;56;57;59; 60;62;63;65;66;68;69;71;72;74;75;77;78;80;82;83;85 ;87;88;90;92;93;95;97;99;100;102;104}

wit_bonus = {-60;-58;-56;-54;-52;-49;-47;-44;-42;-39;-36;-32;-29;-25;-22;-18;-14;-9;-5;0;5;10;16;22;28;34;41;48;55;63;71;80;89;98;108;1 18;129;141;153;165;179;193;207;223;239;256;273;292 ;312;332;354;376;400;425;452;479;508;539;570;604;6 39;676;715;756;799;843;891;940;992;1047;1104;1164; 1227;1294;1364;1437;1514;1594;1679;1768;1861;1959; 2062;2170;2284;2403;2528;2660;2798;2943;3095;3255; 3422;3598;3783;3977;4181;4395;4620}

men_bonus = {1;2;3;4;5;6;7;8;9;11;12;13;14;15;16;17;19;20;21;2 2;23;25;26;27;28;30;31;32;34;35;36;38;39;40;42;43; 45;46;48;49;50;52;53;55;57;58;60;61;63;65;66;68;70 ;71;73;75;76;78;80;82;84;85;87;89;91;93;95;97;99;1 01;103;105;107;109;111;113;115;117;120;122;124;126 ;129;131;133;135;138;140;143;145;147;150;152;155;1 58;160;163;165;168}

hp_table = {80.8;92.7483;104.8279;117.0388;129.381;143.259;15 5.9886;168.8508;181.8456;194.973;210.2745;223.7984 ;237.4562;251.2479;265.1735;281.944;296.2752;310.7 416;325.3432;340.08;374.535;406.0035;437.7555;469. 791;502.11;539.805;573.0042;606.4896;640.2612;674. 319;715.3485;750.3054;785.5512;821.0859;856.9095;9 01.368;938.1096;975.1428;1012.4676;1050.084;1110.8 19;1162.2234;1214.0202;1266.2094;1318.791;1384.35; 1438.206;1492.458;1547.106;1616.715;1672.659;1729. 0026;1785.7458;1826.286;1883.31;1923.087;1980.3774 ;2019.3624;2057.6742;2075.535;2091.621;2105.9106;2 139.78;2129.0142;2137.785;2144.673;2149.6566;2176. 902;2178.5808;2178.294;2176.02;2171.7372;2165.424; 2184.7134;2203.11;2220.603;2237.1816;2252.835;2267 .5524;2281.323;2294.136;2305.9806;2316.846;2326.72 14;2335.596;2343.459;2350.2996;2356.107;2360.8704; 2364.579;2367.222;2368.7886;2369.268;2368.6494;236 6.922;2364.075;2360.0976;2354.979;2348.7084}

mp_table = {30.3;35.8146;41.3898;47.0256;52.722;59.058;64.933 2;70.8696;76.8672;82.926;89.919;96.1608;102.4644;1 08.8298;115.257;122.928;129.5424;136.2192;142.9584 ;149.76;161.595;172.0845;182.6685;193.347;204.12;2 17.035;228.1014;239.2632;250.5204;261.873;275.8995 ;287.5518;299.3004;311.1453;323.0865;338.256;350.5 032;362.8476;375.2892;387.828;412.674;434.0925;455 .6745;477.42;499.329;526.185;548.625;571.23;594;62 2.5435;645.8535;669.33;692.973;710.325;734.085;751 .119;774.99;791.694;808.1175;816.48;824.103;830.97 75;845.55;842.445;847.02;850.8105;853.8075;865.62; 867.24;868.041;868.014;867.15;865.44;873.9375;882. 063;889.812;897.18;904.1625;910.755;916.953;922.75 2;928.1475;933.135;937.71;941.868;945.6045;948.915 ;951.795;954.24;956.2455;957.807;958.92;959.58;959 .7825;959.523;958.797;957.6;955.9275;953.775}

cp_table = {40.4;46.37415;52.41395;58.5194;64.6905;71.6295;77 .9943;84.4254;90.9228;97.4865;105.13725;111.8992;1 18.7281;125.62395;132.58675;140.972;148.1376;155.3 708;162.6716;170.04;187.2675;203.00175;218.87775;2 34.8955;251.055;269.9025;286.5021;303.2448;320.130 6;337.1595;357.67425;375.1527;392.7756;410.54295;4 28.45475;450.684;469.0548;487.5714;506.2338;525.04 2;555.4095;581.1117;607.0101;633.1047;659.3955;692 .175;719.103;746.229;773.553;808.3575;836.3295;864 .5013;892.8729;913.143;941.655;961.5435;990.1887;1 009.6812;1028.8371;1037.7675;1045.8105;1052.9553;1 069.89;1064.5071;1068.8925;1072.3365;1074.8283;108 8.451;1089.2904;1089.147;1088.01;1085.8686;1082.71 2;1092.3567;1101.555;1110.3015;1118.5908;1126.4175 ;1133.7762;1140.6615;1147.068;1152.9903;1158.423;1 163.3607;1167.798;1171.7295;1175.1498;1178.0535;11 80.4352;1182.2895;1183.611;1184.3943;1184.634;1184 .3247;1183.461;1182.0375;1180.0488;1177.4895;1174. 3542}

combat_end

male_end

transform_end

Цитата:

Сообщение от Спойлер

У лыжи более менее верно.

А теперь смотрим дальше

Цитата:

Сообщение от Спойлер

Основано всё на базе npc и прописаны тут data/npc - и в корне не верно.

А так же мега реализация в Player:

/**

* Устанавливает режим трансформаии

*

* @param transformationId идентификатор трансформации

* Известные режимы:

* 0 - стандартный вид чара

* 1 - Onyx Beast

* 2 - Death Blader

* etc.

*/

public void setTransformation(int transformationId)

{

if(transformationId == _transformationId || _transformationId != 0 && transformationId != 0)

return;

// Для каждой трансформации свой набор скилов

if(transformationId == 0) // Обычная форма

{

// Останавливаем текущий эффект трансформации

for(Effect effect : getEffectList().getAllEffects())

if(effect != null && effect.getEffectType() == EffectType.Transformation)

{

if (effect.calc() == 0) // Не обрываем Dispel

continue;

effect.exit();

preparateToTransform(effect.getSkill());

break;

}

// Удаляем скилы трансформации

if(!_transformationSkills.isEmpty())

{

for(Skill s : _transformationSkills.values())

if(!s.isCommon() && !SkillAcquireHolder.getInstance().isSkillPossible( this, s) && !s.isHeroic())

super.removeSkill(s);

_transformationSkills.clear();

}

}

else

{

int _id = 0;

int _level = 1;

final int baseClassId = getBaseClassIdRvRMode();

switch(baseClassId)

{

case 97://Cardinal

_id = 24001;

break;

case 98://Hierophant

_id = 24002;

break;

case 100://SwordMuse

_id = 24003;

break;

case 105://EvaSaint

_id = 24004;

break;

case 107://SpectralDancer

_id = 24005;

break;

case 112://ShillienSaint

_id = 24006;

break;

case 115://Dominator

_id = 24007;

break;

case 116://Doomcryer

_id = 24008;

break;

}

Skill _skill = SkillTable.getInstance().getInfo(_id, _level);

if(_skill != null)

{

super.removeSkill(_skill);

removeSkillFromShortCut(_skill.getId());

}

if(!isCursedWeaponEquipped())

{

// Добавляем скилы трансформации

for(Effect effect : getEffectList().getAllEffects())

if(effect != null && effect.getEffectType() == EffectType.Transformation)

{

if(effect.getSkill() instanceof Transformation && ((Transformation) effect.getSkill()).isDisguise)

{

for(Skill s : getAllSkills())

if(s != null && (s.isActive() || s.isToggle()))

_transformationSkills.put(s.getId(), s);

}

else

for(AddedSkill s : effect.getSkill().getAddedSkills())

if(s.level == 0) // трансформация позволяет пользоваться обычным скиллом

{

int s2 = getSkillLevel(s.id);

if(s2 > 0)

_transformationSkills.put(s.id, SkillTable.getInstance().getInfo(s.id, s2));

}

else if(s.level == -2) // XXX: дикий изжоп для скиллов зависящих от уровня игрока

{

int learnLevel = Math.max(effect.getSkill().getMagicLevel(), 40);

int maxLevel = SkillTable.getInstance().getBaseLevel(s.id);

int curSkillLevel = 1;

if(maxLevel > 3)

curSkillLevel += getLevel() - learnLevel;

else

curSkillLevel += (getLevel() - learnLevel) / ((76 - learnLevel) / maxLevel); // не спрашивайте меня что это такое

curSkillLevel = Math.min(Math.max(curSkillLevel, 1), maxLevel);

_transformationSkills.put(s.id, SkillTable.getInstance().getInfo(s.id, curSkillLevel));

}

else

_transformationSkills.put(s.id, s.getSkill());

preparateToTransform(effect.getSkill());

break;

}

}

else

preparateToTransform(null);

if(!isInOlympiadMode() && !isCursedWeaponEquipped() && _hero && baseClassId == getActiveClassId())

{

// Добавляем хиро скиллы проклятому трансформу

_transformationSkills.put(395, SkillTable.getInstance().getInfo(395, 1));

_transformationSkills.put(396, SkillTable.getInstance().getInfo(396, 1));

_transformationSkills.put(1374, SkillTable.getInstance().getInfo(1374, 1));

_transformationSkills.put(1375, SkillTable.getInstance().getInfo(1375, 1));

_transformationSkills.put(1376, SkillTable.getInstance().getInfo(1376, 1));

}

for(Skill s : _transformationSkills.values())

addSkill(s, false);

}

_transformationId = transformationId;

sendPacket(new ExBasicActionList(this));

sendPacket(new SkillList(this));

sendPacket(new ShortCutInit(this));

for(int shotId : getAutoSoulShot())

sendPacket(new ExAutoSoulShot(shotId, true));

broadcastUserInfo(true);

}


kick 07.08.2015 14:22

Единственно, что верное в трансформах так это скилы сделаны у гринда, и то не совсем даже и верно

0wn3d 07.08.2015 15:08

Давай уже сразу фул сет скриптов OFF HF

А то по кусочках

kick 07.08.2015 15:10

Цитата:

Сообщение от Creo

Давай уже сразу фул сет скриптов OFF HF
А то по кусочках

А я не даю с скриптов OFF HF, я даю только с шарных скриптов Freya.

Скрипт - Freya scripts


Время: 08:30