Перейти к содержанию
Авторизация  
MeRDox

Мешок Удачи

Рекомендуемые сообщения

Кто знающий, как сделать чтобы был не фиксированое количество выпадения с мешка, а например чтобы например от 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);
}
}
}
}

}
}

Изменено пользователем MeRDox

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
#BOX

14516;14505,5,30;14505,6,30;14505,7,30;14505,8,30;14505,9,30;14505,10,30; 

 

сделай так и все 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

#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 монет. Тому такое не подходит

Изменено пользователем MeRDox

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

#BOX
14516;14505,5,30;14505,6,30;14505,7,30;14505,8,30;14505,9,30;14505,10,30; 
 
сделай так и все 

 

По моему общий шанс всех монет не должен быть выше чем 100%.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня несколько видов разной валюты, и делаю типа 100 монет = 30%, 500монет = 20%, 1000 монет и тд...но так тогда на другие валюты будет шанс выпадения не правльный, расчет не такой. А нужно тип 50% 100-1000 монет. Тому такое не подходит

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему общий шанс всех монет не должен быть выше чем 100%.

так и есть я просто пример дал 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

чесно говоря мне методом тыка легче попробовать сделать через исходы, чем попобувать это все реализовать в скрипте)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть такой скрипт, немного странное выпадение итемов получшается, не рандомное, а ближется к единице. Кто знает как поправить? и выставить шанс выпадения на разную валюту, как в стандартных мешках?


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;
    }
}
 

Изменено пользователем MeRDox

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

есть такой скрипт, немного странное выпадение итемов получшается, не рандомное, а ближется к единице. Кто знает как поправить? и выставить шанс выпадения на разную валюту, как в стандартных мешках?


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 это реализовано 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...