Jump to content

Recommended Posts

Posted (edited)

hello all, tonight I decided to share l2 supermonster code adapted acis, 100% tested !

 

so let's start.

 

package net.sf.l2j;

 

config.java

/** Events */  public static final String SMALLEVENTS_FILE = "./config/Events/SmallEvents.properties";
  public static final String OLYMPIAD_FILE = "./config/Events/Olympiad.properties";
  public static final String STRIDER_FILE = "./config/Events/Strider.properties";
  public static final String RANDOMFIGHT_FILE = "./config/Events/RandomFight.properties";
+public static final String SUPERMONSTER_FILE = "./config/Events/SuperMonster.properties";

at line 2599 

aCis_gameserver/java/net/sf/l2j/Config.java

// Super Monster
ExProperties SuperMonster = load(SUPERMONSTER_FILE);
ENABLE_SUPER_MONSTER = SuperMonster.getProperty("EnableSuperMonster", false);
SUPER_MONSTERS = SuperMonster.getProperty("SuperMonsters");


SUPER_MONSTERS_IDS = new ArrayList<>();
String[] arrayOfString1 = SUPER_MONSTERS.split(",");
int i = arrayOfString1.length;
int str1;
for (str1 = 0; str1 < i; str1++)
{
String id = arrayOfString1[str1];
SUPER_MONSTERS_IDS.add(Integer.valueOf(Integer.parseInt(id)));
}
SM_REWARD_PARTY = SuperMonster.getProperty("RewardParty", false);
SM_REWARD_PARTY_NOBLE = SuperMonster.getProperty("GiveNoblesseFullParty", false);
SM_REWARD_PARTY_HERO = SuperMonster.getProperty("GiveHeroFullParty", false);
SM_GIVE_NOBLE = SuperMonster.getProperty("GiveNoblesse", false);
SM_GIVE_HERO = SuperMonster.getProperty("GiveHero", false);
SM_GIVE_ITEM = SuperMonster.getProperty("GiveItemReward", false);


String[] smReward = SuperMonster.getProperty("ItemRewards", "57,100000").split(";");
SM_ITEM_REWARD = new ArrayList<>();
String[] arrayOfString2 = smReward;
str1 = arrayOfString2.length;
for (int id = 0; id < str1; id++)
{
String reward = arrayOfString2[id];


String[] rewardSplit = reward.split(",");
if (rewardSplit.length != 2)
{
_log.warning(StringUtil.concat(new String[]
{
"[Config.load()]: invalid config property -> ItemRewards \"",
reward,
"\""
}));
}
else
{
try
{
SM_ITEM_REWARD.add(new int[]
{


Integer.parseInt(rewardSplit[0]),
Integer.parseInt(rewardSplit[1])
});
}
catch (NumberFormatException nfe)
{
if (!reward.isEmpty())
{
_log.warning(StringUtil.concat(new String[]
{
"[Config.load()]: invalid config property -> ItemRewards \"",
reward,
"\""
}));
}
}
}
}
config file:
 
#=============================================================
# Super Monster
#=============================================================
# This are special monsters that are having special reward features when get killed.
# The list can contain L2Monster, L2Raid, L2GrandBoss instances!
# The script can be edited from data/scripts/events/SuperMonster/SuperMonster.java
# Enable The Super Monster ?
EnableSuperMonster = False

# Monsters ids.
# WARNING all the features will be available for the configured monsters!
# Format monsterId,monsterId,monsterId
SuperMonsters = 0

# Give reward for the full party?
RewardParty = False

# Give noblesse to the full party?
GiveNoblesseFullParty = False

# Give hero status to the full party? (Untill logout)
GiveHeroFullParty = False

# Give noblesse status for the killer?
GiveNoblesse = False

# Give hero status to the killer? (Untill logout)
GiveHero = False

# Give item reward?
# This is for both full party (if enabled) and killer.
GiveItemReward = False

# Items for reward
# Format itemId,amount;itemId,amount;itemId,amount
ItemRewards = 57,100000

script.cfg import:

events/SuperMonster/SuperMonster.java

datapack:

aCis_datapack/data/scripts/events/SuperMonster/SuperMonster.java

package events.SuperMonster;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.datatables.ItemTable;
import net.sf.l2j.gameserver.model.actor.L2Npc;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.itemcontainer.PcInventory;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;

public class SuperMonster extends Quest
{
	public SuperMonster()
	{
		super(-1, "SuperMonster", "custom");
		
		if (Config.ENABLE_SUPER_MONSTER)
		{
			for (int mobs : Config.SUPER_MONSTERS_IDS)
				addKillId(mobs);
		}
	}
	
	@Override
	public String onKill(L2Npc npc, L2PcInstance player, boolean isPet)
	{
		if (Config.SM_REWARD_PARTY && player.getParty() != null)
		{
			for (L2PcInstance members : player.getParty().getPartyMembers())
			{
				members.sendMessage("Congratulations! You killed The SuperMonster!");
				
				if (Config.SM_GIVE_ITEM)
					rewardWinner(members);
				
				if (Config.SM_REWARD_PARTY_HERO && !player.isHero())
				{
					members.setHero(true);
					members.sendMessage("You are now hero untill relogin!");
				}
				
				if (Config.SM_REWARD_PARTY_NOBLE && !members.isNoble())
				{
					members.setNoble(true, true);
					members.sendMessage("You have become noblesse!");
				}
				
				members.broadcastUserInfo();
			}
		}
		else
		{
			player.sendMessage("Congratulations! You killed The SuperMonster!");
			
			if (Config.SM_GIVE_ITEM)
				rewardWinner(player);
			
			if (Config.SM_GIVE_HERO && !player.isHero())
			{
				player.setHero(true);
			}
			
			if (Config.SM_GIVE_NOBLE && !player.isNoble())
			{
				player.setNoble(true, true);
			}
			
			player.broadcastUserInfo();
		}
		
		return null;
	}
	
	static void rewardWinner(L2PcInstance player)
	{
		// Check for nullpointer
		if (player == null)
			return;
		
		// Iterate over all rewards
		for (int[] reward : Config.SM_ITEM_REWARD)
		{
			PcInventory inv = player.getInventory();
			
			// Check for stackable item, non stackabe items need to be added one by one
			if (ItemTable.getInstance().createDummyItem(reward[0]).isStackable())
			{
				inv.addItem("SuperMonster", reward[0], reward[1], player, player);
			}
			else
			{
				for (int i = 0; i < reward[1]; ++i)
				{
					inv.addItem("SuperMonster", reward[0], 1, player, player);
				}
			}
		}
		
		StatusUpdate statusUpdate = new StatusUpdate(player);
		statusUpdate.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
		player.sendPacket(statusUpdate);
	}
	
	public static void main(String args[])
	{
		new SuperMonster();
	}
}
Edited by xAddytzu
Posted (edited)
EnableSuperMonster = False

SuperMonsters = 0

configs are redundant, if id is 0 it should be considered as false (otherwise if you put true you register script for id 0 which doesn't exist). Simply check id array length > 0.

 


 

I'm not sure if hero status is saved on database using it that way, for noble it's normally fine.

 


 

It's old writting style, scripts are on core now and main method is dropped.

 


 

Finally you should better put the whole content of

			player.sendMessage("Congratulations! You killed The SuperMonster!");
			
			if (Config.SM_GIVE_ITEM)
				rewardWinner(player);
			
			if (Config.SM_GIVE_HERO && !player.isHero())
			{
				player.setHero(true);
			}
			
			if (Config.SM_GIVE_NOBLE && !player.isNoble())
			{
				player.setNoble(true, true);
			}
			
			player.broadcastUserInfo();

into rewardWinner because it's redundant and you make 0 special check on party more than on single case. So L2PcInstance player is fine in any case. Even worst, you got messages only if the guy is on party not if he is solo because you badly copied paste without verifying if content was 1:1 copy from team case.

 


 

Last and not least you normally don't need to check null case.

Edited by Tryskell

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

    • New user panel SOURCE $ 200 for source code. R$ 1000,00 BRL for source code.    
    • User panel 2.0 + New features.    
    • Hello everyone, we are one of the top gaming currency stores. We work exclusively with top projects. If you are interested in anything like Adena, Coins, Equip, write to us Discord - pchelacoin Telegram - https://t.me/ipchelacoin BOHPTS, KETRAWARS, EURO-PVP, L2REBORN, E-GLOBAL, LA2DREAM TOP PRICE !!!!!!!
    • L2Elixir – Patch 4 Is Live!   We’re working non-stop, day and night, to deliver the best possible quality and bring back what made L2Elixir special. This project is built with passion, not shortcuts — for the old-school players who remember, and the new ones who want to experience it properly. Thank you for being part of the journey. Together, we’re making L2Elixir great again ❤️ The legends never fade.    ⚙️ General Enabled Class Change service (same class type only) ALT + B → Services → Character Development Enabled Shift + Click on Treasure Chests Players can now identify real chests (Adena, scroll drops) and use Key / Unlock Event deaths now cancel only debuffs, All self buffs are preserved, fixes issues with Root and similar effects Bladedancer class can now log in even when Max Clients (2) is reached. Since an active Bladedancer is not available for every damage dealer and some players tried to abuse this via VPN or a second PC, this feature was added to keep things fair. protections applies, requires testing!    🎒 Items Crystallizing enchanted items now gives the correct increased crystal amount (retail-like behavior) Removed Agathion Seal Bracelet: Rudolph from Santa rewards (Gracia Final item) Added Dualsword Craft Stamp into Milestone Exchange list    🧙 Skills Fixed Banish Undead lethal chance Hot Springs Malaria and similar effects now level up faster while being attacked
  • 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