Jump to content

Recommended Posts

Posted

Hey there.

 

This is a boss engine i created long ago, cause i always found every boss/grand boss engine difficult/weird to use. It's really easy to use. The code may be weird because i remember to be experimenting on stuff when creating this. Also, i know it could have been done in a better way(with saving each boss data and other stuff). Coded on aCis, can't remember revision.

 

There are also some boss examples i used.

 

 

/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.customs.custombosses;

import java.util.ArrayList;
import java.util.List;

import net.sf.l2j.gameserver.ThreadPoolManager;

/**
* @author Anarchy
*
*/
public class CustomBossManager
{
    private List<CustomBoss> _customBosses;
    
    public static CustomBossManager getInstance()
    {
        return SingletonHolder._instance;
    }
    
    protected CustomBossManager()
    {
        _customBosses = new ArrayList<>();
        
        _customBosses.add(new ForestGodBoss());
        
        initBosses();
        
        System.out.println("CustomBossesManager: Loaded "+_customBosses.size()+" custom bosses.");
    }
    
    private void initBosses()
    {
        for (final CustomBoss cb : _customBosses)
        {
            int respawnHours = Integer.parseInt(cb.getRespawnTime().split(":")[0]);
            int respawnMinutes = Integer.parseInt(cb.getRespawnTime().split(":")[1]);
            
            int totalMinutes = (respawnHours * 60) + respawnMinutes;
            
            long respawnMillis = totalMinutes * 1000 * 60;
            
            ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable()
            {
                @Override
                public void run()
                {
                    cb.doSpawn();
                }
            }, respawnMillis/2, respawnMillis);
        }
    }
    
    public CustomBoss getCustomBoss(int id)
    {
        CustomBoss temp = null;
        
        for (CustomBoss cb : _customBosses)
        {
            if (cb.getNpcId() == id)
            {
                temp = cb;
                break;
            }
        }
        
        return temp;
    }
    
    private static class SingletonHolder
    {
        protected static final CustomBossManager _instance = new CustomBossManager();
    }
}

 

 

/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.customs.custombosses;

import net.sf.l2j.gameserver.Announcements;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.datatables.SpawnTable;
import net.sf.l2j.gameserver.model.L2Spawn;
import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;

/**
* @author Anarchy
*
*/
public abstract class CustomBoss
{
    private L2Spawn _lastSpawn = null;
    
    public void delete()
    {
        if (_lastSpawn == null)
        {
            return;
        }
        
        _lastSpawn.getLastSpawn().deleteMe();
        _lastSpawn.stopRespawn();
        SpawnTable.getInstance().deleteSpawn(_lastSpawn, false);
        
        _lastSpawn = null;
        
        Announcements.announceToAll("Custom Boss "+getName()+" has been killed!");
    }
    
    public void doSpawn()
    {
        if (_lastSpawn != null)
        {
            return;
        }
        
        L2NpcTemplate tmpl = NpcTable.getInstance().getTemplate(getNpcId());
        try
        {
            L2Spawn spawn = new L2Spawn(tmpl);
spawn.setLocx(getLocation()[0]);
spawn.setLocy(getLocation()[1]);
spawn.setLocz(getLocation()[2]);
spawn.setHeading(0);
spawn.setRespawnDelay(100);
SpawnTable.getInstance().addNewSpawn(spawn, false);
spawn.init();

_lastSpawn = spawn;
onSpawn();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("Failed to spawn boss "+getName()+" with id "+getNpcId()+".");
        }
    }
    
    protected void onSpawn()
    {
        Announcements.announceToAll("Custom Boss "+getName()+" was spawned in the world!");
    }
    
    public abstract int[] getLocation();
    public abstract int getNpcId();
    public abstract String getName();
    public abstract String getRespawnTime();
}

 

 

/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.customs.custombosses;

/**
* @author Anarchy
*
*/
public class ForestGodBoss extends CustomBoss
{
    @Override
    public int[] getLocation()
    {
        return new int[] { 172830, -87707, -5108 };
    }
    
    @Override
    public int getNpcId()
    {
        return 65533;
    }

    @Override
    public String getName()
    {
        return "Forest God";
    }

    @Override
    public String getRespawnTime()
    {
        return "1:00";
    }
}

 

 

In L2MonsterInstance under doDie() method, add this check:

 

        if (isCustomBoss())
        {
            CustomBossManager.getInstance().getCustomBoss(getNpcId()).delete();
        }

 

and this method:

 

    public boolean isCustomBoss()
    {
        return CustomBossManager.getInstance().getCustomBoss(getNpcId()) != null;
    }

 

Also register the CustomBossManager in Gameserver.java.

 

How to use it:

Simple, create a normal monster with super stats and super drops, make a new class that extends CustomBoss, add it's data there, register it to CustomBossManager and you're done. The bosses must be type L2Monster in order to work properly.

 

About this ForestGod i won't share the npc data just make new ones.

 

HF.

  • 4 months later...
Posted (edited)

You can explain a little bit more

 make a new class that extends CustomBoss, add it's data there, register it to CustomBossManager and you're done

 

plz make example

Edited by pske
  • 2 months later...

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
Reply to this topic...

×   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.



  • Posts

    • 🔥 Looking for a powerful, clean, and player-friendly Auction House system for your Lineage 2 server? This fully-featured module is ready to plug into your project and provide your players with a modern, centralized marketplace!   💼 What is it? A complete Auction House system designed for fixed-price item sales between players. Forget about private stores and spammed zones—this system offers a smooth, secure, and offline-friendly way to buy and sell items across your server.   Photo Library: https://imgur.com/a/zLlUQbW   ✅ Main Features: 🔹 Fixed-Price Listings Only: Players list items at a set price. No bidding, no delays—just fast, clean trades. 🔹 Multi-Currency Support: Works with Adena, event coins, custom currencies—fully configurable. 🔹 Dynamic Interface: Players can filter items by name, type, and price. Easy-to-use HTML layout with smooth pagination. 🔹 Sell While Offline: Post items and receive payments even if you're not online—true passive trading. 🔹 Safety First: Full validation: no equipped/augmented/restricted items unless allowed. Prevents scams, mispricing, and listing errors. 🔹 Expiration Timer (Optional): Set listing time limits. Expired items go to warehouse/mail automatically. 🔹 Spam & Duplication Protection: Prevents multiple listings of identical items and unnecessary database load. 🔹 Performance Optimized: Clean, indexed SQL structure. No lag or bloating even with thousands of listings.   ⚙️ Plug & Play Clean Java code (compatible with aCis & derivatives). Easy setup with full instructions and sample configurations. Includes SQL, HTML files, and all Java classes – fully working out of the box.   💰 Pricing & Contact 📦 50 euro - One-time purchase with full support for setup & basic customization. 💬 Contact me here via PM or on Discord: @Luminous 🔐 Serious buyers only – source is clean, secure, and tested on live servers.     Give your server the next-level economy it deserves. No more chaotic trade zones. No more confusion. Just clean, efficient, server-wide trading.
    • We are certainly not an ambulance, but we will definitely cure you of blacklists and empty pockets. Live freely with SX! Each of you will receive a trial version of SX to familiarize yourself with the product, all you have to do is post in this thread
    • 166 pisses on their heads any day of the week though
    • Thnx for share, i can't pm u for password  
    • I'm looking for the best current files that are up to date for the year 2025, not files that are stuck in 2020.
  • Topics

×
×
  • Create New...