shadowcat 10 Опубликовано 15 августа, 2014 (изменено) Всем привет, хочу обратиться к знатокам за помощью. Хочу организовать выдачу случайного предмета из списка, в котором записаны шансы и количество предметов. Нашел примерно как это работает в эвентах CofferofShadows и L2Day Вот пример package events.CofferofShadows;import java.util.HashMap;import java.util.Map.Entry;import l2p.Config;import l2p.extensions.scripts.ScriptFile;import l2p.gameserver.handler.IItemHandler;import l2p.gameserver.handler.ItemHandler;import l2p.gameserver.model.L2Drop;import l2p.gameserver.model.L2DropData;import l2p.gameserver.model.L2Playable;import l2p.gameserver.model.L2Player;import l2p.gameserver.model.items.L2ItemInstance;import l2p.gameserver.serverpackets.SystemMessage;import l2p.gameserver.xml.ItemTemplates;import l2p.commons.random.Rnd;public class Coffer implements IItemHandler, ScriptFile{// Дроп для эвентого СЃСѓРЅРґСѓРєР° Coffer of Shadowsprivate static final int[] _itemIds = { 8659 };protected static final L2DropData[] _dropmats = new L2DropData[] {// Item Chance// Материалыnew L2DropData(4041, 1, 1, 250, 1), // Mold Hardener 0.025%new L2DropData(4042, 1, 1, 450, 1), // Enria 0.045%new L2DropData(4040, 1, 1, 500, 1), // Mold Lubricant 0.05%new L2DropData(1890, 1, 3, 833, 1), // Mithril Alloy 0.0833%new L2DropData(5550, 1, 3, 833, 1), // Durable Metal Plate 0.0833%new L2DropData(4039, 1, 1, 833, 1), // Mold Glue 0.0833%new L2DropData(4043, 1, 1, 833, 1), // Asofe 0.0833%new L2DropData(4044, 1, 1, 833, 1), // Thons 0.0833%new L2DropData(1888, 1, 3, 1000, 1), // Synthetic Cokes 0.1%new L2DropData(1877, 1, 3, 1000, 1), // Adamantite Nugget 0.1%new L2DropData(1894, 1, 3, 3000, 1), // Crafted Leather 0.3%new L2DropData(1874, 1, 5, 3000, 1), // Oriharukon Ore 0.3%new L2DropData(1875, 1, 5, 3000, 1), // Stone of Purity 0.3%new L2DropData(1887, 1, 3, 3000, 1), // Varnish of Purity 0.3%new L2DropData(1866, 1, 10, 16666, 1), // Suede 1.6666%new L2DropData(1882, 1, 10, 16666, 1), // Leather 1.6666%new L2DropData(1881, 1, 10, 10000, 1), // Coarse Bone Powder 1%new L2DropData(1873, 1, 10, 10000, 1), // Silver Nugget 1%new L2DropData(1879, 1, 5, 10000, 1), // Cokes 1%new L2DropData(1880, 1, 5, 10000, 1), // Steel 1%new L2DropData(1876, 1, 5, 10000, 1), // Mithril Ore 1%new L2DropData(1864, 1, 20, 25000, 1), // Stem 2.5%new L2DropData(1865, 1, 20, 25000, 1), // Varnish 2.5%new L2DropData(1868, 1, 15, 25000, 1), // Thread 2.5%new L2DropData(1869, 1, 15, 25000, 1), // Iron Ore 2.5%new L2DropData(1870, 1, 15, 25000, 1), // Coal 2.5%new L2DropData(1871, 1, 15, 25000, 1), // Charcoal 2.5%new L2DropData(1872, 1, 20, 30000, 1), // Animal Bone 3%new L2DropData(1867, 1, 20, 33333, 1), // Animal Skin 3.3333%};protected static final L2DropData[] _dropacc = new L2DropData[] {// Аксессуары Рё сувенирыnew L2DropData(8660, 1, 1, 1000, 1), // Demon Horns 0.1%new L2DropData(8661, 1, 1, 1000, 1), // Mask of Spirits 0.1%new L2DropData(4393, 1, 1, 300, 1), // Calculator 0.03%new L2DropData(5590, 1, 1, 200, 1), // Squeaking Shoes 0.02%new L2DropData(7058, 1, 1, 50, 1), // Chrono Darbuka 0.005%new L2DropData(8350, 1, 1, 50, 1), // Chrono Maracas 0.005%new L2DropData(5133, 1, 1, 50, 1), // Chrono Unitus 0.005%new L2DropData(5817, 1, 1, 50, 1), // Chrono Campana 0.005%new L2DropData(9140, 1, 1, 30, 1), // Salvation Bow 0.003%// Призрачные аксессуары - шанс 0.01%new L2DropData(9177, 1, 1, 100, 1), // Teddy Bear Hat - Blessed Resurrection Effectnew L2DropData(9178, 1, 1, 100, 1), // Piggy Hat - Blessed Resurrection Effectnew L2DropData(9179, 1, 1, 100, 1), // Jester Hat - Blessed Resurrection Effectnew L2DropData(9180, 1, 1, 100, 1), // Wizard's Hat - Blessed Resurrection Effectnew L2DropData(9181, 1, 1, 100, 1), // Dapper Cap - Blessed Resurrection Effectnew L2DropData(9182, 1, 1, 100, 1), // Romantic Chapeau - Blessed Resurrection Effectnew L2DropData(9183, 1, 1, 100, 1), // Iron Circlet - Blessed Resurrection Effectnew L2DropData(9184, 1, 1, 100, 1), // Teddy Bear Hat - Blessed Escape Effectnew L2DropData(9185, 1, 1, 100, 1), // Piggy Hat - Blessed Escape Effectnew L2DropData(9186, 1, 1, 100, 1), // Jester Hat - Blessed Escape Effectnew L2DropData(9187, 1, 1, 100, 1), // Wizard's Hat - Blessed Escape Effectnew L2DropData(9188, 1, 1, 100, 1), // Dapper Cap - Blessed Escape Effectnew L2DropData(9189, 1, 1, 100, 1), // Romantic Chapeau - Blessed Escape Effectnew L2DropData(9190, 1, 1, 100, 1), // Iron Circlet - Blessed Escape Effectnew L2DropData(9191, 1, 1, 100, 1), // Teddy Bear Hat - Big Headnew L2DropData(9192, 1, 1, 100, 1), // Piggy Hat - Big Headnew L2DropData(9193, 1, 1, 100, 1), // Jester Hat - Big Headnew L2DropData(9194, 1, 1, 100, 1), // Wizard Hat - Big Headnew L2DropData(9195, 1, 1, 100, 1), // Dapper Hat - Big Headnew L2DropData(9196, 1, 1, 100, 1), // Romantic Chapeau - Big Headnew L2DropData(9197, 1, 1, 100, 1), // Iron Circlet - Big Headnew L2DropData(9198, 1, 1, 100, 1), // Teddy Bear Hat - Fireworknew L2DropData(9199, 1, 1, 100, 1), // Piggy Hat - Fireworknew L2DropData(9200, 1, 1, 100, 1), // Jester Hat - Fireworknew L2DropData(9201, 1, 1, 100, 1), // Wizard's Hat - Fireworknew L2DropData(9202, 1, 1, 100, 1), // Dapper Hat - Fireworknew L2DropData(9203, 1, 1, 100, 1), // Romantic Chapeau - Fireworknew L2DropData(9204, 1, 1, 100, 1) // Iron Circlet - Firework};protected static final L2DropData[] _dropevents = new L2DropData[] {// Рвентовые скролыnew L2DropData(9146, 1, 1, 3000, 1), // Scroll of Guidance 0.3%new L2DropData(9147, 1, 1, 3000, 1), // Scroll of Death Whisper 0.3%new L2DropData(9148, 1, 1, 3000, 1), // Scroll of Focus 0.3%new L2DropData(9149, 1, 1, 3000, 1), // Scroll of Acumen 0.3%new L2DropData(9150, 1, 1, 3000, 1), // Scroll of Haste 0.3%new L2DropData(9151, 1, 1, 3000, 1), // Scroll of Agility 0.3%new L2DropData(9152, 1, 1, 3000, 1), // Scroll of Empower 0.3%new L2DropData(9153, 1, 1, 3000, 1), // Scroll of Might 0.3%new L2DropData(9154, 1, 1, 3000, 1), // Scroll of Wind Walk 0.3%new L2DropData(9155, 1, 1, 3000, 1), // Scroll of Shield 0.3%new L2DropData(9156, 1, 1, 2000, 1), // BSoE 0.2%new L2DropData(9157, 1, 1, 1000, 1), // BRES 0.1%// Хламnew L2DropData(5234, 1, 5, 25000, 1), // Mystery Potion 2.5%new L2DropData(7609, 50, 100, 24000, 1), // Proof of Catching a Fish 1.2%new L2DropData(7562, 2, 4, 10000, 1), // Dimensional Diamond 0.1%new L2DropData(6415, 1, 3, 20000, 1), // Ugly Green Fish 0.1%new L2DropData(1461, 1, 3, 15000, 1), // Crystal: A-Grade 0.5%new L2DropData(6406, 1, 3, 20000, 1), // Firework 1%new L2DropData(6407, 1, 1, 20000, 1), // Large Firework 1%new L2DropData(6403, 1, 5, 20000, 1), // Star Shard 1%new L2DropData(6036, 1, 5, 30000, 1), // GMHP 1%new L2DropData(5595, 1, 1, 15000, 1), // SP Scroll: High Grade 1%new L2DropData(9898, 1, 1, 6000, 1), // SP Scroll: Highest Grade 0.3%new L2DropData(1374, 1, 5, 20000, 1), // GHP 1%new L2DropData(1375, 1, 5, 20000, 1), // GSAP 1%new L2DropData(1540, 1, 3, 20000, 1), // Quick Healing Potion 1%new L2DropData(5126, 1, 1, 1000, 1) // Dualsword Craft Stamp 0.1%};protected static final L2DropData[] _dropench = new L2DropData[] {// Заточкиnew L2DropData(955, 1, 1, 400, 1), // EWD 0.04%new L2DropData(956, 1, 1, 2000, 1), // EAD 0.2%new L2DropData(951, 1, 1, 300, 1), // EWC 0.03%new L2DropData(952, 1, 1, 1500, 1), // EAC 0.15%new L2DropData(947, 1, 1, 200, 1), // EWB 0.02%new L2DropData(948, 1, 1, 1000, 1), // EAB 0.1%new L2DropData(729, 1, 1, 100, 1), // EWA 0.01%new L2DropData(730, 1, 1, 500, 1), // EAA 0.05%new L2DropData(959, 1, 1, 50, 1), // EWS 0.005%new L2DropData(960, 1, 1, 300, 1), // EAS 0.03%// Soul Cry 11-14 lvlnew L2DropData(5577, 1, 1, 90, 1), // Red 11 0.009%new L2DropData(5578, 1, 1, 90, 1), // Green 11 0.009%new L2DropData(5579, 1, 1, 90, 1), // Blue 11 0.009%new L2DropData(5580, 1, 1, 70, 1), // Red 12 0.007%new L2DropData(5581, 1, 1, 70, 1), // Green 12 0.007%new L2DropData(5582, 1, 1, 70, 1), // Blue 12 0.007%new L2DropData(5908, 1, 1, 50, 1), // Red 13 0.005%new L2DropData(5911, 1, 1, 50, 1), // Green 13 0.005%new L2DropData(5914, 1, 1, 50, 1), // Blue 13 0.005%new L2DropData(9570, 1, 1, 30, 1), // Red 14 0.003%new L2DropData(9571, 1, 1, 30, 1), // Green 14 0.003%new L2DropData(9572, 1, 1, 30, 1), // Blue 14 0.003%};public synchronized void useItem(L2Playable playable, L2ItemInstance item, Boolean ctrl){if(!playable.isPlayer())return;L2Player activeChar = playable.getPlayer();if(!activeChar.isQuestContinuationPossible(true))return;HashMap items = new HashMap();long count = 0;do{count++;getGroupItem(activeChar, _dropmats, items);getGroupItem(activeChar, _dropacc, items);getGroupItem(activeChar, _dropevents, items);getGroupItem(activeChar, _dropench, items);} while(ctrl && item.getCount() > count && activeChar.isQuestContinuationPossible(false));activeChar.getInventory().destroyItem(item, count, true);activeChar.sendPacket(SystemMessage.removeItems(item.getItemId(), count));for(Entry e : items.entrySet())activeChar.sendPacket(SystemMessage.obtainItems(e.getKey(), e.getValue(), 0));}/** Выбирает 1 предмет РёР· РіСЂСѓРїРїС‹*/public void getGroupItem(L2Player activeChar, L2DropData[] dropData, HashMap report){L2ItemInstance item;long count = 0;for(L2DropData d : dropData)if(Rnd.get(1, L2Drop.MAX_CHANCE) <= d.getChance() * Config.EVENT_CofferOfShadowsRewardRate){count = Rnd.get(d.getMinDrop(), d.getMaxDrop());item = ItemTemplates.getInstance().createItem(d.getItemId());item.setCount(count);activeChar.getInventory().addItem(item);Long old = report.get(d.getItemId());report.put(d.getItemId(), old != null ? old + count : count);}}public final int[] getItemIds(){return _itemIds;}public void onLoad(){ItemHandler.getInstance().registerItemHandler(this);}public void onReload(){}public void onShutdown(){}} Помогите пожалуйста сделать команду для выдачи предметов. Я просто не могу понять за что отвечает HashMap<Integer, Long> items = new HashMap<Integer, Long>(); и for(Entry<Integer, Long> e : items.entrySet()) activeChar.sendPacket(SystemMessage.obtainItems(e.getKey(), e.getValue(), 0)); Изменено 15 августа, 2014 пользователем shadowcat Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hold 15 Опубликовано 15 августа, 2014 Зачем этот геморой? Есть же extractable_items. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
shadowcat 10 Опубликовано 15 августа, 2014 (изменено) Да но у меня немного другая цель: не вскрывать сундук допустим, а после цепочки условий по нажатию кнопки в комьюнити выдать 1 из предметов. Либо для эвента какого-нибудь. Охото понять как это устроено. Изменено 15 августа, 2014 пользователем shadowcat Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hold 15 Опубликовано 15 августа, 2014 Да но у меня немного другая цель: не вскрывать сундук допустим, а после цепочки условий по нажатию кнопки в комьюнити выдать 1 из предметов. Не совсем понял, подробнее объясните. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
shadowcat 10 Опубликовано 15 августа, 2014 (изменено) Вот смотрите. В эвенте вскрывается сундук, после чего персонажу выдается случай(-ые) предмет из списка. В списке заданы id предмета количество и шанс выпадения. Моя цель узнать как построить команду так (В случае с эвентом была getGroupItem), что бы дальше когда я задаю условия и они выполняются, я мог ее использовать для выдачи случайного предмета игроку. Ну или хотябы понять зачем нужны в данном случае HashMap<Integer, Long> items = new HashMap<Integer, Long>(); и for(Entry<Integer, Long> e : items.entrySet()) activeChar.sendPacket(SystemMessage.obtainItems(e.getKey(), e.getValue(), 0)); Изменено 15 августа, 2014 пользователем shadowcat Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 15 августа, 2014 switch(Rnd.get(10)) { case 1: Functions.addItem(player, 57, 100); break; case 2: Functions.addItem(player, 57, 1000); break; case 3: Functions.addItem(player, 57, 10000); break; case 4: Functions.addItem(player, 57, 100000); break; case 5: Functions.addItem(player, 57, 1000000); break; case 6: Functions.addItem(player, 57, 10000000); break; case 7: Functions.addItem(player, 57, 100000000); break; case 8: Functions.addItem(player, 57, 1000000000); break; case 9: Functions.addItem(player, 57, 10000000000); break; case 10: Functions.addItem(player, 57, 100000000000); break; } Как-то вот так. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
shadowcat 10 Опубликовано 15 августа, 2014 Это как один из вариантов, но в таком случае у всех предметов будет одинаковый шанс выпадения. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hold 15 Опубликовано 15 августа, 2014 Это как один из вариантов, но в таком случае у всех предметов будет одинаковый шанс выпадения. Можно же и с шансом реализовать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
shadowcat 10 Опубликовано 16 августа, 2014 Можно же и с шансом реализовать. А можно пример как это должно выгляддеть? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты