Jump to content

12 Anos Online! 🎂


⭐ Parcerias





⚔️ Servers Apoiadores



🎁 Ofertas







[SOURCE] aCis 340 + diffs (341 a 362)


Recommended Posts

De 340 a 345 consegui nesse tópico http://www.l2jbrasil.com/index.php?/topic/111111-source-acis-340-diffs/?hl=bian&do=findComment&comment=692938

 

As demais diffs consegui com alguns amigos e algumas em outros fóruns.

 

Changeset 340

Caches, Announcements, Misc

Caches
   - Filters are moved back into classes.
   
   CrestCache
      - Drop of //admin_fix_cache_crest admincommand.
      - Drop of OLD_PLEDGE related stuff.
      - BMP filter edited for DDS one, crests are stored under .dds format file. Consider to CONVERT .bmp into .dds !
      - Crests are stored on a Map for an easier management.
      
Announcements - Ty Sikken, xblx (&& me ofc).
   - Renamed Announcements > AnnouncementTable, moved into datatables. Addition of Announcement model. General cleanup and rework.
   - Addition of critical announcement type.
   - Addition of scheduled announcement ; you can schedule your announcement to happen X times, every Y times.
   - Saved under XML format instead of TXT.
      - Drop of //reload_announcements (handled directly by AdminAdmin //reload generic admincommand), //announce_menu (no use).
      - Merge of numerous announcements admincommands, now handled by //announce <list|all|add|add_auto|del>.
      - Addition of //say admincommand (critical counterpart for //ann).
      - Old //announce renamed for //ann.
   
Misc
   - Little reorganization on Gameserver.java.
   
PS : so basically, regarding Announcements admincommands, you only have :
- //ann && //say for instant announcements type.
- //announce <list|all|add|add_auto|del> for advanced mode.
- //reload announcement.

Edit : Hasha shared a little .bat to automatically make the .bmp > .dds transfer. You can find it in attachment.

 

Changeset 341

MMOCore, Announcements, Eclipse settings, Scripts, Misc

MMOCore - basic update to latest L2J version.
   - Add a try/catch to avoid core crashing.
   - Disable Nagle's algorithm (better latency, but bigger bandwitdh usage). It's a real time application, for love of goodness !
   - Client is setted on putPacketIntoWriteBuffer method.

Announcements
   - Fix an issue regarding Announcement limit.
   - Add //announce all_auto, allowing to announce auto tasks. Add the appropriate button on Announcements admin panel.

Eclipse settings
   - Added project based Java8 compliance on both projects.
   - Copied project settings from gameserver to datapack. It seems I was using workbench settings on datapack.
   - Fix few missing stuff on datapack, such as static keywords or nested return.
   - "Incomplete switch cases on enum option" is now setted to "Ignore".
   
Scripts
   - addition of SecondClassChange script. I can't test all cases and HTMs, so please report any issue on forums.
   - addition of Q662. Ty RooT.
   
Misc
   - numerous packets cleanups
      - clean one nested Item Class.
      - improve readability or performance.
      - reduce the amount or complexity of variables / parameters when not needed.
      - HennaInfo is fixed, the class level defines the number of henna slots. Ty RooT.
   - getItems() from Inventory returns a List, not an array anymore.
   - Fix possible double attacks issue, ty Hasha.
   - Decrease timer between multiple pickups.
   - Added a new multisell bypass, with a newbie check for L2Merchant exchange equipment. Ty ArhsGr.
   - Fix a NPE regarding CrestCache rework. Ty katara for report.

 

Changeset 342

FloodProtectors, Scripts, Misc

FloodProtectors
   - Simplified FP system (took L2JFree one). Timers are still configurable via config, all others configs are dropped (totally pointless).
   - A parameter setted to 0 means the action is always possible (you can enable/disable any FP that way).
   - Added new FPs - GLOBAL_CHAT, TRADE_CHAT, SOCIAL.
      - GLOBAL_CHAT && TRADE_CHAT FPs are desactivated by default. GLOBAL_CHAT handles "All" and "Shout" chats.
      - SOCIAL timer has been tweaked to handle animations at the most global running speeds. Edit if you don't like.

Scripts
   - addition of Q224, Q228, Q663. Ty to roko91 and RooT.
   
Misc
   - Fix, anew, the movement stuck issue.
   - Drop the empty folder in taskmanager.
   - You can use arrows UP and DOWN to move the character without making your client crashes. No configs.
   - Chats and RollDice handlers cleanup (nothing fantastic). Roll dice message is sent to anyone.
   - Complete StopRotation packet. Ty RooT.

 

Changeset 343

Scripts, Inventories, Misc

Scripts
   - Addition of Q220, Q226. Ty roko91.

Inventories
   - Drop the unused "block" system on PcInventory.
   - Drop the "quests slots" system on PcInventory. Easier slots check.
   
Misc
   - Fix Packet Forge tool. Ty roko91 for the fix.
   - Fix a NPE on ShortcutInit packet.
   - Fix a NPE on removeCrest().
   - Fix a NPE on calculateRewards(), overhit related. Ty SweeTs for the fix.
   - Added a missing check on pickup method, related to overweight. Now you can't be 110% full...
   - RequestDestroyItem got its checks edited, with the addition of CANNOT_DESTROY_NUMBER_INCORRECT message (for both < 1 and > max item number conditions).
   - Remove GMs priviledges on few packets, leading to a most appropriated casual player experience for : attack stance on restart/logout, slot/weight overbuy, outofcontrol Action.

 

Changeset 344

Duels - part I, Misc

Duels - part I

I decide to commit first part of Duels, as there is already a lot of work.
All is functional, and far better written than before. Part 2 will get few fixes && little tweaks for Party Duels, probably 10% of what I'm commiting now.

      - General cleanup : aCis code style, DuelState Enum creation, setIsInDuel > setInDuel rename. Numerous comments && Javadoc as documentation.
      
   DuelManager
      - Fix a ConcurrentException on DuelManager (couldn't handle simultaneous Duel creations).
      - Duel id is correctly calculated (it was probably very, very sad before).
      
   Fixes
      - Chaotic players (karma > 0) can't start or accept a duel request.
      - Fix a potential ConcurrentException on buff/debuff storing.
      - Fix a NPE with _playerConditions.
      - Fix few custom String for SystemMessage counterparts.
      - Fix the way duels handle disconnected players. It is considered as a surrender, as L2OFF. Ty sahar for report.
      - Fix an issue with surrender SystemMessage winner name.
      - Fix the max range for duel request && check task.
      - Fix the check task
         - It is fired once the duel is accepted (instead of after countdowns). A duel can now be disturbed during the countdown.
         - Added missing checks for party duels (zones, interrupted state, distance, pvpflag).
      - Fix RequestDuelAnswerStart checks, which are now exactly the same than RequestDuelStart packet.
      - Fix when a party in a command channel requests or accepts a party duel, that party is automatically withdrawn from the command channel.
      - Fix parties teleport, which are ported back to previous stored location no matter the duel end (in prevision to arena coordinates).
      
   Victory/lose animations
      - Fix an issue with kneel animation for 'B player/party winner' case.
      - Add Victory animation for winners.
      - Animations are sent even if one side is missing.
      
   Timers
      - Revert party duel timer to 120 seconds (retail time).
      - The 1vs1 countdown is setted to 5sec instead of 3sec + "void" 3sec. Messages for 5, 4, 3, 2, 1 cases.
      - The party countdown is setted to 30sec instead of 20sec, with messages for 30, 20, 15, 10 cases. It also uses 5, 4, 3, 2, 1 messages from 1vs1.
      - Drop the 5sec timer at the end of a duel.
      - The two left tasks, CheckTask && StartTask, use scheduleGeneralAtFixedRate to avoid to generate tasks every seconds.
      
Misc
   - Rework PartyMatchList, ExListPartyMatchingWaitingRoom serverpackets.

SECOND PART WILL COME WHEN YOU WILL STOP TO BE LAZY AND PROVIDE ME AN L2OFF SERVER ACCESS

 

Changeset 345

L2JFree Commons - part I, Misc.

L2JFree Commons - part I
   - StringUtil :
      - Holds all String related methods (gathered from misc places).
      - Addition of 8 static DateFormat to avoid to generate objects. Unify the date writing style over the whole source (few still missing).
      - Cleanup existing methods, improving performance or readability.
      - StringUtil.append() allows to append any type of objects, instead of simply strings (which avoid all valueOf / toString).
      - Util.implodeString() is dropped, use String.join() - Java 8 feature - when possible.
   - Point3D class is dropped (redundant with Location).

Misc
   - Drop few invalid IDs from RaidbossInfo script.
   - Fix removeDuel method.
   - Format adenas amount on wedding manager, ty oceeman.
   - Few cleanups, improving readability / performance :
      - L2OlympiadManager, RequestOlympiadMatchList : getOlympiadTasks() creation to handle loop easier.
      - AdminManor handler : addition of static manor.htm.
      - FriendsBBSManager, ClanBBSManager, RegionBBSManager, MailBBSManager : replace String concat on loops for StringBuilder.
      - MailBBSManager : creation of MailType enum.
      - L2AuctionnerInstance : use a StringBuilder instead of String concat loop.
      - RaidBossSpawnManager : the long > long > date > format is cleaned up... You can directly use long to format, lol.
      - SevenSignsFestival : correct use of String.join().
      - PetDataTable : fix a strange use of int array > string format.
      - Drop of GMAudit for bans and buffs action.
      - Q419 : fix the strange array > list > array > 'custom method' formatting
   - All StringBuilder have been reviewed and fixed. The convention name is "sb".
   - All NpcHtmlMessage have been reviewed. The convention name is "html".
   
PROTIPS TO FEEL LIKE A STRING GOD
   - Since JDK 1.5, String concatenation is AUTOMATICALLY replaced by StringBuilder. Don't bother about concatenation, EXCEPT in one case (see below).
   - FOR loops should always use a StringBuilder, NOT A CONCATENATION.
   - If numerous types of element must be attached, you definitively should use StringUtil.append() method.
   - DON'T USE '+' inside StringUtil.append() to seperate parameters, but ',' !

 

Changeset 346

Commons, Holders, Misc

Commons
   - StringReplacer class, used for next Log rework (delimiter).
   - Rnd uses ThreadLocalRandom* (Java7 feature)
   - Addition of MathUtil, holding commonly used math methods.
   - isEmpty() addition for StringUtil.

Holders
   - ItemHolder && SkillHolder are merged for a more generic IntIntHolder (as there are numerous ways to use an Int<>Int class).
   - Deletion of StatusUpdate Attribute class, use IntIntHolder instead.
   
Misc
   - final static > static final.
   - AdminRepairChar (admin_repair && admin_restore) handler is dropped (pointless).
   - AdminBookmark / AdminSkills / BookmarkTable use a better approach to filter results.
   
*More performance infos about ThreadLocalRandom on http://java-performance.info/java-util-random-java-util-concurrent-threadlocalrandom-multithreaded-environments/

 

Changeset 347

Tradelist, AI, Misc

Tradelist
   - General cleanup, drop logs.
   - Fix a ConcurrentException.
   - Create a new package model.tradelist, and split TradeList and TradeItem.

AI
   - Drop AIAccessor (better OOP approach).
   - Little cleanup and organization of ai package (creation of ai.model).
   - L2PcInstance pickup time is upped to 250ms, from 100ms (and previous was 500ms).
   - L2PcInstance getAI() follows other getAI().
   - Revert synchronized keyword on doAttack (causing issues).
   - Drop the Flee behavior for Mage/Priest AI types (not retail and buggy).
   - Better OOP approach for doRevive().
   
Misc
   - You can't sit anymore on a throne which is already occupied - ty RooT.
   - Fix a visual issue when logging/teleporting near a throne sat player - ty RooT.
   - Few Iterator cleanup, handled in a more elegant way.
   - Fix 15+ "potential ressource leak". Adapt latest SQLAccountManager.
   - Fix //zone_visual without parameter, merge //zone_visual_clear and //zone_visual.
   - Drop internal WarehouseItem classes from SendWarehouse(Deposite/Wthdraw)List. Drop GM check.
   - Replace the 3 uses of CopyOnWriteArraySet, which is a performance overkill crap.
   - L2World cleanup (rename methods && variables).
   - AdminEditChar : cleanup listCharacters() method.
   - PrivateStoreType Enum type creation.

 

Changeset 348

Scripts, Refactor, Misc

The scripts stuff has been made due to external compiler taking huge time to compile, prior to JDK8.

Scripts
   - Drop the external compiler, leading to -8mo RAM usage at startup and 2 libs drop. Server starts in 14sec instead of 1min+.
   - All scripts are moved inside core side ; scripts HTMs are moved into data/htm folder.
   - scripts.cfg is replaced by scripts.xml ; it is moved to data/xml.
   - Drop the possibility to load/reload/bypass scripts (drop associated configs && admincommands).
   - Addition of ScheduledQuest, which will be used later for tasks rework / events.
   - L2AttackableAiScript avoids to check NpcTemplate (- 6000+ .get()).

Refactor
   - Rename old Util.Util to HexUtil, and move to commons.lang.
   - Creation of package commons.math, move MathUtil && PrimeFinder inside.
   - Move MinionList to gameserver.model.

Misc
   - Fix a Config related to packets debug, ty RooT.
   - Fix a ConcurrentException on RecipeShopManageList, and add another exploit check.
   - Fix checkPvpSkill, ty Versus.
   - Fix a double flag addition on siege flag spawn, ty Versus.
   - Use ConcurrentSkipListMap for subclasses and cubics (concurrent AND ordered).
   - Add a single method on NpcTable, which allows to drop 4 "single used" methods.

PS:
   
Due to the huge refactor (thousands files are moved), the pack will be exceptionnally fully shared, to give you idea about how it is organized now.
It's also probably easier to copy-paste folders && packages directly rather than using the diff patch (which is 19mo, 350k lines long).

 

Changeset 349

Scripts, RandomAnimationTaskManager, L2Attackable, Misc

Scripts
   - Addition of Q414, Q416, Q639 - ty roko91, DarthVader (and me for the Q639 rewrite ;p).

RandomAnimationTaskManager
   - Drop RandomAnimationTask stored variable on L2Npc (pointless).
   - Creation of RandomAnimationTaskManager, a single task holding NPCs social animation behavior. Avoids to create one task per NPC every 10-40sec ; with a single player online, it's ~120 saved tasks every 10-40sec on a random farm area.
   
L2Attackable
   - cleanup (variables / overriden methods / big methods / get && setters).
   - getHateList() doesn't generate new List objects.
   - _attackByList rework
      - No lazy initialization. Avoids volatile/synchronized stuff.
      - Use concurrency to avoid issues.
      - Better OOP approach (moved from L2Character to L2Attackable).
      - Fix the following performance issue : Dying L2Character(s) generate HashSet for nothing (as getAttackByList().clear() calls the lazy initialization on doDie).
      - As a Set doesn't allow double values, drop .contains() check on addAttackerToAttackByList.

Misc
   - Fix an issue with mail system.
   - Revert previous commit regarding static DateFormat ; it can lead to misformatting.
   - Put Logger on L2Object level, drop others post-L2Object loggers.
   - Drop cw_reload admincommand (redundant with //reload cw) && misc cleanup about //reload (help, combobox, etc).
   - Addition of 2 missing NPC templates (2 quest monsters). Rename npcId 32008 "Gremory" for easier tracking.
   - ItemId 8056 Key of Splendor Room isn't considered as a quest item anymore.

 

Changeset 350

ArmorSets, Memo system, Misc

ArmorSets
   - Rework ArmorSetsTable to use regular writing style (both dp / core). It's probably faster to handle directly an integer array rather than creating a List of HashMap...
   - ArmorSet uses a int[] to store the set, which avoids to generate an integer array everytime you use the admin command "create set".
   - Drop XMLParser, and cleanup XMLDocumentFactory from unused stuff.

Memo system
   - Addition of PlayerMemo, NpcMemo && AbstractMemo. Edit ServerVariables system to reuse AbstractMemo ; rename it ServerMemo.
   - AbstractMemo is a StatsSet with a AtomicBoolean which checks if updates have been made or not (used to make clever saves).
   - PlayerMemo is loaded on player instance creation, and saved on player cleanup.

Misc
   - FishingChampionshipManager instance is harmonized.
   - StatsSet getObject() is reworked.
   - Fix a CCE (as throne system uses mount system). Ty Versus for report.
   - Drop nokarma && character_list admincommands (they already exist under set_karma 0 && character_info).
   - Fix a IOOBE on find_character (prior to page system cleanup).
   - Fix a NFE on remove_skills. Send page 1 if parameter was invalid.
   - Few StringBuilder inner concat -> StringUtil.append cleanup.
   - _disabledSkills doesn't use lazy initialization anymore. isSkillDisabled() method are merged.
   - Fix few postIL invalid skillIds checks. Ty raphaelfersan.
   - Fix 2 Oly SystemMessage, ty ErHard.
   - Access level trade-based SystemMessage are formatted. Ty ErHard.
   - Fix few HTMs encoding issues.
   - Fix Summon Friend item consumption update, and add a message for missing items, ty JDruidas.
   - Fix //npc_index, ty JDruidas.

 

Changeset 351

Sex Enum, Sex-based collision, GameServerRegister, ClassId cleanup, Misc

Sex Enum - Ty lord_rex.
   - setsex admincommand allows only etc, female and male states. There is no more toggle possibility. If you set nothing or a wrong Sex, it defines it as male by default. If the character sex is already setted to the given sex, then it doesn't edit it.
   - Fun fact : etc state for player looks like female. For koreans, women are objects... :troll:
   
Sex-based collision implementation - Ty lord_rex.
   - Fix oversized weapons on females (notably visible for dwarves).

GameServerRegister is reworked to match aCis database installer standards.
   - Add "clean" option, which allows to drop a SINGLE server.
   - Keep the possibility to drop all servers using "cleanall".
   - Add "exit" option.
   - Rework "help" : renamed as "list" and it is easier to see if an id is already used.
   - Informations refresh is correctly handled (before you had to close and launch back the program to get it updated).

ClassId cleanup - Ty Hasha.
   - ClassId is merged with old PlayerClass, allowing some nice optimization.
   - Race is renamed ClassRace.
   - ClassType is dropped, use regular int instead.
   - Possible subclasses for a class are generated and stored on a sexier way. Fix also an issue if the method was used on a custom way.
   - Drop 3 variables from xml/classes (already handled by ClassId enum).
   
Misc
   - Multiple FindBugs fixes.
   - Rework throne sit system to be stored on its own int, because it was using mount system int and was causing issues.
   - Fix the following issue : Wrong parameter count '2' for SystemMessageId: SM[761:S1_CANT_ENTER_ALLIANCE_WITHIN_1_DAY]
   - Fix Q625 npc messages for retail ones. Ty SweeTs.

 

Changeset 352

Quests, Movement, Cleanup, Misc

Quests
   - Addition of Q221 && Q229, ty roko91.
   - Add numerous SOUND_ITEMGET sounds to match aCis quests standards.

Movement - Ty Hasha.
   - Fix movement multiplier.
   - You can't walk anymore if you're mounted (avoid moonwalk issue).
   - Few animation based interactions use movement multiplier ; drop getAnimationTimer().
   - Multiple uneccessary overidden methods are cleaned up.
   - Fix player based water speed (not based on run speed, got its own value).
   - Fix player based walking speed (not based on run speed, got its own value).

Cleanup
   L2PcInstance
      - Few variables are renamed (boolean notably), and the class is more organized.
      - _vehiclePosition is now a SpawnLocation in order to keep track of heading information (used for a packet).
      - Drop GatesRequest && SummonRequest classes.
      - Better use of OOP for initCharStatusUpdateValues() method.
      - Merge isWearingArmorXType methods, and add checks for NONE and SHIELD cases. isWearingArmorType(ArmorType) is the result !
      - Internal "one shot" Runnable classes are dropped.

   Vehicles
      - L2BoatInstance is merged to L2Vehicle (no use to get abstract), L2BoatAI is renamed L2VehicleAI for the occasion.
      - Fix oust system. Add deletion message on ticket consumption.
      - Vehicles packets writing style is unified and avoid to generate Location objects.
      
   Misc
      - Improvement of Location && SpawnLocation classes. The idea is to refresh the object instead of creating a new one.

Misc
   - Fix NextAction infinite loop (must be cleaned once action is done). Ty Kraker for report.
   - Add ActionFailed on onIntentionInteract (to fix multiple clicks). Ty Hasha.

 

Changeset 353

Pets, Misc

Pets
   - Split L2PetData && L2PetLevelData : L2PetData is now merged with the new PetTemplate, while L2PetLevelData is renamed PetDataEntry.
   - Data is parsed using L2OFF : Fix all base values (int to double) and add numerous missing stats.
   - Added template based autoFeed, hungry and unsummon limits (respectively 55, 50 and 40% : before only 55% was used). Rework associated checks, drop isHungry().
   - Added messages for pet items equip/unequip.
   - Fix the walking/running and food visual updates on pet window when autofeeding.
   - Added distance check for player > pet items transfer.
   - Fix a critical issue with pet > player inventory transfer on pet unsummon.
   - Fix doesPetNameExist method to fit with L2OFF (also avoid String operations).
   - Fix the annoying issue with summons single attack (erm, my fault).
      
Misc
   - NpcTable is fully reworked. We avoid 2 loops to check XML content. 
   - Drop L2NpcAIData object, the content is merged with NpcTemplate.
   - ClassId Enum got a static VALUES .values() to avoid to generate arrays on call.
   - NpcTemplate is organized ; setRace is cleaner, Race Enum is edited to reflect that change. Drop of "single-uses" methods to avoid pointless calls.
   - NPCs skills are now taken directly from NpcTemplate, instead of being cloned into L2Character. Save 41k+ maps, roughly 15mo of RAM.
   - StatsSet : getBool() is slightly edited. Addition of getStringArray(), getList() and getMap(). Drop of isSet(), which is containsKey() clone.
   - Light cleanup on HelperBuff system (L2HelperBuff moved and renamed, drop of id variable, drop of setters, etc).
   - Drop Server class, which was holding 3 int. Rework Config and associated classes accordingly. Ty Hasha.
   - //reload admincommand allow the use of numerous parameters (//reload skills npc acar, for example).
   - L2AuctioneerInstance RooT's fix.
   
PS : don't forget to edit npcs XMLs to reflect changes (pet data is holded by NpcTable, and AI type is setted in CAPS to fit with Enum).
PS2 : a second part will come with fixed xp system (wolf, strider, hatchling) and stats for pets (correctly loaded but not yet correctly calculated).

 

Changeset 354

GeoEngine (part II/III), DropProtection drop, ObjectPoly drop, ObjectPosition drop, Misc

GeoEngine - part II

   - merged geodata and pathfinding packages/classes, now we have only one Geoengine package and Geoengine class - better structure overview and removal of unnecessary calls between PathFinding and GeoData.
   - simplified inheritance: new Geoengine abstract class now contains as many methods as possible (common methods to any geoengine model), each geoengine model contains only own/specific methods -> like -70% of code over whole geoengine package (duplicates, getters, ...).
   - Geoengine is now mandatory to start up server because of new upcoming features (doors, fences, new npc spawn manager) - cleaned up configs and related classes.
   - adding missing javadoc everywhere, adding comments to critical sections.
   - merged GeoData and PathNode admin handlers/commands.
   
   Geoengine
      - implementing back Block-based geodata model prior to geo part III.
      - dropped all "new IndexOutOfBounds()" thrown every time we are accessing layer, that does not exist - geodata conversion speed +200%.
      - renaming block classes for better identification.
      - geoengine now loads only diagonal geodata (L2D format), due to overall performance reasons, updated configs with info.
      - implemented another way of accessing block data - indexes. Index-based approach should be faster for multilayer block, when accessing both, NSWE and height of particular cell (should have double performance compared to current getter-based model...upon specific conditions).
      - GeoEngine is no longer abstract class, it contains geodata. GeoEnginePathfinding extends GeoEngine and contains pathfinding related methods.

   Path-checking & Pathfinding
      - fixed line of sight check, though walls without geodata, ty Root for report.

   Converter & L2D geodata
      - dropped own block classes, using geoengine blocks and updating them with necessary methods.
      - updated geodata conversion with few cases/conditions leading to slightly more acurate geodata on rare ocasions (100-1000 cells per region file).
      - L2D geodata for multilayer block are now aligned same way as for L2J/L2OFF (from highest layer to lowest one), leading to drop of the sorting mechanism, overall simplicity and much faster conversion.
      - dropped logger class, using standard output now, improved instructions (for dummies).

GeoEngine - part III

   Geoengine
      - added IGeoObject interface to create basic definition of geo object, when any object implements IGeoObject interface successfully, the object can be added/removed to/from geoengine and geodata can be affected by it.
      - created IDynamicBlock interface, added BlockComplexDynamic and BlockMultilayerDynamic classes to support dynamic geodata when IGeoObject is added/removed to engine.
      - updated GeoEngine with methods to add/remove IGeoObject, created the normal block to dynamic block conversion.

   Doors
      - written own parser to get XML from L2OFF data, new XMLs now contains more and accurate parameters (e.g. doors have level now, it is used for Unlock skill chance calculations).
      - doors are parsed using combination of IL (Vanganth) and GF (Sublimity) datas (thanks for shares) - that means, we have also all doors for future implementation of Fortresses now (340 -> 547 doors total!).
      - checked and corrected all spawn coordinates of doors (L2OFF uses spawn coordinate at the edge of door, we need it in the center) + it contains Z coordinate from geodata (this will help with further implementation of doors and its geodata creation).
      - created DoorTemplate to contain data from XML files, L2DoorInstance use the template in constructor - same approach as for NPCs.
      - massive cleanup and reorganization of L2DoorInstance.
      - updated HTML info window, to show all parameters - so sexy now.
      - auto-open/close task improved, using strictly timers from template, cleaned up scripts.
      - updated/cleaned DoorInfo and DoorStatus packets, added missing parameters.
      - added L2OFF posibility for doors to control another door - multiple open/close at same time.
      - implemented IGeoObject interface and updated DoorTable with proper loading mechanism for it.

   Fences
      - added FenceTable, L2FenceInstance, ExOlympiadFenceInfo packet.
      - updated admin spawn commands to spawn fences correctly.
      - implemented IGeoObject to L2FenceInstance and updated FenceTable to support dynamic geodata - client sends StopMove packet, when character make collision with fence.

DropProtection drop

   - Drop DropProtection class ; rework an existing system to do the same work.
   - Rework L2PcInstance.isInLooterParty() and rename it isLooterOrInLooterParty().
   - dropItem()
      - L2Attackable : No more items template checks.
      - L2PcInstance : No more options to secure player drops. Save a inventory.getItemByObjectId on intentional player dropItem().
   - L2PetInstance.doPickUp() : Drop a double setIntention IDLE.
   
ObjectPoly drop

   - Drop ObjectPoly class, hold directly variables into L2Object.
   - Add a Enum to enforce cases type (DEFAULT, ITEM, NPC). All checks are based on PolyType.
   - Add few checks, notably item template and possible targets.
   - Add the possibility to polymorph a NPC (regular or L2Attackable).
   - Drop SpawnItemPoly packet (redundant with SpawnItem packet).
   
ObjectPosition drop

   - Drop ObjectPosition with correct use of override, leading to a shitload of dropped cast. All methods are moved into L2Object.
   - spawnMe methods are harmonized.
   - Fix an issue with setRegion (code was running twice).
   
Misc

   - L2PcInstance : Rename setProtection to setSpawnProtection (to avoid to melt with item protection).
   - Fix subclass height/radius issue, prior to changeset 351.
   - L2CharPosition is dropped. Use Location for IntentionMoveTo, and SpawnLocation for the leftover.
   - Add MathUtil.limit method (pickup min or max limits if reached, from a default value).
   - Use spawnMe() when spawnMe(int, int, int) isn't needed (avoid to write location).
   - Drop all useless occurences of L2WorldRegion.removeFromZones(this) checks, check which is already done by decayMe() > setRegion(null) from L2Character override. In the same order of idea, drop occurences of L2World.removeObject(this), already done by decayMe().

Geodata is now mandatory.
L2D type geodata is too mandatory.
In case you were using L2D geodata, consider to convert anew the geodata you were using, as the type of L2D has been edited. Using an older L2D geodata will lead to ingame issues.

 

Changeset 355

Movement fix, PetData part II, L2Attackable AI, Lottery, Announcements, Misc

Movement fix
   - Fix strange movement rollback on skill spam.
   - Fix stackoverflow issue.
   - Fix target status (little circle color becoming red on attack).
   
PetData part II - ty Hasha
   - PetDataEntry uses a recycled StatsSet to feed values (short writing style).
   - Mounted players stats are fixed (regular/swim/fly speeds included).
   - Regular pets stats are fixed.

L2Attackable AI
   - L2Attackable won't buff players anymore.
   - L2Attackable can now buffs when they are in attack mode (in order of skills preference : after heal, but before debuff).
   
Lottery
   - Lottery Ticket message fix (doesn't show enchant anymore). Ty RooT.
   - Lottery HTMs table fix. Ty RooT.
   - Fix the lottery instructions %prize% tags.
   - Add default prize to leftover to calculate new lottery prize.
   
Announcements
   - Fix an ArrayIndexOutOfBoundsException for empty //announce. Cleanup adminhandler.
   - Edit Announce panel, replacing edit button for a multiedit (allow more than 16 characters message). The typing is more flexible, with 3 visible lines output.
   
Misc
   - Fix L2WorldRegion onDeath() / onRevive() - was triggering all L2WorldRegion zones, no matter if character was inside or not.
   - Slight revision revert for dropItem (fix the issue where you drop the entire stack of an item even if you put lower amount).
   - Calculation of evasion/accuracy is now precomputed into Formulas.BASE_EVASION_ACCURACY.
   - Put defaults values for AI type data (fixing Headquarters spawn, prior to NpcAIData drop).
   - Slight geoengine fix regarding multilayers (most notably fortress) when using an high character's height.
   - Some HTM typos (from "Hunt HTM typos!" topic).
   - Drop PlayableKnownList (no use).
   - Edit knownlist ranges to follow L2J.

 

Changeset 356

L2Attackable, Packets stuff, MultisellData, Misc

L2Attackable
   - Reduce global aggro timer, from 2min to 1m30.
   - Edit chasing mob distance check. Passive and aggressive mobs leave fight if a 2000 distance is reached.
   - Drop attackRange from CharTemplate. Edit NPCs XMLs to reflect the change. Monsters use directly weapon range. Fix NPCs archers range (from 1100 to 500).

Packets stuff
   - SignSky packet rework :
      - Rename SkySign for SSQInfo.
      - Add missing parameters (red / regular), and make possible packets static.
      - Edit admin panel to reflect those changes.
   - Add a check on ChatAlliance to avoid crafted packet. Ty RooT.
   - Harmonize RequestSetPledgeCrest/RequestExSetPledgeCrestLarge (integrity checks, SystemMessages, writing style).
   - SkillCoolTime fix, ty Denzel for report.
   - Players name must be between 3 and 16 characters. Optimize one check. Ty Denzel for report.
   
MultisellData
   - Possibility to use String for multisell names, using hashCode. Ty lord_rex.
   - Move multisells to data/xml folder. Slight content edit (drop entry id, ma'i'ntainEnchantment typo, drop enchant tag).
   - Latest L2J version, introducing :
      - Entries get their ids handled dynamically.
      - Improved performance (less item template calls, no Ingredient objects for temporary adena case, no dummy objects for enchant case).
      - getMultisell / setMultisell on L2PcInstance : you can't send crafted packet with a simple multisell id, the content must be generated before.
      - Introduction of <npcs> tag, to lock multisell lists to certain npcIds.
      - Equipped items aren't part of possible multisell trades.
      - Fix isStackable flag on MultiSellList packet.
   
Misc
   - Fix UNDEAD issue. Overzeal cleaning can lead to that sort of issue. Ty lord_rex.
   - FeedTask NPE fix. Ty lord_rex.
   - Better WeaponEquipTask behavior (doesn't cancel the whole process if you still attack).
   - Edit map_region.xml (fix 3 catacombs respawn location). Ty Hasha.
   - Fix following target issues :
      - level color takes time to change.
      - summons/pets HPs and level color aren't shown.
   - Fix Asamah HTMs (multiple typos). Add Trap Stone multisell 010.xml. Ty Denzel.
   - Addition of missing minions for Marilion boss. Ty Denzel.
   - Fix Banish Seraph, Recharge and Fisherman's Potion skills, prior to rev 434 and Race rework. Ty Sahar for report.
      
PS : multisell data has been edited. Use new data, don't cp old multisell folder.

 

Changeset 357

Duels, Doors, Misc... And Hasha stuff preparing to incoming SpawnManager :D.

Duels
   - Add the missing getTeam() packet update for summons/pets (was written as TODO).
   - Fix countdown behavior (can't send duel requests, as you are now considered as being in duel). Add DuelState ON_COUNTDOWN to manage behaviors.
   - Drop _isInDuel internal boolean. isInDuel() can be resolved with _duelId > 0.

Doors
   - Correct open/close task && opened doors on server start.
   - Handles correctly miss of geodata if a cell where a door is located isn't loaded.

Misc
   - Drop StatusUpdate packet on addLevel (redundant with UserInfo). Ty RooT.
   - AllowFishing config is dropped, due to Geodata being mandatory. Ty svipben for report.
   - Fast fix for eaten ss/bss on potion use. Ty Hasha.
   - Fix 4 out of 9 CastleTeleportZone (reverted negative values leading to IllegalArgumentException). Ty dzumara for report.
   - Remove NPCs siege guards during midVictory. Ty dzumara for report.
   - Fix the idiot issue about player client freeze (upon logging on).
   - Fix NPC hate behavior "spread". Adds a 2000 distance check for siege guards (like mobs).
   - Fix "ghost" attack action during skill cast. Ty Kraker.
   - FeedableBeasts script : ConcurrentException and NPE fixes. Ty Kingzor for report.
   - Few boolean checks cleanup. PrivateStoreType > StoreType (just to be shorter).
   
Hasha patch 71
   - GrandBossManager doesn't handle anymore boss zones related stuff. ZoneManager handles it.
   - All shapes are reviewed and optimized.
   - OlympiadAnnouncer is merged with Olympiad class, the result is optimized.
   
Hasha patch 72
   - SpawnListener class drop.
   
Hasha patch 76
   - Edit NPCs templates to fit with new SpawnManager (no effect atm, but it will be needed later on).
   - //msg admincommand is moved on more appropriated adminhandler.
   - Addition of StringUtil.getTimeStamp, which allows to get a formated second time under (h m s) format.
   - RaidBossInfo script initialization is optimized using correctly L2Spawn class concept.
   - L2Spawn rework
      - x, y, z and heading infos are now stored under SpawnLocation, allowing nice shortcuts and few optimizations.
      - startRespawn()/stopRespawn() > setRespawnState(boolean)

Side note : it's perfectly normal you receive warning about spawns. I was lazy to edit spawnlist, as it will dissapear soon anyway. Don't create threads about it.

 

Changeset 358

AIs, L2Attackable, Quests, Misc

AIs
   - Refresh all scripts writing style (caps lock for static, etc).
   - Cleanup FleeingNPCs script.
   - Rework entirely and optimize Gordon (static path nodes, drop of numerous pointless variables, "one task to rule them all").
   - Few tweaks and improvements for Dr Chaos (static Strings, fix a bug on paranoia_activity task).
   - Drop AbstractAi, L2AttackableAiScript becomes anew the AI "mother". Change the way npcId registration is handled, fixing events override issue. Ty Hasha.

L2Attackable (E.T Phone Home)
   - Mobs return to their home walking (and not running).
   - Faction call logic is changed. Fix the behavior where one monster could bring a whole room if you were running with him.
   - Tweak returnHome spawn point radius check (20 for guards, 300 for monsters).
   - Remove a redundant execution of leader/minion method.
   - returnHome is instantly processed, it doesn't depend from random walk % rate.
   
Quests
   - All 3rd class quests are, anew, functional (were broken prior to ScriptManager edit). Ty emanueld for report/fix.
   - Fix Q643 "missing htm" error. Ty Kingzor for report.
   - Partial rework of Q021 :
      - The route is tweaked (3 static nodes). Few NpcString are replaced.
      - Fix a NPE, prior to reading bookshelf while page ghost already dissapeared. Ty Kingzor for report.
      - Creation of a duke ghost despawn task. Before he could stay forever if the player didn't move on quest.
      - You can request anew the page ghost if he dissapeared.
      - Don't sendMessage player with "pageDespawn" event name.
      
Misc
   - Add 28 missing noskills HTMs for dwarves trainers. Ty Caparso for the share.
   - Warehouse Freightman Daisy HTM bypass skill list fixed. Ty Caparso.
   - Both gates of Splendor open in same time.
   - Disable autoshots after adding/changing subclass. Ty Erlandys.

 

Changeset 359

TaskManager drop, LoginController, Instances, Scripts / AI, Misc

TaskManager drop
   - Fix and cleanup ScheduledQuest.
   - Move existing tasks to ScriptManager. Tasks are handled by scripts.xml.
   - Drop old TaskManager system and associated SQL table global_tasks.

LoginController
   - handle login attempts in a more consistant way (concurrent map, working concept).
   - basic cleanup, from using JDK8 goodies to formatting rules.
   
Instances
   - L2Guard : Drop ReturnTask, drop onSpawn() redundant check (already handled by super.onSpawn()).
   - L2TownPet : Variabilize task in order to be dropped when npc is deleted.
   - L2ClanHallDoormenInstance : _clanHall is fed using onSpawn().

Scripts / AI
   - Addition of Q114, Q227 - ty sharers.
   - Harmonize all HTMs regarding level/class checks.
   - Swap 2 HTMs content for Q226.
   - L2Attackable can now see L2NpcInstance (notably for better AI control).
   - Fix NPE and stackoverflow (prior to last revision) from onEvtAggression / onEvtAttacked. Optimize the loop checks. Rework PrimevalIsle script.
   - NPE fix for Gordon AI, if he died on server startup (prior to last revision). Ty cross for report.
   - "Returning home" monsters && random walking monsters can now be faction called. Ty Hasha.
   - Core support for Q227 (addition of L2Skill parameter for onAttack).
   - Core support for decay event (addDecayId / onDecay(L2Npc)). Ty Hasha for idea.
   - Edit all 2nd class transfer quests to fix DD exploit, since all 2nd classes are now done. Ty Zero for the patch.
   
Misc
   - Fast and ugly fix for Olympiad towers broadcasting. Ty sahar.
   - Hotfix for //delete command (even if it will be probably reworked in 2 revs). Ty svipben for fix.
   - Avoid to compute twice the same things for pets users relation updates.
   - Add clientStopMoving(null) on player thinkAttack().
   - Fix the 2 following issues (ty ErHard for report)
      - Archer acts like melee player on dead targets.
      - Archer auto follow dead NPC.

 

Changeset 360

Commons, ThreadPool rework, CharNameTable rework, Misc

Commons
   - Creation of ArraysUtil, holding common arrays related methods. Will be feed overtime.
   
ThreadPool rework (based on L2JFree, but tweaked to death).
   - ThreadPoolManager is renamed ThreadPool and is moved to commons. Use a static approach rather than singleton.
   - Merge all pools (ai, packets, general,...) to a single one.
   - Generate pools according to core numbers (by default -1 for scheduled and instant pools).
   - The tasks charge is balanced through the different pools (random selection).
   - Move hidden configs to server.properties.

CharNameTable rework - ty svipben and welcome to IC !
   - Cache player informations on server startup rather than on player login (avoid one db call per invalid player entry request).
   - Drop all synchronized blocks, and use a single ConcurrentHashMap (holding infos of the 2 previous HashMap).
   - Tweak few L2World.getPlayer(), in order they use id parameter instead of name when possible (avoid a pointless call on CharNameTable).

Misc
   - Addition of Q118, Q333. Rework Q123 (which is a clone of Q118). Ty RooT.
   - Drop AutoDeleteInvalidQuestData config. Rework quests loading method (use a single query, don't process enterworld event on quests you don't own).
   - Few Quest.java tweaks : addition of getSponsor() / getApprentice(), put null checks as priority checks, put few final keywords, use of Rnd.get(List).
   - Addition of DebugGeoNode config, setted to False by default (avoid to flood geo_bugs.txt on live servers).
   - addFence returns L2FenceInstance. Ty sahar.
   - SpecialXMas itemhandler doesn't broadcast its content (lol). Ty sahar.
   - Fix isInCombat() - Ty cross for report.
   - Slight validateItemManipulation method edit (avoid double getInventory check on RequestDropItem).
   - "Organize Import" edit : net.sf.l2j.commons are divided from regular net (simply to keep things cleaner).
   - Fix a NPE prior to ClassId rework - Ty sahar for report.
   - Rework MailBBSManager.sendLetter ; fix non-GM mail sending and optimize all checks. Ty Mayhem for report.
   
NB : compared to L2JFree L2ThreadPool :
   - dropped long running pooler.
   - dropped getThreadPools() approach which generate pointless arrays.
   - edit the purge limit from 1min to 10min.
   - delete and merge all pointless classes (10+ merged to 1). 

 

Changeset 361

World/WorldRegion refactor, CoupleManager, RooT's fixes, Skills cleanup, Misc

World/WorldRegion refactor
   - rename both classes, dropping "L2".
   - Drop 3 "grid" configs (hardcoded for now).
   - Merge unique methods.
   - Drop _allPlayable CHMap. Edit _visibleObjects CHMap for a simple arraylist with a lock. Count only players, not all playable as region activators.

CoupleManager rework
   - Store couples in a ConcurrentHashMap instead of ArrayList (avoid ConcurrentException, better index management).
   - Save process is made on server shutdown rather than couple creation.
   - Loading process isn't cutted between Couple && CoupleManager, which avoids 1 connection per Couple loading.
   - Cleaning (drop isMarried boolean as we can reuse coupleId, drop Couple model for IntIntHolder) + Javadoc.
   
RooT's fixes
   - Interaction distance with NPCs is setted to 100 instead of 150 (maybe has to edit players ?).
   - Add more ids in non-talking guards. MoveToPawn and ActionFailed packets are sent for such guards.

Skills cleanup

   DP side
      - Pa'agrio Fist and Rapid Fire are counted as buff. Pa'agrio Fist heals 800 CP back, not full CP.
      - Few NPC skills got remove target attribute (dino skills).
      - Added missing enchant routes for : Shock Stomp, Blessed Body, Blessed Soul, Mass Fear, Mass Gloom, Trance, Erase, Magical Backfire
      - Mystic Immunity uses the correct target type.
      - Summon Treasure Key reuse time is fixed.
      - Heart of Pa'agrio HP regeneration effect is fixed.
      - Heroic Berserker mdef malus is fixed.
      - Infinity Axe passive skill is fixed.
      - Counterattack, Dodge, Mirage are using IL values.
      - Shield of Revenge got a mana cost now.
      - Fear effects don't bug anymore.
      - Fix Item Skill: Battle Roar augment.
      
   Core side
      - The player now runs to the target when skill is under reuse and target out of range.
      - CPHEAL_PERCENT type is dropped (unused).
      - Toggle skills can't be desactivated anymore while in combat.
      - You can't stack anymore Fear, Sleep, Root && Stun effects. Ty xblx.
      - ExRegenMax packet implementation (temporary health gauge on HoT use). Ty svipben to catch it up, and RooT for writing style.
   
Misc
   - Fix a minor typo on 2 packets, ty svipben for report.
   - Mimyu teleport behavior. Ty RooT for share, Sikken for report.
   - Fix SE 2nd class transfer. Ty emanueld for the fix.
   - Lower Loginserver RAM allocation (to 32m), as it doesn't need that much (could even work with 12m with spikes at 9m).
   - SetupGauge packet now uses an Enum to enforce color types.
   - Water task is cleaned up. Drop _isInWater boolean, and "unique-use" methods.
   - Heal participants' CP/HP/MP on Olympiad battle start. Ty sahar for report.
   - Workaround fix for returnHome method (killed stunned mobs = clean aggrolist).
   - Move Die packet call on Enterworld to avoid buffs visual issue. Ty SweeTs/svipben.
   
PS : skills cleanup got nothing related to skills rework. Those are only fixes to wait for a bigger rework, which will come in few months. 

 

Changeset 362

Knownlist system , pets fixes, misc

So, I decided to rework the knownlist system. I will explain why, what are benefits and how it worked/works now.

Old version :
Each object (item, npc, player, summon) had its own knownlist, aka a Map holding surrounding objects. Objects were added/removed according owner's region and a self radius (getDistanceToWatch)

Why it sucked :
   - You needed to update map every time you added/remove. Even if ConcurrentHashMap is performant, that could be painful on big operations (sieges, mass kills, etc).
   - The data was extremely redundant ; for 2000 NPCs, there was 2000 knownlist holding each 1999 entries (excluded himself).
   - The data could scale really, really fast according number of surrounding NPCs, leading to important RAM/CPU usage.
   - A task, called every second, was updating every single region (11260 regions) objects to forget objects.
   - Added to the data being extremely redundant between knownlists, the same info was hold into WorldRegion's object maps (as knownlist feed upon those maps).
   - The definitive list of possible targets was cutted first by getVisibleObjects(2000), getDistanceToWatch, then by radius, leading to compute multiple times the same thing.
   
New version :
   - We use WorldRegion maps as reference.
   - We use setRegion as an passive update system. Which means a single setRegion is needed to refresh every object included in surrounding regions.
      - Regions we leave (aka, old region neighborhood but not part of new region neighborhood) are updated with removeKnownObject.
      - Regions we enter (aka, new region neighborhood but not part of old region neighborhood) are updated with addKnownObject.
      - Leftover (shared regions between old and new neighborhood) isn't processed.
   
Benefits :
   - No more maps for every object = instant RAM save. No more dangerous RAM scaling when gathering important group of NPCs.
   - Cut a entire layer (before WorldRegion CHMap was updated, and WorldRegion's objects knownlists aswell. Now, only WorldRegion is updated).
   - The task was really heavy (11260 areas to refresh on a populated server every 1m) ; its drop delayed the GC cycle from 6min to 10min on vanilla aCis (cutted the garbage on empty server by almost 2).
   - Merge redundant systems and optimize the output (only 6 cells are updated in case of regular region change).
   
(Biggest) changes :
   - Revert from previous revision : ArrayList to CHMap to hold WorldRegion objects (wasn't correctly synchronized leading to ConcurrentException).
   - Whole model.actor.knownlist package && KnownListUpdateTaskManager class dissapear.
   - Broadcast.toSelfAndKnownPlayersInRadiusSq method is dropped, as we are standardizing "distance" system.
   - Heavy rework of spawnMe, spawnMe(x, y, z), decayMe to avoid multiple setRegion calls (before : 2 for every L2Object, 3 for summons !). Avoid multiple addKnownObject() calls (bow use, setTarget) aswell.
   - setXYZInvisible(Location) has been added. Uses are tweaked (when spawning you don't need to setRegion(null), so we only update position).
   - PcTemplate holds player spawn under a Location.
   - EVT_FORGET_OBJECT event is dropped (no use, probably not launched at all).
   - WorldRegion setActive is processed instantly by setRegion method.
   - Fix : guards don't go IDLE if aggrolist is cleaned up, breaking aggro system.
   - Rework knownlist admincommand (includes a page system, as known objects number is way bigger than before).
   
PS :
   - To get knownlist, simply use object.getKnownType or object.getKnownTypeInRadius (all objects on the 9 surrouding areas = object.getKnownType(L2Object.class))
   - Computed knownlist don't show yourself. It shows any type of status : dead, visible, etc. You have to add your own conditions.
   - Always try to choose the HIGHEST instance type (ex: L2PcInstance for players, and not L2Object) to restrain list objects to a maximum. In addition, you won't need any cast.
   - IDLE state for NPCs should be achieved only if no players are left on region. It means the AI is detached from NPC.
   
Multiple pets fixes
   - Pet inventory isn't restored anymore (as pets inventory is transfered on inventory deletion to owner's inventory, the whole thing is useless).
   - On pet dismiss (or player restart), if the player does not have room in their inventory, these items will drop to the ground.
   - Pets cannot pick up arrows, Soulshots, Spiritshots, Blessed Spiritshots.
   - Cleanup L2PetInstance.validateWeight().
   - Refresh correctly pets inventory weight gauge.
   - Numerous cleanup :
      - don't send twice setShowSummonAnimation() info (inherited from L2Summon, no need to call on children)
      - Merge L2PetInstance.spawnPet() with its single usage.
      - Move setLevel from Pet initialization to restore(), which avoids double call.
      - Don't feed _petData on Pet initialization, as info would be wrong anyway. It's already handled by setLevel().
      - Don't set twice item enchant level (was called by setLevel() and SummonItems).
      - Avoid one call of PetItemList / broadcast status.
      
Misc
   - Wedding mod HTMs are moved in their own "mods" folder.

PPS : knownlist rework probably fixes any type of "ghost" issue (player/monsters which look to be here, but when targeting them they update).

PPPS : I thank "monkeys team" for the good job on reporting behavior. You're invited to drop what I sent you and apply this changeset (you normally have a problem with pets summoning, fixed with this changeset). 

 

Link do download:

 

Senha para descompactar o arquivo .rar :

l2jbrasil 

  • Like 4

QdeQ9Kp.png

Link to post
Share on other sites

Seria melhor se já postasse ela 362 sem as diff.

Conhecimento tem preço, então não o deprecie!!!


Conhecimento tem preço, então não o deprecie!!!


Conhecimento tem preço, então não o deprecie !!!


:boxing: :boxing: :boxing:

Link to post
Share on other sites
  • 2 weeks later...
  • 2 years later...
×
×
  • Create New...