greghib / void Goto Github PK
View Code? Open in Web Editor NEWLightweight 2011 RuneScape multiplayer server
License: BSD 3-Clause "New" or "Revised" License
Lightweight 2011 RuneScape multiplayer server
License: BSD 3-Clause "New" or "Revised" License
Scu11
i process clients in batches
so i serve 20 assets to one client, then move onto the next
readding my client to the end of the queue if i have more to request
i found that batching the requests helped with transfer times
the "Js5Client"s are in a kotlin Channel
i take the first one from the channel
process 20 of their requests
add them back to the channel if they still have more to request
rinse and repeat
Definition reading to check arguments are within bounds.
gameObject.size doesn't take rotation into account.
The calculation on whether to flip width and height is:
val flip = rotation and 0x1 == 1
Watch out for existing usages which already flip as they will conflict!
Super rare collectable items dropped by npcs, perhaps even pets?
Items are used in the skilling guides and construction interfaces but could be used as collectables.
Could also be expanded out to collectable paintings/maps (8285..8293)
Ids | Npcs |
---|---|
3241..3260 | Ardy npc heads |
4133..4149 | Slayer npc bodies |
4295, 4297 | Ham member heads |
4519..4521 | Lumb cellar slayer npc bodies |
4625 | Bandit head |
5068 | Master farmer head |
6063 | Spirit tree |
6105 | Elf |
6637 | Dark beast |
6661 | Mogre |
6695 | Desert lizard |
6709 | Fever spider |
6780 | Menaphite thug |
6781 | Bandit |
6782 | Bandit |
6811 | Skeletal wyvern |
7050 | Harpie bug swarm |
7420 | Mutated zygomite |
7499 Evil dave
7500 Dwarf
7501 Goblins
7502 Lumbridge sage
7503 Monkey
7504 Osman
7505 Pirate pete
7506 Sir amik varze
7507 Skrach
8131 Skeleton guard
8132 Guard dog
8133 Hobgoblin guard
8134 Baby red dragon
8135 Huge spider
8136 Troll guard
8137 Hellhound
8138 Demon
8139 Kalphite soldier
8140 Tok-xil
8141 Dagannoth
8142 Steel dragon
9952 Imp
9953 Kebbit
9954 Kebbit
9955 Kebbit
9956 Kebbit
9957 Kebbit
9958 Kebbit
9959 Kebbit
9960 Kebbit
9961 Kebbit
9962 Kebbit
9963 Kebbit
9964 Kebbit
9965 Crimson swift
9966 Copper longtail
9967 Cerulean twitch
9968 Golden warbler
9969 Tropical wagtail
9970 Butterfly
9971 Butterfly
9972 Butterfly
9973 Butterfly
9974 Giant eagle
9975 Rabbit
10591 Terror dog
10997 Molanisk
10998 Cave goblin
11047 Brine rat
11062 Zanik (slice)
14626 Phoenix eggling
14627 Phoenix eggling
14651 Abyssal minion
14652 Creeping hand
14653 Minitrice
14654 Baby basilisk
14655 Baby kurask
14656 Abyssal minion
14657 Creeping hand
14658 Minitrice
14659 Baby basilisk
14660 Baby kurask
14668 Captain undak
14669 Zanik
14670 Zanik
14741 Erjolf
14817 Leela
15498 Desert strykewyrm
15499 Jungle strykewyrm
15500 Ice strykewyrm
18791 Pit dog
18792 Pit ogre
18793 Pit rock protector
18794 Pit scabarite
18795 Pit black demon
18796 Pit iron dragon
Restructure yml config loaders and models to be able to be cleared and reloaded while the game is running. Throwing errors/sending the player a message if the format isn't valid
Api information located at https://discordapp.com/developers/docs/resources/guild
Existing content that could easily be repurposed as custom content
Bugs:
Enhancements:
Npcs should be hidden, moved and frozen to a random spot (in their spawn area) until respawn when they're made visible and unfrozen
Check if there is a way of identifying which movement types NPC's are:
e.g Walk/Fly/Swim & whether they don't collide with other entities
Visual encoding can be entirely event-driven removing one entire entity iteration loop, just hand off to another context (which updating should execute in after?)
Change to single visuals class for players and npcs
Individual visual encoders rather than force npcs and players to share
Both the lobby and game servers are connected from the player's client. The lobby server is a world full of players, and so is the game world. The possibility of what is interactable is just different.
Information the player might want to know or track. All should have timestamps (and maybe tile loc?)
Time spent on each skill
Trees cut
Fish caught
Logs burnt
Food cooked
Food burnt
Ores mined
Bars smelted
Items smithed
Successful pickpockets
Failed pickpockets
Allotments harvested
Compost used
Crops died
Items fletched
Items crafted
Runes crafted
Potions brewed
Potions used
File-server shouldn't be apart of the game server as it will effect players if they can't get required files because the game-server is updating.
Consequences if the game server is updating
Doors which are open by default can't be closed.
Player.hasFriend(other)
% double rewards
% increased speed
% increased success rate
% item not consumed (preserve?)
Doing the same thing repeatedly improves efficiency (e.g fletching the same item over and over)
Skillcape for 99, (t) for 200m xp
A system to store/calculate effective attack, strength, defence bonuses used in the combat calculations.
Need to be modifiable by multipliers (prayers, void, effects etc..) and amounts (for attack style)
Should all containers be saved?
Depends on answers for personalised shops #137
If not then will need to be able to distinguish saved containers from unsaved ones.
See if there's a way of identifying what stack type a container is using cache data.
If not implement a system which stores additional container details.
Being able to tag entities with useful identifiers for easy filtering
E.g "Guilded Altar" object has "prayer altar" tag
Things that can be tagged:
entity.tag("name")
entity.tagged("name")
class TagSystem {
val staticTags: Map<Entity, Set<String>>
val dynamicTags: Map<Entity, Map<Entity, Set<String>>>
fun Entity.tag(target: Entity, tag: String) {
dynamicTags[target][this] = tag
}
fun Entity.tagged(target: Entity, tag: String) {
val tags = dynamicTags[target][this]
If(tags.contains(tag))
Return true
Tags = staticTags[target]
If tags contains tag
Return true
Return false
}
fun clearTags(entity: Entity) {
dynamicTags.remove(entity)
}
}
Current usages of ids need to be converted
Support walking to and picking up table items (partial pathfinding check before option selection)
Players typically expect the ability to wield all items shortly after joining, with high xp rates or cheap items. Giving a balance of 90% of content accessible straight away and 10% needing to be obtained through boss drop. There's a number of issues with that:
Players need the "what's next" to keep playing.
Low exp rates - Server lasts longer, lots of players don't like
Multiple game-modes/prestiging - overdone, bad attempt at re-playability, would need more variation between modes/prestiges to keep the game fresh. Lots of pre-conseived opinions about "x10, x25, x100".
Custom xp curve - Haven't seen done a lot, would give a new feel to the game, could make it much flatter of a curve, maybe make lvl 75/80 half way between 0-99 instead of 92.
Linking achievements with equipment requirements would limit how quickly players progress, gives players a new challenge to obtain amours (instead of typical, rock crabs for 10 mins), changing up what items other players are seen using (max cape player using mith to get achievements for comp cape), and giving a better sense of achievement to players for wearing armour.
Whatever the solution there is going to be a sub-group of players which won't like it and call it stupid that they don't get everything they want easily. I think we should categorise these players as "spoiled babies" and the response to them should always be; tough it's better for everyone.
The current events for a player are just a crazy mess that needs tidying up. They exist because of necessary login/out timing so watch out when refactoring.
Login
RegionLogin
PlayerRegistered
Player#start()
Registered
PlayerSpawn
Logout
Unregistered
PlayerDespawn
Weapon and beastiary data
The tutorial should be engaging and meaningful. A player must be given decisions and feel as if they have concequences.
Example the knight in shining armour trope:
Someone's in trouble, their health decreasing (dungeoneering head menu's/health bar would be great for this), the player must help them otherwise they die (after 2 minutes, show the death animation and replace the npc with a skeleton obj & ghost npc). As a concequence they must go get a ghost speak amulet to continue.
Might be good to have a non-combat way of completing the quest to include skillers (ofc no xp given anyway, but some people don't like combat)
How to handle tutorials without being boring
The not so simple secrets to making good tutorials
Using skeletons to cross-reference animations with npcs/players
Then can use graphics and animations to cross-reference each other for overlaps
A lot of content actually comprises of basic repeatable operations/instructions which could be stored as configuration.
RSPS typically at best manage with a tonne of enumerated "handlers", and at worse one gigantic class of functions. However this data is static during gameplay so there is the option for it to be stored as configuration.
Examples for usage include:
Pros:
Cons:
See Bytecode for implementation ideas. Very similar to the opcode style of cache definitions.
As much content as possible should have in-game hiscores.
Whether that's number of npc kills, most high value loots, fastest kills, highest score in a minigame.
Ties in with adventures log.
Keeping hiscores in-game will be much easier than having them all online too. It's better the game is the social hub, not the website.
As mentioned in dusk-rs/dusk#88 (comment) players are familiar with multiple game-modes where they can choose an exp-multiplier.
The average player will stick to a reasonably high Exp rate (100x+) when given the choice. However, it's known that typically the lower the exp rate, the longer the server will last.
The consequences of game-modes are:
Given the opportunity, players will optimize the fun out of a game.
RS has a near-exponential curve where level 92 experience wise is halfway between 0-99.
It's important it's advertised and explained as a "custom levelling curve". "Lower rates + easier skills = less grinding"
Maybe ironman game-modes, maybe iron-man minigames?
Friends
Ignores
Clan chat
First Time User Experience (FTUE) should have as few blockers as possible to get in-game.
Best practices for a successful FTUE
Relates to #105
There are probably other exceptions too.
Runescape (osrs and rs2 more than rs3) uses very rigid design and rsps almost entirely emulates this rigidness. There's the opportunity to go above and beyond how Runescape works and improve upon certain areas. This no doubt is very different from how things are traditionally done, and what players expect from a private server. However players also find the scene stale, you can't have it both ways. We'll have to decide on what balance to strike between the two.
Rigid: Spawn cows in these exact coordinates every X ticks after death
Enhanced: Here's a cow field, spawn 18 cows in it but not near a player.
Rigid: Walk randomly every X ticks
Enhanced: An NPC will choose between behaviours which make sense for it. E.g a regular Man/Woman might go into a house, use the stove, go to a store, walk to the pub, go to a bank etc..
Rigid: If I'm X tiles away from my spawn point I won't walk any further and you can safe spot me from that distance
Enhanced: I'll stray slightly further than I should if the player isn't that much further away
Rigid: All shops are open always, it's non-stop daytime
Enhanced: Shops close at night, combat NPC's turn aggressive or respawn faster
Rigid: RS: Unfair, breaks rules, ruins economy RSPS: Actual players online; 200, Player count: 405!
Enhanced: It's a feature not a bug! Bots go around doing tasks like players; skills, minigames, pking. They make the game feel more active and alive, can be made to contribute to the economy by selling things to players, can be killed for loot, can assist players with skills and bosses, and they populate minigames when not enough real players are around to play.
Touched on this in #154
When a npc defeats you in battle they get stronger and drop better loot, when they loose multiple times over the loot get's worse.
Gorillas in ape atoll
Skeleton minions in dungeoneering
Barricades? - might be an object
Brawlers in pest control
tile.withinRange(otherTile, distance)
tile.distance(otherTile)
Used often, also doesn't really belong in Tile, better in 2d coordinates?
Index out of bounds exception -86
Class372.method4103 line 41
Traces back to Class91 line 262.
Related to movement & temporary movement type. Occured when entering a removed dynamic region.
Happened 3 times in a row and then wasn't able to replicate a 4th time to get any more info.
Could've been caused by incorrect data sent to another flag.
i.e interacting while standing on the same tile as Ivy or a Shelf won't turn to face the object because Player.face(tile)
uses delta which in that scenario is 0, 0. Will need an "override" method to calculate the direction for objects based on the object type and rotation.
Sky/Ignored types aren't correct/working as expected, needs fixing.
Visuals#addition
currently always includes appearance, however if a player is re-added the apperance update isn't necessary.
Would first have to track what players have/haven't been seen before. Which could be worked out using lastSeen?
Both of currency and items.
We should keep track of both amounts coming into (swells) and exiting the game (sinks) so we have the data to make informed decisions to better balance the game to prevent excessive inflation.
RSPS player expect a higher gold rate than rs, whatever we go with whether x10, x100 or x1000 it'll be intentionally inflated, but that doesn't mean we should let inflation beyond that point go out of control.
When a place reaches the level requirement it makes all prior items useless leaving all items except the few high level ones valueless. RS3 combated this with invention, removing junk items from the game saughtafter by players training the skill thus increasing their value (subsequently making low level players making better money).
There could also be some kind of minigame (thinking gun wars in COD) where the entry fee is one of each type of item in a category (e.g scimitars bronze-dragon) losers don't keep them and winner keeps theirs and the top one (dragon) from of all their defeated opponents.
Depends what is sold, selling direct gp isn't a good idea, most likely items, better to sell cosmetics and boosts (yell, xp, rewards)
See #151
When doing the above, loading please wait remains at 0%, takes absolute ages to login.
Some OSRS content is highly influenced by pre-eoc content and we need to decide on what type of server we will be. Are we going to be OSRS offered in RS2011 visuals? Or are we going to be a blend of both OSRS and RS2011, by picking and choosing what content we want?
For example, ragefire boots are equivalent to eternal boots. Should we replace the content in 667 with the content of OSRS? In this example, this would mean removing Glacors and adding Cerberus.
Low priority; not 100% necessary but for completionists sake. Didn't do with the others (#229) because it's significantly more interconnected with the interface system.
RuneScape follows the do skill
- get loot
- level up
core gameplay loop.
The problem with this is rsps players get fed up of repeating the same skills on different servers, and so it becomes grinding micro actions to get macro rewards. However once max level is reached, end-game content alone isn't enough to keep a player entertained and so end-game players become dependent on content-releases for entertainment.
RuneScape solves this in two ways:
Even with identical content to RS players would soon get bored.
Adding tweaks to existing skill mechanics to keep them fresh and interesting, while still familiar.
RSPS's tend to do these changes within the context of fixed game-modes. There's no reason a player couldn't pick-and-choose to create custom gamemodes.
Any changes should be clearly communicated to the player so they are not surprised.
Importance of a well defined core gameplay loop
Difference between random and randomized progression
How to break down game design
A xenforo-bridge can be used for this, or connection to the database as well.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.