MeRDox 60 Опубликовано 13 сентября, 2016 (изменено) Кто знающий, как сделать чтобы был не фиксированое количество выпадения с мешка, а например чтобы например от 5 до 10) package ru.catssoftware.gameserver.datatables.xml; import java.io.File; import javolution.util.FastList; import javolution.util.FastMap; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Node; import ru.catssoftware.Config; import ru.catssoftware.gameserver.datatables.SkillTable; import ru.catssoftware.gameserver.items.model.L2ExtractableItem; import ru.catssoftware.gameserver.items.model.L2ExtractableProductItem; import ru.catssoftware.gameserver.model.L2Skill; import ru.catssoftware.util.ArrayUtils; public class ExtractableItemsData extends XMLDocument { private final static Logger _log = Logger.getLogger(ExtractableItemsData.class.getName()); private FastMap _items = new FastMap(); private static ExtractableItemsData _instance = null; public static ExtractableItemsData getInstance() { if (_instance == null) _instance = new ExtractableItemsData(); return _instance; } public static void reload() { _instance = new ExtractableItemsData(); } public ExtractableItemsData() { _items.clear(); File f = new File(Config.DATAPACK_ROOT, "data/extractable_items.xml"); try { load(f); _log.info("Extractable items data: Loaded " + _items.size() + " extractable items!"); } catch(Exception e) { _log.warn("Extractable items data: Can not load '" + Config.DATAPACK_ROOT + "data/extractable_items.xml'",e); return; } } public L2ExtractableItem getExtractableItem(int itemID) { return _items.get(itemID); } public int[] itemIDs() { int size = _items.size(); int[] result = new int[size]; int i = 0; for (L2ExtractableItem ei : _items.values()) result[i++] = ei.getItemId(); return result; } @Override protected void parseDocument(Document doc) { for(Node n = doc.getFirstChild();n!=null; n=n.getNextSibling()) { if(n.getNodeName().equals("list")) { for(Node node = n.getFirstChild();node!=null; node = node.getNextSibling()) { if(node.getNodeName().equals("item")) try { int itemId = Integer.parseInt(node.getAttributes().getNamedItem("id").getNodeValue()); FastList product_temp = new FastList(); for(Node product = node.getFirstChild(); product != null; product=product.getNextSibling()) { if(product.getNodeName().equals("product")) { int skillId = Integer.parseInt(product.getAttributes().getNamedItem("skillId").getNodeValue()); int skillLevel = Integer.parseInt(product.getAttributes().getNamedItem("skillLevel").getNodeValue()); int chance = Integer.parseInt(product.getAttributes().getNamedItem("chance").getNodeValue()); L2Skill sk = SkillTable.getInstance().getInfo(skillId, skillLevel); if(sk==null) { _log.warn("Extractable items data: error loading item "+itemId); break; } Integer[] production = {}; Integer[] amount = {}; for(Node pitem = product.getFirstChild(); pitem!=null;pitem=pitem.getNextSibling()) { if(pitem.getNodeName().equals("item")) { production = ArrayUtils.add(production, Integer.parseInt(pitem.getAttributes().getNamedItem("id").getNodeValue())); amount = ArrayUtils.add(amount, Integer.parseInt(pitem.getAttributes().getNamedItem("count").getNodeValue())); } } L2ExtractableProductItem productItem = new L2ExtractableProductItem(production, amount, chance, sk); product_temp.add(productItem); } } L2ExtractableItem product = new L2ExtractableItem(itemId, product_temp); _items.put(itemId, product); } catch(Exception e ) { _log.warn("Extractable items data: error loading item",e); } } } } } } Изменено 13 сентября, 2016 пользователем MeRDox Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DeluxeMD 73 Опубликовано 13 сентября, 2016 #BOX 14516;14505,5,30;14505,6,30;14505,7,30;14505,8,30;14505,9,30;14505,10,30; сделай так и все Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MeRDox 60 Опубликовано 13 сентября, 2016 (изменено) #BOX 14516;14505,5,30;14505,6,30;14505,7,30;14505,8,30;14505,9,30;14505,10,30; сделай так и все у меня несколько видов разной валюты, и делаю типа 100 монет = 30%, 500монет = 20%, 1000 монет и тд...но так тогда на другие валюты будет шанс выпадения не правльный, расчет не такой. А нужно тип 50% 100-1000 монет. Тому такое не подходит Изменено 13 сентября, 2016 пользователем MeRDox Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Glorsermust 0 Опубликовано 13 сентября, 2016 #BOX 14516;14505,5,30;14505,6,30;14505,7,30;14505,8,30;14505,9,30;14505,10,30; сделай так и все По моему общий шанс всех монет не должен быть выше чем 100%. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 13 сентября, 2016 у меня несколько видов разной валюты, и делаю типа 100 монет = 30%, 500монет = 20%, 1000 монет и тд...но так тогда на другие валюты будет шанс выпадения не правльный, расчет не такой. А нужно тип 50% 100-1000 монет. Тому такое не подходит Сделайте отдельную обработку для этого итема, через скрипты и все. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DeluxeMD 73 Опубликовано 14 сентября, 2016 По моему общий шанс всех монет не должен быть выше чем 100%. так и есть я просто пример дал Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MeRDox 60 Опубликовано 14 сентября, 2016 Сделайте отдельную обработку для этого итема, через скрипты и все. чесно говоря мне методом тыка легче попробовать сделать через исходы, чем попобувать это все реализовать в скрипте) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MeRDox 60 Опубликовано 14 сентября, 2016 (изменено) есть такой скрипт, немного странное выпадение итемов получшается, не рандомное, а ближется к единице. Кто знает как поправить? и выставить шанс выпадения на разную валюту, как в стандартных мешках? package custom; import ru.catssoftware.gameserver.handler.IItemHandler; import ru.catssoftware.gameserver.handler.ItemHandler; import ru.catssoftware.gameserver.model.L2ItemInstance; import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance; import ru.catssoftware.gameserver.model.actor.instance.L2PlayableInstance; import ru.catssoftware.gameserver.util.PcAction; import ru.catssoftware.tools.random.Rnd; /** * Created with IntelliJ IDEA. * User: Masone * Date: 15.09.16 * Time: 13:30 * To change this template use File | Settings | File Templates. */ public class Chest implements IItemHandler { private static final int[] ITEM_IDS = { 9902 }; private static final int COIN_IDS[] = { 4037,6673,9900,959,960 }; public Chest() { ItemHandler.getInstance().registerItemHandler(this); } public void useItem(L2PlayableInstance playable, L2ItemInstance item, boolean par){} public void useItem(L2PlayableInstance playable, L2ItemInstance item) { if (!playable.isPlayer()) return; L2PcInstance player = (L2PcInstance) playable; int rndget = Rnd.get(1, 5); int reward_id = 0; int count = 1; if(player != null && rndget > 0) { switch (rndget) { case 1: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 4037 ? Rnd.get(10, 1000) : 1); break; } case 2: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 6673 ? Rnd.get(1, 10) : 1); break; } case 3: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 9900 ? Rnd.get(1, 10) : 1); break; } case 4: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 959 ? Rnd.get(1, 10) : 1); break; } case 5: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 960 ? Rnd.get(1,10) : 1); break; } } } // activeChar или не знаю кто у тебя он там в коде -- кому выдавать PcAction.giveItems(player, reward_id, count); playable.destroyItem("Consume", item.getObjectId(), 1, null, false); } public static void main (String... arguments ) { new Chest(); } public int[] getItemIds() { return ITEM_IDS; } } Изменено 16 сентября, 2016 пользователем MeRDox Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 25 сентября, 2016 есть такой скрипт, немного странное выпадение итемов получшается, не рандомное, а ближется к единице. Кто знает как поправить? и выставить шанс выпадения на разную валюту, как в стандартных мешках? package custom; import ru.catssoftware.gameserver.handler.IItemHandler; import ru.catssoftware.gameserver.handler.ItemHandler; import ru.catssoftware.gameserver.model.L2ItemInstance; import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance; import ru.catssoftware.gameserver.model.actor.instance.L2PlayableInstance; import ru.catssoftware.gameserver.util.PcAction; import ru.catssoftware.tools.random.Rnd; /** * Created with IntelliJ IDEA. * User: Masone * Date: 15.09.16 * Time: 13:30 * To change this template use File | Settings | File Templates. */ public class Chest implements IItemHandler { private static final int[] ITEM_IDS = { 9902 }; private static final int COIN_IDS[] = { 4037,6673,9900,959,960 }; public Chest() { ItemHandler.getInstance().registerItemHandler(this); } public void useItem(L2PlayableInstance playable, L2ItemInstance item, boolean par){} public void useItem(L2PlayableInstance playable, L2ItemInstance item) { if (!playable.isPlayer()) return; L2PcInstance player = (L2PcInstance) playable; int rndget = Rnd.get(1, 5); int reward_id = 0; int count = 1; if(player != null && rndget > 0) { switch (rndget) { case 1: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 4037 ? Rnd.get(10, 1000) : 1); break; } case 2: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 6673 ? Rnd.get(1, 10) : 1); break; } case 3: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 9900 ? Rnd.get(1, 10) : 1); break; } case 4: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 959 ? Rnd.get(1, 10) : 1); break; } case 5: { reward_id = COIN_IDS[Rnd.get(COIN_IDS.length)]; count = (reward_id == 960 ? Rnd.get(1,10) : 1); break; } } } // activeChar или не знаю кто у тебя он там в коде -- кому выдавать PcAction.giveItems(player, reward_id, count); playable.destroyItem("Consume", item.getObjectId(), 1, null, false); } public static void main (String... arguments ) { new Chest(); } public int[] getItemIds() { return ITEM_IDS; } } в исходниках l2j это реализовано Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты