Jump to content

Question

Posted

Hi there.

I've made recently a local server setup with L2OFF files, but here is the problem, i dont know how to work with them. Searched a lot on the internet, to find some clues for me but nothing.

Anyone can share with me any guides how to work with L2OFF files, editing drops lists, mobs, and all that stuff.

 

6 answers to this question

Recommended Posts

  • 0
Posted
1 hour ago, รoftcorє said:

Hi there.

I've made recently a local server setup with L2OFF files, but here is the problem, i dont know how to work with them. Searched a lot on the internet, to find some clues for me but nothing.

Anyone can share with me any guides how to work with L2OFF files, editing drops lists, mobs, and all that stuff.

 

 

Hello dear, you can find the files in the scripts folder. You could specify what you want to edit and we will be happy to help you.

  • Haha 1
  • 0
Posted
30 minutes ago, UnknownSoldier said:

 

Hello dear, you can find the files in the scripts folder. You could specify what you want to edit and we will be happy to help you.

For example i want to edit raid bosses drops as firt type.

Other one is to edit drops from different mobs.

What exactly files i have to edit, how to save them, and do i edit only 1 file = save it, and that's it ? Or i have to make other actions with other files when i change the drops for example.

  • 0
Posted
1 hour ago, รoftcorє said:

For example i want to edit raid bosses drops as firt type.

Other one is to edit drops from different mobs.

What exactly files i have to edit, how to save them, and do i edit only 1 file = save it, and that's it ? Or i have to make other actions with other files when i change the drops for example.

 


To edit the drop you can do it from npcdata.txt, it should be inside the scrtips folder, inside there you look for emo mob/raid that you want to edit and you will find the group of drops.

 

  • 0
Posted
36 minutes ago, UnknownSoldier said:

 


To edit the drop you can do it from npcdata.txt, it should be inside the scrtips folder, inside there you look for emo mob/raid that you want to edit and you will find the group of drops.

 

Correct me if i'm wrong. I just edit one file ? If the default mob for example has some kind of drop, and i want to get rid of an item, and re-place it with other, what then ? It's kinda complicated for me a little bit, because i'm doing it first time. Btm i'm developer also in real life, and trying to learn some C ++ now. But have no idea with editing these files.  They're strange to me, as on first look.

 

  • 0
Posted

 

npcdata,txt
 

npc_begin	boss	29020	[baium]	level=75	acquire_exp_rate=1822.8267	acquire_sp=1081544	unsowing=1	clan={@raid_clan}	ignore_clan_list={}	clan_help_range=300	slot_chest=[]	slot_rhand=[]	slot_lhand=[]	shield_defense_rate=0	shield_defense=0	skill_list={@s_race_undead;@s_perfect_resist_shock;@s_full_magic_defence}	npc_ai={[baium]}	category={}	race=construct	sex=male	undying=0	can_be_attacked=1	corpse_time=13	no_sleep_mode=1	agro_range=1000	ground_high={120;0;0}	ground_low={80;0;0}	exp=804225365	org_hp=1709400	org_hp_regen=750	org_mp=18000	org_mp_regen=99	collision_radius={65;65}	collision_height={174;174}	str=60	int=76	dex=73	wit=70	con=57	men=80	base_attack_type=fist	base_attack_range=40	base_damage_range={0;0;80;120}	base_rand_dam=30	base_physical_attack=3374.18	base_critical=4	physical_hit_modify=4.75	base_attack_speed=253	base_reuse_delay=0	base_magic_attack=2200	base_defend=3300	base_magic_defend=2200	physical_avoid_modify=0	soulshot_count=0	spiritshot_count=0	hit_time_factor=0.6	item_make_list={}	corpse_make_list={}	additional_make_list={}	additional_make_multi_list={{{{[tallum_blade];1;1;10};{[dragon_hunter_axe];1;1;1.5};{[angel_slayer];1;1;1.5};{[basalt_battlehammer];1;1;2};{[forgotten_blade];1;1;2};{[saint_spear];1;1;1.5};{[carnium_bow];1;1;10};{[tallum_blade*dark_legion_s_edge];1;1;1.5};{[elemental_sword];1;1;10};{[halbard];1;1;10};{[arcana_mace];1;1;2};{[draconic_bow];1;1;2};{[demon_splinter];1;1;2};{[heavens_divider];1;1;2};{[imperial_staff];1;1;2};{[dasparion_s_staff];1;1;10};{[bloody_orchid];1;1;10};{[blood_tornado];1;1;10};{[meteor_shower];1;1;10}};60};{{{[ring_of_baium];1;1;100}};100};{{{[sb_divine_inspiration_manuscript];5;15;92.5373};{[top_grade_life_stone_level_761];1;1;1.86567};{[top_grade_life_stone_level_701];1;1;5.597}};86.4516};{{{[high_grade_life_stone_level_701];1;2;52.9801};{[high_grade_life_stone_level_761];1;2;47.0199}};75.5}}	hp_increase=0	mp_increase=0	safe_height=100	npc_end


 

  • Loot Groups

    • Baium's drop list is divided into separate groups, each with a set chance to be selected.
    • Once a group is chosen, the system checks the drop rate of each item inside it.
  • Example Breakdown

    • {[tallum_blade];1;1;10}; means:
      • If this loot group is selected, the Tallum Blade has a 10% chance to drop.
      • Minimum 1, Maximum 1 piece can drop.


Baium Full Drop List:
 

additional_make_multi_list={
    // Weapon Loot Group - 60% chance to be selected
    {
        {
            {[tallum_blade];1;1;10};
            {[dragon_hunter_axe];1;1;1.5};
            {[angel_slayer];1;1;1.5};
            {[basalt_battlehammer];1;1;2};
            {[forgotten_blade];1;1;2};
            {[saint_spear];1;1;1.5};
            {[carnium_bow];1;1;10};
            {[tallum_blade*dark_legion_s_edge];1;1;1.5};
            {[elemental_sword];1;1;10};
            {[halbard];1;1;10};
            {[arcana_mace];1;1;2};
            {[draconic_bow];1;1;2};
            {[demon_splinter];1;1;2};
            {[heavens_divider];1;1;2};
            {[imperial_staff];1;1;2};
            {[dasparion_s_staff];1;1;10};
            {[bloody_orchid];1;1;10};
            {[blood_tornado];1;1;10};
            {[meteor_shower];1;1;10};
        };60
    };

    // Ring of Baium - Always Drops (100% chance)
    {
        {
            {[ring_of_baium];1;1;100};
        };100
    };

    // Scrolls & Life Stones - 86.4516% chance to be selected
    {
        {
            {[sb_divine_inspiration_manuscript];5;15;92.5373};
            {[top_grade_life_stone_level_761];1;1;1.86567};
            {[top_grade_life_stone_level_701];1;1;5.597};
        };86.4516
    };

    // High-Grade Life Stones - 75.5% chance to be selected
    {
        {
            {[high_grade_life_stone_level_701];1;2;52.9801};
            {[high_grade_life_stone_level_761];1;2;47.0199};
        };75.5
    };
}


 

How this works in practice

  1. The system rolls to decide which loot group will be used.
  2. If a group is selected, it rolls for each item inside that group.
  3. Example scenario:
    • The weapon group (60%) is chosen.
    • Each weapon inside has its own drop rate.
    • A Tallum Blade has a 10% chance to drop 1x Tallum Blade within this group.
    • Some items, like the Ring of Baium, always drop (100%).
  • 0
Posted
4 hours ago, mjst said:

 

npcdata,txt
 

npc_begin	boss	29020	[baium]	level=75	acquire_exp_rate=1822.8267	acquire_sp=1081544	unsowing=1	clan={@raid_clan}	ignore_clan_list={}	clan_help_range=300	slot_chest=[]	slot_rhand=[]	slot_lhand=[]	shield_defense_rate=0	shield_defense=0	skill_list={@s_race_undead;@s_perfect_resist_shock;@s_full_magic_defence}	npc_ai={[baium]}	category={}	race=construct	sex=male	undying=0	can_be_attacked=1	corpse_time=13	no_sleep_mode=1	agro_range=1000	ground_high={120;0;0}	ground_low={80;0;0}	exp=804225365	org_hp=1709400	org_hp_regen=750	org_mp=18000	org_mp_regen=99	collision_radius={65;65}	collision_height={174;174}	str=60	int=76	dex=73	wit=70	con=57	men=80	base_attack_type=fist	base_attack_range=40	base_damage_range={0;0;80;120}	base_rand_dam=30	base_physical_attack=3374.18	base_critical=4	physical_hit_modify=4.75	base_attack_speed=253	base_reuse_delay=0	base_magic_attack=2200	base_defend=3300	base_magic_defend=2200	physical_avoid_modify=0	soulshot_count=0	spiritshot_count=0	hit_time_factor=0.6	item_make_list={}	corpse_make_list={}	additional_make_list={}	additional_make_multi_list={{{{[tallum_blade];1;1;10};{[dragon_hunter_axe];1;1;1.5};{[angel_slayer];1;1;1.5};{[basalt_battlehammer];1;1;2};{[forgotten_blade];1;1;2};{[saint_spear];1;1;1.5};{[carnium_bow];1;1;10};{[tallum_blade*dark_legion_s_edge];1;1;1.5};{[elemental_sword];1;1;10};{[halbard];1;1;10};{[arcana_mace];1;1;2};{[draconic_bow];1;1;2};{[demon_splinter];1;1;2};{[heavens_divider];1;1;2};{[imperial_staff];1;1;2};{[dasparion_s_staff];1;1;10};{[bloody_orchid];1;1;10};{[blood_tornado];1;1;10};{[meteor_shower];1;1;10}};60};{{{[ring_of_baium];1;1;100}};100};{{{[sb_divine_inspiration_manuscript];5;15;92.5373};{[top_grade_life_stone_level_761];1;1;1.86567};{[top_grade_life_stone_level_701];1;1;5.597}};86.4516};{{{[high_grade_life_stone_level_701];1;2;52.9801};{[high_grade_life_stone_level_761];1;2;47.0199}};75.5}}	hp_increase=0	mp_increase=0	safe_height=100	npc_end


 

  • Loot Groups

    • Baium's drop list is divided into separate groups, each with a set chance to be selected.
    • Once a group is chosen, the system checks the drop rate of each item inside it.
  • Example Breakdown

    • {[tallum_blade];1;1;10}; means:
      • If this loot group is selected, the Tallum Blade has a 10% chance to drop.
      • Minimum 1, Maximum 1 piece can drop.


Baium Full Drop List:
 

additional_make_multi_list={
    // Weapon Loot Group - 60% chance to be selected
    {
        {
            {[tallum_blade];1;1;10};
            {[dragon_hunter_axe];1;1;1.5};
            {[angel_slayer];1;1;1.5};
            {[basalt_battlehammer];1;1;2};
            {[forgotten_blade];1;1;2};
            {[saint_spear];1;1;1.5};
            {[carnium_bow];1;1;10};
            {[tallum_blade*dark_legion_s_edge];1;1;1.5};
            {[elemental_sword];1;1;10};
            {[halbard];1;1;10};
            {[arcana_mace];1;1;2};
            {[draconic_bow];1;1;2};
            {[demon_splinter];1;1;2};
            {[heavens_divider];1;1;2};
            {[imperial_staff];1;1;2};
            {[dasparion_s_staff];1;1;10};
            {[bloody_orchid];1;1;10};
            {[blood_tornado];1;1;10};
            {[meteor_shower];1;1;10};
        };60
    };

    // Ring of Baium - Always Drops (100% chance)
    {
        {
            {[ring_of_baium];1;1;100};
        };100
    };

    // Scrolls & Life Stones - 86.4516% chance to be selected
    {
        {
            {[sb_divine_inspiration_manuscript];5;15;92.5373};
            {[top_grade_life_stone_level_761];1;1;1.86567};
            {[top_grade_life_stone_level_701];1;1;5.597};
        };86.4516
    };

    // High-Grade Life Stones - 75.5% chance to be selected
    {
        {
            {[high_grade_life_stone_level_701];1;2;52.9801};
            {[high_grade_life_stone_level_761];1;2;47.0199};
        };75.5
    };
}


 

How this works in practice

  1. The system rolls to decide which loot group will be used.
  2. If a group is selected, it rolls for each item inside that group.
  3. Example scenario:
    • The weapon group (60%) is chosen.
    • Each weapon inside has its own drop rate.
    • A Tallum Blade has a 10% chance to drop 1x Tallum Blade within this group.
    • Some items, like the Ring of Baium, always drop (100%).

Bump!  Thanks for the answer.

Close the topic.

Guest
This topic is now closed to further replies.


  • Posts

    • what pack you use  send me on discord for it
    • package custom.events.RandomZoneEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ScheduledFuture; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.time.SchedulingPattern; import org.l2jmobius.commons.time.TimeUtil; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.managers.ZoneManager; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.quest.Event; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.model.zone.ZoneType; import org.l2jmobius.gameserver.model.zone.type.RandomZone; import org.l2jmobius.gameserver.util.Broadcast; /** * Random Zone Event - Activates one random PvP zone temporarily. No modifica la clase de la zona: usa flags PvP en runtime. * @author Juan */ public class RandomZoneEvent extends Event { private static final String CONFIG_FILE = "data/scripts/custom/events/RandomZoneEvent/config.xml"; private static int EVENT_DURATION_MINUTES = 15; private static boolean _isActive = false; private ScheduledFuture<?> _eventTask = null; private final List<ZoneType> _availableZones = new ArrayList<>(); private ZoneType _activeZone = null; public RandomZoneEvent() { loadConfig(); loadZones(); registerZoneListeners(); } /** * Registra listeners a TODAS LAS ZONAS random */ private void registerZoneListeners() { for (ZoneType zone : _availableZones) { addEnterZoneId(zone.getId()); addExitZoneId(zone.getId()); LOGGER.info("[RandomZoneEvent] Registered listener for zone: " + zone.getName()); } } private void loadConfig() { new IXmlReader() { @Override public void load() { parseDatapackFile(CONFIG_FILE); } @Override public void parseDocument(Document doc, File file) { forEach(doc, "event", eventNode -> { final StatSet att = new StatSet(parseAttributes(eventNode)); final String name = att.getString("name"); for (Node node = eventNode.getFirstChild(); node != null; node = node.getNextSibling()) { if ("schedule".equals(node.getNodeName())) { final StatSet attributes = new StatSet(parseAttributes(node)); final String pattern = attributes.getString("pattern"); final SchedulingPattern schedulingPattern = new SchedulingPattern(pattern); final StatSet params = new StatSet(); params.set("Name", name); params.set("SchedulingPattern", pattern); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer("Schedule_" + name, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Event " + name + " scheduled at " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } }); } }.load(); } private void loadZones() { for (ZoneType zone : ZoneManager.getInstance().getAllZones(RandomZone.class)) { if ((zone.getName() != null) && zone.getName().toLowerCase().startsWith("random_zone")) { _availableZones.add(zone); LOGGER.info("[RandomZoneEvent] Loaded zone: " + zone.getName() + " (id=" + zone.getId() + ")"); } } LOGGER.info("[RandomZoneEvent] Total random zones loaded: " + _availableZones.size()); } @Override public void onTimerEvent(String event, StatSet params, Npc npc, Player player) { if (event.startsWith("Schedule_")) { eventStart(null); final SchedulingPattern schedulingPattern = new SchedulingPattern(params.getString("SchedulingPattern")); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer(event, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Rescheduled for " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } @Override public boolean eventStart(Player eventMaker) { if (_isActive) { if (eventMaker != null) { eventMaker.sendMessage("RandomZoneEvent already active."); } return false; } if (_availableZones.isEmpty()) { Broadcast.toAllOnlinePlayers("[RandomZoneEvent] No zones configured."); return false; } _isActive = true; Broadcast.toAllOnlinePlayers("⚔️ Random Zone Event has started!"); _eventTask = ThreadPool.schedule(this::activateRandomZone, 5_000); return true; } private void activateRandomZone() { _activeZone = _availableZones.get(new Random().nextInt(_availableZones.size())); _activeZone.setEnabled(true); Broadcast.toAllOnlinePlayers("🔥 Random Zone Event: " + _activeZone.getName() + " is now PvP for " + EVENT_DURATION_MINUTES + " minutes!"); _eventTask = ThreadPool.schedule(this::eventStop, EVENT_DURATION_MINUTES * 60 * 1000L); } @Override public boolean eventStop() { if (!_isActive) { return false; } _isActive = false; if (_eventTask != null) { _eventTask.cancel(true); _eventTask = null; } if (_activeZone != null) { _activeZone.setEnabled(false); Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended. " + _activeZone.getName() + " is back to normal."); _activeZone = null; } else { Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended."); } return true; } @Override public void onEnterZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, true); if (creature.isPlayer()) { creature.sendMessage("Esta zona está en modo PvP temporalmente."); } } } @Override public void onExitZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, false); if (creature.isPlayer()) { creature.sendMessage("Abandonaste la zona PvP temporal."); } } } @Override public boolean eventBypass(Player player, String bypass) { return true; } @Override public String onEvent(String event, Npc npc, Player player) { return super.onEvent(event, npc, player); } @Override public String onFirstTalk(Npc npc, Player player) { return null; } public static void main(String[] args) { new RandomZoneEvent(); } } i have this but its not working
  • 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