Jump to content
  • 0

[Help]Enchant +0


Question

Posted

Exo ftiaksei enan npc o opoios vazei sa sta weapon kati san ton mammon! thelo omos otan exo ena weapon px forgotten blade +25 otan vazo sa na ginete forgotten blade haste +0. Ti prepei na grapso sto multisell?

7 answers to this question

Recommended Posts

  • 0
Posted

Gia pio logo na to akneis auto? 8a einai to idio na dienis +25 kai na perneis +0 , kai na dineis +3 kai na perneis +0?

 

oloi 8a antalazoun ta  +25 tous gia  +0 +items...

  • 0
Posted

Gia pio logo na to akneis auto? 8a einai to idio na dienis +25 kai na perneis +0 , kai na dineis +3 kai na perneis +0?

 

oloi 8a antalazoun ta  +25 tous gia  +0 +items...

Mallon den katalaves kala ti leo !To leo ksekathara otan vazo sa na xanei ta enchant to weapon oxi trade +25 gia +0 !

 

 

Pio sigekrimena to provlima mou einai otan exo ena weapon +1 xoris sa otan pao na valo sa na m dinei to weapon+sa+na xanei ta enchant na pigenei diladi +0 auto thelo. Gia tin ora psaxno ta java arxeia apo to eclipse alla an ksereis na m peis ti akrivos prepei na allakso apo ta java tha me voithouses. To pack p exo einai l2jserver c6!

 

Mallon edo tha prepei na allakso kati alla apo oti vlepo einai false ola opos prepei na einai ap oso katalavaino!

 

/* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 2, or (at your option)

* any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA

* 02111-1307, USA.

*

* http://www.gnu.org/copyleft/gpl.html

*/

package net.sf.l2j.gameserver.model;

 

import java.io.File;

import java.util.List;

import java.util.logging.Level;

import java.util.logging.Logger;

 

import javax.xml.parsers.DocumentBuilderFactory;

 

import javolution.util.FastList;

import net.sf.l2j.Config;

import net.sf.l2j.gameserver.datatables.ItemTable;

import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;

import net.sf.l2j.gameserver.serverpackets.MultiSellList;

import net.sf.l2j.gameserver.templates.L2Armor;

import net.sf.l2j.gameserver.templates.L2Item;

import net.sf.l2j.gameserver.templates.L2Weapon;

 

import org.w3c.dom.Document;

import org.w3c.dom.Node;

 

/**

* Multisell list manager

*

*/

public class L2Multisell

{

    private static Logger _log = Logger.getLogger(L2Multisell.class.getName());

    private List<MultiSellListContainer> _entries = new FastList<MultiSellListContainer>();

    private static L2Multisell _instance = new L2Multisell();

 

    public MultiSellListContainer getList(int id)

    {

        synchronized (_entries)

        {

            for (MultiSellListContainer list : _entries)

            {

                if (list.getListId() == id) return list;

            }

        }

 

        _log.warning("[L2Multisell] can't find list with id: " + id);

        return null;

    }

 

    public L2Multisell()

    {

        parseData();

    }

 

    public void reload()

    {

        parseData();

    }

 

    public static L2Multisell getInstance()

    {

        return _instance;

    }

 

    private void parseData()

    {

        _entries.clear();

        parse();

    }

 

    /**

    * This will generate the multisell list for the items.  There exist various

    * parameters in multisells that affect the way they will appear:

    * 1) inventory only:

    * * if true, only show items of the multisell for which the

    *   "primary" ingredients are already in the player's inventory.  By "primary"

    *   ingredients we mean weapon and armor.

    * * if false, show the entire list.

    * 2) maintain enchantment: presumably, only lists with "inventory only" set to true

    * should sometimes have this as true.  This makes no sense otherwise...

    * * If true, then the product will match the enchantment level of the ingredient.

    *   if the player has multiple items that match the ingredient list but the enchantment

    *   levels differ, then the entries need to be duplicated to show the products and

    *   ingredients for each enchantment level.

    *   For example: If the player has a crystal staff +1 and a crystal staff +3 and goes

    *   to exchange it at the mammon, the list should have all exchange possibilities for

    *   the +1 staff, followed by all possibilities for the +3 staff.

    * * If false, then any level ingredient will be considered equal and product will always

    *   be at +0

    * 3) apply taxes: Uses the "taxIngredient" entry in order to add a certain amount of adena to the ingredients

    *

    * @see net.sf.l2j.gameserver.serverpackets.ServerBasePacket#runImpl()

    */

    private MultiSellListContainer generateMultiSell(int listId, boolean inventoryOnly, L2PcInstance player, double taxRate)

    {

        MultiSellListContainer listTemplate = L2Multisell.getInstance().getList(listId);

        MultiSellListContainer list = new MultiSellListContainer();

        if (listTemplate == null) return list;

        list = L2Multisell.getInstance().new MultiSellListContainer();

        list.setListId(listId);

 

        if (inventoryOnly)

        {

        if (player == null)

        return list;

 

        L2ItemInstance[] items;

        if (listTemplate.getMaintainEnchantment())

        items = player.getInventory().getUniqueItemsByEnchantLevel(false,false,false);

        else

        items = player.getInventory().getUniqueItems(false,false,false);

 

        int enchantLevel;

            for (L2ItemInstance item : items)

            {

            // only do the matchup on equipable items that are not currently equipped

            // so for each appropriate item, produce a set of entries for the multisell list.

            if (!item.isWear() && ((item.getItem() instanceof L2Armor) || (item.getItem() instanceof L2Weapon)))

            {

            enchantLevel = (listTemplate.getMaintainEnchantment()? item.getEnchantLevel() : 0);

            // loop through the entries to see which ones we wish to include

                for (MultiSellEntry ent : listTemplate.getEntries())

                {

                boolean doInclude = false;

 

                // check ingredients of this entry to see if it's an entry we'd like to include.

                for (MultiSellIngredient ing : ent.getIngredients())

                {

                    if (item.getItemId() == ing.getItemId())

                    {

                    doInclude = true;

                        break;

                    }

                }

 

                // manipulate the ingredients of the template entry for this particular instance shown

                // i.e: Assign enchant levels and/or apply taxes as needed.

                if (doInclude)

                list.addEntry(prepareEntry(ent, listTemplate.getApplyTaxes(), listTemplate.getMaintainEnchantment(), enchantLevel, taxRate));

                }

            }

            } // end for each inventory item.

        } // end if "inventory-only"

        else  // this is a list-all type

        {

        // if no taxes are applied, no modifications are needed

    for (MultiSellEntry ent : listTemplate.getEntries())

    list.addEntry(prepareEntry(ent, listTemplate.getApplyTaxes(), false, 0, taxRate));

        }

 

        return list;

    }

 

// Regarding taxation, the following is the case:

// a) The taxes come out purely from the adena TaxIngredient

// b) If the entry has no adena ingredients other than the taxIngredient, the resulting

    //    amount of adena is appended to the entry

// c) If the entry already has adena as an entry, the taxIngredient is used in order to increase

    //   the count for the existing adena ingredient

    private MultiSellEntry prepareEntry(MultiSellEntry templateEntry, boolean applyTaxes, boolean maintainEnchantment, int enchantLevel, double taxRate)

    {

    MultiSellEntry newEntry = L2Multisell.getInstance().new MultiSellEntry();

    newEntry.setEntryId(templateEntry.getEntryId()*100000+enchantLevel);

    int adenaAmount = 0;

 

        for (MultiSellIngredient ing : templateEntry.getIngredients())

        {

        // load the ingredient from the template

        MultiSellIngredient newIngredient = L2Multisell.getInstance().new MultiSellIngredient(ing);

 

        // if taxes are to be applied, modify/add the adena count based on the template adena/ancient adena count

        if ( ing.getItemId() == 57 && ing.isTaxIngredient() )

        {

        if (applyTaxes)

        adenaAmount += (int)Math.round(ing.getItemCount()*taxRate);

        continue; // do not adena yet, as non-taxIngredient adena entries might occur next (order not guaranteed)

        }

        else if ( ing.getItemId() == 57 )  // && !ing.isTaxIngredient()

        {

        adenaAmount += ing.getItemCount();

        continue; // do not adena yet, as taxIngredient adena entries might occur next (order not guaranteed)

        }

        // if it is an armor/weapon, modify the enchantment level appropriately, if necessary

        else if (maintainEnchantment)

        {

            L2Item tempItem = ItemTable.getInstance().createDummyItem(ing.getItemId()).getItem();

            if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon))

            newIngredient.setEnchantmentLevel(enchantLevel);

        }

 

        // finally, add this ingredient to the entry

        newEntry.addIngredient(newIngredient);

        }

        // now add the adena, if any.

        if (adenaAmount > 0 )

        {

        newEntry.addIngredient(L2Multisell.getInstance().new MultiSellIngredient(57,adenaAmount,0,false,false));

        }

        // Now modify the enchantment level of products, if necessary

        for (MultiSellIngredient ing : templateEntry.getProducts())

        {

        // load the ingredient from the template

        MultiSellIngredient newIngredient = L2Multisell.getInstance().new MultiSellIngredient(ing);

 

        if (maintainEnchantment)

            {

            // if it is an armor/weapon, modify the enchantment level appropriately

            // (note, if maintain enchantment is "false" this modification will result to a +0)

            L2Item tempItem = ItemTable.getInstance().createDummyItem(ing.getItemId()).getItem();

            if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon))

            newIngredient.setEnchantmentLevel(enchantLevel);

            }

        newEntry.addProduct(newIngredient);

        }

        return newEntry;

    }

 

    public void SeparateAndSend(int listId, L2PcInstance player, boolean inventoryOnly, double taxRate)

    {

MultiSellListContainer list = generateMultiSell(listId, inventoryOnly, player, taxRate);

MultiSellListContainer temp = new MultiSellListContainer();

int page = 1;

 

temp.setListId(list.getListId());

 

for (MultiSellEntry e : list.getEntries())

{

if (temp.getEntries().size() == 40)

{

player.sendPacket(new MultiSellList(temp, page, 0));

page++;

temp = new MultiSellListContainer();

temp.setListId(list.getListId());

}

temp.addEntry(e);

}

player.sendPacket(new MultiSellList(temp, page, 1));

    }

 

    public class MultiSellEntry

    {

        private int _entryId;

 

        private List<MultiSellIngredient> _products = new FastList<MultiSellIngredient>();

        private List<MultiSellIngredient> _ingredients = new FastList<MultiSellIngredient>();

 

        /**

        * @param entryId The entryId to set.

        */

        public void setEntryId(int entryId)

        {

            _entryId = entryId;

        }

 

        /**

        * @return Returns the entryId.

        */

        public int getEntryId()

        {

            return _entryId;

        }

 

        /**

        * @param product The product to add.

        */

        public void addProduct(MultiSellIngredient product)

        {

            _products.add(product);

        }

 

        /**

        * @return Returns the products.

        */

        public List<MultiSellIngredient> getProducts()

        {

            return _products;

        }

 

        /**

        * @param ingredients The ingredients to set.

        */

        public void addIngredient(MultiSellIngredient ingredient)

        {

            _ingredients.add(ingredient);

        }

 

        /**

        * @return Returns the ingredients.

        */

        public List<MultiSellIngredient> getIngredients()

        {

            return _ingredients;

        }

    }

 

    public class MultiSellIngredient

    {

        private int _itemId, _itemCount, _enchantmentLevel;

        private boolean _isTaxIngredient, _mantainIngredient;

 

        public MultiSellIngredient(int itemId, int itemCount, boolean isTaxIngredient, boolean mantainIngredient)

        {

        this(itemId, itemCount, 0, isTaxIngredient, mantainIngredient);

        }

 

        public MultiSellIngredient(int itemId, int itemCount, int enchantmentLevel, boolean isTaxIngredient, boolean mantainIngredient)

        {

            setItemId(itemId);

            setItemCount(itemCount);

            setEnchantmentLevel(enchantmentLevel);

            setIsTaxIngredient(isTaxIngredient);

            setMantainIngredient(mantainIngredient);

        }

 

        public MultiSellIngredient(MultiSellIngredient e)

        {

        _itemId = e.getItemId();

        _itemCount = e.getItemCount();

        _enchantmentLevel = e.getEnchantmentLevel();

        _isTaxIngredient = e.isTaxIngredient();

        _mantainIngredient = e.getMantainIngredient();

        }

        /**

        * @param itemId The itemId to set.

        */

        public void setItemId(int itemId)

        {

            _itemId = itemId;

        }

 

        /**

        * @return Returns the itemId.

        */

        public int getItemId()

        {

            return _itemId;

        }

 

        /**

        * @param itemCount The itemCount to set.

        */

        public void setItemCount(int itemCount)

        {

            _itemCount = itemCount;

        }

 

        /**

        * @return Returns the itemCount.

        */

        public int getItemCount()

        {

            return _itemCount;

        }

 

        /**

        * @param itemCount The itemCount to set.

        */

        public void setEnchantmentLevel(int enchantmentLevel)

        {

        _enchantmentLevel = enchantmentLevel;

        }

 

        /**

        * @return Returns the itemCount.

        */

        public int getEnchantmentLevel()

        {

            return _enchantmentLevel;

        }

 

        public void setIsTaxIngredient(boolean isTaxIngredient)

        {

        _isTaxIngredient = isTaxIngredient;

        }

 

        public boolean isTaxIngredient()

        {

        return _isTaxIngredient;

        }

 

        public void setMantainIngredient(boolean mantainIngredient)

        {

        _mantainIngredient = mantainIngredient;

        }

 

        public boolean getMantainIngredient()

        {

        return _mantainIngredient;

        }

    }

 

    public class MultiSellListContainer

    {

        private int _listId;

        private boolean _applyTaxes = false;

        private boolean _maintainEnchantment = false;

 

        List<MultiSellEntry> _entriesC;

 

        public MultiSellListContainer()

        {

            _entriesC = new FastList<MultiSellEntry>();

        }

 

        /**

        * @param listId The listId to set.

        */

        public void setListId(int listId)

        {

            _listId = listId;

        }

 

        public void setApplyTaxes(boolean applyTaxes)

        {

        _applyTaxes = applyTaxes;

        }

 

        public void setMaintainEnchantment(boolean maintainEnchantment)

        {

        _maintainEnchantment = maintainEnchantment;

        }

 

        /**

        * @return Returns the listId.

        */

        public int getListId()

        {

            return _listId;

        }

 

        public boolean getApplyTaxes()

        {

            return _applyTaxes;

        }

 

        public boolean getMaintainEnchantment()

        {

            return _maintainEnchantment;

        }

 

        public void addEntry(MultiSellEntry e)

        {

            _entriesC.add(e);

        }

 

        public List<MultiSellEntry> getEntries()

        {

            return _entriesC;

        }

    }

 

    private void hashFiles(String dirname, List<File> hash)

    {

        File dir = new File(Config.DATAPACK_ROOT, "data/" + dirname);

        if (!dir.exists())

        {

            _log.config("Dir " + dir.getAbsolutePath() + " not exists");

            return;

        }

        File[] files = dir.listFiles();

        for (File f : files)

        {

            if (f.getName().endsWith(".xml")) hash.add(f);

        }

    }

 

    private void parse()

    {

        Document doc = null;

        int id = 0;

        List<File> files = new FastList<File>();

        hashFiles("multisell", files);

 

        for (File f : files)

        {

            id = Integer.parseInt(f.getName().replaceAll(".xml", ""));

            try

            {

 

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                factory.setValidating(false);

                factory.setIgnoringComments(true);

                doc = factory.newDocumentBuilder().parse(f);

            }

            catch (Exception e)

            {

                _log.log(Level.SEVERE, "Error loading file " + f, e);

            }

            try

            {

                MultiSellListContainer list = parseDocument(doc);

                list.setListId(id);

                _entries.add(list);

            }

            catch (Exception e)

            {

                _log.log(Level.SEVERE, "Error in file " + f, e);

            }

        }

    }

 

    protected MultiSellListContainer parseDocument(Document doc)

    {

        MultiSellListContainer list = new MultiSellListContainer();

 

        for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())

        {

            if ("list".equalsIgnoreCase(n.getNodeName()))

            {

            Node attribute;

            attribute = n.getAttributes().getNamedItem("applyTaxes");

            if(attribute == null)

            list.setApplyTaxes(false);

            else

            list.setApplyTaxes(Boolean.parseBoolean(attribute.getNodeValue()));

            attribute = n.getAttributes().getNamedItem("maintainEnchantment");

            if(attribute == null)

            list.setMaintainEnchantment(false);

            else

            list.setMaintainEnchantment(Boolean.parseBoolean(attribute.getNodeValue()));

 

                for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())

                {

                    if ("item".equalsIgnoreCase(d.getNodeName()))

                    {

                        MultiSellEntry e = parseEntry(d);

                        list.addEntry(e);

                    }

                }

            }

            else if ("item".equalsIgnoreCase(n.getNodeName()))

            {

                MultiSellEntry e = parseEntry(n);

                list.addEntry(e);

            }

        }

 

        return list;

    }

 

    protected MultiSellEntry parseEntry(Node n)

    {

        int entryId = Integer.parseInt(n.getAttributes().getNamedItem("id").getNodeValue());

 

        Node first = n.getFirstChild();

        MultiSellEntry entry = new MultiSellEntry();

 

        for (n = first; n != null; n = n.getNextSibling())

        {

            if ("ingredient".equalsIgnoreCase(n.getNodeName()))

            {

            Node attribute;

 

                int id = Integer.parseInt(n.getAttributes().getNamedItem("id").getNodeValue());

                int count = Integer.parseInt(n.getAttributes().getNamedItem("count").getNodeValue());

                boolean isTaxIngredient = false, mantainIngredient = false;

 

                attribute = n.getAttributes().getNamedItem("isTaxIngredient");

 

                if (attribute != null)

                isTaxIngredient = Boolean.parseBoolean(attribute.getNodeValue());

 

                attribute = n.getAttributes().getNamedItem("mantainIngredient");

 

                if (attribute != null)

                mantainIngredient = Boolean.parseBoolean(attribute.getNodeValue());

 

                MultiSellIngredient e = new MultiSellIngredient(id, count, isTaxIngredient, mantainIngredient);

                entry.addIngredient(e);

            }

            else if ("production".equalsIgnoreCase(n.getNodeName()))

            {

                int id = Integer.parseInt(n.getAttributes().getNamedItem("id").getNodeValue());

                int count = Integer.parseInt(n.getAttributes().getNamedItem("count").getNodeValue());

 

                MultiSellIngredient e = new MultiSellIngredient(id, count, false, false);

                entry.addProduct(e);

            }

        }

 

        entry.setEntryId(entryId);

 

        return entry;

    }

 

}

 

  • 0
Posted

Μα γιατι να θες να το κανεις αυτο :/

Ολοι το αντιθετο κανουν

 

τεσπα,αν κανεις κανονικο SHOP οχι του Mammon πρεπει να δουλευει οπως θες,καθως μονο του Mammon εχει το συστημα να στο δινει ιδιο +

  • 0
Posted

pos tha kano kanoniko shop p tha m kanei trade to weapon kai tha m dinei wpn +sa :P. Auto ginete mono me mulitsell(sistima mammon) ta kanonika shop exoun mono item ta opia ta agorazeis me adena!An kses esy ton tropo dose m kapio link na do gt epsaksa kai den vrika kati.

  • 0
Posted

De xreiazetai hardcoding guys,apla pate sta xml tou blacksmith kai kanete to maintainEnchantment false:

Gameserver/data/multisell

 

<?xml version='1.0' encoding='utf-8'?>
<!-- Seven Signs - Blacksmith of Mammon - SA: S-Grade -->
<list maintainEnchantment="false">
<!-- Forgotten Blade - Haste  -->
<item id="1">
	<production id="6581" count="1"/>
	<ingredient id="6364" count="1"/>
	<ingredient id="5908" count="1"/>
	<ingredient id="2134" count="82"/>
</item>
<!-- Forgotten Blade - Health -->
<item id="2">
	<production id="6582" count="1"/>
	<ingredient id="6364" count="1"/>
	<ingredient id="5911" count="1"/>
	<ingredient id="2134" count="82"/>
</item>

Guest
This topic is now closed to further replies.


  • Posts

    • sell adena l2rebon signature x1 - 1kk = 1 dollars l2reborn x10 - 500kk = 4 dollars E-Global x Lu4 - 1kk = 2 dollars BOHPTS - x20-x500 TOP PRICE DISCORD - GODDARDSHOP TELEGRAM - MMOPROMO Also on sale are Epic jewelry, Clothes at a very good price
    • Hello Sorry, my Discord is: ave7309
    • “Hello, I’d like to present a short description of the server. Everyone starts equally at max level 80. The server includes a custom buffer, custom class master, custom weapons and armors, custom zones, custom teleporter, custom raid bosses, and much more. I’ll leave a link in the description for those who want to see how everything looks inside. The server is only open on weekends, and you can find more news via the Facebook link.”   https://www.facebook.com/profile.php?id=61578869175323
    • 1. You where subscriber 3 years ago. 2. There is no current L2jMobius 2.8 Seven Signs version. Subcriber or not. 3. You have your answer from multiple forums that more items is more delay.  
    • 1. Optimize Packet Serialization Look in ItemList.java or wherever the inventory packet is constructed. Instead of building the packet with inefficient string concatenation or repeated allocations, use a preallocated buffer and avoid creating new objects for each item. Mobius sources are Java-based, so profiling with something like VisualVM or YourKit can help see where most time is spent. 2. Avoid Sending the Full List Each Time Modify the server to send only changed items (diff packets) when the inventory window opens. Some newer forks implement this as “lazy loading” or paged inventory so the client only loads e.g. 100 items at a time. 3. Limit the Inventory Size Per Page Instead of showing all 500 slots at once, split the inventory into pages/tabs (100 slots each). When the user switches a tab, send only that page’s items. This requires some client-side editing, but it’s the most user-friendly long-term fix. 4. Database & Cache Optimizations Ensure your items table is indexed by owner_id to make the query for player items fast. Cache item templates and static data so they are not reloaded every time the inventory is shown. ⚠️ Things to Keep in Mind Increasing slots from 80 → 500 does not just change a number — it multiplies the workload for packet building and UI rendering. You can’t fully avoid some extra cost with 500 items, but you can keep it under a few milliseconds if you optimize how and when the data is sent.    
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock