Thread: [KT] Drop Tables 3 DSL

Page 1 of 2 12 LastLast
Results 1 to 10 of 15
  1. #1 [KT] Drop Tables 3 DSL 
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    feedback is welcome and appreciated
    if you use this in your project or server, credits please

    This post was originally created to show off DT2 DSL, but has now evolved to be more flexible and powerful known as DT3. If you want to check out DT2, there is a link at the bottom of this post to the repository. DT2 will still be maintained but much less than DT3. Some features may get added to DT2 from DT3 if they are easy enough to implement, don't want to spend lots of time working on something I deprecated.

    heyo. while working on NBX, I came across some more ugly disgusting code related to generating an item based on rarity. superman to the rescue, because i know this plagues other servers as well.
    as usual, heres something ive created to further streamline development for myself that i know other aspiring developers (the good ones probably beat the shit out of me with their code lol) could find useful. this is very similar to my last snippet-type post of the same nature: [Only registered and activated users can see links. ]. I have improved greatly upon that older model, which (for some god forsaken reason, what was I thinking?) required you to put in the TOTAL slots AND the weights as well as assigning IDs to each bracket and putting those in an array. DropTable DSL uses much less brainpower to write and is much more powerful in terms of flexibility

    Benefits of using DT3 over commonly used drop rate-ish systems
    • Feels much more natural to write and look at. All the work (except the typing part) is done for you!
    • No bug ugly array of jumbled up IDs. Example: [Only registered and activated users can see links. ]
    • Quick (as quick as data entry can be) and easy addition of new drop tables with custom behaviours
    • Quick and easy identification of areas of your drop tables and their behaviours
    • Quick and easy editing of your drop tables and their behaviours
    • Built-in 100% accurate (as accurate as random can be) drop rate modifier formula
    • NEW IN DT3.5 Create Sub-brackets inside of already existing brackets to allow for multiple brackets to occupy the same slot!
    • NEW IN DT3.6 Sub-brackets will now append to the parent bracket's name! For example: Parent Bracket["Shining"] with child Bracket["Armour"] will result in the child actually being Bracket["Shining Armour"]
    • Ability to use custom Weights for your drop tables.
    • Define custom onAnnounce behaviour that will trigger every time that bracket is picked if announceDrop is true!
    • Define custom announceDrop and onAnnounce behaviour for the table and all brackets and sub-brackets will inherit that behaviour unless explicitly defined otherwise!
    • NEW IN DT3.6 Define custom onSelect behaviour that will trigger every time that bracket is picked regardless of announceDrop! This can be useful for incrementing achievements!
    • NEW IN DT3.6 It's even easier to create DropTables with the new shortened (but still just as readable) builder syntax!
    • Define your own custom weight calculation per DropTable!


    The intended use of this is:
    • get the drop table (now called d) from an activity
    • d.pickItemWithModifier(modifier) (outputs a Bracket i will now call b)
    • onSelect(item, b.bracketName, d.tableName)
    • if b.announceDrop: onAnnounce(item, b.bracketName, d.tableName)
    • give player item

    as you can see, the intent is for b.bracketName to correspond to a rarity tier. this helps players and developers get a picture of what items (are/should be) in that bracket (assuming the names of the brackets are somewhat accurate).
    for DropTable.tableName, the intent is to be the name of the activity, which helps players know what activit(y/ies) they can get the item from and developers know what activit(y/ies) they are editing.

    Spoiler for examples:

    MorUlRek Gem Stall


    Example onAnnounce usage


    Custom calculation




    Spoiler for recent updates:


    Spoiler for update 19/01/04:

    2019/01/04

    DT3.3 - Haven't found any bugs yet, here's to hoping lmao
    • Finished rewriting all components (ItemProducer, Bracket, DropTable) to DT3 spec (Flexible, Powerful, Customizable) and their builders. Very similar usage.
      • ItemProducer in DT3 is equivalent to ItemGenerator in DT2
      • Bracket in DT3 can now either be a SingleBracket (which can only produce anything that extends ProducesItem), or a MultiBracket (which can produce SingleBracket or anything that extends ProducesItem). This is good because it allows you to have multiple brackets for the same weight without fucking up the MemoWeightedTable's formula, as well as let you diversify what those brackets do onAnnounce! Multiple Brackets per weight with separate onAnnounce functions is why I created DT3. It was extremely beneficial to rewrite nearly everything from the ground up rather than rewrite everything from the inside out.
      • Nothing super notable about DropTable, its basically just a holder of Brackets.
    • Fixed bug in BaseRandom, not sure how I DIDNT have any compilation or runtime problems (BaseRandom was still extending ProducesWhenPicked<T> which didn't exist rather than Produces<T>)... fuck it
    • Removed a lot of vestigial reused DT2 code
    • Rewrote MorUlRek Gem Stall in DT3!


    This is rewritten to increment the weight in a Map every time the bracket is called
    Spoiler for Rewritten + Cherry picked results:





    Bitbucket: [Only registered and activated users can see links. ]


    Spoiler for update 19/01/06:

    2019/01/06

    DT3.4
    • Fixed bug where Bracket would not inherit from DropTable using Builder syntax
    • MultiBracket now more truthful to its name, can hold multiple Brackets rather than only multiple SingleBrackets
    • Renamed and visually upgraded (better to look at) a bit of code



    Spoiler for update 19/01/07:

    2019/01/07
    DT3.5
    • You can now specify a custom weight calculation formula if you so wish. This way, you don't have to calculate it everywhere else in your code, just one place!
    • Removed pickItemList and pickItemMap from MemoWeightedTable and DropTable. I didn't see any real use for them.
    • Added DslMarker annotations to builders, this makes sure you can't do something weird like build an ItemProducer inside of an ItemProducer or DropTable unless explicitly stated using [email protected]


    Spoiler for custom calc:





    Spoiler for update 19/01/10:

    2019/01/10
    DT3.6
    • Added onSelect
      • onSelect is a function you can define to trigger every time a bracket is picked regardless of whether or not announceDrop is enabled
      • onSelect can be defined in both DropTable and Bracket
      • onSelect will be suggested to any children. Reminder that children will refuse the suggestion if the child already has an one already explicitly defined.
      • onSelect can be useful if you want to do something when, say, you get a pick from a specific table. An example would be firework graphics or maybe incrementing progress towards an achievement.
    • Reduced keystrokes required to create a DropTable
      • Added 'add producer {...}' as a shorter alternative to 'add itemProducer {...}'
      • You now don't have to type "add bracket {...}" or "add producer {...}", you can now remove the "add " part and just type "bracket {...}" or "producer {...}"
      • As a byproduct of basically calling a function now rather than using a variable and infix function, less stress is put on the IDE when using reduced keystroke builders.
      • This change is back-compat, i didnt remove the "add bracket" and "add producer" functions.
    • Added sub-bracket name inheritance using a String class similar to my StateBoolean
      • All sub brackets will inherit the name from their parent bracket and add on to it
      • The idea behind this is to have the parent bracket's name an adjective and the child bracket's name be the subject and the child's children any extra descriptor.
      • For example a parent bracket named "Glowing" that has has a child named "Swords" will result in the childs actual name being "Glowing Swords", and the child's child bracket being named "of Might" will result in the child's child's name being "Glowing Swords of Might"
    • Misc
      • Changed calculateWeights signature from ((Int) -> Double)? to (Int) -> Double and now the default is defaultWeightCalculation
      • Reorganized code
      • Removed BuilderCommon.Set objects. With things that should only be used once in the builder, you use With.


    DT 2.8
    • Added onSelect from DT3 (read above)
    • added reduced keystroke builders ("add producer {...}" -> "producer {...}") from DT3
    • Removed 2 empty lines from DropTable class file
    • added a space before +enableAnnounce in the test bracket in the builders file


    Spoiler for images:

    Reduced typing on bottom
    Everything in onSelect will happen regardless of announceDrop being enabled or disabled





    Bitbucket DT2: [Only registered and activated users can see links. ]
    Bitbucket DT3: [Only registered and activated users can see links. ]
    Last edited by nbness2; 01-11-2019 at 08:27 AM. Reason: DT3 onSelect and reduced keystroke builders
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  2. #2  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    update:
    • rewrote the base kotlin library to be more proper in terms of abstraction and reflection, also more intuitive and safe
    • separated the classes from eachother
    • wrote a separate tests class
    • also rewrote in java for you stubborn people, and python.


    new kotlin: [Only registered and activated users can see links. ]
    new java: [Only registered and activated users can see links. ]
    new python: [Only registered and activated users can see links. ]
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  3. #3  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    fixed a bug that was causing unintended interactions with WeightedTable and a modifier amount
    the bug: modifier did not properly apply to WeightedTable pick calls (anything that wasnt a multiple of 100) because i kept it as an int, therefore it did integer division and would truncate (round down to the nearest whole basically) and only work with multiples of 100 (because was dividing with 100)
    the fix: converted modifier to double when calculating the new modified weight, this avoids integer division truncation and much much much more accurately reflects what should be going on.

    the below pictures are not 100% accurate, just gives you an idea of what was happening
    old bugged example, it would look like a staircase (the steps are where multiplier equals multiples of 100) which is NOT how it was supposed to happen.

    Spoiler for before and after fix:




    new fixed example, it now looks like it should, a radical half pipe.




    Added ItemPair object. You initialize ItemPair and calling ItemPair.newItem will generate a new item from the initialized data. This makes creating items really easy and absolutely unnecessary when picking from a table (and other places if you decide to implement it elsewhere ).
    You can now define an array of item ids to an amount (or range of amounts )rather than separately defining each item id and amount
    You can now define a range of item ids (including a step if wanted) to an amount (or range of amounts) rather than separately defining each item id and amount
    These don't change the chances of an item being picked, they just help you better maintain your drop tables.

    Spoiler for new feature examples:

    ItemPair Example


    New ItemPair declarations


    DropTable gist (includes an example drop table)
    [Only registered and activated users can see links. ]
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  4. #4  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    download link to update: [Only registered and activated users can see links. ]
    download link cause its easier than gists tbh what was i thinking

    Update to kotlin drop tables for some upcoming content I have been slow to work on due to medical issues:
    • Separated a lot of stuff so its a bit more organized
    • You can now call on weightedTable with custom weights using weightedTable.pick(customWeights=intArrayOf( .. ))
      • Same requirements to custom weights as the initial weights. Each weight must be unique (because it will always pick one of the items with the same weight otherwise, and never the other one), and each weight must be over 0.
      • custom weights are assumed to be sorted assuming they meet the requirements, as there is nothing to sort them against unlike the initialization of the weightedTable where both items and weights are given.
      • The hash of each custom weight used on the table are saved for future usage.
      • If the custom weights DO meet the requirements, a RandomRange is saved in the map storing the already verified weights, otherwise a WeightStatus is.
      • This results in a net performance gain (unless every single time a custom weight array is given its unique) and decreased gc pressure (because the randomranges are stored and dont have to be instantiated every time the non-unique weights table is given) at the cost of increased constant memory usage (stores the weight tables hashcodes as well as the randomrange\status)
    • Brackets will automatically consolidate all ItemPairs with the same AmountRanges in to the same ItemPair.
      • RandomRange now has hashcode as a side effect
      • [Only registered and activated users can see links. ]
      • I did this to keep the development process visually streamlined without impairing runtime performance while also decreasing overall memory usage
    • Changed ItemPair properties to make a bit more sense
    • added some demo tables
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  5. #5  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    Update - 2018/12/09
    General changes:
    • Fixed ItemGenerator consolidation bug
      • bug was with RandomRange and for some reason the hashCode not working, so...
      • changed RandomRange to be a data class, now functionally identical RandomRanges are actually identical and will be treated as such.
    • Better organization
    • ItemPair has been renamed to ItemGenerator
    • Added RandomUtil.BaseRandom and all children (found in my sig) to this project.
      • DropTable now inherits from MemoWeightedTable
    • Added NumberUtil.toByteArray and NumberUtil.fromByteArray (found in my sig) to this project.

    Serialization and Deserialization added to:
    • ItemGenerator
    • Bracket
    • DropTable


    DSL has been added to:
    • ItemGenerator
    • Bracket
    • DropTable

    The DSL Grammar has been made to be very easy for people who can read and write english.
    Using the DSL may require more LOC in most cases, but doesnt require as much thinking to convey your ideas and change the tables. Time efficiency while writing comprehensive and understandable code!
    Mor Ul Rek gem stall has been changed a little to use available DSL constructs and has 2 more demo tables to show usage of using full DSL and hybrid DSL. They all compile and serialize to the same thing.
    Anecdotal: My brother who hasnt programmed using anything but scratch was able to write a drop table in DSL in around 10 minutes once he had all the data entry (names ids and amounts) known. That's about 20 minutes quicker than using the non-DSL syntax. Of course this margin would be lower for people used to programming, but its still much easier to understand and write. That is my goal with this, create robust but easy to understand and create drop tables, and the addition of the DSL is a big step towards understanding and creating them more efficiently.

    The following examples contain different examples of how you can utilize the DSL to meet your needs.
    Spoiler for DSL examples:

    Full DSL Mor Ul Rek Gem Stall


    Semi-DSL Mor Ul Rek Gem Stall


    No-DSL Mor Ul Rek Gem Stall

    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  6. #6  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    Update 2018/12/12

    not much today, folks
    • Added sneaky get overload in ItemGenerator to make it seem like you are using implicit receiver infix with a collection literal to add ids and set amounts
      • You can use as many ints as you want when setting ids, or you can use an IntProgression
      • You can only use 2 ints when setting amounts.
      • The old syntax is still compatible with this change
    • Added a README to the main git page to more gently introduce someone to the idea of using the DSL and what the different parts of the DSL do.
    • Renamed some "newItem" and "pick" to "createItem" to make it more consistent throughout.


    Spoiler for new syntax:

    old
    Code:
    ItemGenerator {
        with ids intArrayOf(2, 4, 6, 7, 10)
        with ids 25 step 4 to 100
        with amounts 2 to 10
    }
    new
    Code:
    ItemGenerator {
        withIds [2, 4, 6, 7, 10]
        withIds [25 .. 100 step 4]
        withAmounts [2, 10]
    }
    Looks a bit nicer IMO, but then again thats because I came from languages that have collection literals, which kotlin still doesn't have any of
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  7. #7  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    2018/12/14

    Not much today either
    • Fixed MemoWeightedTable bug
      • Was using .hashCode() instead of .contentHashCode() for weights, and that would produce different hashcodes for identical weight arrays.
    • Added .dslString() for DropTable, Bracket and ItemGenerator
      • This was made because I wanted to convert my NBX tables from old syntax to DSL syntax
      • Easy and proper conversion for you guys.
      • Preserves IntProgressions if they are the only thing in the idList.
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  8. #8  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    I am slowly rewriting this in to DropTable3 DSL. I'll make up what version I'm on next update The plan is for DT2 tables to be compatible all the way until the last DT2 release. DT2 tables will not be fully compatible with DT3. I am slowly adding DT3 features to DT2 until DT3 release.
    With the updates leading to DT3 release, I am going to be slowly abstracting stuff, as people I work with get a hard on for that, and I think it's good practise.

    Updates
    • BaseRandom now implements Create<T>
      • Create<T> implementors must define pickItem(modifier: Int): T. That's it.
    • Reorganization
      • Components (Item, ItemGenerator, Bracket and DropTable) are now in their own folder.
      • Builders are now in util.Builders rather than their respective component's file.
    • [!!!] Bracket.onAnnounce: [Only registered and activated users can see links. ]
      • You can now add a function to Bracket that will execute every time Bracket.pickItemWithWeights(Int) is called and Bracket.announceDrop is true.
      • onAnnounce can be given in Bracket constructors or inside Bracket builder using "onAnnounce { item, bracketName, tableName -> code }"
      • It takes arguments (item: Item, bracketName: String, tableName: String). This should be all the information you need from the table for whatever you plan to do with it.
      • onAnnounce can do anything you want, no more needing big switch statements that hardly relate to the code it's in. Define it all in the Bracket, or a general lambda that takes (Item, String, String) and use those!!
      • onAnnounce is not required (default function does nothing).


    papa nbness says: remember to name your code meaningfully! with sufficient enough naming, you don't need to write nearly as much documentation if any, as the code documents itself! smaller variable names do not make your program run faster, and neither does putting multiple lines of code on the same line using semicolons! it's all the same when you compile!
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  9. #9  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    2018/12/27

    I started on a next version of DropTable DSL because I was really inconvenienced that I limited myself to what I have with DT2. Don't get me wrong this shit is easy to write. But it is quite limited in terms of flexibility. Such as not being able to have the same weight for multiple brackets or only being limited to RandomTable for item ids and RandomRange for item amounts... That's why I am creating DS3. It will be more flexible. It will be more powerful. It will be more.

    DT2.7a (a for arbitrary because i didnt base this version on any measurable metric, not alpha) update brings some syntactic quality of life
    • Created util.Common
      • This is where objects and misc classes used throughout multiple files will go.
      • Best example is DO_NOTHING_X functions, they are functional types that can be used anywhere a functional type can, you just have to specify X, the amount of parameters. There are only 45 because kotlin 1.3's functional arity is 45.
        • These are better used than {_, _, ... _ ->} throughout your code, as these each only make 1 anonymous function and are much easier to check equality for default values while keeping your code non-nullable. {_, _ ->} is not equal (according to hashCode) to DO_NOTHING_2, despite doing the exact same thing, nothing.
    • Added default onAnnounce and default enableAnnounce from DT3
      • You can now define onAnnounce and enableAnnounce at the top level of a DropTable and all children created brackets will inherit these.
      • This is pure QOL syntactic sugar change. This is meant to minimize effort (assigning a bunch of onAnnounce and enableAnnounce with 1 definition) while keeping the same level of customizability (allowing you to override the suggested values inside the bracket).
      • These default values are only "suggested" to built brackets, and will not be used if the bracket has its own explicit onAnnounce or enableAnnounce.
      • If the "selected" enableAnnounce is false, neither the suggested nor defined onAnnounce will be used. DO_NOTHING_3 will be used.
      • Useful if you want to minimize typing in a case where say, one drop table you want all tables to announce with the same message. Except you don't want to announce the least rare one (-enableAnnounce). You also want the most rare one to have a unique message (onAnnounce { ... }).


    Inheritance\Suggestion example

    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  10. #10  
    nbness2#5894

    nbness2's Avatar
    Join Date
    Aug 2011
    Posts
    599
    Thanks given
    224
    Thanks received
    96
    Rep Power
    254
    2019/01/03

    DT2 updates
    • Inlined a lot of stuff so less separate binary garbage files are produced and performance over extremely large unrealistic tests of hundreds of millions of item draws is increased around 5%


    Development on DT3 has started! Current version is 3.04b
    • Completely rewritten everything (RandomUtil and Components are the most notable)
    • New RandomUtil class and a few new extensions! (2 randTo 10) creates RandomIntRange(2, 10, inclusive=true), (RandomIntRange step 2) creates RandomIntProgression(range.start, range.stop, 2). RandomIntProgression has all the same values as the equivalent IntProgression, but you can get a random Int from it rather than having to map it to a list\array and get the random result from that.
    • Much higher level of abstraction compared to the quite rigid structure of DT2. You will be able to add BaseRandom<Int> as ItemProducer (previously ItemGenerator) ItemId AND ItemAmount, so if you really want to you can get really deep with this. You can also put multiple brackets in the same bracket.
    • Improved DSL Syntax, while still being very similar to (but not copypaste compatible with) DT2. Most notable change is no more un-wrapped ranges (ex: with amounts 2 to 10 step 2 -> with amounts (2 to 10 step 2))
    Discord: nbness2#5894
    Python Framework (???): [Only registered and activated users can see links. ]!
    NBX: [Only registered and activated users can see links. ]!
    DropTable DSL: [Only registered and activated users can see links. ]!
    Make your Inventory easier and safer to work with. Introducing Container: [Only registered and activated users can see links. ]
    Reply With Quote  
     

Page 1 of 2 12 LastLast

Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. [KT] Drop Tables 3 DSL
    By nbness2 in forum Snippets
    Replies: 15
    Last Post: 01-11-2019, 08:27 AM
  2. Replies: 23
    Last Post: 01-17-2014, 05:30 AM
  3. [PI] Underingstanding The Rare Drop Table
    By Merrow in forum Snippets
    Replies: 4
    Last Post: 04-06-2013, 04:59 AM
  4. perfect tormented demon drop table
    By Teemuzz in forum Configuration
    Replies: 21
    Last Post: 03-30-2010, 05:17 PM
  5. Drop Tables.
    By Bando in forum RS2 Server
    Replies: 21
    Last Post: 02-13-2010, 10:12 PM
Tags for this Thread

View Tag Cloud

Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •