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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • Hi, I'm selling Interface sources. I was working with one of bigger Essence projects (for ±1 year) delivering them Interface source KR. Per this period gathered knowledge about UE, UE Scripting, saw a lot of tools and their progression. So finally I decided that I can open up my own sales topic. I'm selling source for any protocol - If I don't have source, I will need you to provide whole system folder or for Essence/main - provide me protocol number. Sources are acquired by my OWN decompiler - written in Java, so we're not using popular UEExplorer upgraded by anyone. Decompiler extracts already compile ready sources. It outputs clean code, however constants are mapped 60-70%. Why only 60-70%? Well tl;dr when you compile any sources, they take at that time constant value and place it instead of = CONST_NAME to = THAT_CONST_NAME_VALUE, so it's not possible to have const name instead of value. Example of output: https://pastebin.com/AUpZJAHC for bigger .uc class (557p). You will get source + my compiler wrapper (written in java) - works on Windows/Mac/Linux. Small notice, who thinks 'this is decompiled source' - basically all sources that are on sale are made by decompiling .u and applying changes. I think powerhouse few years ago was ArtToKill/kick (kick added support for INT64 to the publicly available compiler sources) etc. So no - there are no straight from 'creator' sources anywhere, all sellers offer the same - just the quality is different. UEExplorer upgraded was a big step, however, it introduces still a lot of nesting, if statements wrapping incorrectly which could lead to bugs. There are many things how to identify poor quality sources, as if the seller tries to sell 'out-of-box' when they see it compiles - sad news, some bugs are in the logic due to seller focusing only on 'it compiles' rather than issues.   Later I can attached compiled .u to try. Price is 400EUR. Payment methods USDTC (Crypto). I'm still in debate with myself, wether to start selling XDat Editor with structures and ClientDat with 100% all files openings (no unk namings) and improved experience (such as comments support in .dat files, mass sync, improved performance and so on). P.s. If you ask me to give you some project's custom interface - the price may vary - there are couple things per project that need to be hand checked and adjusted (for example Innadril completely changes tokens which then I need to adjust my program to their token Ids). So it might take more time = more money. P.s.s. I have more things in the garage, like my own dsetup source that can allow you 'unlocking' system with your desired encrypting - you don't need to wait till 'patched' systems start appearing and so on, but I think at this time everyone who needs it make them selves it.  
    • It has been a while since I updated this thread. I am currently actively working on a full-scale port of the shader library to ensure the fast and accurate transfer of all effects. I have decompiled the original game and created a tool that fully logs the entire *Lineage 2 Interlude* particle system. This allows me to extract the original formulas hardcoded into the game, resulting in a high-fidelity port. For instance, *Lineage 2* uses an `appRnd` system that generates unique randomization patterns for different skills, giving them distinct visual characteristics; there are countless formulas and technical nuances like this. Ultimately, I will derive all the key formulas and replicate the geometry with high precision. Twelve basic geometry formulas have already been ported. The effect was created in 10 minutes using a .uc file, HLSL formulas, and SpriteEmitter particle blending formulas.   https://prnt.sc/_3UDLQVX_Y-_
    • Good luck my friend! 😃
    • try this one instead. The one he shared affects every single NPC/player character in the game, the one I posted only affects player characters  https://drive.google.com/file/d/1UtccbD9e50x3WEnQBab2PTZnBHwpcGYM/view?usp=sharing or perhaps i misunderstood; if you could please post a full explanation of the problem you're having with the files, unfortunately i think whatever you're using to translate to english is a bit bad nevermind, i got what you mean, here's the fix   https://drive.google.com/file/d/1av7OHaGSdnVQtcBgb9MhtiIkxVXy3P2y/view?usp=sharing   CanIngnoreCollision=True CanBeIngnoredCollision=True  
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..