Jump to content

Recommended Posts

Posted

2.png.10eeff651ff674035efaf3b73858e39e.png
 

Base: L2JServer (2007)
Java: 8
MariaDB: 10
 

Let's get this moving, I hope that with everyone's help in any way we can accomplish something.
Any help is welcome, it's been years since I've worked with L2 and I'm slowly getting back into it, I don't have that much experience + let's keep trying.

The project is on GitHub, I hope that anyone who wants to contribute will create a fork to send their "possible" contributions, so that everyone on the forum can use it.

 

Modifications:
 

Quote

C3p0 > 0.9.5.5
Java 8
Mysql connector
Organized the folders / Build
Updated the SQL
Modified the Database_install.bat file.

 

 

Mods:

 

Quote

Anti-Heavy System
Custom Starter Items
Buff Time Rates
Class Balance
PvP Nick Color System
Added L2J_GeoDriver
Fixed Pathnode charging
Attempt to fix attack
Attempt to fix IA

 

n4kBVZ5.png

 

XYb3SFR.png

 


DOWNLOADS


ProjetoGithub
SystemMEDIAFIRE
ClienteGoogle Driver
GeoDataMediafire

  • Like 2
Posted (edited)

More fluid combat, not 100% yet, but I think it's acceptable.
I put the following logic in movetopawn, moveto, maybemovetopawn, validatelocation, movetolocation:
If Config.GeoData is active, it applies the coordinates using geodata; if disabled, use setdistanceplansq to measure the distance of things!
Fix for reflected damage (if the attacker is null, it will not be calculated).
Minor improvements to the Day/Night item generation manager.
Fix to not punish players who destroy items with a count = 0...
Fix for when a player tried to use a resurrection scroll while seated, it disappeared without effect.
Fix for when it was possible to equip armor while paralyzed.
Cleanup of System message.
Rework of PathNodes.
Fixed the ia for mobs attack range when chasing the player (test)
Fixed Pathnodes loading
Added
# ------------------------
#Show Red Name for Aggressive Mobs
# ------------------------
ShowRedName = True
Which was missing in the configs

Edited by 4TOP
Posted (edited)

Added FloodProtector utility to prevent packet flooding for actions like item use and dice rolling.
Integrated flood protection checks in relevant client packet handlers and registered/removal hooks in player lifecycle.
Updated movement logic in L2PcInstance for improved position synchronization and geodata handling.
Minor fixes and refactoring in attack logic, private store handling, and admin NPC editing.


Refactored AI classes to enhance movement, attack, and skill usage logic for characters and mobs.
Improved distance checks, attack range calculations, and skill casting conditions.
Removed unused intention command logic from L2CharacterAI.
Updated configuration to enable CellPathFinding.
Minor code cleanups and bug fixes for more reliable AI behavior.

Enhanced GeoPathFinding with detailed debug and error messages for region loading, including success/failure counts and file checks.
Refactored L2AttackableAI and L2CharacterAI to improve attack range tolerance, immediate attack behavior, and added safety checks for missing targets.
Updated configuration to disable CellPathFinding by default and added a new ShowRedName option for aggressive mobs.
Minor config and log updates included.

Applied TCP socket optimizations (e.g., TCP_NODELAY, buffer sizes, keepalive) in ClientThread, Connection, and SelectorThread to reduce latency and improve throughput. Enhanced L2AttackableAI with better random walk, aggro, and attack logic, including silent move checks, quest monster handling, and improved faction/raid/minion behavior.
Added silent move support to L2PlayableInstance and quest monster flag to L2NpcTemplate/L2NpcInstance.
These changes aim to improve server responsiveness, AI realism, and overall stability.

Edited by 4TOP
Posted

Handles removed from GS Thnks @ChrisChris

L2Character.isInActiveRegion() with exception handling to register and recover from invalid coordinates, providing feedback to the player and teleporting them to a safe location if necessary.

Added support for alternative skill durations through new configuration options (EnableAlternativeSkillDuration, SkillDurationList).

Improved geodata handling for doors, including dynamic collision calculation and visibility checks.

Reworked skill management logic for PDAM and Unlock, and improved mission event notifications for skill usage.
 

SocketTcpNoDelay in the server configuration to control the use of TCP_NODELAY, reducing latency in MMO games. Refactors socket initialization in ClientThread and Connection to respect this setting.

Also updates the use of generic types for Constructor and Map<Class, Long> to use wildcards and improves skill casting time calculation and packet history serialization.

We refactored the L2AttackableAI class to use the two most hated targets in aggro logic, improving target reconsideration and skill usage.

We added the get2MostHated() function to the L2Attackable class to sort aggro targets.

We improved the attack logic of the L2Character class: pending hit tasks are tracked and canceled in case of cancel, attack timing and movement blocking are more accurate, and hit scheduling with dual weapons/rods/bows is robust.
Several improvements to validation, the PvP flag, and messages for attack actions.

  • Like 1
Posted

Siege Reward
Start PM Msg
Rework Config root
BossDieAnnounce and BossDieSound in the L24Team.properties and Config.java files for global raid boss death notifications and sounds. Adds a new reward_list table to the DB.sql file to track castle rewards.
Improves character creation logic for thread safety and validation.
Adds extensive state checks to the RequestEnchantItem method to prevent enchantments during inappropriate player states.

Fixed auto-attack animation bug (there was no attack animation, only damage animation)
Clean Code
Other fixes I forgot to list!
Java 14

Fixed issue where deleting a character would prevent it from leaving the screen or being removed, or even after a delete CD (it would only exit when re-logging in or creating a new character).

Added Premium System from the other C2 project (Needs testing and improvement).

Added the "Improved" Community Board (incomplete).

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

    • 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
    • ZonePvPSpawnBossRadio=0 ZonePvPSpawnBossBarakiel=0 at the Customs.ini in L2Server folder. Im prety sure this is it because i had the same problem with you in cruma 1 floor for example and i couldn't fix it but i fixed it finally by changing these 2 lines
    • Siege Reward Start PM Msg Rework Config root BossDieAnnounce and BossDieSound in the L24Team.properties and Config.java files for global raid boss death notifications and sounds. Adds a new reward_list table to the DB.sql file to track castle rewards. Improves character creation logic for thread safety and validation. Adds extensive state checks to the RequestEnchantItem method to prevent enchantments during inappropriate player states. Fixed auto-attack animation bug (there was no attack animation, only damage animation) Clean Code Other fixes I forgot to list! Java 14 Fixed issue where deleting a character would prevent it from leaving the screen or being removed, or even after a delete CD (it would only exit when re-logging in or creating a new character). Added Premium System from the other C2 project (Needs testing and improvement). Added the "Improved" Community Board (incomplete).
  • 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