Jump to content

Question

Posted

Hello everyone, im a new user on this community. 

Im a newbie but learning more and more about jass and code.

Im already got a live server and my problem is with the NPC achievement system. My source got the achievement system cause every time i complete an achievement a message system is shown. But no NPC.. In server files /data there is a file achievement.xml with requierements for achievements.  i know how to make a npc who reads html and make a multisell, but i dont know how to read xml and make that file to work with a npc.

I tried to call that achievement.xml like a multisell shop but it doesnt work-.

can anybody help me? 

9 answers to this question

Recommended Posts

  • 0
Posted
3 hours ago, expll0 said:

check database - custom_npc and search for achievement npc

image.png.84e4e26280403293da080ce481905eb2.png

2 hours ago, Zake said:

Pack/client?

Thanks for the quick reply guys, and sorry for bother with this dumb questions.

Its l2jOrion source, rev17+rev21. there is a ini in configs to enable achievement system, that is the wierd thing.

 

this is the achievement.xml in gamesever/data

 

but i dont know how to hook it to a npc to work ingame since its not an html


image.thumb.png.dc565a9783a4f601b01abc0a54943d9e.png

  • 0
Posted

Can you post a pic with the contents of model/actor/instance in your source? There's supposed to be an Achievement npc instance in there if it was meant to work with an npc and not CB or some command.

 

Orion still has npcs in sql lol.

  • 0
Posted (edited)
1 hour ago, An4rchy said:

Can you post a pic with the contents of model/actor/instance in your source? There's supposed to be an Achievement npc instance in there if it was meant to work with an npc and not CB or some command.

 

Orion still has npcs in sql lol.

 

* L2jOrion Project - www.l2jorion.com 
 * 
 * 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 l2jorion.game.model.actor.instance;

import java.util.List;
import java.util.StringTokenizer;

import l2jorion.Config;
import l2jorion.game.datatables.sql.ItemTable;
import l2jorion.game.enums.AchType;
import l2jorion.game.managers.AchievementManager;
import l2jorion.game.model.AchievementHolder;
import l2jorion.game.network.serverpackets.NpcHtmlMessage;
import l2jorion.game.templates.L2Item;
import l2jorion.game.templates.L2NpcTemplate;
import l2jorion.game.util.Util;

public final class L2AchievementInstance extends L2FolkInstance
{
    private final static int PAGE_LIMIT = Config.PAGE_LIMIT;
    
    public L2AchievementInstance(int objectId, L2NpcTemplate template)
    {
        super(objectId, template);
    }
    
    @Override
    public void onBypassFeedback(L2PcInstance player, String command)
    {
        final StringTokenizer st = new StringTokenizer(command, " ");
        String currentCommand = st.nextToken();
        
        if (currentCommand.startsWith("Chat"))
        {
            int val = Integer.parseInt(st.nextToken());
            showChatWindow(player, val);
        }
    }
    
    @Override
    public void showChatWindow(L2PcInstance player, int val)
    {
        final NpcHtmlMessage html = new NpcHtmlMessage(0);
        html.setFile(getHtmlPath(player, getNpcId(), 0));
        html.replace("%objectId%", getObjectId());
        html.replace("%list%", getList(player, val));
        player.sendPacket(html);
    }
    
    public static int countPagesNumber(int objectsSize, int pageSize)
    {
        return objectsSize / pageSize + (objectsSize % pageSize == 0 ? 0 : 1);
    }
    
    private String getList(L2PcInstance player, int page)
    {
        // Retrieve the entire types list based on group type.
        List<AchType> list = AchievementManager.getInstance().getTypeList(player);
        
        // Calculate page number.
        final int max = countPagesNumber(list.size(), PAGE_LIMIT);
        page = page > max ? max : page < 1 ? 1 : page;
        
        // Cut skills list up to page number.
        list = list.subList((page - 1) * PAGE_LIMIT, Math.min(page * PAGE_LIMIT, list.size()));
        
        final StringBuilder sb = new StringBuilder();
        
        int row = 0;
        for (AchType type : list)
        {
            boolean exist = player.getAchievement().getData().containsKey(type);
            boolean completed = false;
            int getLevel = exist ? player.getAchievement().getData().get(type).getId() - 1 : 0;
            int getCount = exist ? player.getAchievement().getData().get(type).getValue() : 0;
            int allStages = AchievementManager.getInstance().getStages(type).size();
            
            if (AchievementManager.getInstance().getStages(type).size() < (getLevel + 1))
            {
                getLevel = AchievementManager.getInstance().getStages(type).size() - 1;
                completed = true;
            }
            
            AchievementHolder ach = AchievementManager.getInstance().getAchievements().get(type).get(getLevel);
            sb.append("<img src=l2ui.squareblack width=296 height=1><table cellspacing=1 cellpadding=1 width=296 bgcolor=000000><tr>");
            sb.append("<td width=40 height=40 align=center><button width=32 height=32 back=" + ach.getIcon() + " fore=" + ach.getIcon() + "></td>");
            sb.append("<td width=256>" + ach.getName().toUpperCase() + " " + (completed ? "<font color=00FF00>Completed</font>" : "") + "<br1>");
            sb.append("Stage:<font color=LEVEL>" + ach.getLevel() + "/" + allStages + "</font> Reward:<font color=LEVEL>" + Util.formatAdena(ach.getRewardCount()) + "</font> " + getItemNameById(ach.getRewardId()) + "<br1>");
            sb.append("<font color=B09878>" + (completed ? "[" + ach.getName() + " achievement completed]" : ach.getDescription().replaceAll("%required%", getCount + "/" + ach.getRequired())) + "</font></td></tr></table>");
            sb.append("<table cellspacing=0 cellpadding=0 width=300 height=15><tr><td>" + generateBar(300, 15, completed ? ach.getRequired() : getCount, ach.getRequired()) + "</td></tr></table>");
            sb.append("<img src=l2ui.squareblack width=296 height=1><img height=3>");
            row++;
        }
        
        for (int i = PAGE_LIMIT; i > row; i--)
        {
            sb.append("<img height=47>");
        }
        
        // Build page footer.
        sb.append("<table width=300><tr>");
        sb.append("<td align=left width=100>" + (page > 1 ? "<button value=\"< PREV\" action=\"bypass npc_" + getObjectId() + "_Chat " + (page - 1) + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
        sb.append("<td align=center width=100>Page " + page + "/" + max + "</td>");
        sb.append("<td align=right width=100>" + (page < max ? "<button value=\"NEXT >\" action=\"bypass npc_" + getObjectId() + "_Chat " + (page + 1) + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
        sb.append("</tr></table>");
        
        return sb.toString();
    }
    
    public String generateBar(int width, int height, int current, int max)
    {
        final StringBuilder sb = new StringBuilder();
        current = current > max ? max : current;
        int bar = Math.max((width * (current * 100 / max) / 100), 0);
        sb.append("<table width=" + width + " cellspacing=0 cellpadding=0><tr><td width=" + bar + " align=center><img src=L2UI_CH3.BR_BAR1_CP width=" + bar + " height=" + height + "/></td>");
        sb.append("<td width=" + (width - bar) + " align=center><img src=L2UI_CH3.BR_BAR1_HP1 width=" + (width - bar) + " height=" + height + "/></td></tr></table>");
        return sb.toString();
    }
    
    @Override
    public String getHtmlPath(L2PcInstance player, final int npcId, final int val)
    {
        return "data/html/achievements/" + npcId + "" + (val == 0 ? "" : "-" + val) + ".htm";
    }
    
    public String getItemNameById(int itemId)
    {
        L2Item item = ItemTable.getInstance().getTemplate(itemId);
        
        String itemName = "NoName";
        
        if (itemId != 0)
        {
            itemName = item.getName();
        }
        
        return itemName;
    }
}
 

30 minutes ago, Amenadiel said:

.achiv command? On xml might have the command

i tried /achievement .achievement .achiv /achiv .achievements /achievements

nothing. 

its funny cause i receive the system msg ingame when i unlock an achievment like adquire noblesse and so

This is the achievementManager page

Quote

package l2jorion.game.managers;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import l2jorion.Config;
import l2jorion.game.enums.AchType;
import l2jorion.game.model.AchievementHolder;
import l2jorion.game.model.actor.instance.L2PcInstance;
import l2jorion.game.templates.StatsSet;
import l2jorion.logger.Logger;
import l2jorion.logger.LoggerFactory;
import l2jorion.util.xml.IXmlReader;

public class AchievementManager implements IXmlReader
{
    private static Logger LOG = LoggerFactory.getLogger(AchievementManager.class);
    
    private final Map<AchType, List<AchievementHolder>> _achievements = new LinkedHashMap<>();
    
    public AchievementManager()
    {
        load();
    }
    
    @Override
    public void load()
    {
        parseDatapackFile("./data/xml/achievements.xml");
        LOG.info("Loaded {} of {} achievements data.", _achievements.size(), AchType.values().length);
    }
    
    public void reload()
    {
        _achievements.clear();
        load();
    }
    
    @Override
    public void parseDocument(Document doc)
    {
        for (Node a = doc.getFirstChild(); a != null; a = a.getNextSibling())
        {
            if ("list".equalsIgnoreCase(a.getNodeName()))
            {
                for (Node b = a.getFirstChild(); b != null; b = b.getNextSibling())
                {
                    if ("achievement".equalsIgnoreCase(b.getNodeName()))
                    {
                        final NamedNodeMap attrs = b.getAttributes();
                        
                        final AchType type = AchType.valueOf(parseString(attrs, "type"));
                        final StatsSet set = new StatsSet();
                        set.set("icon", parseString(attrs, "icon"));
                        set.set("name", parseString(attrs, "name"));
                        set.set("desc", parseString(attrs, "desc"));
                        
                        final List<AchievementHolder> levels = new ArrayList<>();
                        
                        for (Node c = b.getFirstChild(); c != null; c = c.getNextSibling())
                        {
                            if ("stage".equalsIgnoreCase(c.getNodeName()))
                            {
                                set.add(parseAttributes(c));
                                levels.add(new AchievementHolder(set));
                            }
                        }
                        
                        _achievements.put(type, levels);
                    }
                }
            }
        }
        
    }
    
    public List<AchievementHolder> getStages(AchType type)
    {
        return _achievements.get(type);
    }
    
    public AchievementHolder getAchievement(AchType type, int level)
    {
        return _achievements.get(type).stream().filter(x -> x.getLevel() == level).findFirst().orElse(null);
    }
    
    public Map<AchType, List<AchievementHolder>> getAchievements()
    {
        return _achievements;
    }
    
    public List<AchType> getTypeList(L2PcInstance player)
    {
        List<AchType> list = new ArrayList<>();
        for (AchType type : _achievements.keySet())
        {
            if (type == AchType.SPOIL && !player.getSkills().containsKey(254))
            {
                continue;
            }
            
            if (type == AchType.LEADER && player.getClan() != null && !player.isClanLeader())
            {
                continue;
            }
            
            if ((type == AchType.CLAN_LEVEL_UP || type == AchType.CASTLE) && !player.isClanLeader())
            {
                continue;
            }
            
            if (type == AchType.ACADEMY && player.getClassId().level() > 1 && player.getAchievement().getLevel(AchType.ACADEMY) != 2)
            {
                continue;
            }
            
            if (type == AchType.MONSTER_CHAMPION && Config.L2JMOD_CHAMPION_FREQUENCY == 0)
            {
                continue;
            }
            
            list.add(type);
        }
        return list;
    }
    
    public static AchievementManager getInstance()
    {
        return SingletonHolder.INSTANCE;
    }
    
    private static class SingletonHolder
    {
        protected static final AchievementManager INSTANCE = new AchievementManager();
    }
}

 

package l2jorion.game.managers;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import l2jorion.Config;
import l2jorion.game.enums.AchType;
import l2jorion.game.model.AchievementHolder;
import l2jorion.game.model.actor.instance.L2PcInstance;
import l2jorion.game.templates.StatsSet;
import l2jorion.logger.Logger;
import l2jorion.logger.LoggerFactory;
import l2jorion.util.xml.IXmlReader;

public class AchievementManager implements IXmlReader
{
    private static Logger LOG = LoggerFactory.getLogger(AchievementManager.class);
    
    private final Map<AchType, List<AchievementHolder>> _achievements = new LinkedHashMap<>();
    
    public AchievementManager()
    {
        load();
    }
    
    @Override
    public void load()
    {
        parseDatapackFile("./data/xml/achievements.xml");
        LOG.info("Loaded {} of {} achievements data.", _achievements.size(), AchType.values().length);
    }
    
    public void reload()
    {
        _achievements.clear();
        load();
    }
    
    @Override
    public void parseDocument(Document doc)
    {
        for (Node a = doc.getFirstChild(); a != null; a = a.getNextSibling())
        {
            if ("list".equalsIgnoreCase(a.getNodeName()))
            {
                for (Node b = a.getFirstChild(); b != null; b = b.getNextSibling())
                {
                    if ("achievement".equalsIgnoreCase(b.getNodeName()))
                    {
                        final NamedNodeMap attrs = b.getAttributes();
                        
                        final AchType type = AchType.valueOf(parseString(attrs, "type"));
                        final StatsSet set = new StatsSet();
                        set.set("icon", parseString(attrs, "icon"));
                        set.set("name", parseString(attrs, "name"));
                        set.set("desc", parseString(attrs, "desc"));
                        
                        final List<AchievementHolder> levels = new ArrayList<>();
                        
                        for (Node c = b.getFirstChild(); c != null; c = c.getNextSibling())
                        {
                            if ("stage".equalsIgnoreCase(c.getNodeName()))
                            {
                                set.add(parseAttributes(c));
                                levels.add(new AchievementHolder(set));
                            }
                        }
                        
                        _achievements.put(type, levels);
                    }
                }
            }
        }
        
    }
    
    public List<AchievementHolder> getStages(AchType type)
    {
        return _achievements.get(type);
    }
    
    public AchievementHolder getAchievement(AchType type, int level)
    {
        return _achievements.get(type).stream().filter(x -> x.getLevel() == level).findFirst().orElse(null);
    }
    
    public Map<AchType, List<AchievementHolder>> getAchievements()
    {
        return _achievements;
    }
    
    public List<AchType> getTypeList(L2PcInstance player)
    {
        List<AchType> list = new ArrayList<>();
        for (AchType type : _achievements.keySet())
        {
            if (type == AchType.SPOIL && !player.getSkills().containsKey(254))
            {
                continue;
            }
            
            if (type == AchType.LEADER && player.getClan() != null && !player.isClanLeader())
            {
                continue;
            }
            
            if ((type == AchType.CLAN_LEVEL_UP || type == AchType.CASTLE) && !player.isClanLeader())
            {
                continue;
            }
            
            if (type == AchType.ACADEMY && player.getClassId().level() > 1 && player.getAchievement().getLevel(AchType.ACADEMY) != 2)
            {
                continue;
            }
            
            if (type == AchType.MONSTER_CHAMPION && Config.L2JMOD_CHAMPION_FREQUENCY == 0)
            {
                continue;
            }
            
            list.add(type);
        }
        return list;
    }
    
    public static AchievementManager getInstance()
    {
        return SingletonHolder.INSTANCE;
    }
    
    private static class SingletonHolder
    {
        protected static final AchievementManager INSTANCE = new AchievementManager();
    }
}

 

This is Achievement Instance page:

 

* L2jOrion Project - www.l2jorion.com 
 * 
 * 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 l2jorion.game.model.actor.instance;

import java.util.List;
import java.util.StringTokenizer;

import l2jorion.Config;
import l2jorion.game.datatables.sql.ItemTable;
import l2jorion.game.enums.AchType;
import l2jorion.game.managers.AchievementManager;
import l2jorion.game.model.AchievementHolder;
import l2jorion.game.network.serverpackets.NpcHtmlMessage;
import l2jorion.game.templates.L2Item;
import l2jorion.game.templates.L2NpcTemplate;
import l2jorion.game.util.Util;

public final class L2AchievementInstance extends L2FolkInstance
{
    private final static int PAGE_LIMIT = Config.PAGE_LIMIT;
    
    public L2AchievementInstance(int objectId, L2NpcTemplate template)
    {
        super(objectId, template);
    }
    
    @Override
    public void onBypassFeedback(L2PcInstance player, String command)
    {
        final StringTokenizer st = new StringTokenizer(command, " ");
        String currentCommand = st.nextToken();
        
        if (currentCommand.startsWith("Chat"))
        {
            int val = Integer.parseInt(st.nextToken());
            showChatWindow(player, val);
        }
    }
    
    @Override
    public void showChatWindow(L2PcInstance player, int val)
    {
        final NpcHtmlMessage html = new NpcHtmlMessage(0);
        html.setFile(getHtmlPath(player, getNpcId(), 0));
        html.replace("%objectId%", getObjectId());
        html.replace("%list%", getList(player, val));
        player.sendPacket(html);
    }
    
    public static int countPagesNumber(int objectsSize, int pageSize)
    {
        return objectsSize / pageSize + (objectsSize % pageSize == 0 ? 0 : 1);
    }
    
    private String getList(L2PcInstance player, int page)
    {
        // Retrieve the entire types list based on group type.
        List<AchType> list = AchievementManager.getInstance().getTypeList(player);
        
        // Calculate page number.
        final int max = countPagesNumber(list.size(), PAGE_LIMIT);
        page = page > max ? max : page < 1 ? 1 : page;
        
        // Cut skills list up to page number.
        list = list.subList((page - 1) * PAGE_LIMIT, Math.min(page * PAGE_LIMIT, list.size()));
        
        final StringBuilder sb = new StringBuilder();
        
        int row = 0;
        for (AchType type : list)
        {
            boolean exist = player.getAchievement().getData().containsKey(type);
            boolean completed = false;
            int getLevel = exist ? player.getAchievement().getData().get(type).getId() - 1 : 0;
            int getCount = exist ? player.getAchievement().getData().get(type).getValue() : 0;
            int allStages = AchievementManager.getInstance().getStages(type).size();
            
            if (AchievementManager.getInstance().getStages(type).size() < (getLevel + 1))
            {
                getLevel = AchievementManager.getInstance().getStages(type).size() - 1;
                completed = true;
            }
            
            AchievementHolder ach = AchievementManager.getInstance().getAchievements().get(type).get(getLevel);
            sb.append("<img src=l2ui.squareblack width=296 height=1><table cellspacing=1 cellpadding=1 width=296 bgcolor=000000><tr>");
            sb.append("<td width=40 height=40 align=center><button width=32 height=32 back=" + ach.getIcon() + " fore=" + ach.getIcon() + "></td>");
            sb.append("<td width=256>" + ach.getName().toUpperCase() + " " + (completed ? "<font color=00FF00>Completed</font>" : "") + "<br1>");
            sb.append("Stage:<font color=LEVEL>" + ach.getLevel() + "/" + allStages + "</font> Reward:<font color=LEVEL>" + Util.formatAdena(ach.getRewardCount()) + "</font> " + getItemNameById(ach.getRewardId()) + "<br1>");
            sb.append("<font color=B09878>" + (completed ? "[" + ach.getName() + " achievement completed]" : ach.getDescription().replaceAll("%required%", getCount + "/" + ach.getRequired())) + "</font></td></tr></table>");
            sb.append("<table cellspacing=0 cellpadding=0 width=300 height=15><tr><td>" + generateBar(300, 15, completed ? ach.getRequired() : getCount, ach.getRequired()) + "</td></tr></table>");
            sb.append("<img src=l2ui.squareblack width=296 height=1><img height=3>");
            row++;
        }
        
        for (int i = PAGE_LIMIT; i > row; i--)
        {
            sb.append("<img height=47>");
        }
        
        // Build page footer.
        sb.append("<table width=300><tr>");
        sb.append("<td align=left width=100>" + (page > 1 ? "<button value=\"< PREV\" action=\"bypass npc_" + getObjectId() + "_Chat " + (page - 1) + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
        sb.append("<td align=center width=100>Page " + page + "/" + max + "</td>");
        sb.append("<td align=right width=100>" + (page < max ? "<button value=\"NEXT >\" action=\"bypass npc_" + getObjectId() + "_Chat " + (page + 1) + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
        sb.append("</tr></table>");
        
        return sb.toString();
    }
    
    public String generateBar(int width, int height, int current, int max)
    {
        final StringBuilder sb = new StringBuilder();
        current = current > max ? max : current;
        int bar = Math.max((width * (current * 100 / max) / 100), 0);
        sb.append("<table width=" + width + " cellspacing=0 cellpadding=0><tr><td width=" + bar + " align=center><img src=L2UI_CH3.BR_BAR1_CP width=" + bar + " height=" + height + "/></td>");
        sb.append("<td width=" + (width - bar) + " align=center><img src=L2UI_CH3.BR_BAR1_HP1 width=" + (width - bar) + " height=" + height + "/></td></tr></table>");
        return sb.toString();
    }
    
    @Override
    public String getHtmlPath(L2PcInstance player, final int npcId, final int val)
    {
        return "data/html/achievements/" + npcId + "" + (val == 0 ? "" : "-" + val) + ".htm";
    }
    
    public String getItemNameById(int itemId)
    {
        L2Item item = ItemTable.getInstance().getTemplate(itemId);
        
        String itemName = "NoName";
        
        if (itemId != 0)
        {
            itemName = item.getName();
        }
        
        return itemName;
    }
}
 

 

 

Edited by Paly
  • 0
Posted (edited)

Bro, use pastebin.com for large chunks of code. It's unreadable like that.

 

You need to make a new npc with type L2Achievement and add its html in data/html/achievements. If there is already a html there, leave it as it is (only rename with your npc id).

 

If there isn't make sure to include %list% in the html so the actual achievement list can appear.

 

I just had a look at the code, it should work fine unless I missed something. If you find any problems just reply.

 

 

P.S. Kindly suggestion, don't use orion. If you don't have a developer and need ready features, use lucera. Otherwise pay a developer and use aCis.

Edited by An4rchy
  • 0
Posted
1 hour ago, An4rchy said:

Bro, use pastebin.com for large chunks of code. It's unreadable like that.

 

You need to make a new npc with type L2Achievement and add its html in data/html/achievements. If there is already a html there, leave it as it is (only rename with your npc id).

 

If there isn't make sure to include %list% in the html so the actual achievement list can appear.

 

I just had a look at the code, it should work fine unless I missed something. If you find any problems just reply.

 

 

P.S. Kindly suggestion, don't use orion. If you don't have a developer and need ready features, use lucera. Otherwise pay a developer and use aCis.

Hello, you save me. Many many thanks! it works perfectly. I was using L2AchievementManager and the system dont found the npc!  So many thanks to all of you.

I will try lucera. Im on Orion cause it works fine for now and got all the mods i wanted: bang points, offline trade/craft, no core bugs, and now achievements. 

Sorry for the bad reply without <code>

 

I want to ask a little things that maybe are very easy for u guys.

 

How can i create a new item? i need to add it to handlers? i want no make a new sp scroll, that gives exp no sp. i can imagine is not so simple like create a new npc id in custom npc.

 

I follow this steps, create a new code in etcitems. then edit the etcitems in system, and i think i need to add the ability item in source?

  • 0
Posted

You need to make a new ItemHandler and in there add player.addExpAndSp or whatever similar method orion uses. Then, you need to create a new item (in xml or sql, idk what orion uses) and specify the handler you created (if it's xml smth like <set name="handler" val="YourHandlerName"/>0).

 

Also, having a pack that has 'no core bugs' like you said does not mean everything will be OK when you open  a server. You will probably end up with 500 errors/missing things/not working things you had no idea about and 0 clue how to fix them. You cannot open a server if you don't know what you're doing, avoid it. Pay a developer to do it for you, or start learning.

 

Even if you use lucera, which is a pack used by numerous online servers (L2Unity, L2Dream namely and 99% of russian servers) you will still have errors and problems. But as long as you don't leech the pack and buy it, you will have support by experienced developers (a thing that I cannot say for orion unfortunately).

 

Long story short if you don't pay or spend numerous hours learning, you'll fail. But gl.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...