RS2 Pauper | A 2012 Nostalgic Experience

Jun 3, 2015
185
17
0



Hello!

There may be a few of you that remembers this server from quite a few years back. Maybe none of you do, who knows. Regardless, Pauper is back online! It is the original source and code from the original developer. I happened to just stumble across the old source rummaging around my computer and decided what the heck. Some of the original members of the community are already online and playing, literally as I type this message, and if you're one of them - we'd be happy to have you back! All of the accounts are reset, sorta doing a "fresh start" type of deal, but I still have all the backups from 2020 just in case. We aren't trying to expand too much, so we're keeping things pretty compact for the time being. No website, no donations, no voting system, no nothing - just a discord where you can download the client and chat with the community. This is also why our advertisement thread is a bit lackluster and not very well documenting Pauper.

I suck at making installers, so it'll probably false-flag with your anti-virus. But, I made it an exe file that installs with a small jre package suitable with the client so that anyone can play it easily and simply. But, because I suck at making installers it flags easily in anti-virus. I'll probably try to fix it later. If this makes you uncomfortable, I understand & I also have a JAR file I can send you alternatively.

Now, enough about all that, let's advertise the server.


ECONOMY:
  • An economy that's supposed to represent challenge and scale. There are many different tiers to Pauper and you'll find yourself grinding through many different eras of armor and items as your account grows. There are many different useful items in the game that stretch outside of just standard gear to equip. This also allows skillers to be able to make plenty of money and be a huge source to the economy, more on that later. You will need to explore and adventure all around the world in order to keep scaling your account, rather than just stay allocated to one location. We do not, and never have, offered items available for donation, so any item you see in game will have been earned by the community. Most of the trading done will be handled through the Grand Exchange system, where you can sell most of the items you pickup. There are many, many items that are on a "limited items" list that will need another player with that item to complete the transaction through the GE.

SKILLING:
  • The skilling in Pauper is very extensive. Every skill is available to train pretty extensively. This gives skillers many different options to train all of their skills, with different goals and aspects pertaining to each skill. We offer a very in-depth skilling system, having most skills completely redesigned to be of a fitting standard for our server. Every skill has a method to be profitable, allowing our skillers to be able to freely enjoy an enriched skilling experience. Lots of items they produce are also limited in trade from the Grand Exchange, making their services very valuable and could potentially earn them a lot of money. There are lots of effects from your skilling that will have tremendous benefits to your account. One example of this is that agility will increase how fast your run energy restores.

WILDERNESS:
  • We do not neglect the players seeking an even more dangerous thrill. There are vast incentives for players to venture out into the wilderness, where more dangerous monsters are located that drop more valuable items. Many essential key features in Pauper are only located in the wilderness. Such as gaining summoning charms is largely found from monster drops in the wild, Pauper Points (a very valuable commodity) are only dropped through bosses and wilderness monsters, there are a few essential quests that are located out in the wilderness, and so on. Additionally, there are a few bosses in Pauper located in the wilderness, making their trials all that more dangerous for both you and the person potentially trying to kill you.

BOSSES:
  • Pauper has a vast range of bosses that will surely quench that thirst. Some bosses are locked behind achievements, like account status or quest rewards, and others are just readily available. There are a few minibosses that you can find throughout the world, some even located inside the wilderness. Every boss you encounter has been designed from the ground-up and are fully functional, allowing each boss encounter to be meaningful and worthwhile. Each and every boss in the server offer different rewards for slaying them. This will drive players all over the world to try and challenge them wherever they can. There is also even an un-soloable boss in the server - Nex! She has been worked on extensively and is quite the challenge, we encourage you to gather a group of 4 or 5 and give her a shot!

QUESTS:
  • There are a number of custom quests in Pauper, with more to come! There are currently 6 fully playable quests in the server, each offering different and unique rewards. These quests range from quests for low-leveled players, mid-level players, end-game players and even skillers! Each quest is uniquely important in their own right, some can be subjective to how important they would be to your current goals. Whether you want access to better skilling, or allowed into new boss areas - there's a quest for it. These quests are scattered all throughout the world, making sure that you must spread out and adventure into the world to complete them.



Here's some unorganized media!:
n2YnECH.gif

giphy.gif

Taxmgn3.png

557thIs.gif

jZsz0Tp.gif

gMAELpJ.png

69ku8dt.png

Ir8YuaC.png

6bx17n9.gif

LhFPJZ8.gif

LBoKJy0.gif

LXCa4nj.gif

cfj35vI.gif

c9H7Mct.png

JMx8NGC.png

HyGyBUl.png

DVlsgBI.png

WO4vgke.png




 
Last edited:
Few updates:
-Waterbirth isle added
-Fremmy boat takes you there
-Patched slayer point reduction when skipping tasks
-Lighthouse added
-Daggs in lighthouse dungeon added
-Fishing guild added
-Monkfish, karambwan, sea turtles, and manta ray available to fish at fishing guild
-Oysters now give rewards when opened
-Removed a few NPCs from Edgeville in favor of different world locations
-Al-Kharid spawns added
-Additional implings spawned at Puro Puro
-Added agility shortcut to west Falador wall
-Combat scripts added to Varrock guards
-Combat scripts added to Varrock dark wizards
-Combat scripts added to Falador guards
-Combat scripts added to hill giants (teleportal)
-Combat scripts added to ghosts (teleportal)
-Disabled rfd portal > bugged
-Disabled runes in peril portal > bugged
-Combat level requirement for dummies reduced in the algorithm
-Level requirement in Initiation quest reduced from 40 to 30
-Brimhaven vines patched
-Fire giant spawns added to caves in mage arena tunnels
-Hill giants removed from the same spot
-Grenwall spawns added in a clearing near feldip hills around some ogres by a swamp
-Zamorak mage no longer requires a total level to access
-RuneSpan added in Wizard's Tower at Lumbridge
-Warped Gulega major nerf
-Hunter formula updated, now more proper and hunter gear adds bonus
---Larupia adds +1 per item
---Graahk adds +2 per item
---Kyatt adds +3 per item
---Spottier cape adds +5
---Hunter skillcape adds +8
-Hunter NPCs no longer null their movement after catching in box traps
-Can now properly lay 5 traps at level 80 hunter (used to be 4)
 
Thank you!

Few updates:
-Dynamic regions patched
-Reinstated fight caves
-Reinstated RFD portal
-Leaving Runes in Peril off until I come up with a more acceptable reward
-Fishing guild spot split to two, allowing better catches
-Hunter NPCs now run to traps before being caught
-Trap NPCs are no longer extremely magnetized to the traps
-Thieving algorithm updated
-Smithing exp rates increased by 35%
-RuneSpan nodes now properly give RuneSpan points
-RuneSpan shop added to Traiboar
-Dragonfire now rehandled on green, blue, red, black, and brutal dragons
---Anti-dragon shield absorbs most damage
---Anti-fire potion absorbs most damage
---Anti-prayers absorb most of the dragon damage
---Mixing any of these three together will fully protect you from dragon's breath
---Super anti-fire potion absorbs all damage
---Dragonfire shield absorbs all dragon fire with or without charges
-Added more red dragon spawns
-Bunyip passive healing added
-Phoenix thieving added
-Filtering available for dragonfire absorption messages
-Edited terminology for various messages for easier understanding
-Recolored skilling point received message
-Cooking algorithm made more accurate
---Cooking gauntlets will increase cooking rate
---Cooking skillcape will allow the player to never burn
-Draconic visage drop removed from black dragons
-Lava flow mining patched
-Food messages now able to be filtered from game chat
-Fishing rates updated
---Seaweed and oysters have 15% of being caught by default
---Fish in a mixed pond will now be reliant on fishing level difference rather than rng
-Summoning familiars will now properly attack their owner's targets
-NPCs will now attack players attacking them regardless of distance
-Grand Exchange agility shortcut added
-Potion decanter Bob Barter added at Grand Exchange
-Hobgoblin combat potentially patched
-Fairy ring interface timer changed
-Polypore vines patched when climbing up
-Brimhaven Dungeon vines patched
-Food messages now able to be filtered from game chat
-Fishing rates updated
---Seaweed and oysters have 15% of being caught by default
---Fish in a mixed pond will now be reliant on fishing level difference rather than rng
-Summoning familiars will now properly attack their owner's targets
-NPCs will now attack players attacking them regardless of distance
-Grand Exchange agility shortcut added
-Potion decanter Bob Barter added at Grand Exchange
-Hobgoblin combat potentially patched
-Fairy ring interface timer changed
-Polypore vines patched when climbing up
-Brimhaven Dungeon vines patched
-Added leather crafting for the basic leathers
 
Last edited:
Few updates:
-Patched some objects to make you walk to them first to use them
-Skilling shop added with new items
---Gloves of silence added for 775
---Cooking guantlets added for 775
---Goldsmith guantlets added for 775
-Patched leathercrafting for higher tier leathers
-Gems received through mining re-coded
-Ironman can pickup their own drops now unless killed by a player (I think)
-In-game voting incentives now live for TopG
-Changed the home portal to a cooler one
-Slayer Update
---Turael, Vannaka, Mazchna, Cheldaer, Sumona, Duradel, and Kuradal all available
---Each one gives different tasks and different amounts of those tasks
---Each one gives a different amount of points for their tasks
---Boss tasks available from Kuradal, Duradel, and Cheldaer
---More slayer monsters available
-Ellis can now tan regular cowhide
-Coal bag added to skilling point store for 850
-Tokkul gains increased at lava flow
-Kuradal, Duradel, and Chedlaer now properly offer boss tasks in their options
-Dagannoth drops added
-Sea turtle fishing experience increased significantly
-Bonecrusher message now filtered
-TzHaar banker now accessible
-Slayer points now properly awarded
-Bonus slayer points awarded for completing tasks with 100+ kills
-Can smelt using coal from inside coal bag as well
-Smithing items higher than steel received a boost to exp
-Now able to properly start smelting when only have a coal bag with coal in inventory
-New players now able to properly be assigned slayer masters
-Desert stile to strykewyrms now available
-Grey chinchompas added to trap hunting
-Puro Puro rates easier & hunter gear will effect the chances caught
-Vampyres have combat definitions
-Plank sawing experience reduced significantly
-Adamant ore spawned at Falador Mining Guild
-Bank deposit box spawned at Falador Mining Guild
-Basic blast furnace actions added
---Add ore and coal on the conveyor belt to create bars
---Blast furnace uses 1/2 the secondary ore (coal) required
---No need to handle temp gauges or refilling with coke, simple & easy
---Examining the conveyor belt or bar dispenser will give ore details
---Can hold a maximum of 500 ores
FCxWyhC.png

wD8LNkt.png
 
Thank you :)

Few updates:
-Blast furnace now properly tracks how many total ores the player has smelted
-A few shark spots added to fishing guild
-Examining objects no longer interrupt player action
-Gnome advanced agility course completion xp raised
-Manta ray and sea turtle spot now require a bait and rod like their spot suggests
-Farming reinstated
---Every herb, flower, allotment, hop, cactus, fruit tree, vine herb, tree & bush patch around the world available (lil buggy)
---All seeds dropped by mobs are plantable, I think all seeds for these patches are available
---When testing w/ Less, I accidentally cooked up some "interactable farming", we enjoyed it a lot - so it's gone live
-----This means, plots grow close-to instantly, but for low xp
-----1 produce per click, with randomized max values on produce
-Farming now properly tracks crops grown and produce received in player logs
-Farming patches now properly display upon login
-Added fletching animations for those that had none
-Untradeable items do not account for the total number of items kept on death
-Are able to gain skilling points while farming
-Tree seed prices slightly modified
-Tree patches now properly give produce & experience boosted
-Players now require a seed dibber to plant
-Market stall at Draynor now give snape grass as well
-Can now make jugs of water using empty jugs at most water repositories
-Can now make jugs of wine using grapes on jugs of water
-Can now make jugs of wine using bottles of wine on empty jugs
-Can now make wine of Zamorak using jugs of wine on the chaos altar at Edgeville
-Thieving rates now adjusted and more properly adjusted
-Market guards do not aggro as often when thieving from stalls
-Ardougne Knight combat definitions applied
-Unicorn combat definitions applied, drops unicorn horn at 100%
-NPCs will properly be aggressive towards attacking players
-Rev caves are no longer all orks
-Revs will no longer heal as much
-Multi-targeted attacks now take into account NPC sizes
-Torstols gain while farming nerfed
-Non-stackable items dropped in multiple quantities will have separate drop listings
-KBD dragon fire now handled more appropriately
---Protection handled similarly to other dragons
---Dragon fire now only has a 33% chance to freeze
---Dragon fire can only proc freeze if damage is greater than zero
---The poison variation has the same effects as above
---GFX properly applied
-Torstols code patched
-Total produce yield now depends on which patch type it is
-Farming growth handles plots simultaneously rather than latest plot planted
-Multi-harvest plants now handle amount of multi-harvests more uniformly
-Trees now designated as multi-growth plants
-General farming skill polish
-Few prices slightly modified, mostly seeds and herbs
-Players now need a farming level of 80 to craft a polypore staff
-Games necklace, ring of dueling, noted vials of water and anti-dragon shield added to general store
-Added a few spawns throughout the world
-Dagannoths in chaos tunnel received combat definitions
-Player count on website now functional
-Lava flow mining runite ore scaling now scales more functionally off mining level
-Runite ore gained from Lava Flow now noted
-Cavefish healing increased by 10
-Heal splashes no longer display when you already have max hp
-Brine rats added in the sewers beneath Draynor jail
-Terror dogs added in the sewers beneath Draynor jail
-Terrordogs combat definitions applied
-Warped terrorbirds and tortoises have been added in battlefield
-Aquanites added to Fremmy slayer dungeon
-Kurasks added to Fremmy slayer dungeon
-Website-based voting for TopG now live
-Combat definitions applied to kurasks
-Shilo village cart can be jumped over now
-Can recover coal from blast furnace using the collect coke object
-Portals to Edgeville added to rune essence mine
-Deposit box added to rune essence mine, only accessible after completing Runes in Peril
-RuneSpan once again locked behind Runes in Peril quest

We also have a website now!

msc820v.png

09XSvh3.png

E4rDTVR.png

KiYT9FN.png
 
Few updates:
-Potato seeds purchasable from GE (real this time)
-Potato seeds able to be rewarded from seed stall in draynor
-Added some [Tip]'s to the [Did You Know?] random messages
-Glassblowing added
-Reborn force drops modified
-Dragon arrows drops added to various monsters
-Dragon arrows drop rate lowered on dark beasts
-Red sandstone is now mined faster
-Avas accumulator saves arrows 11% easier
-All messages regarding glassblowing creation now filtered
-Decanter patched to give the correct potion IDs for overloads and extremes
-Glassblowing features now able to receive skilling points
-Flask filling added
-Cooking seaweed on fire will cook soda ash
-Using a bucket of sand or soda ash on a furnace will make molten glass for a small amount of crafting exp, as long as players have both items
-Buckets of sand added to general stores
-Birds nests added to woodcutting
-Rewards from birds nests added
-Able to crush bird nests with pestle and mortar

SVfucgB.png

vkOvZew.png

f3CLfpd.gif
 
Last edited:
In this image, why are you removing all of the items instantly? Why not remove them as they're used correctly? @GameMaster

1746517550365.png
 
In this image, why are you removing all of the items instantly? Why not remove them as they're used correctly? @GameMaster

View attachment 9456
It was just easier to just cache all the potions at once and return them when the process is finished rather than deleting multiple potions and returning (2)s (1)s etc during the process and having to refresh the math each time. So, just laziness lol.

Potion memory handled like this:
Java:
        for (Item item : player.getInventory().getItems().getItems()) {
            if (item == null || item.getDefinitions() == null || item.getDefinitions().getName() == null)
                continue;

            String name = item.getDefinitions().getName();
            if (name.matches(".*\\(4\\)")) {
                String baseName = name.replaceAll("\\s*\\(4\\)", "").trim();
                totalDoses.put(baseName, totalDoses.getOrDefault(baseName, 0) + (4 * item.getAmount()));

                potionIds.computeIfAbsent(baseName, k -> new HashMap<>()).put(4, item.getId());
            }
        }

Aren't I a lazy shmuck
 
Few updates:
-Vials of water removed from general stores
-Can create buckets of sand by using empty buckets on sand piles or sand pits
-Wilderness chaos altars now give +200% prayer experience instead of +300%
-Soda ash cooking can now only receive a small fraction of the skilling points from cooking
-Dynamic object descriptor added to give object examines based off of object names and properties
---This system has different template categories for many different themes of objects (trees, fire, rocks, etc.) and builds a "base" description off that
---After, it finds what "category" the object falls under and will add an adjective somewhere in the description based off of the string builder
---Then, depending on which category the falls into, it will add on another "flavor ending" to the description
---This system allows the same object to have multiple different descriptions that all seamlessly fit in
-Grammar formatter created to dynamically handle object examines
-Bolt enchanting redesigned
-Wilderness obelisks redesigned & can no longer send players to the same obelisk
-Shooting Stars redesigned & functioning well (for mining it)
---Now also easier to mine
---Will spawn in a random size between 3-9
-Combat dummies worked on
-Organized cooking logic
-Woodcutting code organized
-Mining code organized
-Lava flow code organized
-Summoning bonuses properly applied to mining, lava flow, and woodcutting
-Patched metal dragon's fire handling
-Health boosts from bonfires patched
-Star Sprite rewards added
---30 stardust per runite ore
---15 stardust per adamant ore
---5 stardust per mithril ore
---1 stardust per coal ore
---Gives ore in noted amounts
---Vanishes after collecting 1500 stardust globally
-Shooting Star tier duration extended
-Runes in Peril fixed (& tested this time lol)
-Shooting Star polish, which caused a little mining polish
---70% chance to receive stardust
---Remaining 30% is just exp without stardust
---Stage only increments when the player receives stardust
---Star Sprite exchange polished with a bit of details
---Small boost to experience
-Edgeville dungeon now wilderness past danger signs
-Items crafted now logged in quest tab
-Equipment tab completely recoded
-Equipment interface received some of the benefits of equipment tab's recoding
-Inferno adze and dragon pickaxe have proper idle animations
-Finished completely recoding mining using a Groovy parser
---This system allows me to add/remove rocks or change their definitions (like exp gains or level requirements) live while the server is running
---All around better code
---Handles pickaxe data separately. Example:
Code:
        BRONZE: [
                id: 1265,
                levelRequired: 1,
                animationId: 625,
                time: 1
        ]
---Handles rock definitions separately. Example:
Code:
        CLAY_ORE: [
                level: 1,
                xp: 5.0,
                oreId: 434,
                oreBaseTime: 10,
                oreRandomTime: 1,
                emptySpot: 11552,
                respawnDelay: 5,
                randomLifeProbability: 0
        ],

vGi8hNu.png

vkFl2UZ.png

Eb09ZXu.png
 
Last edited:
Few updates:
-Improved server resource management through OutputStream writing
-Morchella mushroom spores added to master farmer, kurasks, turoths, and aquanites
-Farming now reads player's toolbelt data
-Rewrote server launcher and termination
-Redesigned thread pools
-Woodcutting added to the new skilling system
-Patched bonfires
-Modified the Ring of Wealth code to specifically reduce droprates for common items while increasing droprates of rarer items at Bandos GWD specifically
-Changed dropping to proper sound
-Made changes to game engine and task scheduling
-Redesigned GameEngine class
-Patched poison purge aura
-Changes made to how Lucien is handled
-Expanded list of undead NPCs
-General Corporeal Beast improvements
---Corporeal Beast now has proper spear configurations
---Dark energy cores redesigned completely
---Dark cores have leap timers they cannot exceed
---Dark energy cores have respawn delays
---Dark energy cores have proper animations when leaping
---Small delay before traveling after doing jump animation for dark energy cores
---Delay before respawning on player tile dependent on how far away the player is, allowing players to be able to dodge the dark energy core entirely
---Corporeal Beast will spawn 2 dark energy cores at 25% HP, each dark energy core acting independently from each other
---Corporeal Beast drops edited
-Boosted experience rates for top floor of RuneSpan creatures and nodes
-Added weight to RuneSpan object node's spawn liklihood of their highest tier
-Patched inferno adze GFX when it burns logs
-Random life probability on trees now have weight added to it based on their level requirements
-Bird nests will now replace the logs provided, but award same amount of experience during woodcutting
-Giant mole drops edited
-Extra giant mole spawns
-Grenwalls now have proper animations
-Grey chinchompas properly give grey chins

mAs4KOR.gif




I have also developed a centralized Groovy parser to handle skilling configurations with mining & woodcutting added to it as proof of concept. The data for mining is stored and collected as shown above still, but parsing logic is now centralized and will be able to handle each skill with ease. This will allow me to easily convert all the other skills to the new Groovy system moving forward. The current packaging with woodcutting & mining added to the new system:

XQzFZgs.png


Adding additional skills to the new system is handled like such:
Java:
    static {
        registerParser("mining", new MiningConfigParser());
        registerParser("woodcutting", new WoodcuttingConfigParser());
    }
 
Last edited:
Meowdy all, apologies for a lack of updates recently,

I haven't exactly been doing content related updates, I've been mostly doing backend updates that won't ever be seen, so I've hardly documented these changes or promoted them. That doesn't mean I haven't been working on the source :) I've been making great strides in completely rewriting the game engine which has been a pretty large task. I am pretty unfamiliar with the RS2 protocol, so I downloaded a Matrix-based source in 2017 when I initially began this project as I do not know all the nuances of RS2 protocol to make my own framework. Given the age and amateurish design of the original Matrix source, I'm sure you can understand the need for a bit of modernization and proper coding practices. The game engine still has a lot of work to do, but the current changes I've made are as follows:
  • Now handles all tasks and processes through GameEngine class referencing
  • CoresManager redesigned to no longer use deprecated code
  • Concurrency replaced with modern tools
  • Thread pooling redesigned, factory now localized to one class that dynamically selects priority queues, thread priorities properly established & assigned correct number of processors
  • Core configurations now flexible
  • Thread monitoring now possible
  • Lifecycle state management added
  • Virtual threading now supported
  • WorldThreads now handled more safely
  • Server bootstrap now capable of internal portforwarding through the weUPnP library, no longer needing to manually portforward with any modern router
There is still a lot of work needed to be done to the engine, but this is a good start in keeping the server stable and updated using jdk24 coding practices.


Pauper is currently experiencing a bit of downtime as I am re-writing player saving and loading while making some of these internal changes. The current method is using a Serializable file which is extremely fragile, especially when this source tragically utilizes an inheritance chain system (Player extends Entity that extends WorldTile that implements Serializable). I intend to make Serialization irrelevant by converting player saving and loading to some simple steps:
  • Player saves to a JSON file
  • GameEngine converts that JSON file to a compressed binary file
  • Server reads and writes to that binary file
  • Periodic last modified checking & saving A separate file watcher thread to check modification, ensuring all most-recent data stays relevant between json and binary (a system with the potential for you to safely edit character files live while players are online & connected)
  • Server handles player loading through the binary file
  • Create SHA-256 based password encoding & obfuscate the code
This will allow humans to read and write to player files while maintaining much faster read times using the binary loading, which will greatly improve network stability since player files are vast & complex - packet transmission will be significantly faster in binary format.

I also plan to release a 30-day rollback system once I've introduced the new player loading.


As far as content-related features go... Not much this time! That doesn't mean there's nothing in store though. I am planning on soon releasing fishing to the new Groovy-based skilling system. Because of this, I've worked on the Groovy parser a bit more to handle s'more data internally rather than relying so much on GroovyShell; gives me more freedom of control in how Groovy files are read and handled. The fishing skill itself hasn't been exactly worked on yet, but I've been doing some planning regarding it. I would like to get it more proper with spots depleting and what-not, so fishing data will likely be handled in a similar fashion to this:
Code:
fishingSpots = [
   "swamp": [
      possibleSpots: [
         [x: 3242, y: 3158],
         [x: 3240, y: 3160],
         [x: 3235, y: 3165],
      ],
      respawnTime: 30,
      updateSpot: { currentSpot ->
         def otherSpots = possibleSpots.findAll { it != currentSpot }
         otherSpots[new Random().nextInt(otherSpots.size())]
      }
   ]
]
That way, the spot data can be cached simple & easy, while still maintaining spots that change to a random preset of coordinates. I may change this to an individual-based system (i.e.: each spot individually will have different locations rather than a region with a shared coordinates preset), but I'm not certain yet.
 
Last edited:
Thank y'all very much! :)

With the introduction of the new skilling system, Pauper had it's launch time extended from about 5 seconds to 20 seconds. I find this unacceptable. I have made improvements to the internal portforwarding, reducing the time it takes to open the server port by about 50%. More importantly, though, I have added config caching and pre-compiling for the Groovy files, which reduced their load time by about 90%. Pauper has now gone from averaging 21,000ms startup to about 3,100ms startup. This system now also appropriately & safely handles both flat and nested Groovy maps while maintaining some seriously fast load times, it also has periodic cache monitoring built in. Examples of nested evaluation & cache referencing:
Java:
    protected Map<String, Map<String, Object>> getCachedNestedConfig(File file) throws IOException {
        String cacheKey = "nested:" + file.getAbsolutePath();
        if (ConfigCache.needsReload(file)) {
            Map<String, Map<String, Object>> config = evaluateGroovyNest(file);
            ConfigCache.updateCache(file, config);
        }
        return ConfigCache.getCachedConfig(cacheKey, () -> {
            try {
                return evaluateGroovyNest(file);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }

    protected Map<String, Map<String, Object>> evaluateGroovyNest(File file) throws IOException {
        Object result = new GroovyShell().evaluate(file);
        if (!(result instanceof Map<?, ?> rawMap)) {
            throw new IOException("Groovy file must return a Map");
        }

        Map<String, Map<String, Object>> typedMap = new HashMap<>();

        for (Map.Entry<?, ?> entry : rawMap.entrySet()) {
            if (!(entry.getKey() instanceof String)) {
                throw new IOException("Map keys must be Strings");
            }
            if (!(entry.getValue() instanceof Map<?, ?> rawNestedMap)) {
                throw new IOException("Map values must be nested Maps");
            }

            Map<String, Object> typedNestedMap = new HashMap<>();

            for (Map.Entry<?, ?> nestedEntry : rawNestedMap.entrySet()) {
                if (!(nestedEntry.getKey() instanceof String)) {
                    throw new IOException("Nested map keys must be Strings");
                }

                typedNestedMap.put((String) nestedEntry.getKey(), nestedEntry.getValue());
            }

            typedMap.put((String) entry.getKey(), typedNestedMap);
        }

        return typedMap;
    }

The ConfigCache class is a bit too large to put here for reference, but you get the idea. The cache is cleared and cold loaded on initial server startup, so you should expect 100% misses on a fresh load, but they are read much faster now:
4hWVSRN.png


Very fast server startup again:
uSZ3OGT.png
 
Thank you!

I'm pleased to announce that all major issues with the new character files are fixed and ready for player access. It currently is not as expansive as my initial idea, but that is still happening, but no JSON yet. Currently, the server serializes the file through our proprietary binary serializer - it is vastly robust and incredibly safe. Since these players are formatted in-house without relying on Java's default serialization, the character files are completely safe from data injection streams! Additionally, the new character files are completely thread-safe with asynchronous i/o streams, and their data is compressed making them much smaller which causes packet transmission to be incredibly quick. Not to mention how fast players are saved in background processes. The compression and decompression of this data is also thread-safe to keep Pauper's flow of logic as consistent as possible. Here's an example of that, which also features how thread-based task execution is now handled with Pauper's new game engine:
Java:
    private static byte[] compressInThread(byte[] data) {
        try {
            return GameEngine.getInstance().getFastExecutor().submit(() -> {
                try {
                    return compress(data);
                } catch (IOException e) {
                    Logger.log("PlayerBinarySerializer", "Compression error: " + e.getMessage());
                    return data;
                }
            }).get();
        } catch (InterruptedException | ExecutionException e) {
            Thread.currentThread().interrupt();
            return data;
        }
    }

    private static byte[] decompressInThread(byte[] compressed) {
        try {
            return GameEngine.getInstance().getFastExecutor().submit(() -> {
                try {
                    return decompress(compressed);
                } catch (IOException e) {
                    Logger.log("PlayerBinarySerializer", "Decompression error: " + e.getMessage());
                    throw new RuntimeException(e);
                }
            }).get();
        } catch (InterruptedException | ExecutionException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException("Decompression failed", e);
        }
    }

New character files much smaller, old character files used to be around 30KB:
wIrvlWr.png


Extremely fast player saving:
x060ZUm.png



Now with player files out of the way, I'll be creating a new quest system so I can replace the Initiation quest. This will be a much better designed quest that'll bring a rich and enjoyable start to Pauper, which will also be more in-tune with the flat exp rates we will soon be introducing so that everyone will be competing at the same level. This means that we should be coming back online in just a few short days :)
 
Hello, hello, hello! Pauper is getting very close to it's re-launch! Since we've grown a small interest of players now waiting for this, I will be sure to post here 24-hours in advance when the re-launch will be going live to give everyone a fair chance at logging in and start competing for skills and in the economy.

But how have we gotten closer to re-launch? Our quest system! I've been spending a few days making it quite robust. I first designed Cook's Assistant as a simple quest to test all the systems and add essential core systems I may need to actually execute quests. This allowed me to set the foundations of the questing system and expand on it much further while I am redesigning the Initiation quest (starter quest). Unfortunately for any eager-eyes that may be lurking on this project - I will be removing any and all custom quests from the source before releasing it to the public; leaving only Cook's Assistant as an example of how the quest system works. It will be up to the rest of you to make your own quests.

Disregarding that though, the quest system has gotten quite robust! I've already added extremely safe quest saving through the binary serializer and it's pretty much got all the tools you need to make fully functional and in-depth quests. Nested skill requirement, item requirement, & reward maps as well as String-based objective issuing to allow for quite literally any amount of ideas to add to quests, no matter the complexity nor the creativity. An example of how these are applied and referenced in a dialogue:
Java:
        String currentObj = player.getQuestManager().getQuest(Initiation.class).getCurrentObjective();
        if (currentObj.equalsIgnoreCase("Catch some shrimp for Turael")) {
            if (player.getInventory().containsItem(RAW_SHRIMP, 1)) {
                if (player.getInventory().getFreeSlots() >= 2) {
                    sendItemDialogue(RAW_SHRIMP, 1, "You show Turael the raw shrimp.");
                    stage = 20;
                } else {
                    sendNPCDialogue(TURAEL, Annoyed,
                            "I see you have shrimp, but your inventory is full!",
                            "Make some space so I can give you cooking tools.");
                    stage = FINISH;
                }
            } else {
                String displayObj = currentObj.replace("for Turael", "").trim();
                sendNPCDialogue(TURAEL, Serious,
                        "Remember, you need to " + displayObj.toLowerCase());
                stage = 10;
            }


The system is completely decoupled from the rest of the game logic, which means any and all quest-related logic can be handled within it's own packaging and simply needs to communicate with the game server in order to branch over. This makes it extremely easy to add new quests, both simple and advanced. Of course, how complex you make these quests will be up to you and how you use the source. Because of this decoupled logic, all you have to do is call the showCompletionInterface() method and it will dynamically display all the rewards of whichever quest the players have completed:
Java:
    public void showCompletionInterface(Player player) {
        player.getInterfaceManager().sendInterface(1244);
        player.getWorldPackets().sendIComponentText(1244, 25, "You have completed " + getName() + "!");

        StringBuilder rewardsText = new StringBuilder();
        ItemReward firstItemReward = null;

        for (QuestReward reward : rewards) {
            rewardsText.append(reward.getDisplayText()).append("<br>");

            if (firstItemReward == null && reward instanceof ItemReward) {
                firstItemReward = (ItemReward) reward;
            }
        }

        player.getWorldPackets().sendGlobalString(359, rewardsText.toString());

        if (firstItemReward != null) player.getWorldPackets().sendItemOnIComponent(1244, 24, firstItemReward.getItemId(), firstItemReward.getAmount());
        else player.getWorldPackets().sendItemOnIComponent(1244, 24, -1, 0);


        player.getWorldPackets().sendGameMessage("Congratulations! You have completed " + getName() + " quest!");
        giveRewards(player);
    }

D6mc5U8.png



Current questing package with an incomplete Initiation quest:
WA8e8JB.png
 
Last edited:
Alright! The starter tutorial has been finished and tested pretty thoroughly. I wasn't able to get it done as quickly as I wanted, I got pretty busy these last couple days.

Either way, this is the 24-hour post in advance to our re-launch!

It's not exactly a 24hr advance, it's more like a 15/16hr advance post. But either way, we will be online tomorrow from this date!
 

Users who are viewing this thread (total: 2, members: 1, guests: 1)