Jump to content

Recommended Posts

Posted

I am a Software Engineer, development would not be a problem. I also have a project of my own that I've been carrying for the last years, so I'm not that far form L2J, i'm just outdated 😛

 

Anyway, I'll check it out later, thanks anyway!

  • 6 months later...
Posted (edited)

Changeset 410 (3371)

 

Makers, NpcAi / Desires, Cursed Weapon rework, Bugfixes, Admincommands, Movement, Organization

 

Makers

  • Fix ghost corpses.
  • Introduce task manager for MultiSpawn spawn schedule.
  • Introduce task managers for Npc respawn and despawn tasks.
  • Add missing random treasurebox maker.

NpcAi / Desires

  • AttackableAttack > NpcAttack, allowing ATTACK_FINISHED event over Npc.
  • Merge all reduceWeight from NpcAI operations.
  • Don't broadcast MoveToPawn packet for cast hold scenarii. CH and CP managers use hold cast. Probably way more to add.
  • Rework DesireQueue#addOrUpdate to avoid to generate a List.
  • Drop _isInHitAnimation, avoid twice runAI calls upon attack end animation, save a ThreadPool.
  • Implement Desire#isInvalid, used over the main loop to clean invalid Desires. All sided getDesires().removeIf are dropped, notably over AggroList/HateList.

Cursed Weapon rework

  • Fix potential task scheduling issues, reworking the whole layers. Reduce code by 1/3.
  • Use L2OFF formulas/data for item drop rate, staging process.
  • CW end duration now decreases when killing other Players.

Bugfixes

  • Revert schedule part from ThreadPool.
  • Fix Pet inventory IU. Ty Denzel for the report.
  • Fix Pet item timestamp reuse delay. Ty artemis for the fix.
  • Disable automatic beastshots when his owner dies. Ty Root for the report.
  • Player cannot craft while casting a skill, nor trade. Ty Root for the report.
  • Add missing weight checks for player/summon pickup, and player craft. Ty Root for the report.
  • Implement /graduatelist command, which displays a list of clan academy graduates for the past week. Ty RooT for the report.
  • Fix PLAYING_FOR_LONG_TIME concept ; rest message is server related, not Player related. Ty RooT for the report.
  • Player should stop movement when opening store.
  • Fix Q351 occurences of itemId 4310 by 4407 one + slight fix.
  • Fix Q365 missing memoState + poison skillId. Ty Root for the report.
  • Fix Q417 Torai despawn over cond 11.
  • Fix Q216 4 missing npcIds. Ty Karudin for the report.
  • Fix the invalid comment of DeleteCharAfterDays Config.
  • Fix NPC drop penalty level calculation. Ty Bandnentans for the report.
  • Items are now dropped in a 30/45 donut shape around dropper. Ty Bandnentans for the report.
  • PartyMatch fixes
    • Don't show Party members or CW holder as available waiting members.
    • You can't show overall List or join a PartyMatch room as CW holder.
    • CW owner, upon acquisition, leave PartyMatch system.
    • PartyMatch window is now automatically closed upon Player#removeMeFromPartyMatch.
    • Remove Player from PartyMatch if Player and newly joined Party leader PartyMatch rooms differ.
    • You can't join or be invited in a PartyMatch room if already partying/CW holding.
  • Fix ShowLicence config when set to false. Ty artemis for the fix.
  • Fix maximum number of macros. Ty artemis for the fix.
  • Fix invalid IU update over //enchant. Ty artemis for the fix.
  • Fix Castle Mass Gatekeeper HTMs. Ty kingNik0n for the fix.
  • Drop _disabledItems implementation. Won't be used by next refactors. Ty artemis for the report.
  • Fix loading handlers under debug. Ty Keku for the fix.
  • Fix character_macroses table structure (commands = 12x32 chars minimum).

Admincommands

  • Merge all old spawn admincommands (//list_spawns, //spawn, //unspawnall, //respawnall, //delete) to //spawn and //unspawn (previously //delete). Generate //help. //unspawn works over all ASpawn.
  • Merge all old fence admincommands (//spawnfence, //deletefence, //listfence) to //fence [add|remove], generate AdminFence. They now use proper Pagination. You can also teleport to it.
  • Implementation of //show manor.
  • Implementation of //set quest <id> [cond]. Related items must be hand-given.
  • Implementation of //set henna [page] [add|remove symbolId]. The hennas are still bound to game logic (slots, canBeUsedBy).

Movement - Ty LaRoja, Bandnentans

  • Fix Boats IOOBE.
  • Adapt getHeight logic from L2OFF.
  • Introduce back WASD movement, handle boat board/unboard.
  • Fix WATER/FLY movement logic.
  • Avoid to pathfind diagonal cells with detected obstacle.

Organization

  • Addition of QuestVars class, holding all related variables from quests (itemIds, npcIds, questNames, sounds, etc), allowing to reduce length of each script while reusing variables. 100+ cloned variables were deleted.
  • Refactor geometry package and Territory. Territory is now a unique 3D shape, holding any type of 2D geometry. 
  • Remove few useless Location#clone uses.
  • Implementation of ItemContainer#forEachItem.
  • Clean many unused FrequentSkill. The whole enum is questionable.
  • Drop MathUtil#checkIfInRange, implement WorldObject#isInStrictRadius (involve collision of that WorldObject, and potential WorldObject parameter).
  • WorldObject#isIn2DRadius parameter is now a Point2D, not a Location (since a Location inherits Point2D, Location are still usable as parameter).
  • Rework Pagination#generatePages to handle page number > 1000.
  • Use Pagination over Tryskell SchemeBuffer. Ty CUCU23 for the share.
Edited by Tryskell
Posted (edited)
On 5/18/2025 at 6:57 AM, Tessa said:

 

You still need an executor for delayed task, and regarding instant task, they are simply executed using regular virtual thread.

 

Delayed tasks handling was anyway reverted back due to VT's pinning / strange behavior.

 

If you got something better to propose, you can also contribute rather than "??".

Edited by Tryskell
Posted
26 minutes ago, Tryskell said:

 

You still need an executor for delayed task, and regarding instant task, they are simply executed using regular virtual thread.

 

Delayed tasks handling was anyway reverted back due to VT's pinning / strange behavior.

 

If you got something better to propose, you can also contribute rather than "??".

Well, you can use them as they are supposed to be used, to begin with.
Of course your tasks will be delayed, and this behavior is not strange at all, you don't have control over when the JVM will move them to a carrier thread.

Posted (edited)

A lot of people say L2 is dead, and ACIS is still in development. But seriously, you’ve got the skills and knowledge why not make your own game with a clean brand new client from scratch? The only thing missing is client devs, and you can find plenty here or on freelance sites.

:serious:Stop treating it like a hobby and turn it into something that can actually make money and people happy, you have the name just move forward, even AI can help you script quests, me first I would totally play any game you made similar to l2

anyway:notbadn:

🍪 have one i know you like them

Edited by Nightw0lf
Posted
On 5/20/2025 at 4:04 PM, Nightw0lf said:

A lot of people say L2 is dead, and ACIS is still in development. But seriously, you’ve got the skills and knowledge why not make your own game with a clean brand new client from scratch? The only thing missing is client devs, and you can find plenty here or on freelance sites.

:serious:Stop treating it like a hobby and turn it into something that can actually make money and people happy, you have the name just move forward, even AI can help you script quests, me first I would totally play any game you made similar to l2

anyway:notbadn:

🍪 have one i know you like them

 

There's many reasons why it would be more NO than YES :

  • Using NCSoft assets is a death wish, they can lawyer any LU3/Unity if they wanted, since it's a plain steal of intellectual property.
  • It's an hobby, as you said it, and it's not specially about money. Money is a way to filter idiots/resellers, nothing more. It's really about trying to replicate old content and optimize it which I find it fun.
  • I just align with the basic idea than an emulator emulates. When you launch Project64 and SuperMario 64, you don't expect to get something more than 120 stars and Bowser boss in the end - which should have been L2J project to begin with
  • Even if I played a lot with TESCS from Morrowind, back in time, it's not enough to handle current engines, and I'm too lazy to learn Unity/Unreal Engine. Moreover, it would mean buying assets.
  • While doing it alone would be a fail, coupling to L2J / L2 community would still be shitty (since the majority is RU/BR) ; people is only about fame/glory/reselling shit on back of others. Opening to others, the project would be leaked day 1, rebranded and resold.
  • MMO genre is basically dead, and that's not a reboot of any game (l2/wow classic :D) which will turn the tide.

Regarding L2 or an remastered version of it, you can obviously blatantly copy-cat it (as Propnight did for Dead by daylight).

 

All frenchies aren't supposed to do Expedition 33 :).

Posted
  1. "Just make your own game!" sounds simple until you’ve tried it. I did, with Epic Dragon World and learned the hard way that "open source" often means "free labor for resellers." The MIT license became a buffet for people to grab code, rebrand it and ghost the project. Even basic collaboration collapsed because everyone wanted their vision, not *a* vision.

  2. NCSoft’s lawyers aren’t theoretical. They’re a sword of Damocles. Even if you rebuild a client from scratch, if it feels like Lineage 2, they’ll come knocking. Ask the Chrono Trigger fangame corpses how that goes.

  3. MMOs are hospice care. The genre’s on life support, kept alive by whales and nostalgia. Look at Throne and Liberty, NCSoft’s own "successor" to L2, flopping harder than a 2004 PKer in ToI. Classic reboots (WoW, L2) are bandaids, not resurrections.

  4. This is the hobby. Optimizing old systems, reverse-engineering spaghetti code and preserving janky mechanics is the fun part. Monetizing it turns it into customer service hell. No thanks.

  5. Community? What community? The L2 scene is 90% resellers, 10% players who’ll quit the second they don’t get +16 on day one. Both asking how to install Java and why running the uncompiled server does not work.

  • 3 weeks later...
Posted
On 5/23/2025 at 7:02 PM, Mobius said:
  1. "Just make your own game!" sounds simple until you’ve tried it. I did, with Epic Dragon World and learned the hard way that "open source" often means "free labor for resellers." The MIT license became a buffet for people to grab code, rebrand it and ghost the project. Even basic collaboration collapsed because everyone wanted their vision, not *a* vision.

  2. NCSoft’s lawyers aren’t theoretical. They’re a sword of Damocles. Even if you rebuild a client from scratch, if it feels like Lineage 2, they’ll come knocking. Ask the Chrono Trigger fangame corpses how that goes.

  3. MMOs are hospice care. The genre’s on life support, kept alive by whales and nostalgia. Look at Throne and Liberty, NCSoft’s own "successor" to L2, flopping harder than a 2004 PKer in ToI. Classic reboots (WoW, L2) are bandaids, not resurrections.

  4. This is the hobby. Optimizing old systems, reverse-engineering spaghetti code and preserving janky mechanics is the fun part. Monetizing it turns it into customer service hell. No thanks.

  5. Community? What community? The L2 scene is 90% resellers, 10% players who’ll quit the second they don’t get +16 on day one. Both asking how to install Java and why running the uncompiled server does not work.

you went full negative mode there a step back, i was not hoping in getting l2 back from the results of tryskel, a game is a game doesnt have to stay as is, everything evolves and you go where the community (if any) takes you, the engine is there, a quest system, AI everything is at hand even a first person game would be better people start with less with less people cmon...

Posted
On 6/13/2025 at 9:01 AM, Nightw0lf said:

you went full negative mode there a step back, i was not hoping in getting l2 back from the results of tryskel, a game is a game doesnt have to stay as is, everything evolves and you go where the community (if any) takes you, the engine is there, a quest system, AI everything is at hand even a first person game would be better people start with less with less people cmon...

We have everything, but no people to "bind" everything.
On this community it is a mere joke.

Sorry for the offtopic.
If you want join my discord's Game Dev section.
I plan to add more contend about it.

Posted

@Tryskellhas and continues to do an awesome job with aCis. I will support aCis in any way I can, and was really happy to see aCis was still around and active as a poject and community when I jumped back into L2.

 

I do not think L2 or Interlude is ded, it never will be. What I do think is that thinking outside the box and introducing the game to new people is important now. I would bet that the majority of those new people who try it are hooked and will continue to play for years.

 

Posted

Changeset 411 (3596)

 

ZoneManager, Manors, Cursed Weapon, AI, Bugfixes, Organization

 

[Fishing is currently malfunctioning. Wait next revisions for item/skills reparse + fish rework.

 

ZoneManager - Ty Bandnentans for the backup job

  • Rework ZoneManager, parsing L2OFF zones and associated parameters.
  • Zones are now handled by name, and not anymore by custom, dynamic, id - making them easier to invoke, and allowing retail script to invoke them aswell.
  • Zones are now extending Territory, and don't use anymore shapes (Circle/Rectangle/NPoly). Default shape is Polygon, cut into Triangles, through Territory. One more step down to delete "zone.form" package and ZoneForm class.
  • All zone types are added as L2OFF. Custom zone types are deleted (ARTIFACT, SCRIPT,...) and good names are provided (Boss = NoRestart, NoLanding = NoFly, etc).
  • NoRestart zones type (eg. previous Boss) behavior is now matching retail, and uses retail parameters aswell. It normally fixes the "instant teleport back to town when entering boss zones through few teleporters" issue.
  • Implementation of onLogin/onLogout/onEnterRegion/onExitRegion methods types for zones.
  • Implementation of EffectZoneTaskManager (a universal 666ms ticking task for all effect zones) and ZoneRevalidationTaskManager (a universal 666ms Creature revalidateZone task, avoiding multiple calls).
  • Migrate zone related Stat Func application to zone onEnter/onExit, deleting ZoneManager#getZone calls upon stat calculation (run speed, hp/mp regen).
  • Fix moving from same zone type to same zone type ; it doesn't consider to going out (hotfix). Should notably fix water re-entrance issue.
  • Delete custom CastleTeleportZone, use retail Mass Teleporter HTMs and AI params.

Manors - Ty LaRoja for fixes

  • Fix an issue where turning in crops to the Manor Lord for materials would incorrectly add adena to the castle vault instead of deducting it, while seed sales are correctly handled.
  • Fix an issue where the "Stop Purchase" button did not properly clear all crops. The last crop would remain set, and the manor wouldn't fully disable unless all adena was manually removed from the vault.
  • Introduce //manor [change], allowing manually a manor cycle to run.

Cursed Weapon

  • CW passive skill is properly cleaned up. Ty Denzel for report.
  • Don't store anymore Player reference on CursedWeapon.
  • Store CursedWeapon reference upon Player, rather than itemId - for faster acquisition.
  • Fix a NPE upon CursedWeapon#endOfLife.

AI

  • Fix aggressive monsters behavior. Ty Denzel for report, Bandnentans for fix.
  • Fix EvilateA/B not respawning demons. Ty Bandnentans for report.
  • Fix a conditional NPE over PartyLeaderHeretic2Aggressive AI.
  • Fix Gordon script NPE. Ty Sahar for report.
  • Move most DefaultNpc methods to Npc (npc isn't a parameter anymore, but the method caller).
  • Overload NpcAi#addCastDesire with NpcSkillType parameter, since it was hard to read and error-prone.
    • -> npc.getAI().addCastDesire(attacker, getNpcSkillByType(npc, NpcSkillType.DD_MAGIC), 1000000);
    • -> npc.getAI().addCastDesire(attacker, NpcSkillType.DD_MAGIC, 1000000);.
  • Implement NpcMaker#areaSetOnOff and Npc#areaSetOnOff. AIs can now activate and de-activate areas based on behavior (generally spawn and dying). Uncomment all scripts areas triggers.
  • Implement Creature#isInThisTerritory, checking if a Creature is in a parametrized zone name. Uncomment all scripts areas triggers.
  • Re-introduce back RandomAnimationTaskManager for Folks. Ty Bandnentans for report.
  • getSeeRange() is now minimal Config.DEFAULT_SEE_RANGE - can't be lower - notably fix Gordon ON_SEE event.
  • Implement NODE_ARRIVED EventHandler. Fix Gordon continuously running after attacking someone.

Bugfixes

  • Sanitize the username string in AuthLogin as it is in RequestAuthLogin. Ty artemis for fix.
  • //set title is fixed (allows more than one token, and spaces between words). Add the possibility to clear title with no parameter.
  • Add a missing sysMessage upon regular Pet's name set, remove one check processed by regex (and which had invalid sysMessage).
  • Fix a "day 1" issue related to CH : if your clan was holding any CH, HP/MP regen was applied no matter the CH zone you were currently set.
  • Remove run stance upon Npc#reduceCurrentHp, making Walker run when being hit. Ty Denzel for report.
  • Fix an issue where Castle owners couldn't register for SCH. Fix the related SystemMessageId.
  • Allow blocked interaction to scan at higher range.

Organization

  • Config : Introduce NAME_REGEX_PATTERN and TITLE_REGEX_PATTERN, delete ZONE_TOWN Config.
  • Territory "Polygon to Triangle" algorithm is edited for an adapted version of Earcut (earcut4j without the hole handling), allowing monotone polygon and using Z-order curve index for faster spatial partitioning.
  • Rewrite Triangle#intersects method to be more accurate.
  • Drop grandboss_list SQL.
  • The few "var" are now named "variable", prior to var keyword addition in Java.
  • Update MariaDB connector from 3.1.4 to 3.5.3.
  • Add //set pvp <number> and //set pk <number>.
  • RoomInfo improvement - allocate and reuse a single List, rather than nullify it and create a new one.
  • 1 year later...
Posted

Changeset 412 (3767)

 

JDK 25, Garbage shrink, GeoEngine, PathFinder, Movement, IdFactory, Skills/Items refactor, Fishing, Stats calculation, Race issues, Zones, Bugfixes, Organization

 

JDK 25

  • aCis officialy migrates to latest LTS, JDK 25 !
  • Make a use of unnamed variables.

Garbage shrink - reduce overall garbage (-92%~) with multiple reworks (from 17go/h to 1.4go/h).

GeoEngine

  • Memory-mapped geodata, avoiding ~300mo internal objects overhead and remove the geodata loading from the GC heap.
  • Replace divisions with bit shifts for block indexing (notably used by getBlock).
  • Eliminate repeated Math.sqrt() calls in the DDA loops : horizontal distance and step increments (distStepX/distStepY) are precomputed once, then accumulated (accumDist) on each iteration.
  • Implement CellWalker/LosTrace which factorize the DDA and avoid double scanning for vision checks.
  • Add a block cache (lastBlockX/lastBlockY) to avoid redundant getBlock() calls while the cell stays within the same block.
  • Add guards for the dx == 0 case (purely vertical movement) when computing slope m and distance increments.
  • Introduce LOS_HEIGHT_FACTOR to factor out the line-of-sight height calculation.

PathFinder

  • Implement retail pathfind system, using both algorithm, rules and data.
  • System is far lesser impressive than geodata ones, but is blazing fast and is strictly similar to what L2OFF is/feels.
  • New Config : PATHFIND_ITERATIONS / PATHFIND_CHASE_ITERATIONS.

Movement

  • Revert back to a shared MoveTaskManager ticking every 100ms ; no per-actor scheduled task anymore.
  • Use immutable, atomically-published MoveHolder orders (similar to CastHolder pattern) ; no lock between the order path and the tick path.
  • Implement a server-side start-accel ramp matching the client's from-standstill acceleration, simulating properly the client animation cycle over straight lines - no matter your actual speed.

IdFactory

  • Use a lock-free implementation rather than full synchronized.

Skills/Items refactor - Ty Bandnentans for refactor, Sahar for initial skill parsing

  • Reparse all skills and items using L2OFF AdvExt.
  • Rework many formulas to handle things as L2OFF (notably skill effect success rate, fall damage, etc).

Skills

  • Rework 15 target handlers, introducing 13 AffectScope and 7 AffectObject.
  • Introduce retail effects : 6 consume, 8 cubic, 90 instant, 97 pumps, 3 tick.
  • Introduce 44 conditions.
  • Addition of L2J channelization system, EffectInfo, EffectList - with vital reworks (using lock-based fine-grained concurrency, isLimitExceeded cleanup, effects flag recomputation use main updateEffectList loop,...).
  • Addition of EffectExpirationTaskManager, a wall-clock used to handle timers of effects.
  • Addition of //show affectscope to visualize the range effects of casted skills. Can be used to any target, as a toggle on/off, visualized by any GM (similar to //show move implementation).
  • Add icon tag over data - make a use over SchemeBuffer.
  • Known bugs fixed :
    • All skills properly consume mana (notably stances). Ty to original reporter p0w3rf1y.
    • Similar abnormal states visuals don't override each other anymore (exemple case of Silent Move and Stealth). Ty to original reporter Sim.
    • All skill related data is normally fine - until L2OFF AdvExt is wrong. Topics related to values edition were dropped. If invalid, propose another data to reparse.
    • Fix an issue with Touch of Life, disappearing from buff slot when you port (soe, teleport, GM recall).
    • Issue related to Scroll of Recovery deleting buff because related skill was using BUFF SkillType is fixed. Ty to original reporter KejbL.
    • Upon //skill remove all / set all, the expertise penalty is now properly set.
    • Skills such as Switch/Trick properly use DERANGEMENT trait. Ty to original reporter YeahThePro.
    • Skill, as container of effects, can now apply different skill powers per effect. As exemple, Blinding Blow "turning back" effect is 100%, but damage itself can fail independently. Ty to original reporter YeahThePro.
    • With new affectscope/affectobject/targethandlers :
      • Skills can't be used versus invalid targets (exemple : Tribunal towards Guards). Ty to original reporter shyr.
      • Skills can be used upon CTRL (Vortex, Archer stun, Sand Bomb) without need of pvp flag. Ty to original reporters Denzel, ErHarD.
      • Shuriel's Oracle properly heal the boss rather than themselves. Ty to original reporter Bandnentans.
    • SoE and alike skills can be properly casted by mounted Players, since RideState implementation. Ty to original reporter cross.
    • Skills without effect points don't trigger anymore any type of trigger skills (notably, Energy Stone and Infinity Rod exploit). Ty cross for report.
    • Heroic skills (aswell as a big amount of item skills) casted from any sub/main class should also be set on reuse for all other sub/main classes. Ty Bandnentans for report.
    • Effects don't refresh upon each other (sleep, root, fear, stun) - they are automatically being resisted. Ty to original reporter Kitsos.
    • Effects aren't preventively dropped - if a Stun occurs, it isn't instantly stopped if another Stun is attempted. Ty to original reporter Kitsos.
    • Madness properly temporary aggro a target, and stop to do so at end of the effect. Ty to original reporter shyr.
    • Fear doesn't make the target coming to you, it instantly goes into fear effect. Ty to original reporter shyr.
    • Cubics data and behavior is reparsed and formulas picked from L2OFF. Ty to original reporter p0w3rf1y.
    • Skill casting animation isn't "bloated" anymore by delay. Ty to original reporter deekay.
    • Clan Skill : Luck is now properly implemented.
    • Fix an issue where when an effect disappears, the thinkCast of the same skill is triggered immediately (npcId 18243 using Fake Petrification when he was able to use it, making it invul). Ty to original reporter Denzel.
    • Blows do specific sounds over critical. Ty to original reporter L2Pulse.
    • PvP Ability – The player’s attack ability in Player vs. Player combat increases once they become a Noblesse. Ty YeahThePro for report.

Items

  • BodyPart is now an enum, cutting many switches to none (-200 lines over Inventory).
  • Arrow type method helper is now part of CrystalType enum, cutting related uses.
  • Add alias and icon tags - make a use of icon in existing "noicon" placeholders - notably //find item.
  • Known bug fixed :
    • Don't make Adena sellable. Ty DarthVader for report.
    • Upon extractable item production, both sit/Formal Wear now work. Ty to original reporter sahar.
    • All items are properly parsed, so issues such as "Skill 2188 [BEAST_FEED] isn't implemented". Ty to original reporter Jackass.
    • Soul crystals properly aggro monsters upon usage. Ty to original reporter Denzel.

Fishing

  • Add parsed data related to fishing (places, monster, rod, distribution).
  • Formulas are picked from L2OFF aswell.
  • Hot Springs Lure is now available to buy.

Stats calculation

  • Introduce StatusBroadcastTaskManager, used to delay all types of broadcast (karma, skill cooltime, skilllist, weight, stats, abnormals...).
    • Indirectly fix all types of stats update lacking, such as Bison Spirit Totem skills. Ty to original reporter FunnyMan.
    • Speed is still sent at-will.
  • Basic Creature stats values are now precomputed and recalculated when needed (buff, debuff, etc). There is no more calcStat when getting a basic value, which avoid calcStat over get"Stat" (getPdef, getPatk, etc).
  • Rework StatusUpdate
    • Avoid to use temporary maps, use an int array instead (less RAM footprint).
    • Packet directly pick good stats, you don't have to register it anymore (less verbose).
    • Stats are filtered before being sent.
  • Status listener is moved from Creature to Attackable, avoiding to generate and manage thousands of useless Sets.

Race issues

  • Casting process now uses a CastHolder, used to retain current cast data. Should avoid the random NPEs.
  • Movement process now uses MoveHolder. Fix race conditions (geopath queue could be accessed in 2 different spots, could end as a IOOBE).
  • Solve race conditions over DesireQueue, using an ArrayList + lock.
  • WorldObject (_objectId / _region as volatile, _isVisible as atomic, shorten the lock over setRegion, calling effects aside lock, inverse the order of refreshId ; we set a new id, then release old id).
  • Spawn related
    • Fixed SpawnManager leaks.
    • Added atomic maker/multispawn synchronization with rollback.
    • Secured spawn counters with CAS.
    • Introduced atomic respawn-claiming.
    • Simplified and hardened recycling logic in MultiSpawn.
    • Add MultiSpawn#isDeleted to expose the deletion state. Deleted MultiSpawn instances can no longer respawn through the scheduler.
    • Rework MakerSpawnScheduleTaskManager
      • Move from ConcurrentLinkedQueue to PriorityBlockingQueue ; poll until test fails, avoiding to iterate the whole container.
      • Emptiness check removal is down at the end, not the start - to avoid leftovers.
    • Add Spawn _npc safeguards to avoid NPEs due to potential race conditions.
  • Improve DamageZone, PoisonZone and InstantSkillZone concurrency safety and task lifecycle management.
  • Make Intention immutables.
  • Npc#onDecay now claims _isDecayed atomically ; concurrent decay paths (DecayTaskManager tick, deleteMe from scripts) can no longer run it twice and corrupt spawn accounting.
  • TradeList#confirm locks both TradeLists in a deterministic order, so two concurrent confirms can no longer each grab their own lock and silently stall the trade.
  • Product#decreaseCount uses a CAS loop, so racing buyers can no longer drive a limited stock negative.
  • Refactor death state management - provide a single source of truth for death checks and reduce the risk of state desynchronization. Should fix "Body to Mind" sync issue, where skill kills you while it shouldn't (and alike).

Zones
Zones no longer live in WorldRegion. They are rasterized once into a coarse TILE_SIZE (32768u) grid owned by ZoneManager, decoupled from the visibility grid. A point lookup is now a single cell read instead of scanning the current region plus its 8 neighbours.

  • Revalidation is split add-only / set-iterating:
    • entering scans only the creature's own cell (ZoneManager.revalidate -> ZoneType.addCreature), no wasted removal tests;
    • exiting iterates the creature's cached inside-zone set (Creature._insideZones), which also covers zones outside its current cell.
  • ZoneType keeps a reverse index in sync via Creature.addZone/removeZone.
  • EventTrigger visuals (castle slow traps, fences) become a real invisible WorldObject (EventTriggerObject) riding the object knownlist like retail's CEventController, replacing the ZoneType addKnownObject/removeKnownObject hooks;
  • ZoneType.onReload() releases the emitter on zone reload. Clan-hall decorations move the same way, onto ClanHallManagerNpc.addKnownObject.
  • Danger zones (Damage/Poison/InstantSkill/Swamp) split onEnter/onExit into isOn()-gated public methods plus unconditional doEnter/doExit, so a setOnOff toggle applies the effect correctly against the freshly flipped flag.
  • SwampZone drops its prior func before re-adding it to avoid stacking the slow when a movement revalidate races a toggle.
  • Admin //zone panel is paginated over the current cell's candidate zones.

Bugfixes

  • Fix PK killer being flagged as a PKer itself.
  • Grouped territories (territory="a;b;c") are no longer merged into a single synthetic "grouped_XXX" Territory (random location was corrupted due to Z depth merge). Ty Bandnentans for report.
  • Merge _runAiStep into _lifeTime in NpcAI (redundant) since _runAiStep was reset to 0 every 3 ticks, and this broke the % 2 follow cadence.
  • Fix rooted monster who doesn't provide XP/SP upon death. Ty Denzel for report.
  • Introduce a mechanism where hate value is cleared if monster is back to full health and aggro cleaned.
  • Clean aggro and hate upon next spawn occurence.
  • Npc#onDecay now cancels any pending scheduled despawn, preventing a stale timer from despawning a recycled, respawned Npc.
  • Npc#deleteMe now aborts attack, cast and move, releasing the Npc from shared tasks (MoveTaskManager).
  • Npc#deleteMe now severs the master/minion relationship both ways ; killing privates no longer breaks their respawn once the leader deleted itself (Stakato Nest 22108/22110 exploit). Ty Denzel for report.
  • Handle EffectZoneTaskManager NPE gracefully.
  • Improve rev. 411 "Allow blocked interaction to scan at higher range." bugfix ; now it properly reads bypasses. Ty Bandnentans for report/fix.
  • Deny arrow key movement if casting/attacking. Ty Bandnentans for report.
  • Multiple Pledge fixes :
    • Fix 2 potential NPEs upon VillageMaster.
    • Add Clan#getUnitName method.
    • Fix 1 potential NPE upon Clan#getSubPledgeLeaderName.
    • Avoid Clan#getOnlineMembers/getAllSubPledges arrays creation.
    • Fix PledgeShowMemberListAll server crash (introduced in rev 311).
  • Multiple summons/monster fixes :
    • Fix "move to" summon action, broken since movement branch and boat method implementation.
    • Fix "stop" summon action :
      • Stop summon even when returning to owner.
      • Stop attack stance.
    • Fix "attack" summon action, it only tryToAttack, no tryToFollow.
    • Implement proper behavior for attack follow, for both summons and regular Npcs (try to reach one offset surrounding target).
    • Implement proper behavior for friendly follow (offset behind the target, follow task stops if target isn't owner and destination is reached).
    • Remove tryToIdle upon Playable#stop (subject to StackOverflowException).
  • Refresh the SP display upon studying skills.
  • Fix a trade issue, where disconnected Player wouldn't clear trade window for partner.
  • Fix Castle#regTimeOver behavior. Ty Sahar for report, LaRoja for fix.
  • Fix PlayerCast NPE, occuring since Siege switch flip. Ty Sahar for fix.
  • Fix a NPE over Npc#isInMyTerritory. Ty Sahar for fix.
  • Dummy objectId deletion is now ignored. Ty TheDude for report.
  • Fix INVALID_MACRO logic. Macros aren't limited to 255 characters server-side anymore. Ty MrThirtyOddSix for report.
  • Fix and improve SetAggressiveTime logic. Ty Bandnentans for report.
  • Add missing 32049 npcId HTM. Ty Bandnentans for report.
  • Fix potential RequestRestartPoint NPE. Ty Bandnentans for report.
  • Fix Baium Desires weight. Ty Bandnentans for report.
  • Make RandomAnimationTaskManager more random - since all calls are gathered upon a similar wallclock, many Npc were sending SocialAction at the same time.
  • Fix an UnsupportedOperationException over Olympiads, prior to c2c50fa5 commit. Bad, Bad LaRoja. Ty CUCU23 for report.
  • Fix an issue over onEvtAgression (social aggro was running as a dead loop).
  • Fix a NPE over RaidPrivateStandard. Ty Bandnentans for report.
  • Adena is now charged after teleport appearing, not before. Ty Bandnentans for report.

Organization

  • World gets explicit coordinate helpers (worldToZoneGridX/Y, worldToRegionX/Y, worldToTileX/Y, regionIndexToWorldX/Y) and drops the expensive getRegion(ZoneType).
  • Geometry gains AShape.getBounds() (Rectangle/Triangle/Polygon) for broad-phase grid insertion, and Polygon now computes an area-weighted centroid.
  • Overload CabalType enum with maxTax.
  • Drop ChangeRecorderListener - avoid generating arraylists/arrays upon item equip/unequip (manually tracking updates became useless since InventoryUpdateTaskManager / ItemInstanceTaskManager introduction).
  • Delete TamedBeast / TamedBeastAI (unused).
  • CastleDefendTeleporter is reworked to handle NPC AI params instead of hardcoded Locations arrays - drop related custom zones.
  • Siegable#checkSides aswell as Siege#switchSides now handles Set<SiegeSide> instead of varargs - (O1) instead of (On) + EnumSet performance.
  • Npc#isLordOwner is renamed isMyLord, Npc#getPledgeCastleState does only 1 SiegeSide lookup instead of 2.
  • Few QuestVars addition (120+ entries).
  • Replace TradeList#getAvailableItems peek use (should be only used for debugging process)
  • TradeList for trade usages isn't nullified anymore, but clear(). Player#isTrading is implemented such as trade partner != null.
  • "skill" package is now part of "model" package, L2Skill is renamed Skill to follow regular convention naming. Most inner packages are renamed.
  • SkillTable is now known as SkillData and moved to "data.xml", since it only cares about XML content. DocumentBase/Item/Skill are heavily reworked, since they don't use <table> tag anymore.
  • DocumentBase, as IXmlReader, now use a static DocumentBuilderFactory.
  • Addition of few Inventory methods, such as #isInPaperdoll(Item) or #forEachPaperdollItem(Predicate, Consumer) - cutting complexity and improving performance.
  • GamePacketHandler management is fully reworked to be handled as an EnumMap<GameState, HashMap<Integer, Supplier>>.
  • Addition of PACKET_VIEWER_DEBUG Config, splitting the packet view logic from PACKET_HANDLER_DEBUG.
  • Rework HexUtil to avoid to generate any sublayered Strings, we only rely on the initial StringBuilder.
  • Rework few unoptimized methods/streams here and there (RaidPointManager#calculateRanking/getWinners, AdminFind#listDualbox, Location#getClosestPosition/getClosestPositionList, ...)
  • Implement RequestSetCastleSiegeTime packet, added back RequestSkillCoolTime packet. Introduce STATIC_PACKET version of DummyPacket.
  • FirstClassChange / SecondClassChange are reworked using record / QuestVars.
  • 50+ SonarLint warnings.
  • Rework GM Shop, delete 20% of buyLists, order Sets over //item set.
  • Drop unused Desire#getTimestamp implementation.
  • Implement a universal, lock-free, growable and highly concurrent ObjectPool. It is used to build, retain and borrow Objects of any type, leading to a complete crush of garbage for such objects at the cost of retained RAM.
  • Implement TimeUtil, a utility class to help to get current hour and minute instead of using a Calendar.
  • Implement ConcurrentSnapshotSet, a thread-safe Set tuned for read-mostly, allocation-free iteration (avoiding to compute .values()).
  • Delete #forceWalkStance / #forceRunStance methods - use #setWalkOrRun instead. Don't send any packet if running state doesn't evolve.
  • Npc follow system is cleaned up (variables are static and precalculated, follow slots is now a int[] instead of a List<Integer>). Add DEFAULT_FOLLOW_RANGE Config.
  • Move fishing variables from Player to FishingStance.
  • Multiple Object[0] > Object[]::new to save some array computation.
  • Skill#getTargetList use a static new Creature[0] to avoid to generate pointless arrays, use an ArrayList rather than LinkedList.
  • World class : #removeObjects allows Collection as parameter, #getRegion is sanitized, #deleteVisibleNpcSpawns is called over _objects, not the 45056 WorldRegion _objects lists, static methods are dropped.
  • PlayerInfoTable : #addPlayer/#updatePlayerData are now processed by a single method, #mergePlayerData.
  • Rework //enchant admincommand. It now uses a panel to properly visualize your target's items and current enchant level.
  • New helper method Npc#notifyClanAttack

Behavior edit

  • WorldRegion size is reduced from 2048 to 1024 (retail value). Still no Z check.
  • Monster don't have anymore LoS check for onSee, making them agressive through walls (retail behavior). Drop aswell the social LoS check.

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

    • Changeset 412 (3767)   JDK 25, Garbage shrink, GeoEngine, PathFinder, Movement, IdFactory, Skills/Items refactor, Fishing, Stats calculation, Race issues, Zones, Bugfixes, Organization   JDK 25 aCis officialy migrates to latest LTS, JDK 25 ! Make a use of unnamed variables. Garbage shrink - reduce overall garbage (-92%~) with multiple reworks (from 17go/h to 1.4go/h). GeoEngine Memory-mapped geodata, avoiding ~300mo internal objects overhead and remove the geodata loading from the GC heap. Replace divisions with bit shifts for block indexing (notably used by getBlock). Eliminate repeated Math.sqrt() calls in the DDA loops : horizontal distance and step increments (distStepX/distStepY) are precomputed once, then accumulated (accumDist) on each iteration. Implement CellWalker/LosTrace which factorize the DDA and avoid double scanning for vision checks. Add a block cache (lastBlockX/lastBlockY) to avoid redundant getBlock() calls while the cell stays within the same block. Add guards for the dx == 0 case (purely vertical movement) when computing slope m and distance increments. Introduce LOS_HEIGHT_FACTOR to factor out the line-of-sight height calculation. PathFinder Implement retail pathfind system, using both algorithm, rules and data. System is far lesser impressive than geodata ones, but is blazing fast and is strictly similar to what L2OFF is/feels. New Config : PATHFIND_ITERATIONS / PATHFIND_CHASE_ITERATIONS. Movement Revert back to a shared MoveTaskManager ticking every 100ms ; no per-actor scheduled task anymore. Use immutable, atomically-published MoveHolder orders (similar to CastHolder pattern) ; no lock between the order path and the tick path. Implement a server-side start-accel ramp matching the client's from-standstill acceleration, simulating properly the client animation cycle over straight lines - no matter your actual speed. IdFactory Use a lock-free implementation rather than full synchronized. Skills/Items refactor - Ty Bandnentans for refactor, Sahar for initial skill parsing Reparse all skills and items using L2OFF AdvExt. Rework many formulas to handle things as L2OFF (notably skill effect success rate, fall damage, etc). Skills Rework 15 target handlers, introducing 13 AffectScope and 7 AffectObject. Introduce retail effects : 6 consume, 8 cubic, 90 instant, 97 pumps, 3 tick. Introduce 44 conditions. Addition of L2J channelization system, EffectInfo, EffectList - with vital reworks (using lock-based fine-grained concurrency, isLimitExceeded cleanup, effects flag recomputation use main updateEffectList loop,...). Addition of EffectExpirationTaskManager, a wall-clock used to handle timers of effects. Addition of //show affectscope to visualize the range effects of casted skills. Can be used to any target, as a toggle on/off, visualized by any GM (similar to //show move implementation). Add icon tag over data - make a use over SchemeBuffer. Known bugs fixed : All skills properly consume mana (notably stances). Ty to original reporter p0w3rf1y. Similar abnormal states visuals don't override each other anymore (exemple case of Silent Move and Stealth). Ty to original reporter Sim. All skill related data is normally fine - until L2OFF AdvExt is wrong. Topics related to values edition were dropped. If invalid, propose another data to reparse. Fix an issue with Touch of Life, disappearing from buff slot when you port (soe, teleport, GM recall). Issue related to Scroll of Recovery deleting buff because related skill was using BUFF SkillType is fixed. Ty to original reporter KejbL. Upon //skill remove all / set all, the expertise penalty is now properly set. Skills such as Switch/Trick properly use DERANGEMENT trait. Ty to original reporter YeahThePro. Skill, as container of effects, can now apply different skill powers per effect. As exemple, Blinding Blow "turning back" effect is 100%, but damage itself can fail independently. Ty to original reporter YeahThePro. With new affectscope/affectobject/targethandlers : Skills can't be used versus invalid targets (exemple : Tribunal towards Guards). Ty to original reporter shyr. Skills can be used upon CTRL (Vortex, Archer stun, Sand Bomb) without need of pvp flag. Ty to original reporters Denzel, ErHarD. Shuriel's Oracle properly heal the boss rather than themselves. Ty to original reporter Bandnentans. SoE and alike skills can be properly casted by mounted Players, since RideState implementation. Ty to original reporter cross. Skills without effect points don't trigger anymore any type of trigger skills (notably, Energy Stone and Infinity Rod exploit). Ty cross for report. Heroic skills (aswell as a big amount of item skills) casted from any sub/main class should also be set on reuse for all other sub/main classes. Ty Bandnentans for report. Effects don't refresh upon each other (sleep, root, fear, stun) - they are automatically being resisted. Ty to original reporter Kitsos. Effects aren't preventively dropped - if a Stun occurs, it isn't instantly stopped if another Stun is attempted. Ty to original reporter Kitsos. Madness properly temporary aggro a target, and stop to do so at end of the effect. Ty to original reporter shyr. Fear doesn't make the target coming to you, it instantly goes into fear effect. Ty to original reporter shyr. Cubics data and behavior is reparsed and formulas picked from L2OFF. Ty to original reporter p0w3rf1y. Skill casting animation isn't "bloated" anymore by delay. Ty to original reporter deekay. Clan Skill : Luck is now properly implemented. Fix an issue where when an effect disappears, the thinkCast of the same skill is triggered immediately (npcId 18243 using Fake Petrification when he was able to use it, making it invul). Ty to original reporter Denzel. Blows do specific sounds over critical. Ty to original reporter L2Pulse. PvP Ability – The player’s attack ability in Player vs. Player combat increases once they become a Noblesse. Ty YeahThePro for report. Items BodyPart is now an enum, cutting many switches to none (-200 lines over Inventory). Arrow type method helper is now part of CrystalType enum, cutting related uses. Add alias and icon tags - make a use of icon in existing "noicon" placeholders - notably //find item. Known bug fixed : Don't make Adena sellable. Ty DarthVader for report. Upon extractable item production, both sit/Formal Wear now work. Ty to original reporter sahar. All items are properly parsed, so issues such as "Skill 2188 [BEAST_FEED] isn't implemented". Ty to original reporter Jackass. Soul crystals properly aggro monsters upon usage. Ty to original reporter Denzel. Fishing Add parsed data related to fishing (places, monster, rod, distribution). Formulas are picked from L2OFF aswell. Hot Springs Lure is now available to buy. Stats calculation Introduce StatusBroadcastTaskManager, used to delay all types of broadcast (karma, skill cooltime, skilllist, weight, stats, abnormals...). Indirectly fix all types of stats update lacking, such as Bison Spirit Totem skills. Ty to original reporter FunnyMan. Speed is still sent at-will. Basic Creature stats values are now precomputed and recalculated when needed (buff, debuff, etc). There is no more calcStat when getting a basic value, which avoid calcStat over get"Stat" (getPdef, getPatk, etc). Rework StatusUpdate Avoid to use temporary maps, use an int array instead (less RAM footprint). Packet directly pick good stats, you don't have to register it anymore (less verbose). Stats are filtered before being sent. Status listener is moved from Creature to Attackable, avoiding to generate and manage thousands of useless Sets. Race issues Casting process now uses a CastHolder, used to retain current cast data. Should avoid the random NPEs. Movement process now uses MoveHolder. Fix race conditions (geopath queue could be accessed in 2 different spots, could end as a IOOBE). Solve race conditions over DesireQueue, using an ArrayList + lock. WorldObject (_objectId / _region as volatile, _isVisible as atomic, shorten the lock over setRegion, calling effects aside lock, inverse the order of refreshId ; we set a new id, then release old id). Spawn related Fixed SpawnManager leaks. Added atomic maker/multispawn synchronization with rollback. Secured spawn counters with CAS. Introduced atomic respawn-claiming. Simplified and hardened recycling logic in MultiSpawn. Add MultiSpawn#isDeleted to expose the deletion state. Deleted MultiSpawn instances can no longer respawn through the scheduler. Rework MakerSpawnScheduleTaskManager Move from ConcurrentLinkedQueue to PriorityBlockingQueue ; poll until test fails, avoiding to iterate the whole container. Emptiness check removal is down at the end, not the start - to avoid leftovers. Add Spawn _npc safeguards to avoid NPEs due to potential race conditions. Improve DamageZone, PoisonZone and InstantSkillZone concurrency safety and task lifecycle management. Make Intention immutables. Npc#onDecay now claims _isDecayed atomically ; concurrent decay paths (DecayTaskManager tick, deleteMe from scripts) can no longer run it twice and corrupt spawn accounting. TradeList#confirm locks both TradeLists in a deterministic order, so two concurrent confirms can no longer each grab their own lock and silently stall the trade. Product#decreaseCount uses a CAS loop, so racing buyers can no longer drive a limited stock negative. Refactor death state management - provide a single source of truth for death checks and reduce the risk of state desynchronization. Should fix "Body to Mind" sync issue, where skill kills you while it shouldn't (and alike). Zones Zones no longer live in WorldRegion. They are rasterized once into a coarse TILE_SIZE (32768u) grid owned by ZoneManager, decoupled from the visibility grid. A point lookup is now a single cell read instead of scanning the current region plus its 8 neighbours. Revalidation is split add-only / set-iterating: entering scans only the creature's own cell (ZoneManager.revalidate -> ZoneType.addCreature), no wasted removal tests; exiting iterates the creature's cached inside-zone set (Creature._insideZones), which also covers zones outside its current cell. ZoneType keeps a reverse index in sync via Creature.addZone/removeZone. EventTrigger visuals (castle slow traps, fences) become a real invisible WorldObject (EventTriggerObject) riding the object knownlist like retail's CEventController, replacing the ZoneType addKnownObject/removeKnownObject hooks; ZoneType.onReload() releases the emitter on zone reload. Clan-hall decorations move the same way, onto ClanHallManagerNpc.addKnownObject. Danger zones (Damage/Poison/InstantSkill/Swamp) split onEnter/onExit into isOn()-gated public methods plus unconditional doEnter/doExit, so a setOnOff toggle applies the effect correctly against the freshly flipped flag. SwampZone drops its prior func before re-adding it to avoid stacking the slow when a movement revalidate races a toggle. Admin //zone panel is paginated over the current cell's candidate zones. Bugfixes Fix PK killer being flagged as a PKer itself. Grouped territories (territory="a;b;c") are no longer merged into a single synthetic "grouped_XXX" Territory (random location was corrupted due to Z depth merge). Ty Bandnentans for report. Merge _runAiStep into _lifeTime in NpcAI (redundant) since _runAiStep was reset to 0 every 3 ticks, and this broke the % 2 follow cadence. Fix rooted monster who doesn't provide XP/SP upon death. Ty Denzel for report. Introduce a mechanism where hate value is cleared if monster is back to full health and aggro cleaned. Clean aggro and hate upon next spawn occurence. Npc#onDecay now cancels any pending scheduled despawn, preventing a stale timer from despawning a recycled, respawned Npc. Npc#deleteMe now aborts attack, cast and move, releasing the Npc from shared tasks (MoveTaskManager). Npc#deleteMe now severs the master/minion relationship both ways ; killing privates no longer breaks their respawn once the leader deleted itself (Stakato Nest 22108/22110 exploit). Ty Denzel for report. Handle EffectZoneTaskManager NPE gracefully. Improve rev. 411 "Allow blocked interaction to scan at higher range." bugfix ; now it properly reads bypasses. Ty Bandnentans for report/fix. Deny arrow key movement if casting/attacking. Ty Bandnentans for report. Multiple Pledge fixes : Fix 2 potential NPEs upon VillageMaster. Add Clan#getUnitName method. Fix 1 potential NPE upon Clan#getSubPledgeLeaderName. Avoid Clan#getOnlineMembers/getAllSubPledges arrays creation. Fix PledgeShowMemberListAll server crash (introduced in rev 311). Multiple summons/monster fixes : Fix "move to" summon action, broken since movement branch and boat method implementation. Fix "stop" summon action : Stop summon even when returning to owner. Stop attack stance. Fix "attack" summon action, it only tryToAttack, no tryToFollow. Implement proper behavior for attack follow, for both summons and regular Npcs (try to reach one offset surrounding target). Implement proper behavior for friendly follow (offset behind the target, follow task stops if target isn't owner and destination is reached). Remove tryToIdle upon Playable#stop (subject to StackOverflowException). Refresh the SP display upon studying skills. Fix a trade issue, where disconnected Player wouldn't clear trade window for partner. Fix Castle#regTimeOver behavior. Ty Sahar for report, LaRoja for fix. Fix PlayerCast NPE, occuring since Siege switch flip. Ty Sahar for fix. Fix a NPE over Npc#isInMyTerritory. Ty Sahar for fix. Dummy objectId deletion is now ignored. Ty TheDude for report. Fix INVALID_MACRO logic. Macros aren't limited to 255 characters server-side anymore. Ty MrThirtyOddSix for report. Fix and improve SetAggressiveTime logic. Ty Bandnentans for report. Add missing 32049 npcId HTM. Ty Bandnentans for report. Fix potential RequestRestartPoint NPE. Ty Bandnentans for report. Fix Baium Desires weight. Ty Bandnentans for report. Make RandomAnimationTaskManager more random - since all calls are gathered upon a similar wallclock, many Npc were sending SocialAction at the same time. Fix an UnsupportedOperationException over Olympiads, prior to c2c50fa5 commit. Bad, Bad LaRoja. Ty CUCU23 for report. Fix an issue over onEvtAgression (social aggro was running as a dead loop). Fix a NPE over RaidPrivateStandard. Ty Bandnentans for report. Adena is now charged after teleport appearing, not before. Ty Bandnentans for report. Organization World gets explicit coordinate helpers (worldToZoneGridX/Y, worldToRegionX/Y, worldToTileX/Y, regionIndexToWorldX/Y) and drops the expensive getRegion(ZoneType). Geometry gains AShape.getBounds() (Rectangle/Triangle/Polygon) for broad-phase grid insertion, and Polygon now computes an area-weighted centroid. Overload CabalType enum with maxTax. Drop ChangeRecorderListener - avoid generating arraylists/arrays upon item equip/unequip (manually tracking updates became useless since InventoryUpdateTaskManager / ItemInstanceTaskManager introduction). Delete TamedBeast / TamedBeastAI (unused). CastleDefendTeleporter is reworked to handle NPC AI params instead of hardcoded Locations arrays - drop related custom zones. Siegable#checkSides aswell as Siege#switchSides now handles Set<SiegeSide> instead of varargs - (O1) instead of (On) + EnumSet performance. Npc#isLordOwner is renamed isMyLord, Npc#getPledgeCastleState does only 1 SiegeSide lookup instead of 2. Few QuestVars addition (120+ entries). Replace TradeList#getAvailableItems peek use (should be only used for debugging process) TradeList for trade usages isn't nullified anymore, but clear(). Player#isTrading is implemented such as trade partner != null. "skill" package is now part of "model" package, L2Skill is renamed Skill to follow regular convention naming. Most inner packages are renamed. SkillTable is now known as SkillData and moved to "data.xml", since it only cares about XML content. DocumentBase/Item/Skill are heavily reworked, since they don't use <table> tag anymore. DocumentBase, as IXmlReader, now use a static DocumentBuilderFactory. Addition of few Inventory methods, such as #isInPaperdoll(Item) or #forEachPaperdollItem(Predicate, Consumer) - cutting complexity and improving performance. GamePacketHandler management is fully reworked to be handled as an EnumMap<GameState, HashMap<Integer, Supplier>>. Addition of PACKET_VIEWER_DEBUG Config, splitting the packet view logic from PACKET_HANDLER_DEBUG. Rework HexUtil to avoid to generate any sublayered Strings, we only rely on the initial StringBuilder. Rework few unoptimized methods/streams here and there (RaidPointManager#calculateRanking/getWinners, AdminFind#listDualbox, Location#getClosestPosition/getClosestPositionList, ...) Implement RequestSetCastleSiegeTime packet, added back RequestSkillCoolTime packet. Introduce STATIC_PACKET version of DummyPacket. FirstClassChange / SecondClassChange are reworked using record / QuestVars. 50+ SonarLint warnings. Rework GM Shop, delete 20% of buyLists, order Sets over //item set. Drop unused Desire#getTimestamp implementation. Implement a universal, lock-free, growable and highly concurrent ObjectPool. It is used to build, retain and borrow Objects of any type, leading to a complete crush of garbage for such objects at the cost of retained RAM. Implement TimeUtil, a utility class to help to get current hour and minute instead of using a Calendar. Implement ConcurrentSnapshotSet, a thread-safe Set tuned for read-mostly, allocation-free iteration (avoiding to compute .values()). Delete #forceWalkStance / #forceRunStance methods - use #setWalkOrRun instead. Don't send any packet if running state doesn't evolve. Npc follow system is cleaned up (variables are static and precalculated, follow slots is now a int[] instead of a List<Integer>). Add DEFAULT_FOLLOW_RANGE Config. Move fishing variables from Player to FishingStance. Multiple Object[0] > Object[]::new to save some array computation. Skill#getTargetList use a static new Creature[0] to avoid to generate pointless arrays, use an ArrayList rather than LinkedList. World class : #removeObjects allows Collection as parameter, #getRegion is sanitized, #deleteVisibleNpcSpawns is called over _objects, not the 45056 WorldRegion _objects lists, static methods are dropped. PlayerInfoTable : #addPlayer/#updatePlayerData are now processed by a single method, #mergePlayerData. Rework //enchant admincommand. It now uses a panel to properly visualize your target's items and current enchant level. New helper method Npc#notifyClanAttack Behavior edit WorldRegion size is reduced from 2048 to 1024 (retail value). Still no Z check. Monster don't have anymore LoS check for onSee, making them agressive through walls (retail behavior). Drop aswell the social LoS check.
    • Dude, you brought this topic back after 15 years you’re a legend 😂 Please describe your problem. Is the model appearing gray or is the model completely missing?  
    • Your approach with real user signals sounds interesting For broader SEO work on my own side projects, I’ve been getting solid results through https://xedea.com/our-services/seo-agency-malaysia/ -their focus on lead generation and transparent reporting fits what I needed. Might offer useful complementary techniques for scaling beyond search ranking alone 
    • can you explain how to do it? I have the same problem and i dont know how o fix this
  • 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..