Are there any right now?
↧
Looking for a good 637/639 rsps
↧
[317] Violence - Most Addictive OSRS


Welcome to Violence, we are Brand-New.
Join the most addictive war in the RSPS scene, we are a community
driven RSPS that strives to create the most enjoyable experience for you!
Violence has been in non-stop development for the past Year, with a goal of surpassing
all PK/PVM based servers. We are not just only a Pking server, but a great Pvming and
skilling server too, with an extreme amount of pure content, wat is really addictive.
+ Over 8 different wilderness events
+ Raids 2 Wilderness Events
+ Raids 1 Wilderness Events
+ Raids 1 Chambers Of Xeric
+ Wilderness bosses drop parts of the twisted bow
+ Active wilderness
+ Brandnew event chests.
+ Wilderness bosses, drop pvp crates and other crates with great loot.
+ Log-in and Pk instantly
+ Every single osrs wilderness boss with great loot.
+ Quick set-up interface for instant Pking
+ All OSRS items and every osrs boss.
+ Tournament system, the best Hybrid claims the BM reward and #1 Hybrid title
+ Blacklist a toxic player from attacking you at Edgeville
+ Wildernerss Bots to pk against as practice
+ Profile interface system, search other player's statistics
+ World events spawn every 2 hours to spice things up with bonus rewards
+ Highscores for pures, zerks, ranged tanks, mains
+ Achievements to unlock items and titles
+ Osrs items, bosses & maps
+ Welfare items are free, barrows and above cost blood money
+ Professional client with customization to any revision you would want
+ Many Wild bosses for the best money making methods
+ Pvp tasks, get kills as a pure/zerk/main and claim BM reward after completion
+ Target system
+ Every OSRS Boss pets & Skilling pets
+ Daily highscores, #1 spot claims 15k Bm reward, different highscores everyday
+ Skilling for skill capes, max capes & some relaxing money making
+ Daily lottery
+ Killstreak skulls
+ CS GO Mystery Boxes
+ F2p protection when F2p pking
+ Placeholders & all bank features
+ Killstreak skulls
+ Much more addictive content, join the grind now at http://violenceps.com
The Everlasting ,just released in deep wilderness level 47, this boss is a great powerful boss with 7 different attack styles,
from mage to range , you will need to dodge some of those hits, he does have some great drops some of witch are best in game.
![]()
Barrel chest boss just released, this boss will have some extreme loot to gain, he is a multi boss and would be great for you to bring a team,
he can smash through prayer and he can switch attacks from melee to mage and will drain your prayer remarkable fast.
![]()
Galvek from dragon slayer 2 just released, this boss will have some great loot to achieve,
he is a really powerful boss, so get your pots and armour ready for the fight of your life.
![]()
from mage to range , you will need to dodge some of those hits, he does have some great drops some of witch are best in game.

Barrel chest boss just released, this boss will have some extreme loot to gain, he is a multi boss and would be great for you to bring a team,
he can smash through prayer and he can switch attacks from melee to mage and will drain your prayer remarkable fast.

Galvek from dragon slayer 2 just released, this boss will have some great loot to achieve,
he is a really powerful boss, so get your pots and armour ready for the fight of your life.







Visit Violenceps.com to Join now
credits:
10% - PI
25% - DT
65% - VL
↧
↧
[317] Tojad - THEATRE OF BLOOD - Inferno - LOTTO - Switches - BOSS+++ - Marketplace - SKILL
Tojad is ONLINE at
Brought to you by the maker of Tojad in the download's section with custom quickprayers, null packet handling crashes, etc...
- MEMORY LEAKS/ERRORS (FIXED/COMPLETED)
- RAIDS (FIXED/COMPLETED)
- GRAND EXCHANGE (FULLY REWORKED/IMPLEMENTED GRAND EXCHANGE SYSTEM/VOTE/HISCORES/STORE)
- MINOR CHANGES(FIXED/COMPLETED)
-Fixed minor bugs in website/server(FIXED)
-FIXED running through the wall in edgeville bank(FIXED)
-Rewards system in raids(REWORKED/COMPLETED)
-Leechers in raids that do not fight all bosses do not get rewards(COMPLETED)
-Gladiator having a rank(COMPLETED)
![]()
-Theatre Of Blood(COMPLETED)
Brought to you by the maker of Tojad in the download's section with custom quickprayers, null packet handling crashes, etc...
Tojad.com
Coming out with this version of Tojad
I have only one thing in mind and that is precision
I have only one thing in mind and that is precision
efficiency and evolution of RSPS Gaming! At the moment
the game is at its beginning stages! I have done a lot of work plethora
of work with memory leaks and a plethora of errors to make the game
operate faster ALL UPDATED My main goal in mind is to evolve the game
the game is at its beginning stages! I have done a lot of work plethora
of work with memory leaks and a plethora of errors to make the game
operate faster ALL UPDATED My main goal in mind is to evolve the game
UPDATES
ARE ONLY THE
VERY BEGINNING
- MEMORY LEAKS/ERRORS (FIXED/COMPLETED)
- RAIDS (FIXED/COMPLETED)
- GRAND EXCHANGE (FULLY REWORKED/IMPLEMENTED GRAND EXCHANGE SYSTEM/VOTE/HISCORES/STORE)
- MINOR CHANGES(FIXED/COMPLETED)
-Fixed minor bugs in website/server(FIXED)
-FIXED running through the wall in edgeville bank(FIXED)
-Rewards system in raids(REWORKED/COMPLETED)
-Leechers in raids that do not fight all bosses do not get rewards(COMPLETED)
-Gladiator having a rank(COMPLETED)
-Theatre Of Blood(COMPLETED)
Theatre Of Blood
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Credits: 10% - PI
25% - DT
65% - TJ
All Theatre Of Blood Bosses

Chambers Of Xeric
Credits: 10% - PI
25% - DT
65% - TJ
↧
[317] Text to Json
Hello R-S,
I was wondering if there are any actual guides / tutorials on R-S that would help me understand and change the way my player files are being saved.
Currently they're being saved as .txt files, I would like them to be saved as a .json file (looks cleaner imo).
Any tips, help, etc would be greatly appreciated. :)
I was wondering if there are any actual guides / tutorials on R-S that would help me understand and change the way my player files are being saved.
Currently they're being saved as .txt files, I would like them to be saved as a .json file (looks cleaner imo).
Any tips, help, etc would be greatly appreciated. :)
↧
Searching for someone (Payed)
Hi there,
I'm looking for a coder for my server to add auto donate and auto vote in my rsps (Ruse-Base) and website ofcours, you get paid for it, if youre interested leave your skype below or give me a pm or add me on skype (live:rickdekker2000 or rickdekker2000@hotmail.com)
Thanks for the time
Rick
I'm looking for a coder for my server to add auto donate and auto vote in my rsps (Ruse-Base) and website ofcours, you get paid for it, if youre interested leave your skype below or give me a pm or add me on skype (live:rickdekker2000 or rickdekker2000@hotmail.com)
Thanks for the time
Rick
↧
↧
Error: loaderror Unpacking config 86
I get the error shown in the title after repacking 4 of my indexes in the cache.
I also get these:
Error unrecognised seq config code: A bunch of numbers.
I am on Elvarg base learning to code, but this is preventing me from logging into the game ^^
Thanks in advance.
I finally fixed that and now I get: java.lang.ArrayIndexOutOfBoundsException: 1033696.
anyone has the solution?
I also get these:
Error unrecognised seq config code: A bunch of numbers.
I am on Elvarg base learning to code, but this is preventing me from logging into the game ^^
Thanks in advance.
I finally fixed that and now I get: java.lang.ArrayIndexOutOfBoundsException: 1033696.
anyone has the solution?
↧
[718] SiriusX 718 RSPS | Join now | New Server 2019
Discord : https://discord.gg/VnXW8e
Website : https://siriusxrsps.org/home under construction
SiriusX 718 is a returning PRE - EOC private server!
We have alot of features to offer, developing alot with a good group of coders and developers to give you the ultimate PRE-EOC feeling.
For now there are daily updates and we are trying our best to make this server so enjoyable as possible!
Its a server brought into a new life because SiriusX ended in 2015. My community enjoyed it so much that we brought it back and we will try to make it fit the 2019 standards.
We includes RS3 items and OSRS items aswell.
We have a variety of gameplay to offer so if you enjoyed 718 or if you want to try something special please join our discord and take a moment to feel the vibes of the server.
While we are still doing some updates the server is running and its 99% of the time online :)
![]()
Website : https://siriusxrsps.org/home under construction
SiriusX 718 is a returning PRE - EOC private server!
We have alot of features to offer, developing alot with a good group of coders and developers to give you the ultimate PRE-EOC feeling.
For now there are daily updates and we are trying our best to make this server so enjoyable as possible!
Its a server brought into a new life because SiriusX ended in 2015. My community enjoyed it so much that we brought it back and we will try to make it fit the 2019 standards.
We includes RS3 items and OSRS items aswell.
We have a variety of gameplay to offer so if you enjoyed 718 or if you want to try something special please join our discord and take a moment to feel the vibes of the server.
While we are still doing some updates the server is running and its 99% of the time online :)

↧
[317] Added ferocious gloves from OSRS, but no stats show?
Hello, I added ferocious gloves (Item: 22981)
but when I added the item stats to the item.cfg for some reason still no stats show?
https://imgur.com/a/AGdUsQa
https://imgur.com/a/cjnTesa
I also added it to itemdefinitions.json
https://ibb.co/FJy3Br6
any idea whats goin on it? why its still not showing stats?
but when I added the item stats to the item.cfg for some reason still no stats show?
https://imgur.com/a/AGdUsQa
https://imgur.com/a/cjnTesa
I also added it to itemdefinitions.json
https://ibb.co/FJy3Br6
any idea whats goin on it? why its still not showing stats?
↧
[317] [RUSE] Problem with drop view interface
Hey I got a problem with this drop view interface. The right amount of items are totally wrong and I can't seem to find where the problem may occur.
![]()
As you see, some of the items are displaying correctly but not all.
Code client sided:
Code server sided:
Any help would be greatly appreciated :)
EDIT:
Fixed it. Replaced this:
public PacketSender sendItemOnInterface(int frame, int item, int slot, int amount) {
PacketBuilder out = new PacketBuilder(34, PacketType.SHORT);
out.putShort(frame);
out.put(slot);
out.putShort(item + 1);
if (amount > 254) {
out.put(255);
out.putShort(amount);
} else {
out.put(amount);
}
player.getSession().queueMessage(out);
return this;
}
with this:
public PacketSender sendItemOnInterface(int frame, int item, int slot, int amount) {
PacketBuilder out = new PacketBuilder(34, PacketType.SHORT);
out.putShort(frame);
out.put(slot);
out.putShort(item + 1);
if (amount > 254) {
out.put(255);
out.putInt(amount);
} else {
out.put(amount);
}
player.getSession().queueMessage(out);
return this;
}
Mod can close thread.

As you see, some of the items are displaying correctly but not all.
Code client sided:
Code:
public static void OsDropViewer(TextDrawingArea[] tda) {
RSInterface tab = addInterface(33000);
addSpriteLoader(33001, 1079);
addHoverButtonWSpriteLoader(33002, 1075, 21, 21,"Close", 0, 33003, 1);
addHoveredImageWSpriteLoader(33003, 1076, 21, 21, 33004);
addText(33005, "Drops Viewer", tda, 2, 0xFFA500, true, true);
int x = 7, y = 7;
tab.totalChildren(7);
tab.child(0, 33001, 0+x, 0+y);
tab.child(1, 33002, 472+x, 7+y);
tab.child(2, 33003, 472+x, 7+y);
tab.child(3, 33005, 250+x, 11+y);
tab.child(4, 33006, 8+x, 41+y);
tab.child(5, 34000, 150+x, 35+y);
tab.child(6, 33007, 6+x, 58+y);
final RSInterface results = addInterface(33007);
results.width = 122;
results.height = 258;
results.scrollMax = 300;
results.totalChildren(100);
for (int j = 0; j < 100; j++) {
addClickableText(33008 + j, "", "View Drops", tda, 0, 0xff0000, false, true, 110);
results.child(j, 33008 + j, 3, 2 + (j*14));
}
RSInterface main = addInterface(34000);
main.totalChildren(720);
main.width = 328;
main.height = 281;
main.scrollMax = 2560;
addSpriteLoader(34001, 1077);
addSpriteLoader(34002, 1078);
for(int i = 0; i < 40; i++) {
main.child(i, 34001, 0, (i * 64));
main.child(i + 40, 34002, 0, 32 + (i * 64));
}
addText(34003, "Amount:", tda, 0, 0xff9040, true, true);
addText(34004, "Chance:", tda, 0, 0xff9040, true, true);
addText(34005, "Value:", tda, 0, 0xff9040, true, true);
for (int i = 0; i < 80; i++) {
//itemGroup(34010 + i, 1, 1, 1, 1, false, false);
itemGroup(34010 + i, 1, 1, 1, 1);
interfaceCache[34010 + i].inv[0] = 14485;
interfaceCache[34010 + i].invStackSizes[0] = 1;
addText(34100 + i, "Name", tda, 1, 0xFFA500, false, true);
addText(34200 + i, "Amount", tda, 0, 0xffffff, true, true);
addText(34300 + i, "Chance", tda, 0, 0xffffff, true, true);
addText(34400 + i, "Value", tda, 0, 0xffffff, true, true);
int yy = (i * 32);
main.child(80+i, 34010+i, 1, 0+yy);
main.child(160+i, 34100+i, 39, 6+yy);
main.child(240+i, 34003, 175, 2+yy);
main.child(320+i, 34004, 234, 2+yy);
main.child(400+i, 34005, 293, 2+yy);
main.child(480+i, 34200+i, 175, 14+yy);
main.child(560+i, 34300+i, 234, 14+yy);
main.child(640+i, 34400+i, 293, 14+yy);
}
addClickableText(33006, "@whi@Search for an NPC", "Search", tda, 0, 0xff0000, 134, 10);
}
Code:
public static void buildRightSide(Player player, int npcId) {
player.getPacketSender().sendString(SEARCHED_STRING, "@whi@"+NpcDefinition.forId(npcId).getName()); //Search button
player.getPacketSender().sendString(STRING_AMOUNT, "Amount:");
player.getPacketSender().sendString(STRING_CHANCE, "Chance:");
player.getPacketSender().sendString(STRING_VALUE, "Value:");
for (int i = 0; i < 80; i++) {
if (i > NPCDrops.forId(npcId).getDropList().length-1) {
//System.out.println("Sending blank on "+i);
player.getPacketSender().sendItemOnInterface(ITEM_MODEL+i, -1, 0, 1); //remove all item models
player.getPacketSender().sendString(ITEM_NAME+i, ""); //remove all item names
player.getPacketSender().sendString(ITEM_AMOUNT+i, "");
player.getPacketSender().sendString(ITEM_CHANCE+i, "");
player.getPacketSender().sendString(ITEM_VALUE+i, "");
} else {
Item item = NPCDrops.forId(npcId).getDropList()[i].getItem();
if (item.getDefinition() == null) {
continue;
}
int amount = item.getAmount();
int chance = NPCDrops.forId(npcId).getDropList()[i].getChance().getRandom();
player.getPacketSender().sendItemOnInterface(ITEM_MODEL+i, item.getId(), 0, amount); //remove all item models
player.getPacketSender().sendString(ITEM_NAME+i, item.getDefinition().getName()); //remove all item names
player.getPacketSender().sendString(ITEM_AMOUNT+i, item.getAmount()+"");
player.getPacketSender().sendString(ITEM_CHANCE+i, "1/"+(chance == 0 ? "1" : chance));
player.getPacketSender().sendString(ITEM_VALUE+i, Misc.format(amount*item.getDefinition().getValue())+"");
}
}
}
EDIT:
Fixed it. Replaced this:
Quote:
public PacketSender sendItemOnInterface(int frame, int item, int slot, int amount) {
PacketBuilder out = new PacketBuilder(34, PacketType.SHORT);
out.putShort(frame);
out.put(slot);
out.putShort(item + 1);
if (amount > 254) {
out.put(255);
out.putShort(amount);
} else {
out.put(amount);
}
player.getSession().queueMessage(out);
return this;
}
Quote:
public PacketSender sendItemOnInterface(int frame, int item, int slot, int amount) {
PacketBuilder out = new PacketBuilder(34, PacketType.SHORT);
out.putShort(frame);
out.put(slot);
out.putShort(item + 1);
if (amount > 254) {
out.put(255);
out.putInt(amount);
} else {
out.put(amount);
}
player.getSession().queueMessage(out);
return this;
}
↧
↧
Part 2/4 tattoo
Pain was a lot easier this time, the sorest was the opposite side of the elbow.
https://imgur.com/gallery/OgHEqIx
https://imgur.com/gallery/OgHEqIx
↧
718 /8xx refactored matrix client, source code
Hi,
Looking to buy an (ideally) fully refactored/functional 718/8xx client. No jars, need the source code.
Maybe interested in a 718/887 perfectly packed cache as well.
Please pm me if you'd be interested.
Thanks.
Looking to buy an (ideally) fully refactored/functional 718/8xx client. No jars, need the source code.
Maybe interested in a 718/887 perfectly packed cache as well.
Please pm me if you'd be interested.
Thanks.
↧
User title
<span style="background: url(https://i.imgur.com/Q5arH.gif);color: #72025e;font-weight:bold;text-shadow: 0px 0px 10px #000000;">Skotos Founder</span>
↧
User title
<span style="background: url(https://i.imgur.com/Q5arH.gif);color: #72025e;font-weight:bold;text-shadow: 0px 0px 10px #000000;">BIG OOF</span>
↧
↧
[OSRS] AdaptivePS ~ The new wave

Spoiler for Media:
Giving away 5-10 donator ranks to the people who are seen most active on server!
So what are you waiting for? Join now! AdaptivePS.xyz
↧
Simba Scripts
I am selling simba bot scripts for different servers. You may find them below
SpawnPK
SpawnScape
I can accept the following payment methods:
By purchasing from me, you agree too the following:
You can contact me on WhatsApp or Discord
I can make custom scripts for the server off your choice and the price will be agreed on beforehand, payment required beforehand - I'm not wasting a couple hours making a script for anyone to decide they no longer want it.
LOOKED AT DO NOT SELL LIST AND NOTHING AGAINST - REMOVE IT NOT ALLOWED
SpawnPK
Code:
Stall theiver - $10
Undead Pker killer - $10
Rogue Chest Looter - $15
Demonic Gorrila Killer - $15
Mage Arene Killer - $15
Donator Zone NPC Killer - $15
V.I.P Spawner Killer - $20
Tekton Killer - $20
Corp Killer - $20
Raid Farm - $35
Code:
Rev killer(loots, teles when attacked by player, supports custom preset) $12.50
Code:
- Paypal(Friends and Family only)
- Bitcoin
- Circle Pay
- Bank Transfer for UK Only
- 07 Gold
- Cash App
Code:
- You are buying the script, I can give a rundown on how to run the script if needed but this isn't compulsory on my end
- You are not to release or re-sell the script too anyone
- If you find any bugs with the scripts I will fix them for free, however you'll need to give me some time
- If you modify the script and break it, I will not provide another copy for free. There will be a small fee
- All payments are final and non-refundable
Code:
WhatsApp - +44 7717 121349
Discord - Zee#3264
LOOKED AT DO NOT SELL LIST AND NOTHING AGAINST - REMOVE IT NOT ALLOWED
↧
[OSRS] - #180: Everrain, an Oldschool Emulation
Everrain
For such a long time I have wanted to start an Oldschool emulation project using a Deob.
There are far too many "OSRS" servers which are in fact 317's loading outdated OSRS data.
Everrain aims to emulate your Oldschool RuneScape experience with a twist. We are currently writing a variety of content, starting off with the basics; skills and combat.
I will gradually be updating this thread with media and updates, stay tuned!
Media
Cooking

Mining

Fishing

Team
Credits
↧
hifps
Hopping Islands: From Java to Kotlin Part 4
This series is aimed at existing Java developers that might feel tempted to switch over.
The goal of this series is to introduce Kotlin as a language you can use in tandem with Java, or even as a complete replacement.
Across the series, I will be covering a multitude of topics (usually with a few topics per part) on the benefits of using Kotlin over Java.
Here are the topics I have picked out for part 4:
Generics
What are generics, you might ask?
Generics are a compiler feature that give an easy way to provide functions that are applicable to multiple types of objects within user given bounds without any extra cost at runtime
Basically, everything except for primitive number types (byte char short int long float and double) is an
But the compiler (and IDE) can analyze your code to see if it meets certain criteria, and it allows you to do extra stuff with that information.
Say I wanted to make a function in Java that only takes a
First, here's
Here's how you would define a function that makes all subspecies of the
This will bark all the sub species of in the list.
You will notice the
The
You can use any (valid identifier) name you want to, even cAt.
The
Thats how you know that
Okay, if you didn't really understand generics, you should get the gist of it.
As a small note, you cannot access the generic type information at runtime, as everything is actually an
Now, on to kotlin's generics!
Well, for the most part they are the same.
Here's what the dogs would look like in Kotlin!
Now here's what the function in kotlin would look like as an extension function:
Not too remarkable, eh?
Hold your horses, Kotlin has an extra level to generics.
With generics in Java, all type information is erased at runtime.
This means that you dont really know what anything actually is, and the compiler cannot guarantee that some casts will work.
Kotlin has a solution. Reified generics.
Reified generics open some possibilities previously not possible in Java, such as the compiler guaranteeing type information is available inside a function.
The caveat to this is that if you want to reify a generic type, you MUST inline the function and you MUST say so.
Here is an example case of where you can not use regular generics and must use reified generics.
Weird, looks like it should work. Add 2 words, and it will!
This can be used for other things as well, such as getting the type of something put in to the function.
Your imagination (and the feature set of the JVM) is the only limiting factor!
Contracts
Contracts in kotlin are a way for you to programatically tell the compiler what you say is going to happen.
It will take your word for it, despite what you actually do with the information you are putting under contract!
Here's an example of where contracts are be useful. Say I want to create a function that takes a lambda, a lambda which I know will only run once.
I know it will only run once, so I should be able to initialize a
that was declared outside of the lambda, right?
Well, let's try it out.
Eek, it gives us an error:
That's unfair. The standard library has functions like
Well, good news. You can too! Contracts to the rescue!
Contracts are quite basic for now, but they do allow for some good functionality.
There are some rules to contracts:
So here's what a contract looks like
This is the definition of a contract that claims
Okay, so let's put that at the beginning of our function and see what happens.
NOTE: AS OF THIS POST, CONTRACTS ARE EXPERIMENTAL IN KOTLIN AND YOU MUST EXPLICITLY ENABLE THEM BEFORE THEY WORK!
No error! And it works! But what if I run it twice... Hehehehe
Well, it will run twice. But you shouldn't abuse contracts for reasons that should be obvious if other people are going to read your code.
Inline classes
NOTE: AS OF THIS POST, INLINE CLASSES ARE EXPERIMENTAL IN KOTLIN AND YOU MUST EXPLICITLY ENABLE THEM BEFORE THEY WORK!
Inline classes are a really neat feature in Kotlin.
Normally, only primitive classes get optimized heavily during runtime, but wrapper classes like Java's
Inline classes allow you to bypass this boxing problem in some cases.
However, inline classes have a few restrictions:
Now, how do you create an inline class? It's a mystical art they don't teach you in Java school.
Extreme stuff, I'm not sure if you're ready... But, if you're confident enough to write that, let's keep trudging on!
Now, here are the benefits of inline classes:
This allows you to get a performance uplift when using them in the underlying type use case
Example: Inline classes are currently being used in the standard library to implement unsigned primitives in Kotlin!
Another example, this time a bit more visual:
That's all for this post. Hope you learned something and are more inclined to start using Kotlin!
The menu for part 5:
This series is aimed at existing Java developers that might feel tempted to switch over.
The goal of this series is to introduce Kotlin as a language you can use in tandem with Java, or even as a complete replacement.
Across the series, I will be covering a multitude of topics (usually with a few topics per part) on the benefits of using Kotlin over Java.
Here are the topics I have picked out for part 4:
- Generics
- Contracts
- Inline Classes
Generics
What are generics, you might ask?
Generics are a compiler feature that give an easy way to provide functions that are applicable to multiple types of objects within user given bounds without any extra cost at runtime
Basically, everything except for primitive number types (byte char short int long float and double) is an
Object
. But the compiler (and IDE) can analyze your code to see if it meets certain criteria, and it allows you to do extra stuff with that information.
Say I wanted to make a function in Java that only takes a
List
of things that are a subclass of type Dog
and make every Dog
in the List<Dog>
Bark.First, here's
Dog
Code:
public abstract class Dog {
final String dogBreed;
final String barkSound;
Dog(String dogBreed, String barkSound) {
this.dogBreed = dogBreed;
this.barkSound = barkSound;
}
void bark()
}
Dog
species T
in a List
bark.Code:
public static <T extends Dog> void barkDogs(List<T> dogList) {
dogList.forEach(T::bark);
}
You will notice the
<T extends Dog>
in the function definition.The
T
is just the name you are giving to that generic type in that function.You can use any (valid identifier) name you want to, even cAt.
The
<T extends Dog>
tells the compiler to make sure that any time T
is used, it is actually a subclass of Dog
.Thats how you know that
T
has the bark
function, is because it is a species of .Okay, if you didn't really understand generics, you should get the gist of it.
As a small note, you cannot access the generic type information at runtime, as everything is actually an
Object
!Now, on to kotlin's generics!
Well, for the most part they are the same.
Here's what the dogs would look like in Kotlin!
Code:
abstract class Dog(val dogBreed: String, val barkSound: String) {
fun bark() = println("$dogBreed says: $barkSound! Good dog!")
}
Code:
fun <T: Dog> List<T>.barkAllDogs() = forEach(T::bark)
Hold your horses, Kotlin has an extra level to generics.
With generics in Java, all type information is erased at runtime.
This means that you dont really know what anything actually is, and the compiler cannot guarantee that some casts will work.
Kotlin has a solution. Reified generics.
Reified generics open some possibilities previously not possible in Java, such as the compiler guaranteeing type information is available inside a function.
The caveat to this is that if you want to reify a generic type, you MUST inline the function and you MUST say so.
Here is an example case of where you can not use regular generics and must use reified generics.
Code:
fun <T> List<T>.filterToArray(predicate: (T) -> Boolean) =
with(filter(predicate)) { // Now in context of the filtered list
Array<T>(this.size, ::get) // Cannot use 'T' as reified type parameter. Use a class instead.
}
Code:
inline fun <reified T> List<T>.filterToArray(predicate: (T) -> Boolean) =
with(filter(predicate)) { // Now in context of the filtered list
Array<T>(this.size, ::get) // Ding ding!
}
Your imagination (and the feature set of the JVM) is the only limiting factor!
Contracts
Contracts in kotlin are a way for you to programatically tell the compiler what you say is going to happen.
It will take your word for it, despite what you actually do with the information you are putting under contract!
Here's an example of where contracts are be useful. Say I want to create a function that takes a lambda, a lambda which I know will only run once.
I know it will only run once, so I should be able to initialize a
val
that was declared outside of the lambda, right?
Well, let's try it out.
Code:
fun doThingOnce(lambda: () -> Unit) = lambda()
fun main() {
val name: String
doThingOnce { name = "My name" }
}
Captured values initialization is forbidden due to possible reassignment.
That's unfair. The standard library has functions like
run
that can do what I want my function to do!Well, good news. You can too! Contracts to the rescue!
Contracts are quite basic for now, but they do allow for some good functionality.
There are some rules to contracts:
- The first line of a function with a contract must be the contract
- Actually there's just 1 concrete rule, I just like lists.
So here's what a contract looks like
Code:
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block
will run exactly once.Okay, so let's put that at the beginning of our function and see what happens.
NOTE: AS OF THIS POST, CONTRACTS ARE EXPERIMENTAL IN KOTLIN AND YOU MUST EXPLICITLY ENABLE THEM BEFORE THEY WORK!
Code:
fun doThingOnce(lambda: () -> Unit) {
contract {
callsInPlace(lambda, InvocationKind.EXACTLY_ONCE)
}
lambda()
}
fun main() {
var name: String
doThingOnce { name = "My name" }
}
Well, it will run twice. But you shouldn't abuse contracts for reasons that should be obvious if other people are going to read your code.
Inline classes
NOTE: AS OF THIS POST, INLINE CLASSES ARE EXPERIMENTAL IN KOTLIN AND YOU MUST EXPLICITLY ENABLE THEM BEFORE THEY WORK!
Inline classes are a really neat feature in Kotlin.
Normally, only primitive classes get optimized heavily during runtime, but wrapper classes like Java's
Integer
don't get the same special treatment despite having nearly identical usage as it's primitive brother.Inline classes allow you to bypass this boxing problem in some cases.
However, inline classes have a few restrictions:
- An inline class cannot have an
init
block - An inline class can only have 1 primary constructor parameter, and it must be a
val
- Inline classes CAN have properties, but CANNOT have backing fields
- As such, Inline classes CANNOT have late initialized or delegated properties (coming soon to a HIFJTK near you)
Now, how do you create an inline class? It's a mystical art they don't teach you in Java school.
Code:
inline class InlineClassName(val underlyingValue: ClassType)
Now, here are the benefits of inline classes:
- They CAN inherit from interfaces
- They CAN be used where the inherited interfaces are used
- They get optimized as the underlying type ONLY WHEN USED AS THE UNDERLYING TYPE
This allows you to get a performance uplift when using them in the underlying type use case
Example: Inline classes are currently being used in the standard library to implement unsigned primitives in Kotlin!
Another example, this time a bit more visual:
Code:
interface Colors {
val value: Int
val alpha: Int
get() = (value shr 24) and 0xFF
val red: Int
get() = (value shr 16) and 0xFF
val green: Int
get() = (value shr 8) and 0xFF
val blue: Int
get() = value and 0xFF
}
inline class ARGB(override val value: Int): Colors {
override fun toString(): String = "ARGB()"
}
// Used as Colors, not optimized as Int
fun printColors(colors: Colors) = with(colors) {
println("[$alpha, $red, $green, $blue]")
}
// Used as ARGB, optimized as Int. At runtime, this essentially becomes a function that takes an Int. Weird, right?
fun printArgb(argb: ARGB) = println(argb)
// Used as ARGB?, NOT optimized as Int, as it is essentially Int? (java Integer) at runtime.
fun argbIsNull(argb: ARGB?) = argb == null
// Used as T, NOT optimized as Int.
fun <T> genericFunction(genericValue: T) = println(genericValue)
fun main() {
val colorsRaw = ARGB(0x04143C09)
printColors(colorsRaw)
printArgb(colorsRaw)
print(argbIsNull(colorsRaw))
print(genericFunction(colorsRaw))
}
The menu for part 5:
- open class
- lateinit
- delegates
↧
↧
667 need help with delay... and item requirement to use teleport
Hey all, so im new to coding and instead of asking for help i would normally try work it out myself. so after a hell of testing i still cant work out what im doing wrong here.
so, i want a delay on this command to work in time with the gfx i have added but, its not dalaying the time from entering the command to finishing teleportation.
if (cmd[0].equalsIgnoreCase("dhome")) {
player.getControlerManager().startControler("DZ");
player.setNextGraphics(new Graphics(***));
player.addStopDelay(4);
player.setNextWorldTile(new WorldTile(****, ****, 0));
player.getPackets().sendGameMessage("<col=00ff00>T hanks for supporting The The Dark Temple");
return true;
}
The command works, but the 4 sec delay inst working. (yes **** are numbers, just changed them for this)
Also, im trying to set a item needed/requirement for a teleport. i dont know what im doing wrong but this is the thing i made but it just wouldn't teleport however take away the item requirement and the portal works. sorry if its sloppy, like i said im just trying, testing and learning .
Thank you in advance
so, i want a delay on this command to work in time with the gfx i have added but, its not dalaying the time from entering the command to finishing teleportation.
if (cmd[0].equalsIgnoreCase("dhome")) {
player.getControlerManager().startControler("DZ");
player.setNextGraphics(new Graphics(***));
player.addStopDelay(4);
player.setNextWorldTile(new WorldTile(****, ****, 0));
player.getPackets().sendGameMessage("<col=00ff00>T hanks for supporting The The Dark Temple");
return true;
}
The command works, but the 4 sec delay inst working. (yes **** are numbers, just changed them for this)
Also, im trying to set a item needed/requirement for a teleport. i dont know what im doing wrong but this is the thing i made but it just wouldn't teleport however take away the item requirement and the portal works. sorry if its sloppy, like i said im just trying, testing and learning .
Spoiler for scrip:
Thank you in advance
↧
[377] VanillaRS - A RuneScape 2006 Emulation
VanillaRS
Disclaimer
For all intentions and purposes this is a hobby project,
used for my own personal learning experience, whether I will ever host this or release it in the rs2-download section,
is unknown. I initially started out with a 317 client loading 319 cache (317 cache no exist :C) but later decided to convert it
to a 377 server, so the server is now officially a 377 server. 377 was released sometime mid-2006.
The framework is written from scratch however credits should be given where credits are due; I thank Major for sharing
all the 377 server -> client packets and Licker for releasing his refactored 377 client. And all the people on discord 4 helping out
whenever I ask questions regarding rsps shit.
I plan on emulating as much of the content from the 377 era as possible.
Obligatory Media
![]()
![]()
Disclaimer
For all intentions and purposes this is a hobby project,
used for my own personal learning experience, whether I will ever host this or release it in the rs2-download section,
is unknown. I initially started out with a 317 client loading 319 cache (317 cache no exist :C) but later decided to convert it
to a 377 server, so the server is now officially a 377 server. 377 was released sometime mid-2006.
The framework is written from scratch however credits should be given where credits are due; I thank Major for sharing
all the 377 server -> client packets and Licker for releasing his refactored 377 client. And all the people on discord 4 helping out
whenever I ask questions regarding rsps shit.
I plan on emulating as much of the content from the 377 era as possible.
Obligatory Media


↧
667 need help with delay... and item requirement to use teleport
Hey all, so im new to coding and instead of asking for help i would normally try work it out myself. so after a hell of testing i still cant work out what im doing wrong here.
so, i want a delay on this command to work in time with the gfx i have added but, its not dalaying the time from entering the command to finishing teleportation.
if (cmd[0].equalsIgnoreCase("dhome")) {
player.getControlerManager().startControler("DZ");
player.setNextGraphics(new Graphics(***));
player.addStopDelay(4);
player.setNextWorldTile(new WorldTile(****, ****, 0));
player.getPackets().sendGameMessage("<col=00ff00>T hanks for supporting The The Dark Temple");
return true;
}
The command works, but the 4 sec delay inst working. (yes **** are numbers, just changed them for this)
Also, im trying to set a item needed/requirement for a teleport. i dont know what im doing wrong but this is the thing i made but it just wouldn't teleport however take away the item requirement and the portal works. sorry if its sloppy, like i said im just trying, testing and learning .
Edit, i worked the second bit out, if anyone needs... put at around line 2781
Thank you in advance
so, i want a delay on this command to work in time with the gfx i have added but, its not dalaying the time from entering the command to finishing teleportation.
if (cmd[0].equalsIgnoreCase("dhome")) {
player.getControlerManager().startControler("DZ");
player.setNextGraphics(new Graphics(***));
player.addStopDelay(4);
player.setNextWorldTile(new WorldTile(****, ****, 0));
player.getPackets().sendGameMessage("<col=00ff00>T hanks for supporting The The Dark Temple");
return true;
}
The command works, but the 4 sec delay inst working. (yes **** are numbers, just changed them for this)
Also, im trying to set a item needed/requirement for a teleport. i dont know what im doing wrong but this is the thing i made but it just wouldn't teleport however take away the item requirement and the portal works. sorry if its sloppy, like i said im just trying, testing and learning .
Spoiler for scrip:
Edit, i worked the second bit out, if anyone needs... put at around line 2781
Spoiler for EDIT:
Thank you in advance
↧