mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-10 10:20:41 -07:00
Converted some of the management server to kotlin
Added json configs for management server Cleaned up some files
This commit is contained in:
parent
7f552a6890
commit
156ad07ae6
191 changed files with 820 additions and 2135 deletions
32
.gitignore
vendored
32
.gitignore
vendored
|
|
@ -3,3 +3,35 @@
|
|||
/Management-Server/build/tmp/
|
||||
/Management-Server/build/kotlin/
|
||||
/Management-Server/build/generated/
|
||||
/Client/build/
|
||||
/Client/build/classes/
|
||||
/Client/build/tmp/
|
||||
/Client/build/kotlin/
|
||||
/Client/build/generated/
|
||||
/Server/build/
|
||||
/Server/build/classes/
|
||||
/Server/build/tmp/
|
||||
/Server/build/kotlin/
|
||||
/Server/build/generated/
|
||||
/Server/data/eco/bot_offers.json
|
||||
**/.idea/workspace.xml
|
||||
**/.idea/tasks.xml
|
||||
Server/**/*.class
|
||||
CompiledServer/*
|
||||
CompiledServer/
|
||||
Server/gradle/
|
||||
Server/build/
|
||||
Server/.gradle/
|
||||
Client/gradle/
|
||||
Client/build/
|
||||
Client/.gradle/
|
||||
Management-Server/.gradle
|
||||
Management-Server/build/
|
||||
Management-Server/org/
|
||||
Server/data/eco/grand_exchange_db.emp
|
||||
Single-Player/*
|
||||
Single-Player/
|
||||
docker
|
||||
.gradle
|
||||
gradle
|
||||
.idea
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
ر<EFBFBD>امإU<EFBFBD>ّف<EFBFBD>ئ<EFBFBD>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
<EFBFBD>ノ
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,2 +0,0 @@
|
|||
58
|
||||
11
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
<EFBFBD>b
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,653 +0,0 @@
|
|||
org/runite/client/WorldListEntry.java
|
||||
org.runite.client.WorldListEntry
|
||||
org/runite/client/Class163.java
|
||||
org.runite.client.Class163
|
||||
org/runite/client/Class140_Sub3.java
|
||||
org.runite.client.Class140_Sub3
|
||||
org/runite/client/Class61.java
|
||||
org.runite.client.Class61
|
||||
org/runite/client/Class118_Sub1.java
|
||||
org.runite.client.Class118_Sub1
|
||||
org/runite/client/Class132.java
|
||||
org.runite.client.Class132
|
||||
org/runite/client/Class30.java
|
||||
org.runite.client.Class30
|
||||
org/runite/client/Class75.java
|
||||
org.runite.client.Class75
|
||||
org/runite/client/AnimationHeader.java
|
||||
org.runite.client.AnimationHeader
|
||||
org/runite/client/Class3_Sub13_Sub26.java
|
||||
org.runite.client.Class3_Sub13_Sub26
|
||||
org/runite/client/Class29.java
|
||||
org.runite.client.Class29
|
||||
org/runite/client/Class3_Sub28_Sub2.java
|
||||
org.runite.client.Class3_Sub28_Sub2
|
||||
org/runite/client/Class92.java
|
||||
org.runite.client.Class92
|
||||
org/runite/client/Class15.java
|
||||
org.runite.client.Class15
|
||||
org/runite/client/Bzip2Context.java
|
||||
org.runite.client.Bzip2Context
|
||||
org/runite/client/Class3_Sub13_Sub3.java
|
||||
org.runite.client.Class3_Sub13_Sub3
|
||||
org/runite/client/Class3_Sub24.java
|
||||
org.runite.client.Class3_Sub24
|
||||
org/runite/client/Class3_Sub3.java
|
||||
org.runite.client.Class3_Sub3
|
||||
org/runite/client/Class117.java
|
||||
org.runite.client.Class117
|
||||
org/runite/client/Class3_Sub13_Sub1.java
|
||||
org.runite.client.Class3_Sub13_Sub1
|
||||
org/runite/client/Class163_Sub2_Sub1.java
|
||||
org.runite.client.Class163_Sub2_Sub1
|
||||
org/runite/client/Class3_Sub10.java
|
||||
org.runite.client.Class3_Sub10
|
||||
org/runite/client/Class3_Sub13_Sub14.java
|
||||
org.runite.client.Class3_Sub13_Sub14
|
||||
org/runite/client/Class3_Sub1.java
|
||||
org.runite.client.Class3_Sub1
|
||||
org/runite/client/Class164_Sub2.java
|
||||
org.runite.client.Class164_Sub2
|
||||
org/runite/client/Class3_Sub13_Sub28.java
|
||||
org.runite.client.Class3_Sub13_Sub28
|
||||
org/runite/client/Class77.java
|
||||
org.runite.client.Class77
|
||||
org/runite/client/Class3_Sub13_Sub31.java
|
||||
org.runite.client.Class3_Sub13_Sub31
|
||||
org/runite/client/Class129.java
|
||||
org.runite.client.Class129
|
||||
org/runite/client/Class134.java
|
||||
org.runite.client.Class134
|
||||
org/runite/client/Js5Worker.java
|
||||
org.runite.client.Js5Worker
|
||||
org/runite/client/Class3_Sub13_Sub12.java
|
||||
org.runite.client.Class3_Sub13_Sub12
|
||||
org/runite/client/Class155_Sub2.java
|
||||
org.runite.client.Class155_Sub2
|
||||
org/runite/client/Class58.java
|
||||
org.runite.client.Class58
|
||||
org/runite/client/Class115.java
|
||||
org.runite.client.Class115
|
||||
org/runite/client/Class120.java
|
||||
org.runite.client.Class120
|
||||
org/runite/client/Class44.java
|
||||
org.runite.client.Class44
|
||||
org/runite/client/Interface1.java
|
||||
org.runite.client.Interface1
|
||||
org/runite/client/Class101.java
|
||||
org.runite.client.Class101
|
||||
org/runite/client/MouseListeningClass.java
|
||||
org.runite.client.MouseListeningClass
|
||||
org/runite/client/Class3_Sub13_Sub24.java
|
||||
org.runite.client.Class3_Sub13_Sub24
|
||||
org/runite/client/Class119.java
|
||||
org.runite.client.Class119
|
||||
org/runite/client/Class163_Sub1_Sub1.java
|
||||
org.runite.client.Class163_Sub1_Sub1
|
||||
org/runite/client/Class3_Sub12.java
|
||||
org.runite.client.Class3_Sub12
|
||||
org/runite/client/Class17.java
|
||||
org.runite.client.Class17
|
||||
org/runite/client/Class151_Sub1.java
|
||||
org.runite.client.Class151_Sub1
|
||||
org/runite/client/Class56.java
|
||||
org.runite.client.Class56
|
||||
org/runite/client/Class113.java
|
||||
org.runite.client.Class113
|
||||
org/runite/client/LinkableRSString.java
|
||||
org.runite.client.LinkableRSString
|
||||
org/runite/client/Class34.java
|
||||
org.runite.client.Class34
|
||||
org/runite/client/Class3_Sub13_Sub33.java
|
||||
org.runite.client.Class3_Sub13_Sub33
|
||||
org/runite/client/Class161.java
|
||||
org.runite.client.Class161
|
||||
org/runite/client/Translation.java
|
||||
org.runite.client.Translation
|
||||
org/runite/client/Class65.java
|
||||
org.runite.client.Class65
|
||||
org/runite/client/RandomAccessFileWrapper.java
|
||||
org.runite.client.RandomAccessFileWrapper
|
||||
org/runite/client/AssembledMethod.java
|
||||
org.runite.client.AssembledMethod
|
||||
org/runite/client/Class144.java
|
||||
org.runite.client.Class144
|
||||
org/runite/client/Class167.java
|
||||
org.runite.client.Class167
|
||||
org/runite/client/DataBuffer.java
|
||||
org.runite.client.DataBuffer
|
||||
org/runite/client/Class3_Sub19.java
|
||||
org.runite.client.Class3_Sub19
|
||||
org/runite/client/Class40.java
|
||||
org.runite.client.Class40
|
||||
org/runite/client/Class46.java
|
||||
org.runite.client.Class46
|
||||
org/runite/client/Class3_Sub28_Sub17_Sub2.java
|
||||
org.runite.client.Class3_Sub28_Sub17_Sub2
|
||||
org/runite/client/Interface3.java
|
||||
org.runite.client.Interface3
|
||||
org/runite/client/Class103.java
|
||||
org.runite.client.Class103
|
||||
org/runite/client/Class6.java
|
||||
org.runite.client.Class6
|
||||
org/runite/client/Class140_Sub7.java
|
||||
org.runite.client.Class140_Sub7
|
||||
org/runite/client/Class3_Sub24_Sub4.java
|
||||
org.runite.client.Class3_Sub24_Sub4
|
||||
org/runite/client/Class27.java
|
||||
org.runite.client.Class27
|
||||
org/runite/client/Class3_Sub24_Sub1.java
|
||||
org.runite.client.Class3_Sub24_Sub1
|
||||
org/runite/client/ResourceRequest.java
|
||||
org.runite.client.ResourceRequest
|
||||
org/runite/client/Class3_Sub22.java
|
||||
org.runite.client.Class3_Sub22
|
||||
org/runite/client/WorldMap.java
|
||||
org.runite.client.WorldMap
|
||||
org/runite/client/Class169.java
|
||||
org.runite.client.Class169
|
||||
org/runite/client/Class3_Sub13_Sub21.java
|
||||
org.runite.client.Class3_Sub13_Sub21
|
||||
org/runite/client/Class124.java
|
||||
org.runite.client.Class124
|
||||
org/runite/client/Class36.java
|
||||
org.runite.client.Class36
|
||||
org/runite/client/Class3_Sub24_Sub3.java
|
||||
org.runite.client.Class3_Sub24_Sub3
|
||||
org/runite/client/Class53.java
|
||||
org.runite.client.Class53
|
||||
org/runite/client/Class3_Sub15.java
|
||||
org.runite.client.Class3_Sub15
|
||||
org/runite/client/Class83.java
|
||||
org.runite.client.Class83
|
||||
org/runite/client/Class3_Sub28_Sub8.java
|
||||
org.runite.client.Class3_Sub28_Sub8
|
||||
org/runite/client/AbstractIndexedSprite.java
|
||||
org.runite.client.AbstractIndexedSprite
|
||||
org/runite/client/Class164_Sub2_Sub1.java
|
||||
org.runite.client.Class164_Sub2_Sub1
|
||||
org/runite/client/Class139.java
|
||||
org.runite.client.Class139
|
||||
org/runite/client/Model.java
|
||||
org.runite.client.Model
|
||||
org/runite/client/Class3_Sub13_Sub22.java
|
||||
org.runite.client.Class3_Sub13_Sub22
|
||||
org/runite/client/Class3_Sub13_Sub18.java
|
||||
org.runite.client.Class3_Sub13_Sub18
|
||||
org/runite/client/NPCDefinition.java
|
||||
org.runite.client.NPCDefinition
|
||||
org/runite/client/Class75_Sub2.java
|
||||
org.runite.client.Class75_Sub2
|
||||
org/runite/client/Class3_Sub13_Sub23_Sub1.java
|
||||
org.runite.client.Class3_Sub13_Sub23_Sub1
|
||||
org/runite/client/ShaderInterface.java
|
||||
org.runite.client.ShaderInterface
|
||||
org/runite/client/Class3_Sub28_Sub16_Sub2.java
|
||||
org.runite.client.Class3_Sub28_Sub16_Sub2
|
||||
org/runite/client/Class125.java
|
||||
org.runite.client.Class125
|
||||
org/runite/client/Class129_Sub2.java
|
||||
org.runite.client.Class129_Sub2
|
||||
org/runite/client/Class84.java
|
||||
org.runite.client.Class84
|
||||
org/runite/client/Class75_Sub3.java
|
||||
org.runite.client.Class75_Sub3
|
||||
org/runite/client/Class82.java
|
||||
org.runite.client.Class82
|
||||
org/runite/client/Class3_Sub13.java
|
||||
org.runite.client.Class3_Sub13
|
||||
org/runite/client/Class99.java
|
||||
org.runite.client.Class99
|
||||
org/runite/client/Bzip2Decompressor.java
|
||||
org.runite.client.Bzip2Decompressor
|
||||
org/runite/client/Class123.java
|
||||
org.runite.client.Class123
|
||||
org/runite/client/Class3_Sub13_Sub23.java
|
||||
org.runite.client.Class3_Sub13_Sub23
|
||||
org/runite/client/Class38_Sub1.java
|
||||
org.runite.client.Class38_Sub1
|
||||
org/runite/client/Interface4.java
|
||||
org.runite.client.Interface4
|
||||
org/runite/client/Class3_Sub28_Sub16_Sub2_Sub1.java
|
||||
org.runite.client.Class3_Sub28_Sub16_Sub2_Sub1
|
||||
org/runite/client/GameShell.java
|
||||
org.runite.client.GameShell
|
||||
org/runite/client/Class3_Sub24_Sub2.java
|
||||
org.runite.client.Class3_Sub24_Sub2
|
||||
org/runite/client/KeyboardListener.java
|
||||
org.runite.client.KeyboardListener
|
||||
org/runite/client/Class7.java
|
||||
org.runite.client.Class7
|
||||
org/runite/client/Class140_Sub6.java
|
||||
org.runite.client.Class140_Sub6
|
||||
org/runite/client/Class64.java
|
||||
org.runite.client.Class64
|
||||
org/runite/client/Class25.java
|
||||
org.runite.client.Class25
|
||||
org/runite/client/Model_Sub1.java
|
||||
org.runite.client.Model_Sub1
|
||||
org/runite/client/Class152.java
|
||||
org.runite.client.Class152
|
||||
org/runite/client/Class3_Sub13_Sub38.java
|
||||
org.runite.client.Class3_Sub13_Sub38
|
||||
org/runite/client/RenderAnimationDefinition.java
|
||||
org.runite.client.RenderAnimationDefinition
|
||||
org/runite/client/Class1.java
|
||||
org.runite.client.Class1
|
||||
org/runite/client/Class3_Sub13_Sub5.java
|
||||
org.runite.client.Class3_Sub13_Sub5
|
||||
org/runite/client/Class158.java
|
||||
org.runite.client.Class158
|
||||
org/runite/client/ColorCore.java
|
||||
org.runite.client.ColorCore
|
||||
org/runite/client/Class2.java
|
||||
org.runite.client.Class2
|
||||
org/runite/client/Class79.java
|
||||
org.runite.client.Class79
|
||||
org/runite/client/Class8.java
|
||||
org.runite.client.Class8
|
||||
org/runite/client/Class3_Sub13_Sub29.java
|
||||
org.runite.client.Class3_Sub13_Sub29
|
||||
org/runite/client/Class20.java
|
||||
org.runite.client.Class20
|
||||
org/runite/client/Class114.java
|
||||
org.runite.client.Class114
|
||||
org/runite/client/Class159.java
|
||||
org.runite.client.Class159
|
||||
org/runite/client/AtmosphereParser.java
|
||||
org.runite.client.AtmosphereParser
|
||||
org/runite/client/Class3_Sub11.java
|
||||
org.runite.client.Class3_Sub11
|
||||
org/runite/client/Class3_Sub28_Sub1.java
|
||||
org.runite.client.Class3_Sub28_Sub1
|
||||
org/runite/client/Class3_Sub28_Sub16_Sub1_Sub1.java
|
||||
org.runite.client.Class3_Sub28_Sub16_Sub1_Sub1
|
||||
org/runite/client/Class155_Sub1.java
|
||||
org.runite.client.Class155_Sub1
|
||||
org/runite/client/Class3_Sub30_Sub1.java
|
||||
org.runite.client.Class3_Sub30_Sub1
|
||||
org/runite/client/Class35.java
|
||||
org.runite.client.Class35
|
||||
org/runite/client/Class3_Sub28_Sub12.java
|
||||
org.runite.client.Class3_Sub28_Sub12
|
||||
org/runite/client/Class3_Sub14.java
|
||||
org.runite.client.Class3_Sub14
|
||||
org/runite/client/Class143.java
|
||||
org.runite.client.Class143
|
||||
org/runite/client/Class168.java
|
||||
org.runite.client.Class168
|
||||
org/runite/client/Class127_Sub1.java
|
||||
org.runite.client.Class127_Sub1
|
||||
org/runite/client/Class3_Sub5.java
|
||||
org.runite.client.Class3_Sub5
|
||||
org/runite/client/Class3_Sub13_Sub19.java
|
||||
org.runite.client.Class3_Sub13_Sub19
|
||||
org/runite/client/Class163_Sub2.java
|
||||
org.runite.client.Class163_Sub2
|
||||
org/runite/client/Class10.java
|
||||
org.runite.client.Class10
|
||||
org/runite/client/Class3_Sub13_Sub32.java
|
||||
org.runite.client.Class3_Sub13_Sub32
|
||||
org/runite/client/Class3_Sub28_Sub18.java
|
||||
org.runite.client.Class3_Sub28_Sub18
|
||||
org/runite/client/Class164_Sub1_Sub1.java
|
||||
org.runite.client.Class164_Sub1_Sub1
|
||||
org/runite/client/Class162.java
|
||||
org.runite.client.Class162
|
||||
org/runite/client/GameObject.java
|
||||
org.runite.client.GameObject
|
||||
org/runite/client/Class3_Sub13_Sub27.java
|
||||
org.runite.client.Class3_Sub13_Sub27
|
||||
org/runite/client/GraphicDefinition.java
|
||||
org.runite.client.GraphicDefinition
|
||||
org/runite/client/Class3_Sub13_Sub13.java
|
||||
org.runite.client.Class3_Sub13_Sub13
|
||||
org/runite/client/Class3_Sub2.java
|
||||
org.runite.client.Class3_Sub2
|
||||
org/runite/client/Class3_Sub28_Sub20.java
|
||||
org.runite.client.Class3_Sub28_Sub20
|
||||
org/runite/client/Class59.java
|
||||
org.runite.client.Class59
|
||||
org/runite/client/Class164_Sub1.java
|
||||
org.runite.client.Class164_Sub1
|
||||
org/runite/client/Class102.java
|
||||
org.runite.client.Class102
|
||||
org/runite/client/Class147.java
|
||||
org.runite.client.Class147
|
||||
org/runite/client/InterfaceWidget.java
|
||||
org.runite.client.InterfaceWidget
|
||||
org/runite/client/MouseWheel.java
|
||||
org.runite.client.MouseWheel
|
||||
org/runite/client/Class116.java
|
||||
org.runite.client.Class116
|
||||
org/runite/client/Class3_Sub28_Sub17.java
|
||||
org.runite.client.Class3_Sub28_Sub17
|
||||
org/runite/client/Class3_Sub23.java
|
||||
org.runite.client.Class3_Sub23
|
||||
org/runite/client/Class3_Sub13_Sub2.java
|
||||
org.runite.client.Class3_Sub13_Sub2
|
||||
org/runite/client/Class3_Sub28_Sub3.java
|
||||
org.runite.client.Class3_Sub28_Sub3
|
||||
org/runite/client/Class163_Sub3.java
|
||||
org.runite.client.Class163_Sub3
|
||||
org/runite/client/Class31.java
|
||||
org.runite.client.Class31
|
||||
org/runite/client/RSString.java
|
||||
org.runite.client.RSString
|
||||
org/runite/client/Display.java
|
||||
org.runite.client.Display
|
||||
org/runite/client/Class3_Sub13_Sub30.java
|
||||
org.runite.client.Class3_Sub13_Sub30
|
||||
org/runite/client/Class140_Sub4.java
|
||||
org.runite.client.Class140_Sub4
|
||||
org/runite/client/WorldListCountry.java
|
||||
org.runite.client.WorldListCountry
|
||||
org/runite/client/CacheResourceWorker.java
|
||||
org.runite.client.CacheResourceWorker
|
||||
org/runite/client/Class164.java
|
||||
org.runite.client.Class164
|
||||
org/runite/client/Class45.java
|
||||
org.runite.client.Class45
|
||||
org/runite/client/PacketParser.java
|
||||
org.runite.client.PacketParser
|
||||
org/runite/client/ItemDefinition.java
|
||||
org.runite.client.ItemDefinition
|
||||
org/runite/client/Class133.java
|
||||
org.runite.client.Class133
|
||||
org/runite/client/Class145.java
|
||||
org.runite.client.Class145
|
||||
org/runite/client/Class3_Sub13_Sub4.java
|
||||
org.runite.client.Class3_Sub13_Sub4
|
||||
org/runite/client/Class74.java
|
||||
org.runite.client.Class74
|
||||
org/runite/client/Class12.java
|
||||
org.runite.client.Class12
|
||||
org/runite/client/Class131.java
|
||||
org.runite.client.Class131
|
||||
org/runite/client/Class3_Sub28_Sub19.java
|
||||
org.runite.client.Class3_Sub28_Sub19
|
||||
org/runite/client/Class150.java
|
||||
org.runite.client.Class150
|
||||
org/runite/client/Class3_Sub13_Sub25.java
|
||||
org.runite.client.Class3_Sub13_Sub25
|
||||
org/runite/client/HDSprite.java
|
||||
org.runite.client.HDSprite
|
||||
org/runite/client/Class163_Sub1.java
|
||||
org.runite.client.Class163_Sub1
|
||||
org/runite/client/Class3_Sub4.java
|
||||
org.runite.client.Class3_Sub4
|
||||
org/runite/client/CS2AsmOpcodes.java
|
||||
org.runite.client.CS2AsmOpcodes
|
||||
org/runite/client/Class88.java
|
||||
org.runite.client.Class88
|
||||
org/runite/client/Class118.java
|
||||
org.runite.client.Class118
|
||||
org/runite/client/Class3_Sub13_Sub39.java
|
||||
org.runite.client.Class3_Sub13_Sub39
|
||||
org/runite/client/Class60.java
|
||||
org.runite.client.Class60
|
||||
org/runite/client/ComponentWrappedCanvas.java
|
||||
org.runite.client.ComponentWrappedCanvas
|
||||
org/runite/client/MapUnderlayColorDefinition.java
|
||||
org.runite.client.MapUnderlayColorDefinition
|
||||
org/runite/client/Class50.java
|
||||
org.runite.client.Class50
|
||||
org/runite/client/Class3_Sub28_Sub5.java
|
||||
org.runite.client.Class3_Sub28_Sub5
|
||||
org/runite/client/Class160.java
|
||||
org.runite.client.Class160
|
||||
org/runite/client/Class78.java
|
||||
org.runite.client.Class78
|
||||
org/runite/client/Class33.java
|
||||
org.runite.client.Class33
|
||||
org/runite/client/RSInterface.java
|
||||
org.runite.client.RSInterface
|
||||
org/runite/client/Class72.java
|
||||
org.runite.client.Class72
|
||||
org/runite/client/Signlink.java
|
||||
org.runite.client.Signlink
|
||||
org/runite/client/Class166.java
|
||||
org.runite.client.Class166
|
||||
org/runite/client/Class3_Sub6.java
|
||||
org.runite.client.Class3_Sub6
|
||||
org/runite/client/Class3_Sub13_Sub15.java
|
||||
org.runite.client.Class3_Sub13_Sub15
|
||||
org/runite/client/WaterMovementShader.java
|
||||
org.runite.client.WaterMovementShader
|
||||
org/runite/client/ISAACCipher.java
|
||||
org.runite.client.ISAACCipher
|
||||
org/runite/client/Js5ResourceRequest.java
|
||||
org.runite.client.Js5ResourceRequest
|
||||
org/runite/client/Class81.java
|
||||
org.runite.client.Class81
|
||||
org/runite/client/Class128.java
|
||||
org.runite.client.Class128
|
||||
org/runite/client/Class3_Sub13_Sub37.java
|
||||
org.runite.client.Class3_Sub13_Sub37
|
||||
org/runite/client/Client.java
|
||||
org.runite.client.Client
|
||||
org/runite/client/Class3_Sub13_Sub6.java
|
||||
org.runite.client.Class3_Sub13_Sub6
|
||||
org/runite/client/Class18.java
|
||||
org.runite.client.Class18
|
||||
org/runite/client/Class3_Sub13_Sub11.java
|
||||
org.runite.client.Class3_Sub13_Sub11
|
||||
org/runite/client/Class43.java
|
||||
org.runite.client.Class43
|
||||
org/runite/client/Class106.java
|
||||
org.runite.client.Class106
|
||||
org/runite/client/Sprites.java
|
||||
org.runite.client.Sprites
|
||||
org/runite/client/Class49.java
|
||||
org.runite.client.Class49
|
||||
org/runite/client/TextCore.java
|
||||
org.runite.client.TextCore
|
||||
org/runite/client/DumpingTools.java
|
||||
org.runite.client.DumpingTools
|
||||
org/runite/client/CS2Script.java
|
||||
org.runite.client.CS2Script
|
||||
org/runite/client/TimeUtils.java
|
||||
org.runite.client.TimeUtils
|
||||
org/runite/client/Class3_Sub25.java
|
||||
org.runite.client.Class3_Sub25
|
||||
org/runite/client/Sensor.java
|
||||
org.runite.client.Sensor
|
||||
org/runite/client/Class91.java
|
||||
org.runite.client.Class91
|
||||
org/runite/client/WaterShader.java
|
||||
org.runite.client.WaterShader
|
||||
org/runite/client/Class157.java
|
||||
org.runite.client.Class157
|
||||
org/runite/client/Class97.java
|
||||
org.runite.client.Class97
|
||||
org/runite/client/Class24.java
|
||||
org.runite.client.Class24
|
||||
org/runite/client/Class135.java
|
||||
org.runite.client.Class135
|
||||
org/runite/client/Class21.java
|
||||
org.runite.client.Class21
|
||||
org/runite/client/AssembledMethodContainer.java
|
||||
org.runite.client.AssembledMethodContainer
|
||||
org/runite/client/Class75_Sub1.java
|
||||
org.runite.client.Class75_Sub1
|
||||
org/runite/client/ClientErrorException.java
|
||||
org.runite.client.ClientErrorException
|
||||
org/runite/client/Class75_Sub4.java
|
||||
org.runite.client.Class75_Sub4
|
||||
org/runite/client/Class154.java
|
||||
org.runite.client.Class154
|
||||
org/runite/client/Class22.java
|
||||
org.runite.client.Class22
|
||||
org/runite/client/Class67.java
|
||||
org.runite.client.Class67
|
||||
org/runite/client/Class110.java
|
||||
org.runite.client.Class110
|
||||
org/runite/client/Class3_Sub31.java
|
||||
org.runite.client.Class3_Sub31
|
||||
org/runite/client/Class155.java
|
||||
org.runite.client.Class155
|
||||
org/runite/client/Class3_Sub28_Sub17_Sub1.java
|
||||
org.runite.client.Class3_Sub28_Sub17_Sub1
|
||||
org/runite/client/ClientCommands.java
|
||||
org.runite.client.ClientCommands
|
||||
org/runite/client/Class108.java
|
||||
org.runite.client.Class108
|
||||
org/runite/client/Class19.java
|
||||
org.runite.client.Class19
|
||||
org/runite/client/Class3_Sub9.java
|
||||
org.runite.client.Class3_Sub9
|
||||
org/runite/client/Class70.java
|
||||
org.runite.client.Class70
|
||||
org/runite/client/Class3_Sub28_Sub9.java
|
||||
org.runite.client.Class3_Sub28_Sub9
|
||||
org/runite/client/ObjectDefinition.java
|
||||
org.runite.client.ObjectDefinition
|
||||
org/runite/client/Class37.java
|
||||
org.runite.client.Class37
|
||||
org/runite/client/Class3_Sub13_Sub9.java
|
||||
org.runite.client.Class3_Sub13_Sub9
|
||||
org/runite/client/Player.java
|
||||
org.runite.client.Player
|
||||
org/runite/client/Class141.java
|
||||
org.runite.client.Class141
|
||||
org/runite/client/Class68.java
|
||||
org.runite.client.Class68
|
||||
org/runite/client/LoginHandler.java
|
||||
org.runite.client.LoginHandler
|
||||
org/runite/client/Class23.java
|
||||
org.runite.client.Class23
|
||||
org/runite/client/Class85.java
|
||||
org.runite.client.Class85
|
||||
org/runite/client/Class144_Sub1.java
|
||||
org.runite.client.Class144_Sub1
|
||||
org/runite/client/Class140_Sub1_Sub2.java
|
||||
org.runite.client.Class140_Sub1_Sub2
|
||||
org/runite/client/Class3_Sub8.java
|
||||
org.runite.client.Class3_Sub8
|
||||
org/runite/client/Class3_Sub13_Sub17.java
|
||||
org.runite.client.Class3_Sub13_Sub17
|
||||
org/runite/client/Class156.java
|
||||
org.runite.client.Class156
|
||||
org/runite/client/Class3_Sub13_Sub34.java
|
||||
org.runite.client.Class3_Sub13_Sub34
|
||||
org/runite/client/NPC.java
|
||||
org.runite.client.NPC
|
||||
org/runite/client/Class3_Sub13_Sub20.java
|
||||
org.runite.client.Class3_Sub13_Sub20
|
||||
org/runite/client/Class126.java
|
||||
org.runite.client.Class126
|
||||
org/runite/client/QuickChat.java
|
||||
org.runite.client.QuickChat
|
||||
org/runite/client/Class3_Sub7.java
|
||||
org.runite.client.Class3_Sub7
|
||||
org/runite/client/Class137.java
|
||||
org.runite.client.Class137
|
||||
org/runite/client/Class158_Sub2.java
|
||||
org.runite.client.Class158_Sub2
|
||||
org/runite/client/Class3_Sub13_Sub36.java
|
||||
org.runite.client.Class3_Sub13_Sub36
|
||||
org/runite/client/Class3_Sub13_Sub7.java
|
||||
org.runite.client.Class3_Sub13_Sub7
|
||||
org/runite/client/Class96.java
|
||||
org.runite.client.Class96
|
||||
org/runite/client/Class129_Sub1.java
|
||||
org.runite.client.Class129_Sub1
|
||||
org/runite/client/Class52.java
|
||||
org.runite.client.Class52
|
||||
org/runite/client/WaterfallShader.java
|
||||
org.runite.client.WaterfallShader
|
||||
org/runite/client/Class41.java
|
||||
org.runite.client.Class41
|
||||
org/runite/client/Class107.java
|
||||
org.runite.client.Class107
|
||||
org/runite/client/HDToolKit.java
|
||||
org.runite.client.HDToolKit
|
||||
org/runite/client/Class71.java
|
||||
org.runite.client.Class71
|
||||
org/runite/client/AbstractSprite.java
|
||||
org.runite.client.AbstractSprite
|
||||
org/runite/client/Class39.java
|
||||
org.runite.client.Class39
|
||||
org/runite/client/Interface2.java
|
||||
org.runite.client.Interface2
|
||||
org/runite/client/Class158_Sub1.java
|
||||
org.runite.client.Class158_Sub1
|
||||
org/runite/client/Class3_Sub13_Sub10.java
|
||||
org.runite.client.Class3_Sub13_Sub10
|
||||
org/runite/client/Class3_Sub26.java
|
||||
org.runite.client.Class3_Sub26
|
||||
org/runite/client/Class3_Sub17.java
|
||||
org.runite.client.Class3_Sub17
|
||||
org/runite/client/Class3_Sub12_Sub1.java
|
||||
org.runite.client.Class3_Sub12_Sub1
|
||||
org/runite/client/Class80.java
|
||||
org.runite.client.Class80
|
||||
org/runite/client/Class3_Sub20.java
|
||||
org.runite.client.Class3_Sub20
|
||||
org/runite/client/CacheResourceRequest.java
|
||||
org.runite.client.CacheResourceRequest
|
||||
org/runite/client/Class121.java
|
||||
org.runite.client.Class121
|
||||
org/runite/client/HDIndexedSprite.java
|
||||
org.runite.client.HDIndexedSprite
|
||||
org/runite/client/Class136.java
|
||||
org.runite.client.Class136
|
||||
org/runite/client/SequenceDefinition.java
|
||||
org.runite.client.SequenceDefinition
|
||||
org/runite/client/LDIndexedSprite.java
|
||||
org.runite.client.LDIndexedSprite
|
||||
org/runite/client/Class140_Sub1_Sub1.java
|
||||
org.runite.client.Class140_Sub1_Sub1
|
||||
org/runite/client/Class3_Sub21.java
|
||||
org.runite.client.Class3_Sub21
|
||||
org/runite/client/Class42.java
|
||||
org.runite.client.Class42
|
||||
org/runite/client/Class3_Sub27.java
|
||||
org.runite.client.Class3_Sub27
|
||||
org/runite/client/Class95.java
|
||||
org.runite.client.Class95
|
||||
org/runite/client/Class57.java
|
||||
org.runite.client.Class57
|
||||
org/runite/client/Class32.java
|
||||
org.runite.client.Class32
|
||||
org/runite/client/Class38.java
|
||||
org.runite.client.Class38
|
||||
org/runite/client/Class51.java
|
||||
org.runite.client.Class51
|
||||
org/runite/client/Class140_Sub2.java
|
||||
org.runite.client.Class140_Sub2
|
||||
org/runite/client/CacheIndex.java
|
||||
org.runite.client.CacheIndex
|
||||
org/runite/client/Unsorted.java
|
||||
org.runite.client.Unsorted
|
||||
org/runite/client/Class3_Sub13_Sub8.java
|
||||
org.runite.client.Class3_Sub13_Sub8
|
||||
org/runite/client/Class3_Sub13_Sub16.java
|
||||
org.runite.client.Class3_Sub13_Sub16
|
||||
org/runite/client/Class3_Sub28_Sub4.java
|
||||
org.runite.client.Class3_Sub28_Sub4
|
||||
org/runite/client/Class146.java
|
||||
org.runite.client.Class146
|
||||
org/runite/client/Class3_Sub13_Sub35.java
|
||||
org.runite.client.Class3_Sub13_Sub35
|
||||
org/runite/client/ClientLoader.java
|
||||
org.runite.client.ClientLoader
|
||||
org/runite/client/ModPanel.java
|
||||
org.runite.client.ModPanel
|
||||
org.runite.client.ModPanel$ButtonListener
|
||||
org.runite.client.ModPanel$DebugMenu
|
||||
org.runite.client.ModPanel$DebugMenu$CheckBoxListener
|
||||
org.runite.client.ModPanel$ItemMenu
|
||||
org.runite.client.ModPanel$ItemMenu$1
|
||||
org.runite.client.ModPanel$ItemMenu$2
|
||||
org.runite.client.ModPanel$ItemMenu$3
|
||||
org.runite.client.ModPanel$NPCMenu
|
||||
org.runite.client.ModPanel$NPCMenu$1
|
||||
org.runite.client.ModPanel$NPCMenu$2
|
||||
org.runite.client.ModPanel$NPCMenu$3
|
||||
org.runite.client.ModPanel$PlayerMenu
|
||||
org.runite.client.ModPanel$PlayerMenu$1
|
||||
org.runite.client.ModPanel$PlayerMenu$2
|
||||
org.runite.client.ModPanel$TeleMenu
|
||||
org.runite.client.ModPanel$TeleMenu$1
|
||||
org.runite.client.ModPanel$TeleMenu$2
|
||||
15
Management-Server/managementprops/properties.json
Normal file
15
Management-Server/managementprops/properties.json
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"DatabaseInformation": {
|
||||
"database_name": "global",
|
||||
"database_username": "root",
|
||||
"database_password": "",
|
||||
"database_host": "127.0.0.1",
|
||||
"database_port": "3306"
|
||||
},
|
||||
|
||||
"WorldTechnicalInformation": {
|
||||
"world_limit": "10",
|
||||
"worldhop_delay": "20000"
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -6,10 +6,12 @@ import ms.net.packet.WorldPacketRepository;
|
|||
import ms.system.ShutdownSequence;
|
||||
import ms.system.mysql.SQLManager;
|
||||
import ms.system.util.Command;
|
||||
import ms.system.util.ManagementConfigParser;
|
||||
import ms.world.GameServer;
|
||||
import ms.world.PlayerSession;
|
||||
import ms.world.WorldDatabase;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
|
|
@ -128,6 +130,7 @@ public final class Management {
|
|||
}
|
||||
System.out.println("-------- 530 Management server --------");
|
||||
System.out.println("Starting up...");
|
||||
new ManagementConfigParser("managementprops" + File.separator + "properties.json");
|
||||
SQLManager.init();
|
||||
//NioReactor.configure(ServerConstants.PORT).start();
|
||||
NioReactor.configure(5555).start();
|
||||
|
|
|
|||
|
|
@ -8,16 +8,6 @@ import ms.system.OperatingSystem;
|
|||
*
|
||||
*/
|
||||
public final class ServerConstants {
|
||||
|
||||
/**
|
||||
* The port to be used for communications.
|
||||
*/
|
||||
public static final String SERVER_NAME = "2009Scape";
|
||||
|
||||
/**
|
||||
* The port to be used for communications.
|
||||
*/
|
||||
public static final int PORT = 5555;
|
||||
|
||||
/**
|
||||
* The maximum amount of worlds.
|
||||
|
|
@ -27,22 +17,12 @@ public final class ServerConstants {
|
|||
/**
|
||||
* The world switching delay in milliseconds.
|
||||
*/
|
||||
public static final long WORLD_SWITCH_DELAY = 20_000l;
|
||||
public static final long WORLD_SWITCH_DELAY = 20_000L;
|
||||
|
||||
/**
|
||||
* The address of the Management server.
|
||||
*/
|
||||
public static final String HOST_ADDRESS = "127.0.0.1";
|
||||
|
||||
/**
|
||||
* The store path.
|
||||
*/
|
||||
public static final String STORE_PATH = "./store/";
|
||||
|
||||
/**
|
||||
* The maximum amount of players per world.
|
||||
*/
|
||||
public static final int MAX_PLAYERS = (1 << 11) - 1;
|
||||
|
||||
/**
|
||||
* The operating system of the management server
|
||||
|
|
|
|||
|
|
@ -1,25 +1,23 @@
|
|||
package ms.net.packet;
|
||||
package ms.net.packet
|
||||
|
||||
/**
|
||||
* Represents the types of packet headers.
|
||||
* @author Emperor
|
||||
*
|
||||
*/
|
||||
public enum PacketHeader {
|
||||
enum class PacketHeader {
|
||||
|
||||
/**
|
||||
* The normal packet header.
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* The byte packet header.
|
||||
*/
|
||||
BYTE,
|
||||
|
||||
/**
|
||||
* The short packet header.
|
||||
*/
|
||||
SHORT;
|
||||
|
||||
/**
|
||||
* The normal packet header.
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* The byte packet header.
|
||||
*/
|
||||
BYTE,
|
||||
|
||||
/**
|
||||
* The short packet header.
|
||||
*/
|
||||
SHORT
|
||||
}
|
||||
|
|
@ -1,587 +0,0 @@
|
|||
package ms.net.packet;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.List;
|
||||
|
||||
import ms.ServerConstants;
|
||||
import ms.net.IoSession;
|
||||
import ms.system.PunishmentStorage;
|
||||
import ms.world.GameServer;
|
||||
import ms.world.PlayerSession;
|
||||
import ms.world.WorldDatabase;
|
||||
import ms.system.communication.ClanRank;
|
||||
import ms.system.communication.ClanRepository;
|
||||
import ms.system.communication.CommunicationInfo;
|
||||
import ms.world.info.Response;
|
||||
import ms.world.info.UIDInfo;
|
||||
|
||||
/**
|
||||
* Repository class for world packets.
|
||||
* @author Emperor
|
||||
*
|
||||
*/
|
||||
public final class WorldPacketRepository {
|
||||
|
||||
/**
|
||||
* Sends the player registry response.
|
||||
* @param server The game server.
|
||||
* @param player The player session.
|
||||
* @param response The registry response.
|
||||
*/
|
||||
public static void sendRegistryResponse(GameServer server, PlayerSession player, Response response) {
|
||||
IoBuffer buffer = new IoBuffer(0, PacketHeader.BYTE);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.put((byte) response.opcode());
|
||||
if (response == Response.MOVING_WORLD) {
|
||||
long delay = ServerConstants.WORLD_SWITCH_DELAY - (System.currentTimeMillis() - player.getDisconnectionTime());
|
||||
buffer.put((byte) (delay / 1000));
|
||||
}
|
||||
server.getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to the player.
|
||||
* @param player The player.
|
||||
* @param message The message to send.
|
||||
*/
|
||||
public static void sendPlayerMessage(PlayerSession player, String message) {
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
IoBuffer buffer = new IoBuffer(2, PacketHeader.BYTE);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.putString(message);
|
||||
player.getWorld().getSession().write(buffer);
|
||||
}
|
||||
|
||||
public static void sendPlayerMessage(PlayerSession player, String[] messages) {
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
for (String message : messages)
|
||||
sendPlayerMessage(player, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the contact information.
|
||||
* @param player The player.
|
||||
*/
|
||||
public static void sendContactInformation(PlayerSession player) {
|
||||
CommunicationInfo info = player.getCommunication();
|
||||
IoBuffer buffer = new IoBuffer(3, PacketHeader.SHORT);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.put(info.getContacts().size());
|
||||
for (String contact : info.getContacts().keySet()) {
|
||||
buffer.putString(contact);
|
||||
buffer.put(info.getRank(contact).ordinal());
|
||||
buffer.put(CommunicationInfo.getWorldId(player, contact));
|
||||
}
|
||||
buffer.put(info.getBlocked().size());
|
||||
for (String contact : info.getBlocked()) {
|
||||
buffer.putString(contact);
|
||||
}
|
||||
if (info.getCurrentClan() == null) {
|
||||
buffer.put(0);
|
||||
} else {
|
||||
buffer.put(1);
|
||||
buffer.putString(info.getCurrentClan());
|
||||
}
|
||||
player.getWorld().getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a contact update.
|
||||
* @param player The player who's contacts we're changing.
|
||||
* @param contact The contact to update.
|
||||
* @param block If we're updating the blocked list.
|
||||
* @param remove If the contact should be removed.
|
||||
* @param worldId The world id of the contact.
|
||||
* @param rank The clan rank.
|
||||
*/
|
||||
public static void sendContactUpdate(PlayerSession player, String contact, boolean block, boolean remove, int worldId, ClanRank rank) {
|
||||
IoBuffer buffer = new IoBuffer(4, PacketHeader.BYTE);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.putString(contact);
|
||||
buffer.put((byte) (block ? 1 : 0));
|
||||
if (rank != null) {
|
||||
buffer.put((byte) (2 + rank.ordinal()));
|
||||
} else {
|
||||
buffer.put((byte) (remove ? 1 : 0));
|
||||
if (!block && !remove) {
|
||||
buffer.put((byte) worldId);
|
||||
}
|
||||
}
|
||||
player.getWorld().getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a clan message.
|
||||
* @param player The player to send the message to.
|
||||
* @param p The player sending the message.
|
||||
* @param message The message to send.
|
||||
* @param type The message type.
|
||||
*/
|
||||
public static void sendMessage(PlayerSession player, PlayerSession p, int type, String message) {
|
||||
IoBuffer buffer = new IoBuffer(5, PacketHeader.BYTE);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.putString(p.getUsername());
|
||||
buffer.put((byte) type);
|
||||
buffer.put((byte) p.getChatIcon());
|
||||
buffer.putString(message);
|
||||
player.getWorld().getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends clan information to the server.
|
||||
* @param server The server.
|
||||
* @param clan The clan.
|
||||
*/
|
||||
public static void sendClanInformation(GameServer server, ClanRepository clan) {
|
||||
IoBuffer buffer = new IoBuffer(6, PacketHeader.SHORT);
|
||||
buffer.putString(clan.getOwner().getUsername());
|
||||
buffer.putString(clan.getName());
|
||||
int length = clan.getPlayers().size();
|
||||
if (length > ClanRepository.MAX_MEMBERS) {
|
||||
length = ClanRepository.MAX_MEMBERS;
|
||||
}
|
||||
buffer.put((byte) length);
|
||||
for (int i = 0; i < length; i++) {
|
||||
PlayerSession player = clan.getPlayers().get(i);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.put(player.getWorldId());
|
||||
buffer.put((byte) clan.getRank(player).ordinal());
|
||||
}
|
||||
buffer.put((byte) clan.getJoinRequirement().ordinal());
|
||||
buffer.put((byte) clan.getKickRequirement().ordinal());
|
||||
buffer.put((byte) clan.getMessageRequirement().ordinal());
|
||||
buffer.put((byte) clan.getLootRequirement().ordinal());
|
||||
server.getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the leave clan packet.
|
||||
* @param player The player leaving the clan.
|
||||
*/
|
||||
public static void sendLeaveClan(PlayerSession player) {
|
||||
IoBuffer buffer = new IoBuffer(7, PacketHeader.BYTE);
|
||||
buffer.putString(player.getUsername());
|
||||
player.getWorld().getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the player login notification.
|
||||
* @param server The server.
|
||||
* @param player The player logging in.
|
||||
* @param names The names.
|
||||
*/
|
||||
public static void notifyPlayers(GameServer server, PlayerSession player, List<String> names) {
|
||||
IoBuffer buffer = new IoBuffer(8, PacketHeader.SHORT);
|
||||
buffer.putString(player.getUsername());
|
||||
buffer.put((byte) player.getWorldId());
|
||||
buffer.put((byte) names.size());
|
||||
for (String name : names) {
|
||||
buffer.putString(name);
|
||||
}
|
||||
server.getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the game server a player logged out.
|
||||
* @param server The game server to notify.
|
||||
* @param player The player logging out.
|
||||
*/
|
||||
public static void notifyLogout(GameServer server, PlayerSession player) {
|
||||
IoBuffer buffer = new IoBuffer(9, PacketHeader.BYTE);
|
||||
buffer.putString(player.getUsername());
|
||||
server.getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the update countdown to the server.
|
||||
* @param server The server.
|
||||
* @param ticks The amount of ticks left.
|
||||
*/
|
||||
public static void sendUpdate(GameServer server, int ticks) {
|
||||
IoBuffer buffer = new IoBuffer(10);
|
||||
buffer.putInt(ticks);
|
||||
server.getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the punishment update packet.
|
||||
* @param world The world to send the packet to.
|
||||
* @param key The punishment key.
|
||||
* @param type The punishment type.
|
||||
* @param duration The duration of the punishment.
|
||||
*/
|
||||
public static void sendPunishUpdate(GameServer world, String key, int type, long duration) {
|
||||
IoBuffer buffer = new IoBuffer(11, PacketHeader.BYTE);
|
||||
buffer.putString(key);
|
||||
buffer.put((byte) type);
|
||||
buffer.putLong(duration);
|
||||
world.getSession().write(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a configuration reload.
|
||||
* @param world the world.
|
||||
*/
|
||||
public static void sendConfigReload(GameServer world) {
|
||||
world.getSession().write(new IoBuffer(15, PacketHeader.BYTE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles incoming world packets.
|
||||
* @param session The I/O session.
|
||||
* @param opcode The opcode.
|
||||
* @param b The buffer to read from.
|
||||
*/
|
||||
public static void handleIncoming(IoSession session, int opcode, ByteBuffer b) {
|
||||
IoBuffer buffer = new IoBuffer(opcode, PacketHeader.NORMAL, b);
|
||||
GameServer server = session.getGameServer();
|
||||
switch (opcode) {
|
||||
case 0:
|
||||
handlePlayerRegistration(server, buffer);
|
||||
break;
|
||||
case 1:
|
||||
handlePlayerRemoval(server, buffer);
|
||||
break;
|
||||
case 2:
|
||||
handlePunishment(server, buffer);
|
||||
break;
|
||||
case 3:
|
||||
handleCommunicationRequest(server, buffer);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
handleContactUpdate(server, buffer, opcode == 5);
|
||||
break;
|
||||
case 6:
|
||||
handleJoinClan(server, buffer);
|
||||
break;
|
||||
case 7:
|
||||
handleClanRename(server, buffer);
|
||||
break;
|
||||
case 8:
|
||||
handleClanSetting(server, buffer);
|
||||
break;
|
||||
case 9:
|
||||
handleClanKick(server, buffer);
|
||||
break;
|
||||
case 10:
|
||||
handleClanMessage(server, buffer);
|
||||
break;
|
||||
case 11:
|
||||
handlePrivateMessage(server, buffer);
|
||||
break;
|
||||
case 12:
|
||||
handleClanInfoRequest(server, buffer);
|
||||
break;
|
||||
case 13:
|
||||
handleChatSetting(server, buffer);
|
||||
break;
|
||||
case 14:
|
||||
handleInfoUpdate(server, buffer);
|
||||
break;
|
||||
default:
|
||||
System.err.println("Handling incoming packet [opcode=" + opcode + ", size=" + b.limit() + "].");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the info of a player update.
|
||||
* @param server the server.
|
||||
* @param buffer the buffer.
|
||||
*/
|
||||
private static void handleInfoUpdate(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player != null) {
|
||||
player.setChatIcon((int) buffer.get());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a player registration.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handlePlayerRegistration(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
String password = buffer.getString();
|
||||
String ipAddress = buffer.getString();
|
||||
String macAddress = buffer.getString();
|
||||
String compName = buffer.getString();
|
||||
String serial = buffer.getString();
|
||||
int rights = server.getInfo().getRevision() == 498 ? 0 : buffer.getInt();
|
||||
int chatIcon = server.getInfo().getRevision() == 498 ? 0 : buffer.get();
|
||||
UIDInfo uid = new UIDInfo(ipAddress, compName, macAddress, serial);
|
||||
PlayerSession player = new PlayerSession(username, password, new UIDInfo(ipAddress, compName, macAddress, serial));
|
||||
if (WorldDatabase.isActivePlayer(username)) {
|
||||
sendRegistryResponse(server, player, Response.ALREADY_ONLINE);
|
||||
return;
|
||||
}
|
||||
player.setUid(uid);
|
||||
player.setRights(rights);
|
||||
player.setChatIcon(chatIcon);
|
||||
if (PunishmentStorage.isSystemBanned(uid)) {
|
||||
sendRegistryResponse(server, player, Response.BANNED);
|
||||
return;
|
||||
}
|
||||
player.parse();
|
||||
if (player.isBanned()) {
|
||||
sendRegistryResponse(server, player, Response.ACCOUNT_DISABLED);
|
||||
return;
|
||||
}
|
||||
if (player.getLastWorld() != server.getInfo().getWorldId() && player.hasMovedWorld()) {
|
||||
sendRegistryResponse(server, player, Response.MOVING_WORLD);
|
||||
return;
|
||||
}
|
||||
server.register(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the removal of a player.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handlePlayerRemoval(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
PlayerSession session = server.getPlayers().get(username);
|
||||
if (session != null) {
|
||||
session.setActive(false);
|
||||
PlayerSession player = server.getPlayers().remove(username);
|
||||
if (player != null) {
|
||||
session.remove();
|
||||
}
|
||||
session.setWorldId(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a player registration.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handlePunishment(GameServer server, IoBuffer buffer) {
|
||||
int type = buffer.get() & 0xFF;
|
||||
String target = buffer.getString();
|
||||
long duration = buffer.getLong();
|
||||
String staff = buffer.getString();
|
||||
PunishmentStorage.handlePunishment(staff, target, type, duration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the communication info request packet.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleCommunicationRequest(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
sendContactInformation(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a contact update packet.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer to read from.
|
||||
* @param block If the list is for blocked players.
|
||||
*/
|
||||
private static void handleContactUpdate(GameServer server, IoBuffer buffer, boolean block) {
|
||||
String username = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
String contact = buffer.getString();
|
||||
switch (buffer.get()) {
|
||||
case 0:
|
||||
if (block) {
|
||||
player.getCommunication().block(contact);
|
||||
break;
|
||||
}
|
||||
player.getCommunication().add(contact);
|
||||
break;
|
||||
case 1:
|
||||
player.getCommunication().remove(contact, block);
|
||||
break;
|
||||
case 2:
|
||||
player.getCommunication().updateClanRank(contact, ClanRank.values()[buffer.get()]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan related packet.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleJoinClan(GameServer server, IoBuffer buffer) {
|
||||
String name = buffer.getString();
|
||||
String clanName = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(name);
|
||||
if (player == null || !player.isActive()) {
|
||||
System.err.println("Invalid player specified in clan packet!");
|
||||
return;
|
||||
}
|
||||
if (player.getClan() != null) {
|
||||
player.getClan().leave(player, true);
|
||||
return;
|
||||
}
|
||||
if (clanName.length() < 1) {
|
||||
sendLeaveClan(player);
|
||||
return;
|
||||
}
|
||||
ClanRepository clan = ClanRepository.get(server, clanName);
|
||||
if (clan == null) {
|
||||
sendPlayerMessage(player, new String[]{ "The channel you tried to join does not exist.", "Try joining the main clan named '" + ServerConstants.SERVER_NAME + "'.:clan:" });
|
||||
return;
|
||||
}
|
||||
clan.enter(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles renaming a clan.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleClanRename(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
String name = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null || !player.isActive()) {
|
||||
return;
|
||||
}
|
||||
ClanRepository clan = ClanRepository.getClans().get(username);
|
||||
player.getCommunication().setClanName(name);
|
||||
if (clan != null) {
|
||||
if (name.length() < 1) {
|
||||
clan.clean(true);
|
||||
} else {
|
||||
clan.rename(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles changing clan settings packet.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleClanSetting(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
int type = buffer.get();
|
||||
ClanRank rank = type < 4 ? ClanRank.values()[buffer.get() & 0xFF] : null;
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null || !player.isActive()) {
|
||||
return;
|
||||
}
|
||||
ClanRepository clan = ClanRepository.get(server,username);
|
||||
switch (type) {
|
||||
case 0:
|
||||
player.getCommunication().setJoinRequirement(rank);
|
||||
if (clan != null) {
|
||||
clan.clean(false);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
player.getCommunication().setMessageRequirement(rank);
|
||||
break;
|
||||
case 2:
|
||||
player.getCommunication().setKickRequirement(rank);
|
||||
if (clan != null) {
|
||||
clan.update();
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
player.getCommunication().setLootRequirement(rank);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles kicking a player from the clan.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleClanKick(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
String playerName = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null || !player.isActive() || player.getClan() == null) {
|
||||
return;
|
||||
}
|
||||
PlayerSession target = WorldDatabase.getPlayer(playerName);
|
||||
if (target == null || !target.isActive()) {
|
||||
return;
|
||||
}
|
||||
player.getClan().kick(player, target);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan message.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleClanMessage(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
String message = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null || !player.isActive() || player.getClan() == null) {
|
||||
return;
|
||||
}
|
||||
player.getClan().message(player, message);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles a clan message.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handlePrivateMessage(GameServer server, IoBuffer buffer) {
|
||||
String username = buffer.getString();
|
||||
String receiver = buffer.getString();
|
||||
String message = buffer.getString();
|
||||
PlayerSession player = server.getPlayers().get(username);
|
||||
if (player == null || !player.isActive()) {
|
||||
return;
|
||||
}
|
||||
player.getCommunication().sendMessage(receiver, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan information request packet.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleClanInfoRequest(GameServer server, IoBuffer buffer) {
|
||||
String name = buffer.getString();
|
||||
ClanRepository clan = ClanRepository.get(server, name);
|
||||
if (clan == null) {
|
||||
return;
|
||||
}
|
||||
sendClanInformation(server, clan);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a chat setting update packet.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private static void handleChatSetting(GameServer server, IoBuffer buffer) {
|
||||
String name = buffer.getString();
|
||||
int publicSetting = buffer.get();
|
||||
int privateSetting = buffer.get();
|
||||
int tradeSetting = buffer.get();
|
||||
PlayerSession player = server.getPlayers().get(name);
|
||||
if (player == null || !player.isActive()) {
|
||||
return;
|
||||
}
|
||||
player.getCommunication().updateSettings(publicSetting, privateSetting, tradeSetting);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,555 @@
|
|||
package ms.net.packet
|
||||
|
||||
import ms.net.IoSession
|
||||
import ms.system.PunishmentStorage
|
||||
import ms.system.communication.ClanRank
|
||||
import ms.system.communication.ClanRepository
|
||||
import ms.system.communication.CommunicationInfo
|
||||
import ms.system.util.ManagementConstants.Companion.WORLD_HOP_DELAY
|
||||
import ms.world.GameServer
|
||||
import ms.world.PlayerSession
|
||||
import ms.world.WorldDatabase
|
||||
import ms.world.info.Response
|
||||
import ms.world.info.UIDInfo
|
||||
import java.nio.ByteBuffer
|
||||
|
||||
/**
|
||||
* Repository class for world packets.
|
||||
* @author Emperor
|
||||
*/
|
||||
object WorldPacketRepository {
|
||||
/**
|
||||
* Sends the player registry response.
|
||||
* @param server The game server.
|
||||
* @param player The player session.
|
||||
* @param response The registry response.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendRegistryResponse(server: GameServer, player: PlayerSession, response: Response) {
|
||||
val buffer = IoBuffer(0, PacketHeader.BYTE)
|
||||
buffer.putString(player.username)
|
||||
buffer.put(response.opcode())//byte
|
||||
if (response == Response.MOVING_WORLD) {
|
||||
val delay: Long = WORLD_HOP_DELAY - (System.currentTimeMillis() - player.disconnectionTime)
|
||||
buffer.put((delay / 1000).toInt())
|
||||
}
|
||||
server.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to the player.
|
||||
* @param player The player.
|
||||
* @param message The message to send.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendPlayerMessage(player: PlayerSession?, message: String?) {
|
||||
if (player == null) {
|
||||
return
|
||||
}
|
||||
val buffer = IoBuffer(2, PacketHeader.BYTE)
|
||||
buffer.putString(player.username)
|
||||
buffer.putString(message)
|
||||
player.world.session.write(buffer)
|
||||
}
|
||||
|
||||
fun sendPlayerMessage(player: PlayerSession?, messages: Array<String?>) {
|
||||
if (player == null) {
|
||||
return
|
||||
}
|
||||
for (message in messages) sendPlayerMessage(player, message)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the contact information.
|
||||
* @param player The player.
|
||||
*/
|
||||
fun sendContactInformation(player: PlayerSession) {
|
||||
val info = player.communication
|
||||
val buffer = IoBuffer(3, PacketHeader.SHORT)
|
||||
buffer.putString(player.username)
|
||||
buffer.put(info.contacts.size)
|
||||
for (contact in info.contacts.keys) {
|
||||
buffer.putString(contact)
|
||||
buffer.put(info.getRank(contact).ordinal)
|
||||
buffer.put(CommunicationInfo.getWorldId(player, contact))
|
||||
}
|
||||
buffer.put(info.blocked.size)
|
||||
for (contact in info.blocked) {
|
||||
buffer.putString(contact)
|
||||
}
|
||||
if (info.currentClan == null) {
|
||||
buffer.put(0)
|
||||
} else {
|
||||
buffer.put(1)
|
||||
buffer.putString(info.currentClan)
|
||||
}
|
||||
player.world.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a contact update.
|
||||
* @param player The player who's contacts we're changing.
|
||||
* @param contact The contact to update.
|
||||
* @param block If we're updating the blocked list.
|
||||
* @param remove If the contact should be removed.
|
||||
* @param worldId The world id of the contact.
|
||||
* @param rank The clan rank.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendContactUpdate(
|
||||
player: PlayerSession,
|
||||
contact: String?,
|
||||
block: Boolean,
|
||||
remove: Boolean,
|
||||
worldId: Int,
|
||||
rank: ClanRank?
|
||||
) {
|
||||
val buffer = IoBuffer(4, PacketHeader.BYTE)
|
||||
buffer.putString(player.username)
|
||||
buffer.putString(contact)
|
||||
buffer.put((if (block) 1 else 0))
|
||||
if (rank != null) {
|
||||
buffer.put((2 + rank.ordinal))
|
||||
} else {
|
||||
buffer.put((if (remove) 1 else 0))
|
||||
if (!block && !remove) {
|
||||
buffer.put(worldId)
|
||||
}
|
||||
}
|
||||
player.world.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a clan message.
|
||||
* @param player The player to send the message to.
|
||||
* @param p The player sending the message.
|
||||
* @param message The message to send.
|
||||
* @param type The message type.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendMessage(player: PlayerSession, p: PlayerSession, type: Int, message: String?) {
|
||||
val buffer = IoBuffer(5, PacketHeader.BYTE)
|
||||
buffer.putString(player.username)
|
||||
buffer.putString(p.username)
|
||||
buffer.put(type)
|
||||
buffer.put(p.chatIcon)
|
||||
buffer.putString(message)
|
||||
println("Send Message: ${player.username} -> ${p.username} T: $type ICO: ${p.chatIcon} $message")
|
||||
player.world.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends clan information to the server.
|
||||
* @param server The server.
|
||||
* @param clan The clan.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendClanInformation(server: GameServer, clan: ClanRepository) {
|
||||
val buffer = IoBuffer(6, PacketHeader.SHORT)
|
||||
buffer.putString(clan.owner.username)
|
||||
buffer.putString(clan.name)
|
||||
var length = clan.players.size
|
||||
if (length > ClanRepository.MAX_MEMBERS) {
|
||||
length = ClanRepository.MAX_MEMBERS
|
||||
}
|
||||
buffer.put(length)
|
||||
for (i in 0 until length) {
|
||||
val player = clan.players[i]
|
||||
buffer.putString(player.username)
|
||||
buffer.put(player.worldId)
|
||||
buffer.put(clan.getRank(player).ordinal)
|
||||
}
|
||||
buffer.put(clan.joinRequirement.ordinal)
|
||||
buffer.put(clan.kickRequirement.ordinal)
|
||||
buffer.put(clan.messageRequirement.ordinal)
|
||||
buffer.put(clan.lootRequirement.ordinal)
|
||||
server.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the leave clan packet.
|
||||
* @param player The player leaving the clan.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendLeaveClan(player: PlayerSession) {
|
||||
val buffer = IoBuffer(7, PacketHeader.BYTE)
|
||||
buffer.putString(player.username)
|
||||
player.world.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the player login notification.
|
||||
* @param server The server.
|
||||
* @param player The player logging in.
|
||||
* @param names The names.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun notifyPlayers(server: GameServer, player: PlayerSession, names: List<String?>) {
|
||||
val buffer = IoBuffer(8, PacketHeader.SHORT)
|
||||
buffer.putString(player.username)
|
||||
buffer.put(player.worldId)
|
||||
buffer.put(names.size)
|
||||
for (name in names) {
|
||||
buffer.putString(name)
|
||||
}
|
||||
server.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the game server a player logged out.
|
||||
* @param server The game server to notify.
|
||||
* @param player The player logging out.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun notifyLogout(server: GameServer, player: PlayerSession) {
|
||||
val buffer = IoBuffer(9, PacketHeader.BYTE)
|
||||
buffer.putString(player.username)
|
||||
server.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the update countdown to the server.
|
||||
* @param server The server.
|
||||
* @param ticks The amount of ticks left.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendUpdate(server: GameServer, ticks: Int) {
|
||||
val buffer = IoBuffer(10)
|
||||
buffer.putInt(ticks)
|
||||
server.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the punishment update packet.
|
||||
* @param world The world to send the packet to.
|
||||
* @param key The punishment key.
|
||||
* @param type The punishment type.
|
||||
* @param duration The duration of the punishment.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendPunishUpdate(world: GameServer, key: String?, type: Int, duration: Long) {
|
||||
val buffer = IoBuffer(11, PacketHeader.BYTE)
|
||||
buffer.putString(key)
|
||||
buffer.put(type)
|
||||
buffer.putLong(duration)
|
||||
world.session.write(buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a configuration reload.
|
||||
* @param world the world.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun sendConfigReload(world: GameServer) {
|
||||
world.session.write(IoBuffer(15, PacketHeader.BYTE))
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles incoming world packets.
|
||||
* @param session The I/O session.
|
||||
* @param opcode The opcode.
|
||||
* @param b The buffer to read from.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun handleIncoming(session: IoSession, opcode: Int, b: ByteBuffer) {
|
||||
val buffer = IoBuffer(opcode, PacketHeader.NORMAL, b)
|
||||
val server = session.gameServer
|
||||
when (opcode) {
|
||||
0 -> handlePlayerRegistration(server, buffer)
|
||||
1 -> handlePlayerRemoval(server, buffer)
|
||||
2 -> handlePunishment(server, buffer)
|
||||
3 -> handleCommunicationRequest(server, buffer)
|
||||
4, 5 -> handleContactUpdate(server, buffer, opcode == 5)
|
||||
6 -> handleJoinClan(server, buffer)
|
||||
7 -> handleClanRename(server, buffer)
|
||||
8 -> handleClanSetting(server, buffer)
|
||||
9 -> handleClanKick(server, buffer)
|
||||
10 -> handleClanMessage(server, buffer)
|
||||
11 -> handlePrivateMessage(server, buffer)
|
||||
12 -> handleClanInfoRequest(server, buffer)
|
||||
13 -> handleChatSetting(server, buffer)
|
||||
14 -> handleInfoUpdate(server, buffer)
|
||||
else -> System.err.println("Handling incoming packet [opcode=" + opcode + ", size=" + b.limit() + "].")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the info of a player update.
|
||||
* @param server the server.
|
||||
* @param buffer the buffer.
|
||||
*/
|
||||
private fun handleInfoUpdate(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val player = server.players[username]
|
||||
if (player != null) {
|
||||
player.chatIcon = buffer.get()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a player registration.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handlePlayerRegistration(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val password = buffer.string
|
||||
val ipAddress = buffer.string
|
||||
val macAddress = buffer.string
|
||||
val compName = buffer.string
|
||||
val serial = buffer.string
|
||||
val rights = buffer.int
|
||||
val chatIcon = buffer.get()
|
||||
val uid = UIDInfo(ipAddress, compName, macAddress, serial)
|
||||
val player = PlayerSession(username, password, UIDInfo(ipAddress, compName, macAddress, serial))
|
||||
if (WorldDatabase.isActivePlayer(username)) {
|
||||
sendRegistryResponse(server, player, Response.ALREADY_ONLINE)
|
||||
return
|
||||
}
|
||||
player.uid = uid
|
||||
player.rights = rights
|
||||
player.chatIcon = chatIcon
|
||||
if (PunishmentStorage.isSystemBanned(uid)) {
|
||||
sendRegistryResponse(server, player, Response.BANNED)
|
||||
return
|
||||
}
|
||||
player.parse()
|
||||
if (player.isBanned) {
|
||||
sendRegistryResponse(server, player, Response.ACCOUNT_DISABLED)
|
||||
return
|
||||
}
|
||||
if (player.lastWorld != server.info.worldId && player.hasMovedWorld()) {
|
||||
sendRegistryResponse(server, player, Response.MOVING_WORLD)
|
||||
return
|
||||
}
|
||||
server.register(player)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the removal of a player.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handlePlayerRemoval(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val session = server.players[username]
|
||||
if (session != null) {
|
||||
session.isActive = false
|
||||
val player = server.players.remove(username)
|
||||
if (player != null) {
|
||||
session.remove()
|
||||
}
|
||||
session.worldId = 0
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a player registration.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handlePunishment(server: GameServer, buffer: IoBuffer) {
|
||||
val type = buffer.get() and 0xFF
|
||||
val target = buffer.string
|
||||
val duration = buffer.long
|
||||
val staff = buffer.string
|
||||
PunishmentStorage.handlePunishment(staff, target, type, duration)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the communication info request packet.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleCommunicationRequest(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val player = server.players[username] ?: return
|
||||
sendContactInformation(player)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a contact update packet.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer to read from.
|
||||
* @param block If the list is for blocked players.
|
||||
*/
|
||||
private fun handleContactUpdate(server: GameServer, buffer: IoBuffer, block: Boolean) {
|
||||
val username = buffer.string
|
||||
val player = server.players[username] ?: return
|
||||
val contact = buffer.string
|
||||
when (buffer.get()) {
|
||||
0 -> {
|
||||
if (block) {
|
||||
player.communication.block(contact)
|
||||
}
|
||||
player.communication.add(contact)
|
||||
}
|
||||
1 -> player.communication.remove(contact, block)
|
||||
2 -> player.communication.updateClanRank(contact, ClanRank.values()[buffer.get()])
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan related packet.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleJoinClan(server: GameServer, buffer: IoBuffer) {
|
||||
val name = buffer.string
|
||||
val clanName = buffer.string
|
||||
val player = server.players[name]
|
||||
if (player == null || !player.isActive) {
|
||||
System.err.println("Invalid player specified in clan packet!")
|
||||
return
|
||||
}
|
||||
if (player.clan != null) {
|
||||
player.clan.leave(player, true)
|
||||
return
|
||||
}
|
||||
if (clanName.length < 1) {
|
||||
sendLeaveClan(player)
|
||||
return
|
||||
}
|
||||
val clan = ClanRepository.get(server, clanName)
|
||||
if (clan == null) {
|
||||
sendPlayerMessage(
|
||||
player,
|
||||
arrayOf(
|
||||
"The channel you tried to join does not exist.",
|
||||
"Try joining the main clan named '2009Scape'.:clan:"
|
||||
)
|
||||
)
|
||||
return
|
||||
}
|
||||
clan.enter(player)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles renaming a clan.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleClanRename(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val name = buffer.string
|
||||
val player = server.players[username]
|
||||
if (player == null || !player.isActive) {
|
||||
return
|
||||
}
|
||||
val clan = ClanRepository.getClans()[username]
|
||||
player.communication.clanName = name
|
||||
if (clan != null) {
|
||||
if (name.isEmpty()) {
|
||||
clan.clean(true)
|
||||
} else {
|
||||
clan.rename(name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles changing clan settings packet.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleClanSetting(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val type = buffer.get()
|
||||
val rank = if (type < 4) ClanRank.values()[buffer.get() and 0xFF] else null
|
||||
val player = server.players[username]
|
||||
if (player == null || !player.isActive) {
|
||||
return
|
||||
}
|
||||
val clan = ClanRepository.get(server, username)
|
||||
when (type) {
|
||||
0 -> {
|
||||
player.communication.joinRequirement = rank
|
||||
clan?.clean(false)
|
||||
}
|
||||
1 -> player.communication.messageRequirement = rank
|
||||
2 -> {
|
||||
player.communication.kickRequirement = rank
|
||||
clan?.update()
|
||||
}
|
||||
3 -> player.communication.lootRequirement = rank
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles kicking a player from the clan.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleClanKick(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val playerName = buffer.string
|
||||
val player = server.players[username]
|
||||
if (player == null || !player.isActive || player.clan == null) {
|
||||
return
|
||||
}
|
||||
val target = WorldDatabase.getPlayer(playerName)
|
||||
if (target == null || !target.isActive) {
|
||||
return
|
||||
}
|
||||
player.clan.kick(player, target)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan message.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleClanMessage(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val message = buffer.string
|
||||
val player = server.players[username]
|
||||
if (player == null || !player.isActive || player.clan == null) {
|
||||
return
|
||||
}
|
||||
player.clan.message(player, message)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan message.
|
||||
* @param server The game server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handlePrivateMessage(server: GameServer, buffer: IoBuffer) {
|
||||
val username = buffer.string
|
||||
val receiver = buffer.string
|
||||
val message = buffer.string
|
||||
val player = server.players[username]
|
||||
if (player == null || !player.isActive) {
|
||||
return
|
||||
}
|
||||
player.communication.sendMessage(receiver, message)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a clan information request packet.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleClanInfoRequest(server: GameServer, buffer: IoBuffer) {
|
||||
val name = buffer.string
|
||||
val clan = ClanRepository.get(server, name) ?: return
|
||||
sendClanInformation(server, clan)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a chat setting update packet.
|
||||
* @param server The server.
|
||||
* @param buffer The buffer.
|
||||
*/
|
||||
private fun handleChatSetting(server: GameServer, buffer: IoBuffer) {
|
||||
val name = buffer.string
|
||||
val publicSetting = buffer.get()
|
||||
val privateSetting = buffer.get()
|
||||
val tradeSetting = buffer.get()
|
||||
val player = server.players[name]
|
||||
if (player == null || !player.isActive) {
|
||||
return
|
||||
}
|
||||
player.communication.updateSettings(publicSetting, privateSetting, tradeSetting)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,9 @@
|
|||
package ms.system;
|
||||
package ms.system
|
||||
|
||||
/**
|
||||
* The operating systems
|
||||
* @author Clayton Williams
|
||||
*
|
||||
*/
|
||||
public enum OperatingSystem {
|
||||
|
||||
UNIX,
|
||||
WINDOWS
|
||||
|
||||
}
|
||||
enum class OperatingSystem {
|
||||
UNIX, WINDOWS
|
||||
}
|
||||
|
|
@ -476,11 +476,6 @@ public final class CommunicationInfo {
|
|||
* @return The rank.
|
||||
*/
|
||||
public ClanRank getRank(String contact) {
|
||||
for (String name : ServerConstants.ADMINISTRATORS) {
|
||||
if (contact.equals(name)) {
|
||||
return ClanRank.ADMINISTRATOR;
|
||||
}
|
||||
}
|
||||
return contacts.get(contact);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,100 +0,0 @@
|
|||
package ms.system.mysql;
|
||||
|
||||
import ms.ServerConstants;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* Manages the sql connections.
|
||||
* @author Vexia
|
||||
*
|
||||
*/
|
||||
public final class SQLManager {
|
||||
|
||||
/**
|
||||
* If the sql manager is locally hosted.
|
||||
*/
|
||||
public static final boolean LOCAL = true;
|
||||
|
||||
/**
|
||||
* The database URL.
|
||||
*/
|
||||
public static final String DATABASE_URL = (LOCAL ? "127.0.0.1" : "keldagrim.org") + ":3306/" + (SQLManager.LOCAL ? "global" : ServerConstants.DATABASE_NAMES[1]);
|
||||
|
||||
/**
|
||||
* The username of the user.
|
||||
*/
|
||||
private static final String USERNAME = (LOCAL ? "root" : "keldagr1_user");
|
||||
|
||||
/**
|
||||
* The password of the user.
|
||||
*/
|
||||
private static final String PASSWORD = (LOCAL ? "" : "2jf4wkz$");
|
||||
|
||||
|
||||
/**
|
||||
* IF the sql manager is initialized.
|
||||
*/
|
||||
private static boolean initialized;
|
||||
|
||||
/**
|
||||
* Constructs a new {@code SQLManager} {@code Object}
|
||||
*/
|
||||
public SQLManager() {
|
||||
/**
|
||||
* empty.
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the sql manager.
|
||||
*/
|
||||
public static void init() {
|
||||
initialized = true;
|
||||
WorldListSQLHandler.clearWorldList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a connection from the pool.
|
||||
* @return The connection.
|
||||
*/
|
||||
public static Connection getConnection() {
|
||||
try {
|
||||
return DriverManager.getConnection("jdbc:mysql://" + DATABASE_URL + "?useTimezone=true&serverTimezone=UTC", USERNAME, PASSWORD);
|
||||
} catch (SQLException e) {
|
||||
System.out.println("Error: Mysql error message=" + e.getMessage() + ".");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Releases the connection so it's available for usage.
|
||||
* @param connection The connection.
|
||||
*/
|
||||
public static void close(Connection connection) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the initialized.
|
||||
* @return the initialized
|
||||
*/
|
||||
public static boolean isInitialized() {
|
||||
return initialized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the bainitialized.
|
||||
* @param initialized the initialized to set.
|
||||
*/
|
||||
public static void setInitialized(boolean initialized) {
|
||||
SQLManager.initialized = initialized;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
package ms.system.mysql
|
||||
|
||||
import ms.system.util.ManagementConstants
|
||||
import ms.system.util.ManagementConstants.Companion.DATABASE_HOST_ADDRESS
|
||||
import ms.system.util.ManagementConstants.Companion.DATABASE_NAME
|
||||
import ms.system.util.ManagementConstants.Companion.DATABASE_PASSWORD
|
||||
import ms.system.util.ManagementConstants.Companion.DATABASE_PORT
|
||||
import ms.system.util.ManagementConstants.Companion.DATABASE_USERNAME
|
||||
import java.sql.Connection
|
||||
import java.sql.DriverManager
|
||||
import java.sql.SQLException
|
||||
|
||||
/**
|
||||
* Manages the sql connections.
|
||||
* @author Vexia
|
||||
*/
|
||||
object SQLManager {
|
||||
|
||||
/**
|
||||
* IF the sql manager is initialized.
|
||||
*/
|
||||
var isInitialized = false
|
||||
|
||||
/**
|
||||
* Initializes the sql manager.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun init() {
|
||||
isInitialized = true
|
||||
WorldListSQLHandler.clearWorldList()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a connection from the pool.
|
||||
* @return The connection.
|
||||
*/
|
||||
@JvmStatic
|
||||
val connection: Connection?
|
||||
get() {
|
||||
try {
|
||||
return DriverManager.getConnection(
|
||||
"jdbc:mysql://$DATABASE_HOST_ADDRESS:$DATABASE_PORT/$DATABASE_NAME?useTimezone=true&serverTimezone=UTC",
|
||||
DATABASE_USERNAME,
|
||||
DATABASE_PASSWORD
|
||||
)
|
||||
} catch (e: SQLException) {
|
||||
println("Error: Mysql error message=" + e.message + ".")
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Releases the connection so it's available for usage.
|
||||
* @param connection The connection.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun close(connection: Connection) {
|
||||
try {
|
||||
connection.close()
|
||||
} catch (e: SQLException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
package ms.system.util
|
||||
|
||||
import org.json.simple.JSONObject
|
||||
import org.json.simple.parser.JSONParser
|
||||
import java.io.File
|
||||
import java.io.FileReader
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
/**
|
||||
* Class for parsing the server config, I.E default.json
|
||||
* @param path the path to the JSON file to parse.
|
||||
* @author Ceikry
|
||||
*/
|
||||
class ManagementConfigParser(path: String) {
|
||||
val pathTo = parsePath(path)
|
||||
val confFile = File(pathTo)
|
||||
val parser = JSONParser()
|
||||
var reader: FileReader? = null
|
||||
var data: JSONObject? = null
|
||||
|
||||
init {
|
||||
if(!confFile.canonicalFile.exists()){
|
||||
println("Could not find ${confFile.canonicalFile} - Double check your working directory!")
|
||||
exitProcess(0)
|
||||
} else if(!pathTo.contains(".json")) {
|
||||
println("Config file MUST be a JSON file!!")
|
||||
println("(Got $pathTo)")
|
||||
} else {
|
||||
reader = FileReader(pathTo)
|
||||
data = parser.parse(reader) as JSONObject
|
||||
parseDatabaseInformation()
|
||||
parseWorldTechnicalSettings()
|
||||
}
|
||||
}
|
||||
|
||||
private fun parseDatabaseInformation(){
|
||||
data ?: return
|
||||
val dbData = data!!["DatabaseInformation"] as JSONObject
|
||||
ManagementConstants().parseDBProp(dbData)
|
||||
}
|
||||
|
||||
private fun parseWorldTechnicalSettings(){
|
||||
data ?: return
|
||||
val wtiData = data!!["WorldTechnicalInformation"] as JSONObject
|
||||
ManagementConstants().parseWTIProp(wtiData)
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a path string
|
||||
* @author Ceikry
|
||||
* @param pathString The string to parse
|
||||
* @return a String with the proper file separators for the current OS.
|
||||
*/
|
||||
fun parsePath(pathString: String): String {
|
||||
var pathTokens: List<String>? = null
|
||||
if(pathString.contains("/"))
|
||||
pathTokens = pathString.split("/")
|
||||
else if(pathString.contains("\\"))
|
||||
pathTokens = pathString.split("\\")
|
||||
|
||||
pathTokens ?: return pathString //return the initial pathString if path does not contain file separators.
|
||||
var pathProduct = ""
|
||||
for(token in pathTokens){
|
||||
if(token != "")
|
||||
pathProduct += "$token${File.separator}"
|
||||
}
|
||||
|
||||
return pathProduct
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
package ms.system.util
|
||||
|
||||
import org.json.simple.JSONObject
|
||||
|
||||
class ManagementConstants {
|
||||
|
||||
companion object {
|
||||
|
||||
//MySQL main database name
|
||||
var DATABASE_NAME: String = "global"
|
||||
|
||||
//MySQL database username
|
||||
var DATABASE_USERNAME: String = "root"
|
||||
|
||||
//MySQL database password
|
||||
var DATABASE_PASSWORD: String = ""
|
||||
|
||||
//MySQL host
|
||||
var DATABASE_HOST_ADDRESS: String = "127.0.0.1"
|
||||
|
||||
//MySQL port
|
||||
var DATABASE_PORT: Int = 3306
|
||||
|
||||
//Max amount of worlds supported on the world list
|
||||
var MAX_WORLD_AMOUNT: Int = 10
|
||||
|
||||
//User world hop delay in seconds
|
||||
var WORLD_HOP_DELAY: Long = 20_000L
|
||||
|
||||
}
|
||||
|
||||
fun parseDBProp(data: JSONObject) {
|
||||
DATABASE_NAME = data["database_name"].toString()
|
||||
DATABASE_USERNAME = data["database_username"].toString()
|
||||
DATABASE_PASSWORD = data["database_password"].toString()
|
||||
DATABASE_HOST_ADDRESS = data["database_host"].toString()
|
||||
DATABASE_PORT = data["database_port"].toString().toInt()
|
||||
}
|
||||
|
||||
fun parseWTIProp(data: JSONObject) {
|
||||
MAX_WORLD_AMOUNT = data["world_limit"].toString().toInt()
|
||||
WORLD_HOP_DELAY = data["worldhop_delay"].toString().toLong()
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -47,13 +47,13 @@ public class WorldDatabase {
|
|||
buf.putShort((short) 0);
|
||||
buf.put((byte) 1);
|
||||
IoBuffer buffer = new IoBuffer();
|
||||
if (updateStamp != (int) WorldDatabase.updateStamp) {
|
||||
if (updateStamp == (int) WorldDatabase.updateStamp) {
|
||||
buf.put((byte) 0);
|
||||
} else {
|
||||
buf.put((byte) 1); // Indicates an update occured.
|
||||
putWorldListinfo(buffer);
|
||||
} else {
|
||||
buf.put((byte) 0);
|
||||
}
|
||||
putPlayerInfo(buffer);
|
||||
putPlayerInfo(buffer);
|
||||
if (buffer.toByteBuffer().position() > 0) {
|
||||
buf.put((ByteBuffer) buffer.toByteBuffer().flip());
|
||||
}
|
||||
|
|
@ -85,18 +85,21 @@ public class WorldDatabase {
|
|||
buffer.putJagString(capitalize(country.name().toLowerCase()));
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Stole this from a library so we don't need the dependency
|
||||
*/
|
||||
|
||||
/**
|
||||
* Converts a string to a capitalized string
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
private static String capitalize(String name) {
|
||||
if (name != null && name.length() != 0) {
|
||||
if (name == null || name.length() == 0) {
|
||||
return name;
|
||||
} else {
|
||||
char[] chars = name.toCharArray();
|
||||
chars[0] = Character.toUpperCase(chars[0]);
|
||||
return new String(chars);
|
||||
} else {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the world configuration on the packet.
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ dependencies {
|
|||
implementation "org.jetbrains:markdown-jvm:0.2.0.pre-55"
|
||||
implementation 'com.google.guava:guava:29.0-jre'
|
||||
implementation 'mysql:mysql-connector-java:8.0.21'
|
||||
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
|
||||
implementation 'io.github.classgraph:classgraph:4.8.98'
|
||||
implementation 'org.jetbrains.kotlin:kotlin-reflect'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue