Compare commits

..

9 Commits

Author SHA1 Message Date
dependabot[bot] 74f7b7f034 Bump xstream from 1.4.18 to 1.4.19 in /2006Scape Server
Bumps [xstream](https://github.com/x-stream/xstream) from 1.4.18 to 1.4.19.
- [Release notes](https://github.com/x-stream/xstream/releases)
- [Commits](https://github.com/x-stream/xstream/commits)

---
updated-dependencies:
- dependency-name: com.thoughtworks.xstream:xstream
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-04 01:04:22 +00:00
darkaidz98@gmail.com 81cd126a33 Revert Library Updates To Fix Server 2022-01-29 10:45:52 +00:00
Josh Shippam 54a3e5cdec Various Changes (#523)
* Discord Bot Update

Updated JavaCord To Latest
Changed Some Commands To No Longer Be World Specific
Added An "AdminCommands" Command

* Update Some Server Libs

* Added Purge & Pin/Un-Pin To Commands Discord Bot

* Fixed -dev & -no-crc Client Args

* Add Discord User ID Linking Support(Useless For Now)

* Added Support For User's Kicking Own Accounts Through Discord Bot

* Merge Website Integration Stuff Into One Var
2022-01-27 01:32:17 +00:00
Teddy 63055f9181 East falador staircase was falling into the last if which was teleporting the player to a void (#522)
Co-authored-by: Sad Emu <wcpro111@gmail.com>
2022-01-22 03:32:48 +00:00
Teddy 9a3cf5867a Added jad ranged attack projectile (#521)
Co-authored-by: Sad Emu <wcpro111@gmail.com>
2022-01-20 23:53:19 +00:00
Dark98 c5c4471a4f Added Current World To Client Title 2022-01-08 01:54:00 +00:00
Dark98 500441d551 Added/Fixed Right Click Banking For Fadli(Duel Arena Banker) 2022-01-08 00:46:56 +00:00
Dark98 803346323b Fix Discord Bot Derp 2022-01-08 00:18:35 +00:00
Josh Shippam e1a8d85408 Second World Setup (#518)
* Start Setting Up Second World

Added World Number To Login Message
Added World Number To Login Interface
Made World 2 Listen On Different Port
Made Client Connect To 43597 For World 2

* Small Cleanup For World 2 Support

Calculate Port For World Based On World Number
Use Existing World int For World In Server

* Woops Wrong Ports

* Set Server Port After Loading Config

* Add xpRate Var & Include With XPRate Calculations

* Add -w/-world arg to client

* Add XP Rate Multiplier For Non-Bot Worlds

* More Multi World Stuff

Update Integrations(Discord Bot/Website Stuff) For Multiple Worlds
Added More XP Rate Dialogue Stuff

* Add Kick Command To Discord Bot & Fix Type In ConfigLoader

* Create/Use commandPrefix Var For Discord Bot

* Small Fixup For World 2

Renamed BOT_WORLD to VARIABLE_XP_RATE
Fixed Dialogue/Message grammar
Added a check for VARIABLE_XP_RATES to ::xprate command

* More Discord Commands(GameKick, MoveHome & Update)

*GameKick kicks A player if their client froze but acc stayed logged in
*MoveHome removes the need for ::stuck which removes potential for abuse
*Update schedules A server update

* Minor fixup

* 43597 → 43598

* Fix XP Rate Multiplier & add ::xprate to cooamnds list if enabled

* Use Either VARIABLE_SKILL_RATE OR XP_RATE Not Both

TODO(Convert Player.xpRate Into An Array For Easier Rate Changes)

* Create/Use PLAYER_XP_RATES For Easier Rate Changes

* Fixed Abusive Client Command Privileges & Added myxprate/checkxprate

* Allow Loading VARIABLE_XP_RATES & PLAYER_XP_RATES From Config

* Properly Update Client Title Logo

If The Cache Has Already Been Downloaded You Will Need To Delete It & Let The Client ReDownload It

* Fix Cache CRC Checks For The Client(Allows Cache To Actually Check For Updates)

* Add -no-crc & -dev Arguments To Client

* Fix Naming For Some Vars

* Make CHECK_CRC Description More Descriptive

* Fix More Var Descriptions

* Cleanup Unused GameConstants Vars & Add More Vars To ConfigLoader

Co-authored-by: Danial <admin@redsparr0w.com>
2021-12-31 03:47:48 +00:00
39 changed files with 8184 additions and 2059 deletions
+4 -16
View File
@@ -1,4 +1,4 @@
# This workflow will build a Java project with Maven
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
@@ -11,7 +11,9 @@ on:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
@@ -19,18 +21,4 @@ jobs:
with:
java-version: 1.8
- name: Build with Maven
id: build
run: |
mvn -B clean package
mkdir -p ~/artifacts
cp "2006Scape Client/target/client-1.0-jar-with-dependencies.jar" ~/artifacts/Client.jar
cp "2006Scape Server/target/server-1.0-jar-with-dependencies.jar" ~/artifacts/Server.jar
cp "2006Scape Server/ServerConfig.Sample.json" ~/artifacts/ServerConfig.json
cp SinglePlayer.bat ~/artifacts/
cp -r "2006Scape Server/plugins" ~/artifacts/
cp -r "2006Scape Server/data" ~/artifacts/
- name: Publish build to GH Actions
uses: actions/upload-artifact@v2
with:
path: ~/artifacts/*
name: 2006Scape-Build
run: mvn -B clean install
+9 -9
View File
@@ -10970,7 +10970,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3425,
@@ -10980,7 +10980,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3428,
@@ -10990,7 +10990,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3425,
@@ -11000,7 +11000,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3423,
@@ -11010,7 +11010,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3427,
@@ -11020,7 +11020,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3416,
@@ -11030,7 +11030,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3413,
@@ -11040,7 +11040,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3410,
@@ -11050,7 +11050,7 @@
"height": 2
},
{
"maxHit": 8,
"maxHit": 16,
"strength": 150,
"attack": 250,
"x": 3413,
@@ -1,41 +0,0 @@
package plugin.buttons
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.ButtonActionEvent
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.players.Player
import plugin.buttons.ButtonClick
@SubscribesTo(ButtonActionEvent::class)
class DialogueOptionButtons : ButtonClick() {
override fun execute(player: Player, event: ButtonActionEvent) {
when (event.button) {
// First Option (Option Interfaces 2, 3, 4, and 5)
9157, 9167, 9178, 9190 ->
player.dialogueFactory.executeOption(0, player.optionDialogue)
// Second Option (Option Interfaces 2, 3, 4, and 5)
9158, 9168, 9179, 9191 ->
player.dialogueFactory.executeOption(1, player.optionDialogue)
// Third Option (Option Interfaces 3, 4, and 5)
9169, 9180, 9192 ->
player.dialogueFactory.executeOption(2, player.optionDialogue)
// Fourth Option (Option Interfaces 4 and 5)
9181, 9193 ->
player.dialogueFactory.executeOption(3, player.optionDialogue)
// Fifth Option (Option Interface 5)
9194 ->
player.dialogueFactory.executeOption(4, player.optionDialogue)
}
}
override fun test(event: ButtonActionEvent): Boolean {
return DialoguePlugin.isDialogueButton(event.button)
}
}
@@ -1,28 +1,35 @@
package plugin.npc.manwoman
package plugin.click.npc
import com.rs2.GameConstants
import com.rs2.event.EventContext
import com.rs2.event.EventSubscriber
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.NpcFirstClickEvent
import com.rs2.game.content.skills.SkillHandler
import com.rs2.game.npcs.Npc
import com.rs2.game.players.Player
import com.rs2.util.Misc
import plugin.npc.banker.BankerDialogue
import plugin.npc.manwoman.ManWomanDialogue
@SubscribesTo(NpcFirstClickEvent::class)
class FirstClick : EventSubscriber<NpcFirstClickEvent> {
class NpcFirstClick : EventSubscriber<NpcFirstClickEvent> {
override fun subscribe(context: EventContext, player: Player, event: NpcFirstClickEvent) {
if (player.playerRights >= 3) {
player.packetSender.sendMessage("[click= npc], [type = first], [id= ${event.npc}], [Type= ${event.npc}]")
player.packetSender.sendMessage("[click= npc], [type = first], [id= ${event.npc}], [Type= ${event.npc}]");
}
when(event.npc) {
// Man or Woman
1,2,3,4,5,6 -> player.dialogueFactory.sendDialogue(ManWomanDialogue(Misc.random(22)))
1,2,3,4,5,6 -> if (Misc.random(10) <= 5) {
player.dialogueHandler.sendDialogues(3869, player.npcType)
} else {
player.dialogueHandler.sendDialogues(3872, player.npcType)
}
//else ->
}
}
}
@@ -1,37 +0,0 @@
package plugin.npc.banker
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.dialogues.DialogueFactoryPlugin
import com.rs2.game.dialogues.ExpressionPlugin
/**
* The Dialogue Class for Gnome and Human Banker NPCs
* Does NOT include dialogue for Ghost Bankers
* @author Qweqker
*/
class BankerDialogue : DialoguePlugin() {
override fun sendDialogues(factory: DialogueFactoryPlugin) {
factory
.sendNPCChat(ExpressionPlugin.HAPPY, "Good day. How may I help you?")
.sendOption("I'd like to access my bank account, please.", {
factory
.onAction {
factory.player.packetSender.openUpBank()
}
}, "I'd like to check my PIN settings.", {
factory
.onAction {
factory.player.bankPin.bankPinSettings()
}
}, "What is this place?") {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT,"What is this place?")
.sendNPCChat(ExpressionPlugin.DEFAULT,"This is the bank of <servername>. We have many branches in many towns.")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"And what do you do?")
.sendNPCChat(ExpressionPlugin.DEFAULT,"We will look after your items and money for you. Leave your valuables with us if you want to keep them safe.")
}
.execute()
}
}
@@ -1,32 +0,0 @@
package plugin.npc.banker
import com.rs2.event.EventContext
import com.rs2.event.EventSubscriber
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.NpcFirstClickEvent
import com.rs2.game.content.skills.SkillHandler
import com.rs2.game.players.Player
import com.rs2.util.Misc
import plugin.npc.banker.BankerDialogue
import plugin.npc.manwoman.ManWomanDialogue
@SubscribesTo(NpcFirstClickEvent::class)
class FirstClick : EventSubscriber<NpcFirstClickEvent> {
override fun subscribe(context: EventContext, player: Player, event: NpcFirstClickEvent) {
if (player.playerRights >= 3) {
player.packetSender.sendMessage("[click= npc], [type = first], [id= ${event.npc}], [Type= ${event.npc}]")
}
when(event.npc) {
// Banker (NOT INCLUDING GHOST BANKER IN PORT PHASMATYS)
166, 494, 495, 496, 497, 498, 499, 953, 1036, 1360, 2163, 2164, 2354, 2355, 2568, 2569, 2570 -> {
if (!SkillHandler.isSkilling(player)) {
player.dialogueFactory.sendDialogue(BankerDialogue())
}
}
}
}
}
@@ -1,163 +0,0 @@
package plugin.npc.manwoman
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.dialogues.DialogueFactoryPlugin
import com.rs2.game.dialogues.ExpressionPlugin
/**
* The Dialogue Class for Man and Woman NPCs
* @author Qweqker
*/
class ManWomanDialogue(private val randomDialogue: Int) : DialoguePlugin() {
override fun sendDialogues(factory: DialogueFactoryPlugin) {
// Since Man and Woman NPCs provide a random dialogue every interaction, use a switch statement
// There are 23 dialogues, but a random number is rolled between 0 and 22 in the FirstClick.kt file
// as part of the calling process
when(randomDialogue) {
0 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Not too bad, but I'm a little worried about the increase of goblins these days.")
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Don't worry, I'll kill them.")
.execute()
1 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "How can I help you?")
.sendOption("Do you want to trade? ", {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT,"Do you want to trade?")
.sendNPCChat(ExpressionPlugin.DEFAULT,"No, I have nothing I wish to get rid of. If you want to do some trading, there are plenty of shops and market stalls around though.")
}, "I'm in search of a quest.", {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT,"I'm in search of a quest.")
.sendNPCChat(ExpressionPlugin.DEFAULT,"I'm sorry I can't help you there.")
}, "I'm in search of enemies to kill.") {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "I'm in search of enemies to kill.")
.sendNPCChat(ExpressionPlugin.DEFAULT,"I've heard there are many fearsome creatures that dwell under the ground...")
}
.execute()
2 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.ANNOYED, "Get out of my way, I'm in a hurry!")
.execute()
3 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.HAPPY, "I'm fine, how are you?")
.sendPlayerChat(ExpressionPlugin.HAPPY, "Very well thank you.")
.execute()
4 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.HAPPY, "Hello there! Nice weather we've been having.")
.execute()
5 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.HAPPY, "I'm very well thank you.")
.execute()
6 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Who are you?")
.sendPlayerChat(ExpressionPlugin.DEFAULT, "I'm a bold adventurer.")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Ah, a very noble profession.")
.execute()
7 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.ANNOYED, "Do I know you? I'm in a hurry!")
.execute()
8 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I think we need a new king. The one we've got isn't very good.")
.execute()
9 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Not too bad thanks.")
.execute()
10 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Are you asking for a fight?")
/* TODO: Have NPC Attack Player
.onAction {
}*/
.execute()
11 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I'm busy right now.")
.execute()
12 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Hello.")
.execute()
13 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "None of your business.")
.execute()
14 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"Do you wish to trade?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "No, I have nothing I wish to get rid of. If you want to do some trading, there are plenty of shops and market stalls around though.")
.execute()
15 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"I'm in search of a quest.")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I'm sorry I can't help you there.")
.execute()
16 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"I'm in search of enemies to kill.")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I've heard there are many fearsome creatures that dwell under the ground...")
.execute()
17 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.ANNOYED, "No I don't have any spare change.")
.execute()
18 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DISTRESSED, "I'm a little worried - I've heard there's lots of people going about, killing citizens at random.")
.execute()
19 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DISTRESSED, "No, I don't want to buy anything!")
.execute()
20 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "That is classified information.")
.execute()
21 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Have this flyer...")
.onAction {
factory.player.itemAssistant.addOrDropItem(956, 1)
}
.execute()
22 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Yo, wassup!")
.execute()
}
}
}
@@ -1,26 +0,0 @@
package plugin.quests.cooksassistant
import com.rs2.event.EventContext
import com.rs2.event.EventSubscriber
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.NpcFirstClickEvent
import com.rs2.game.players.Player
import plugin.quests.cooksassistant.dialogue.LumbridgeCookDialogue
@SubscribesTo(NpcFirstClickEvent::class)
class FirstClick : EventSubscriber<NpcFirstClickEvent> {
override fun subscribe(context: EventContext, player: Player, event: NpcFirstClickEvent) {
when(event.npc) {
//Lumbridge Cook (278)
278 -> {
if (player.playerRights >= 3) {
player.packetSender.sendMessage("[click= npc], [type = first/quest], [id= ${event.npc}], [Type= ${event.npc}]")
}
player.dialogueFactory.sendDialogue(LumbridgeCookDialogue())
}
}
}
}
@@ -1,151 +0,0 @@
package plugin.quests.cooksassistant.dialogue
import com.rs2.game.content.quests.QuestAssistant
import com.rs2.game.content.quests.QuestRewards
import com.rs2.game.dialogues.DialogueFactoryPlugin
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.dialogues.ExpressionPlugin
/**
* The Dialogue For The Lumbridge Castle Cook/Cooks Assistant Quest
*/
class LumbridgeCookDialogue : DialoguePlugin() {
override fun sendDialogues(factory: DialogueFactoryPlugin) {
if (factory.player.cookAss == 0) {
factory
.sendNPCChat(ExpressionPlugin.ANXIOUS, "What am I to do?")
.sendOption("What's wrong?", {
factory
.onAction {
factory
.sendPlayerChat("What's wrong?")
.sendNPCChat(
"Oh dear, oh dear, oh dear, I'm in a terrible terrible",
"mess! It's the Duke's birthday today, and I should be",
"making him a lovely big birthday cake!"
)
.sendNPCChat(
"I've forgotten to buy the ingredients. I'll never get",
"them in time now. He'll sack me! What will I do? I have",
"four children and a goat to look after. Would you help",
"me? Please?"
)
.sendOption("I'm always happy to help a cook in distress", {
factory.onAction {
factory
.sendPlayerChat("Yes, I'll help you.")
.sendNPCChat(
"Oh thank you, thank you. I need milk, an egg, and",
"flour. I'd be very grateful if you can get them for me."
)
.sendPlayerChat("So where do I find these ingredients then?")
.sendNPCChat(
"You can find flour in any of the shops here.",
"You can find eggs by killing chickens.",
"You can find milk by using a bucket on a cow"
)
.execute()
.player.cookAss = 1
QuestAssistant.sendStages(factory.player)
}
},
"I can't right now, Maybe later.", {
factory.onAction {
factory
.sendPlayerChat("I can't right now, Maybe later.")
.sendNPCChat("Oh please! Hurry then!")
.execute()
}
})
}
}, "Can you cook me a cake?", {
factory
.onAction {
factory
.sendNPCChat("Does it look like I have the time?")
.execute()
}
}, "You don't look very happy.", {
factory
.sendPlayerChat(ExpressionPlugin.ANXIOUS, "You don't look so happy.")
.sendNPCChat(
"Oh dear, oh dear, oh dear, I'm in a terrible terrible",
"mess! It's the Duke's birthday today, and I should be",
"making him a lovely big birthday cake!"
)
.sendNPCChat(
"I've forgotten to buy the ingredients. I'll never get",
"them in time now. He'll sack me! What will I do? I have",
"four children and a goat to look after. Would you help",
"me? Please?"
)
.sendOption("I'm always happy to help a cook in distress", {
factory.onAction {
factory
.sendPlayerChat("Yes, I'll help you.")
.sendNPCChat(
"Oh thank you, thank you. I need milk, an egg, and",
"flour. I'd be very grateful if you can get them for me."
)
.sendPlayerChat("So where do I find these ingredients then?")
.sendNPCChat(
"You can find flour in any of the shops here.",
"You can find eggs by killing chickens.",
"You can find milk by using a bucket on a cow"
)
.execute()
.player.cookAss = 1
QuestAssistant.sendStages(factory.player)
}
},
"I can't right now, Maybe later.", {
factory.onAction {
factory
.sendPlayerChat("I can't right now, Maybe later.")
.sendNPCChat("Oh please! Hurry then!")
.execute()
}
})
}, "Nice hat.") {
factory
.sendNPCChat("I don't have time for your jibber-jabber!")
}
.execute()
} else if(factory.player.cookAss == 1) {
factory
.sendNPCChat("How are you getting on with finding the ingredients?")
if (factory.player.itemAssistant.playerHasItem(1944, 1)
&& factory.player.itemAssistant.playerHasItem(1927, 1)
&& factory.player.itemAssistant.playerHasItem(1933, 1)
) {
factory.sendPlayerChat("Here's all the items!")
factory.player.itemAssistant.deleteItem(1944, 1)
factory.player.itemAssistant.deleteItem(1927, 1)
factory.player.itemAssistant.deleteItem(1933, 1)
factory.player.cookAss = 2
factory.sendNPCChat("You brought me everything I need! I'm saved!", "Thank you!")
.sendPlayerChat("So do I get to go to the Duke's Party?")
.sendNPCChat("I'm afraid not, only the big cheeses get to dine with the", "Duke.")
.sendPlayerChat("Well, maybe one day I'll be important enough to sit on", "the Duke's table")
.sendNPCChat("Maybe, but I won't be holding my breath.")
QuestRewards.cookReward(factory.player)
} else {
factory.sendPlayerChat("I don't have all the items yet.")
.sendNPCChat("Oh please! Hurry then!")
.execute()
}
} else if(factory.player.cookAss == 2) {
factory
.sendPlayerChat("So do I get to go to the Duke's Party?")
.sendNPCChat("I'm afraid not, only the big cheeses get to dine with the", "Duke.")
.sendPlayerChat("Well, maybe one day I'll be important enough to sit on", "the Duke's table")
.sendNPCChat("Maybe, but I won't be holding my breath.")
QuestRewards.cookReward(factory.player)
} else if(factory.player.cookAss == 3) {
factory.sendNPCChat("Thanks for helping me out friend!")
}
}
}
+3 -3
View File
@@ -50,7 +50,7 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4.1</version>
<version>2.10.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
@@ -128,7 +128,7 @@
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.17</version>
<version>1.4.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javacord/javacord-api -->
<dependency>
@@ -146,7 +146,7 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.everythingrs</groupId>
@@ -11,9 +11,7 @@ import com.rs2.game.players.Player;
public enum NpcEmotes {
MAN(new int[] {1, 2, 3, 4, 5, 6}, 422, 1834, 836),
AL_KHARID_WARRIOR(new int[] {18}, 451, 1156, 836),
GUARD(new int[] {9}, 412, 1156, 836),
GUARD_NO_SHIELD(new int[] {10}, 412, 404, 836),
GUARD(new int[] {9, 10}, 412, 404, 836),
GARGOYLE(new int[] {1610, 1611}, 1517, 1519, 1518),
SKELETAL_WYVERN(new int[] {3068}, 2989, 2988, 2987),
BAT(new int[] {412, 78}, 30, 31, 36),
@@ -24,7 +24,7 @@ public class Food {
MANTA(391, 22, "Manta Ray", 0, "Food", false),
SHARK(385, 20, "Shark", 0, "Food", false),
LOBSTER(379, 12, "Lobster", 0, "Food", false),
KARAMBWAN(3144, 18, "Karambwan", 0, "Food", false),
KARAMBWAN(3144, 2 + Misc.random(4), "Karambwan", 0, "Food", false),
TROUT(333, 7, "Trout", 0, "Food", false),
SALMON(329, 9, "Salmon", 0, "Food", false),
SWORDFISH(373, 14, "Swordfish", 0, "Food", false),
@@ -38,9 +38,8 @@ public class Cooking extends SkillHandler {
LOBSTER(377, 379, 381, 40, 120, 74, 68, "lobster"),
SWORDFISH(371, 373, 375, 50, 140, 86, 81, "swordfish"),
MONKFISH(7944, 7946, 7948, 62, 150, 92, 90, "monkfish"),
SHARK(383, 385, 387, 76, 210, 100, 94, "shark"),
SEA_TURTLE(395, 397, 399, 82, 211, 100, 100, "sea turtle"),
MANTA_RAY(389, 391, 393, 91, 216, 100, 100, "manta ray"),
SHARK(383, 385, 387, 76, 210, 100, 94, "shark"),
MANTA_RAY(389, 391, 393, 91, 169, 100, 100, "manta ray"),
SEAWEED(401, 1781, 1781, 1, 1, 1, 1, "sea weed"),
CURRY(2009, 2011, 2013, 60, 280, 74, 74, "curry");
@@ -1,14 +0,0 @@
package com.rs2.game.dialogues;
import java.util.function.Consumer;
/**
* The chain-able interface that allows implementing dialogue factories the ability to chain
* together.
*
* @author Vult-R
*/
public interface ChainablePlugin extends Consumer<DialogueFactoryPlugin> {
}
@@ -4,12 +4,7 @@ package com.rs2.game.dialogues;
* ChatEmotes.java
* @author Andrew (Mr Extremez)
*/
/**
* Contains a List of Chat Head Emotes NPCs and Players can use during Dialogues
* @Deprecated Consider using {@link ExpressionPlugin} instead to add Chat Head Animations to Dialogues.
*
*/
@Deprecated
public enum ChatEmotes {
HAPPY_JOYFUL(588),
@@ -0,0 +1,20 @@
package com.rs2.game.dialogues;
import com.rs2.game.players.Player;
import com.rs2.net.packets.PacketType;
/**
* Dialogue
**/
public class Dialogue implements PacketType {
@Override
public void processPacket(Player c, int packetType, int packetSize) {
if (c.nextChat > 0) {
c.getDialogueHandler().sendDialogues(c.nextChat, c.talkingNpc);
} else {
c.getDialogueHandler().sendDialogues(0, -1);
}
}
}
@@ -1,743 +0,0 @@
package com.rs2.game.dialogues;
import com.rs2.GameConstants;
import com.rs2.game.npcs.NpcHandler;
import com.rs2.game.players.Player;
import com.rs2.util.LoggerUtils;
import com.rs2.util.Misc;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Represents a factory class that contains important functions for building dialogues.
*
* @author Vult-R <https://github.com/Vult-R>
*
* Ported by Qweqker
*/
public final class DialogueFactoryPlugin {
/**
* The single logger for this class.
*/
private static final Logger logger = LoggerUtils.getLogger(DialogueFactoryPlugin.class);
/**
* The queue of dialogues in this factory.
*/
private final Queue<ChainablePlugin> chain = new ArrayDeque<>();
/**
* The approximate maximum characters that can be fit onto a dialogue line in the interface
*
* Defined for use in the dialogue line splitting code
*/
private static final int MAXIMUM_CHARACTERS_PER_LINE = 52;
/**
* The maximum length for any dialogue
*
* Because each line can fit approximately 52 characters, we'll set the maximum
* to 260 characters to accommodate for five lines of dialogue. It can be adjusted later if needed.
*/
private static final int MAXIMUM_LENGTH = 260;
/**
* The player who owns this factory.
*/
private final Player player;
/**
* The flag that denotes dialogue is active.
*/
private boolean active;
/**
* The next action in the dialogue chain.
*/
private Optional<Runnable> nextAction = Optional.empty();
/**
* Creates a new {@link DialogueFactoryPlugin}.
*
* @param player The player who owns this factory.
*/
public DialogueFactoryPlugin(Player player) {
this.player = player;
}
/**
* Sends a player a dialogue.
*
* @param dialogue The dialogue to sent.
*/
public final DialogueFactoryPlugin sendDialogue(DialoguePlugin dialogue) {
clear(); // Clear dialogue queue before starting new one. Hacky, but it works for this base
player.setDialogue(Optional.of(dialogue));
dialogue.sendDialogues(this);
return this;
}
/**
* Sets an {@code action} so this action can be executed after dialogues are done.
*
* @param action The action to set.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin onAction(Runnable action) {
setNextAction(Optional.of(action));
return this;
}
/**
* Accepts the next dialogue in the chain.
*
* @return The instance of this factory.
*/
public DialogueFactoryPlugin onNext() {
if (getChain().peek() != null) {
ChainablePlugin chain = getChain().poll();
chain.accept(this);
} else {
player.getPacketSender().sendClearScreen();
}
return this;
}
/**
* Executes an {@code option} for a {@code player}.
*
* @param type The type of option.
*
* @param option The option to execute.
*/
public final void executeOption(int type, Optional<OptionDialoguePlugin> option) {
option.ifPresent($it -> $it.getActions().get(type).run());
execute();
}
/**
* Clears the current dialogue {@code chain}.
*
* @return The instance of this factory.
*/
public void clear() {
chain.clear();
nextAction = Optional.empty();
player.setDialogue(Optional.empty());
player.setOptionDialogue(Optional.empty());
setActive(false);
}
/**
* Appends a {@code chain} to this factory.
*
* @return The instance of this factory.
*/
private final DialogueFactoryPlugin append(ChainablePlugin chain) {
this.chain.add(chain);
return this;
}
/**
* Retrieves the next dialogue in the chain and executes it.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin execute() {
// check to see if there are anymore dialogues.
if (getChain().peek() != null) {
// there is so, grab the next dialogue.
ChainablePlugin entry = getChain().poll();
// is this an option dialogue?
if (entry instanceof OptionDialoguePlugin) {
OptionDialoguePlugin option = (OptionDialoguePlugin) entry;
player.setOptionDialogue(Optional.of(option));
}
setActive(true);
// whatever dialogue it is, accept it.
entry.accept(this);
} else {
// there are no dialogues in this chain.
// is there an action?
if (getNextAction().isPresent()) {
// there is so, execute it.
getNextAction().ifPresent($it -> $it.run());
// we just used this action so empty it so it can't be used again.
setNextAction(Optional.empty());
return this;
}
setActive(false);
// there are no more dialogues, so clear the screen.
player.getPacketSender().sendClearScreen();
}
return this;
}
/**
* Retrieves the next dialogue in the chain and executes it.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin executeNoClose() {
// check to see if there are anymore dialogues.
if (getChain().peek() != null) {
// there is so, grab the next dialogue.
ChainablePlugin entry = getChain().poll();
// is this an option dialogue?
if (entry instanceof OptionDialoguePlugin) {
OptionDialoguePlugin option = (OptionDialoguePlugin) entry;
player.setOptionDialogue(Optional.of(option));
}
setActive(true);
// whatever dialogue it is, accept it.
entry.accept(this);
} else {
// there are no dialogues in this chain.
// is there an action?
if (getNextAction().isPresent()) {
// there is so, execute it.
getNextAction().ifPresent($it -> $it.run());
// we just used this action so empty it so it can't be used again.
setNextAction(Optional.empty());
return this;
}
setActive(false);
}
return this;
}
/**
* Replaces keywords with their translated values in an existing dialogue text.
*
* @param line The line to check for a keyword.
*/
private final String appendKeywords(String line) {
// If the line contains #username, replace with a formatted player name.
if (line.contains("<username>")) {
line = line.replaceAll("<username>", Misc.formatPlayerName((player.playerName)));
}
if (line.contains("<servername>")) {
line = line.replaceAll("<servername>", GameConstants.SERVER_NAME);
}
return line;
}
/**
* Appends a {@link PlayerDialoguePlugin} to the current dialogue chain.
*
* @param lines The dialogue of the player talking.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendPlayerChat(String... lines) {
return append(new PlayerDialoguePlugin(lines));
}
/**
* Appends a {@link PlayerDialoguePlugin} to the current dialogue chain.
*
* @param lines The dialogue of the player talking.
*
* @param expression The expression of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendPlayerChat(ExpressionPlugin expression, String... lines) {
return append(new PlayerDialoguePlugin(expression, lines));
}
/**
* Sends a dialogue with a player talking.
*
* @param dialogue The player dialogue.
*
* @return The instance of this factory.
*/
final DialogueFactoryPlugin sendPlayerChat(PlayerDialoguePlugin dialogue) {
ExpressionPlugin expression = dialogue.getExpression();
String[] lines = dialogue.getLines();
validateLength(lines);
lines = splitLines(lines);
switch (lines.length) {
case 1:
player.getPacketSender().sendDialogueAnimation(969, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 970);
player.getPacketSender().sendString(appendKeywords(lines[0]), 971);
player.getPacketSender().sendPlayerDialogueHead(969);
player.getPacketSender().sendChatInterface(968);
break;
case 2:
player.getPacketSender().sendDialogueAnimation(974, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 975);
player.getPacketSender().sendString(appendKeywords(lines[0]), 976);
player.getPacketSender().sendString(appendKeywords(lines[1]), 977);
player.getPacketSender().sendPlayerDialogueHead(974);
player.getPacketSender().sendChatInterface(973);
break;
case 3:
player.getPacketSender().sendDialogueAnimation(980, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 981);
player.getPacketSender().sendString(appendKeywords(lines[0]), 982);
player.getPacketSender().sendString(appendKeywords(lines[1]), 983);
player.getPacketSender().sendString(appendKeywords(lines[2]), 984);
player.getPacketSender().sendPlayerDialogueHead(980);
player.getPacketSender().sendChatInterface(979);
break;
case 4:
player.getPacketSender().sendDialogueAnimation(987, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 988);
player.getPacketSender().sendString(appendKeywords(lines[0]), 989);
player.getPacketSender().sendString(appendKeywords(lines[1]), 990);
player.getPacketSender().sendString(appendKeywords(lines[2]), 991);
player.getPacketSender().sendString(appendKeywords(lines[3]), 992);
player.getPacketSender().sendPlayerDialogueHead(987);
player.getPacketSender().sendChatInterface(986);
break;
default:
logger.log(Level.SEVERE, String.format("Invalid player dialogue line length: %s", lines.length));
break;
}
return this;
}
/**
* Appends an npc dialogue.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(String... lines) {
return append(new NPCDialogue(lines));
}
/**
* Appends an {@link NPCDialogue} to the current dialogue chain.
*
* @param expression The expression of this npc.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(ExpressionPlugin expression, String... lines) {
return append(new NPCDialogue(expression, lines));
}
/**
* Appends an {@link NPCDialogue} to the current dialogue chain.
*
* @param id The id of this npc.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(int id, String... lines) {
return append(new NPCDialogue(id, ExpressionPlugin.DEFAULT, lines));
}
/**
* Appends an {@link NPCDialogue} to the current dialogue chain.
*
* @param id The id of this npc.
*
* @param expression The expression of this npc.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(int id, ExpressionPlugin expression, String... lines) {
return append(new NPCDialogue(id, expression, lines));
}
/**
* Sends a dialogue with a npc talking.
*
* @param dialogue The dialogue.
*
* @return The instance of this factory.
*/
final DialogueFactoryPlugin sendNPCChat(NPCDialogue dialogue) {
ExpressionPlugin expression = dialogue.getExpression();
String[] lines = dialogue.getLines();
validateLength(lines);
lines = splitLines(lines);
final String npcName = NpcHandler.getNpcListName(player.npcType).replaceAll("_", " ");
if (npcName == null) {
return this;
}
switch (lines.length) {
case 1:
player.getPacketSender().sendDialogueAnimation(4883, expression.getId());
player.getPacketSender().sendString(npcName, 4884);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4885);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4883);
player.getPacketSender().sendChatInterface(4882);
break;
case 2:
player.getPacketSender().sendDialogueAnimation(4888, expression.getId());
player.getPacketSender().sendString(npcName, 4889);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4890);
player.getPacketSender().sendString(appendKeywords(lines[1]), 4891);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4888);
player.getPacketSender().sendChatInterface(4887);
break;
case 3:
player.getPacketSender().sendDialogueAnimation(4894, expression.getId());
player.getPacketSender().sendString(npcName, 4895);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4896);
player.getPacketSender().sendString(appendKeywords(lines[1]), 4897);
player.getPacketSender().sendString(appendKeywords(lines[2]), 4898);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4894);
player.getPacketSender().sendChatInterface(4893);
break;
case 4:
player.getPacketSender().sendDialogueAnimation(4901, expression.getId());
player.getPacketSender().sendString(npcName, 4902);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4903);
player.getPacketSender().sendString(appendKeywords(lines[1]), 4904);
player.getPacketSender().sendString(appendKeywords(lines[2]), 4905);
player.getPacketSender().sendString(appendKeywords(lines[3]), 4906);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4901);
player.getPacketSender().sendChatInterface(4900);
break;
default:
logger.log(Level.SEVERE,
String.format("Invalid npc dialogue line length: %s", lines.length));
break;
}
return this;
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2) {
return append(new OptionDialoguePlugin(option1, action1, option2, action2));
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2, String option3, Runnable action3) {
return append(new OptionDialoguePlugin(option1, action1, option2, action2, option3, action3));
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2, String option3, Runnable action3, String option4, Runnable action4) {
return append(
new OptionDialoguePlugin(option1, action1, option2, action2, option3, action3, option4, action4));
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*
* @param option5 The text for the fifth option.
*
* @param action5 The action for the fifth action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2, String option3, Runnable action3, String option4, Runnable action4,
String option5, Runnable action5) {
return append(new OptionDialoguePlugin(option1, action1, option2, action2, option3, action3, option4,
action4, option5, action5));
}
/**
* Sends a dialogue with options.
*
* @param dialogue The dialogue.
*
* @return The instance of this factory.
*/
final DialogueFactoryPlugin sendOption(OptionDialoguePlugin dialogue) {
String[] options = dialogue.getLines();
validateLength(options);
switch (options.length) {
case 2:
player.getPacketSender().sendString("Select an Option", 2460);
player.getPacketSender().sendString(options[0], 2461);
player.getPacketSender().sendString(options[1], 2462);
player.getPacketSender().sendChatInterface(2459);
return this;
case 3:
player.getPacketSender().sendString("Select an Option", 2470);
player.getPacketSender().sendString(options[0], 2471);
player.getPacketSender().sendString(options[1], 2472);
player.getPacketSender().sendString(options[2], 2473);
player.getPacketSender().sendChatInterface(2469);
return this;
case 4:
player.getPacketSender().sendString("Select an Option", 2481);
player.getPacketSender().sendString(options[0], 2482);
player.getPacketSender().sendString(options[1], 2483);
player.getPacketSender().sendString(options[2], 2484);
player.getPacketSender().sendString(options[3], 2485);
player.getPacketSender().sendChatInterface(2480);
return this;
case 5:
player.getPacketSender().sendString("Select an Option", 2493);
player.getPacketSender().sendString(options[0], 2494);
player.getPacketSender().sendString(options[1], 2495);
player.getPacketSender().sendString(options[2], 2496);
player.getPacketSender().sendString(options[3], 2497);
player.getPacketSender().sendString(options[4], 2498);
player.getPacketSender().sendChatInterface(2492);
return this;
}
return this;
}
/**
* Appends a {@link StatementDialoguePlugin} to the current dialogue chain.
*
* @param lines The text for this statement.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendStatement(String... lines) {
append(new StatementDialoguePlugin(lines));
return this;
}
/**
* Sends a player a statement dialogue.
*
* @param dialogue The statement dialogue.
*/
final DialogueFactoryPlugin sendStatement(StatementDialoguePlugin dialogue) {
String[] lines = dialogue.getLines();
validateLength(lines);
lines = splitLines(lines);
switch (lines.length) {
case 1:
player.getPacketSender().sendString(dialogue.getLines()[0], 357);
player.getPacketSender().sendString("Click here to continue", 358);
player.getPacketSender().sendChatInterface(356);
break;
case 2:
player.getPacketSender().sendString(dialogue.getLines()[0], 360);
player.getPacketSender().sendString(dialogue.getLines()[1], 361);
player.getPacketSender().sendString("Click here to continue", 362);
player.getPacketSender().sendChatInterface(359);
break;
case 3:
player.getPacketSender().sendString(dialogue.getLines()[0], 364);
player.getPacketSender().sendString(dialogue.getLines()[1], 365);
player.getPacketSender().sendString(dialogue.getLines()[2], 366);
player.getPacketSender().sendString("Click here to continue", 367);
player.getPacketSender().sendChatInterface(363);
break;
case 4:
player.getPacketSender().sendString(dialogue.getLines()[0], 369);
player.getPacketSender().sendString(dialogue.getLines()[1], 370);
player.getPacketSender().sendString(dialogue.getLines()[2], 371);
player.getPacketSender().sendString(dialogue.getLines()[3], 372);
player.getPacketSender().sendString("Click here to continue", 373);
player.getPacketSender().sendChatInterface(368);
break;
case 5:
player.getPacketSender().sendString(dialogue.getLines()[0], 375);
player.getPacketSender().sendString(dialogue.getLines()[1], 376);
player.getPacketSender().sendString(dialogue.getLines()[2], 377);
player.getPacketSender().sendString(dialogue.getLines()[3], 378);
player.getPacketSender().sendString(dialogue.getLines()[4], 379);
player.getPacketSender().sendString("Click here to continue", 380);
player.getPacketSender().sendChatInterface(374);
default:
logger.log(Level.SEVERE, String.format("Invalid statement dialogue line length: %s",
dialogue.getLines().length));
break;
}
return this;
}
/**
* The method that validates the length of {@code text}.
*
* @param text the text that will be validated.
* @throws IllegalStateException if any lines of the text exceed a certain length.
*/
private final void validateLength(String... text) {
if (Arrays.stream(text).filter(Objects::nonNull).anyMatch(s -> s.length() > MAXIMUM_LENGTH)) {
throw new IllegalStateException(
"Dialogue length too long, maximum length is: " + MAXIMUM_LENGTH);
}
}
/**
* The method that splits the length of {@code text}.
*
* @param text the text that will be split.
* @throws IllegalStateException if the calculated number of lines exceeds 4.
* @return text if the line is detected to already be split.
* @return splittext the text formatted into lines that fit into the dialogue interface
*/
private final String[] splitLines(String... text) {
if(text.length > 1){
if(GameConstants.SERVER_DEBUG) {
logger.log(Level.INFO, "Detected more than 1 Dialogue line. Assuming Dialogues have been split already.");
}
return text;
}
int characters = text[0].length();
String[] words = text[0].split(" ");
double lines = Math.ceil(characters / MAXIMUM_CHARACTERS_PER_LINE) + 1;
if(lines > 4){
throw new IllegalStateException(
"Calculated Line Split Exceeds 4 Lines.");
}
ArrayList<String> splitText = new ArrayList<>();
int index = 0;
// Begin Splitting Lines
for(int i = 0; i < lines; i++) {
int length = 0;
StringBuilder line = new StringBuilder();
while (length <= MAXIMUM_CHARACTERS_PER_LINE && !(index == words.length)) {
String currentWord = "";
try {
currentWord = words[index];
if (length + (currentWord.length() + 1) <= MAXIMUM_CHARACTERS_PER_LINE) {
currentWord += " ";
} else {
currentWord += "";
}
} catch (Exception e) {
logger.log(Level.INFO, e.toString());
}
length += currentWord.length();
if (length <= MAXIMUM_CHARACTERS_PER_LINE) {
line.append(currentWord);
index++;
}
}
splitText.add(line.toString());
}
return splitText.toArray(new String[0]);
}
// Delombok'd Code Below
public Queue<ChainablePlugin> getChain() {
return this.chain;
}
public Player getPlayer() {
return this.player;
}
public boolean isActive() {
return this.active;
}
public Optional<Runnable> getNextAction() {
return this.nextAction;
}
public void setActive(boolean active) {
this.active = active;
}
public void setNextAction(Optional<Runnable> nextAction) {
this.nextAction = nextAction;
}
}
@@ -8,6 +8,7 @@ import com.rs2.game.content.quests.QuestAssistant;
import com.rs2.game.content.quests.QuestRewards;
import com.rs2.game.content.randomevents.FreakyForester;
import com.rs2.game.content.randomevents.RandomEventHandler;
import com.rs2.game.content.skills.SkillHandler;
import com.rs2.game.content.skills.farming.Farmers;
import com.rs2.game.content.skills.slayer.Slayer;
import com.rs2.game.content.traveling.CarpetTravel;
@@ -21,12 +22,6 @@ import com.rs2.game.players.PlayerAssistant;
import com.rs2.game.shops.Shops.Shop;
import com.rs2.util.Misc;
/**
* Handles Dialogues between NPCs and Players
* @Deprecated Consider using {@link DialogueFactoryPlugin} instead to implement dialogues.
*
*/
@Deprecated
public class DialogueHandler {
private final Player player;
@@ -317,6 +312,140 @@ public class DialogueHandler {
player.nextChat = 0;
player.ptjob = 2;
break;
case 50:
sendNpcChat1("What am I to do?", player.talkingNpc, "Cook");
player.nextChat = 51;
break;
case 51:
sendOption("What's wrong?", "Can you cook me a cake?",
"You don't look very happy.", "Nice hat.");
player.dialogueAction = 52;
break;
case 52:
sendPlayerChat("What's wrong?");
player.nextChat = 54;
break;
case 54:
sendNpcChat3(
"Oh dear, oh dear, oh dear, I'm in a terrible terrible",
"mess! It's the Duke's birthday today, and I should be",
"making him a lovely big birthday cake!",
player.talkingNpc, "Cook");
player.nextChat = 55;
break;
case 55:
sendNpcChat4(
"I've forgotten to buy the ingredients. I'll never get",
"them in time now. He'll sack me! What will I do? I have",
"four children and a goat to look after. Would you help",
"me? Please?", player.talkingNpc, "Cook");
player.nextChat = 56;
break;
case 56:
sendOption("I'm always happy to help a cook in distress.",
"I can't right now, Maybe later.");
player.dialogueAction = 57;
break;
case 57:
sendPlayerChat("Yes, I'll help you.");// 9157
player.nextChat = 60;
break;
case 58:
sendPlayerChat("I can't right now, Maybe later.");// 9158
player.nextChat = 59;
break;
case 59:
sendNpcChat1("Oh please! Hurry then!", player.talkingNpc, "Cook");
player.nextChat = 0;
break;
case 60:
sendNpcChat2("Oh thank you, thank you. I need milk, an egg, and",
"flour. I'd be very grateful if you can get them for me.",
player.talkingNpc, "Cook");
player.cookAss = 1;
QuestAssistant.sendStages(player);
player.nextChat = 61;
break;
case 61:
sendPlayerChat("So where do I find these ingredients then?");
player.nextChat = 62;
break;
case 62:
sendNpcChat3("You can find flour in any of the shops here.",
"You can find eggs by killing chickens.",
"You can find milk by using a bucket on a cow",
player.talkingNpc, "Cook");
player.nextChat = 0;
break;
case 63:
sendNpcChat1("I don't have time for your jibber-jabber!",
player.talkingNpc, "Cook");
player.nextChat = 0;
break;
case 64:
sendNpcChat1("Does it look like I have the time?",
player.talkingNpc, "Cook");
player.nextChat = 0;
break;
case 65:
sendPlayerChat("You don't look so happy.");
player.nextChat = 54;
break;
case 66:
sendNpcChat1(
"How are you getting on with finding the ingredients?",
player.talkingNpc, "Cook");
player.nextChat = 67;
break;
case 67:
if (player.getItemAssistant().playerHasItem(1944, 1)
&& player.getItemAssistant().playerHasItem(1927, 1)
&& player.getItemAssistant().playerHasItem(1933, 1)) {
sendPlayerChat("Here's all the items!");
player.nextChat = 68;
} else {
sendPlayerChat("I don't have all the items yet.");
player.nextChat = 59;
}
break;
case 68:
player.getItemAssistant().deleteItem(1944, 1);
player.getItemAssistant().deleteItem(1927, 1);
player.getItemAssistant().deleteItem(1933, 1);
player.cookAss = 2;
sendNpcChat2("You brought me everything I need! I'm saved!",
"Thank you!", player.talkingNpc, "Cook");
player.nextChat = 69;
break;
case 69:
sendPlayerChat("So do I get to go to the Duke's Party?");
player.nextChat = 70;
break;
case 70:
sendNpcChat2(
"I'm afraid not, only the big cheeses get to dine with the",
"Duke.", player.talkingNpc, "Cook");
player.nextChat = 72;
break;
case 72:
sendPlayerChat(
"Well, maybe one day I'll be important enough to sit on",
"the Duke's table");
player.nextChat = 74;
break;
case 74:
sendNpcChat1("Maybe, but I won't be holding my breath.",
player.talkingNpc, "Cook");
player.nextChat = 75;
break;
case 75:
QuestRewards.cookReward(player);
break;
case 76:
sendNpcChat1("Thanks for helping me out friend!",
player.talkingNpc, "Cook");
player.nextChat = 0;
break;
case 84:
sendNpcChat1("How are you getting on finding all my supplies",
player.talkingNpc, "Doric");
@@ -3813,9 +3942,32 @@ public class DialogueHandler {
"Tzhaar-Mej-Tal");
player.nextChat = 0;
break;
/** Bank Settings **/
case 1013:
if (SkillHandler.isSkilling(player)) {
return;
}
sendNpcChat1("Good day. How may I help you?", player.talkingNpc, "Banker");
player.nextChat = 1014;
break;
case 1014:// bank open done, this place done, settings done, to do
// delete pin
sendOption("I'd like to access my bank account, please.", "I'd like to check my my P I N settings.", "What is this place?");
player.dialogueAction = 251;
break;
/** What is this place? **/
case 1015:
sendPlayerChat("What is this place?");
player.nextChat = 1016;
break;
case 1016:
sendNpcChat2("This is the bank of " + GameConstants.SERVER_NAME + ".", "We have many branches in many towns.", player.talkingNpc, "Banker");
player.nextChat = 0;
break;
/**
* BANK P I N Setting
* Note on P I N. In order to check your P I N Settings. You must enter your Bank Pin first
* Note on P I N. In order to check your "Pin Settings. You must have
* enter your Bank Pin first
**/
/** I don't know option for Bank Pin **/
case 1017:
@@ -7320,8 +7472,28 @@ public class DialogueHandler {
case 3868:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.HAPPY_JOYFUL, "Enjoy your stay here. May it be spiritually uplifting!");
player.getDialogueHandler().endDialogue();
break;
case 3869:
player.getDialogueHandler().sendPlayerChat(ChatEmotes.DEFAULT, "Hello, how's it going?");
player.nextChat = 3870;
break;
//holiday events (easter)
case 3870:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.HAPPY_JOYFUL, "I'm fine how are you?");
player.nextChat = 3871;
break;
case 3871:
player.getDialogueHandler().sendPlayerChat(ChatEmotes.DEFAULT, "Very well thank you.");
player.getDialogueHandler().endDialogue();
break;
case 3872:
player.getDialogueHandler().sendPlayerChat(ChatEmotes.DEFAULT, "Hello, how's it going?");
player.nextChat = 3873;
break;
case 3873:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.HAPPY_JOYFUL, "Hello there! Nice weather we've been having.");
player.getDialogueHandler().endDialogue();
break;
//holiday events (easter)
case 6000:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.DISTRESSED, "Oh dear... What am I going to do?");
player.nextChat = 6001;
@@ -393,6 +393,9 @@ public class DialogueOptions {
} else if (player.dialogueAction == 56) {
player.getDialogueHandler().sendDialogues(96, player.npcType);
return;
} else if (player.dialogueAction == 57) {
player.getDialogueHandler().sendDialogues(57, player.npcType);
return;
} else if (player.dialogueAction == 3222) {
player.getBarrows().checkCoffins();
player.getPacketSender().closeAllWindows();
@@ -689,6 +692,9 @@ public class DialogueOptions {
} else if (player.dialogueAction == 74) {
player.getDialogueHandler().sendDialogues(535, player.npcType);
return;
} else if (player.dialogueAction == 57) {
player.getDialogueHandler().sendDialogues(58, player.npcType);
return;
} else if (player.dialogueAction == 62) {
player.getDialogueHandler().sendDialogues(309, player.npcType);
return;
@@ -938,6 +944,9 @@ public class DialogueOptions {
if (player.dialogueAction == 113) {
player.getDialogueHandler().sendDialogues(3540, player.npcType);
}
if (player.dialogueAction == 52) {
player.getDialogueHandler().sendDialogues(52, player.npcType);
}
if (player.dialogueAction == 1000) {
player.getDialogueHandler().sendDialogues(3524,player.npcType);
}
@@ -1008,6 +1017,9 @@ public class DialogueOptions {
player.getPlayerAssistant().gloryTeleport(3293, 3174, 0, "modern");
Teles.necklaces(player);
}
if (player.dialogueAction == 52) {
player.getDialogueHandler().sendDialogues(64, player.npcType);
}
if (player.dialogueAction == 1000) {
player.getDialogueHandler().sendDialogues(3523, player.npcType);
}
@@ -1081,6 +1093,9 @@ public class DialogueOptions {
player.getPlayerAssistant().gloryTeleport(2911, 3152, 0, "modern");
Teles.necklaces(player);
}
if (player.dialogueAction == 52) {
player.getDialogueHandler().sendDialogues(65, player.npcType);
}
if (player.dialogueAction == 1000) {
player.getDialogueHandler().sendDialogues(3523,player.npcType);
}
@@ -1139,6 +1154,9 @@ public class DialogueOptions {
player.getPlayerAssistant().gloryTeleport(3103, 3249, 0, "modern");
Teles.necklaces(player);
}
if (player.dialogueAction == 52) {
player.getDialogueHandler().sendDialogues(63, player.npcType);
}
if (player.dialogueAction == 1000) {
player.getDialogueHandler().sendDialogues(3523, player.npcType);
}
@@ -1,37 +0,0 @@
package com.rs2.game.dialogues;
import com.google.common.collect.ImmutableList;
/**
* Represents an abstract dialogue, in which extending classes will be able to construct and send
* dialogues to a player.
*
* @author Vult-R
*/
public abstract class DialoguePlugin {
/**
* The action buttons responsible for dialogues.
*/
public static final ImmutableList<Integer> DIALOGUE_BUTTONS = ImmutableList.of(9157, 9167, 9178, 9190,
9158, 9168, 9179, 9191, 9169, 9180, 9192, 9181, 9193, 9194);
/**
* Sends a player a dialogue.
*
* @param factory The factory for this dialogue.
*/
public abstract void sendDialogues(DialogueFactoryPlugin factory);
/**
* Checks if the button triggered is an optional dialogue button.
*
* @param button The index of the button being checked.
*
* @return The result of the operation.
*/
public static final boolean isDialogueButton(int button) {
return DIALOGUE_BUTTONS.stream().anyMatch(search -> search == button);
}
}
@@ -1,74 +0,0 @@
package com.rs2.game.dialogues;
/*
* Copyright (c) 2010-2011 Graham Edgecombe Copyright (c) 2011-2016 Major <major.emrs@gmail.com> and
* other apollo contributors
*
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without
* fee is hereby granted, provided that the above copyright notice and this permission notice appear
* in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**
* Represents the expressions of entities for dialogue.
*
* @author Vult-R
*/
public enum ExpressionPlugin {
HAPPY(588),
ANXIOUS(589),
CALM_TALK(590),
DEFAULT(591),
EVIL(592),
BAD(593),
WICKED(594),
ANNOYED(595),
DISTRESSED(596),
AFFLICTED(597),
DRUNK_LEFT(600),
DRUNK_RIGHT(601),
NOT_INTERESTED(602),
SLEEPY(603),
PLAIN_EVIL(604),
LAUGH(605),
SNIGGER(606),
HAVE_FUN(607),
GUFFAW(608),
EVIL_LAUGH_SHORT(609),
SLIGHTLY_SAD(610),
SAD(599),
VERY_SAD(611),
ON_ONE_HAND(612),
ALMOST_CRYING(598),
NEARLY_CRYING(613),
ANGRY(614),
FURIOUS(615),
ENRAGED(616),
MAD(617);
/**
* The id for this expression.
*/
private final int id;
/**
* Creates a new {@link ExpressionPlugin}.
*
* @param expression The id for this expression.
*/
private ExpressionPlugin(int expression) {
this.id = expression;
}
// Delombok'd Code Below
public int getId() {
return this.id;
}
}
@@ -1,122 +0,0 @@
package com.rs2.game.dialogues;
/**
* The {@link ChainablePlugin} implementation that represents dialogue in which an NPC is talking.
*
* @author Vult-R
*/
public final class NPCDialogue implements ChainablePlugin {
/**
* The id of this npc.
*/
private int id = -1;
/**
* The expression of this NPC.
*/
private final ExpressionPlugin expression;
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* Creates a new {@link NPCDialogue}
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(String... lines) {
this(ExpressionPlugin.DEFAULT, lines);
}
/**
* Creates a new {@link NPCDialogue}
*
* @param expression The expression of this npc.
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(ExpressionPlugin expression, String... lines) {
this.expression = expression;
this.lines = lines;
}
/**
* Creates a new {@link NPCDialogue}
*
* @param id The id of this npc.
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(int id, String... lines) {
this(id, ExpressionPlugin.DEFAULT, lines);
}
/**
* Creates a new {@link NPCDialogue}
*
* @param id The id of this npc.
*
* @param expression The expression of this npc.
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(int id, ExpressionPlugin expression, String... lines) {
this.id = id;
this.expression = expression;
this.lines = lines;
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendNPCChat(this);
}
public int getId() {
return this.id;
}
public ExpressionPlugin getExpression() {
return this.expression;
}
// Delombok'd Code Below
public String[] getLines() {
return this.lines;
}
public void setId(int id) {
this.id = id;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof NPCDialogue)) return false;
final NPCDialogue other = (NPCDialogue) o;
if (this.getId() != other.getId()) return false;
final Object this$expression = this.getExpression();
final Object other$expression = other.getExpression();
if (this$expression == null ? other$expression != null : !this$expression.equals(other$expression))
return false;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
return true;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + this.getId();
final Object $expression = this.getExpression();
result = result * PRIME + ($expression == null ? 43 : $expression.hashCode());
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
return result;
}
public String toString() {
return "AstraeusNPCDialogue(id=" + this.getId() + ", expression=" + this.getExpression() + ", lines=" + java.util.Arrays.deepToString(this.getLines()) + ")";
}
}
@@ -1,163 +0,0 @@
package com.rs2.game.dialogues;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link ChainablePlugin} implementation that represents a dialogue in which options are given to the
* player.
*
* @author Vult-R
*/
public final class OptionDialoguePlugin implements ChainablePlugin {
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* The list of actions for this dialogue.
*/
private final List<Runnable> actions = new ArrayList<>();
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2) {
lines = new String[] {option1, option2};
actions.add(action1);
actions.add(action2);
}
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2,
String option3, Runnable action3) {
lines = new String[] {option1, option2, option3};
actions.add(action1);
actions.add(action2);
actions.add(action3);
}
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2,
String option3, Runnable action3, String option4, Runnable action4) {
lines = new String[] {option1, option2, option3, option4};
actions.add(action1);
actions.add(action2);
actions.add(action3);
actions.add(action4);
}
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*
* @param option5 The text for the fifth option.
*
* @param action5 The action for the fifth action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2,
String option3, Runnable action3, String option4, Runnable action4, String option5,
Runnable action5) {
lines = new String[] {option1, option2, option3, option4, option5};
actions.add(action1);
actions.add(action2);
actions.add(action3);
actions.add(action4);
actions.add(action5);
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendOption(this);
}
// Delombok'd code below
public String[] getLines() {
return this.lines;
}
public List<Runnable> getActions() {
return this.actions;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof OptionDialoguePlugin)) return false;
final OptionDialoguePlugin other = (OptionDialoguePlugin) o;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
final Object this$actions = this.getActions();
final Object other$actions = other.getActions();
if (this$actions == null ? other$actions != null : !this$actions.equals(other$actions)) return false;
return true;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
final Object $actions = this.getActions();
result = result * PRIME + ($actions == null ? 43 : $actions.hashCode());
return result;
}
public String toString() {
return "AstraeusOptionDialogue(lines=" + java.util.Arrays.deepToString(this.getLines()) + ", actions=" + this.getActions() + ")";
}
}
@@ -1,84 +0,0 @@
package com.rs2.game.dialogues;
/**
* A {@link ChainablePlugin} implementation that represents a player talking.
*
* @author Vult-R
*/
public class PlayerDialoguePlugin implements ChainablePlugin {
/**
* The expression of this player.
*/
private final ExpressionPlugin expression;
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* Creates a new {@link PlayerDialoguePlugin} with a default expression of {@code DEFAULT}.
*
* @param lines The text for this dialogue.
*/
public PlayerDialoguePlugin(String... lines) {
this(ExpressionPlugin.DEFAULT, lines);
}
/**
* Creates a new {@link PlayerDialoguePlugin}.
*
* @param expression The expression for this dialogue.
*
* @param lines The text for this dialogue.
*/
public PlayerDialoguePlugin(ExpressionPlugin expression, String... lines) {
this.expression = expression;
this.lines = lines;
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendPlayerChat(this);
}
public ExpressionPlugin getExpression() {
return this.expression;
}
// Delombok'd Code Below
public String[] getLines() {
return this.lines;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof PlayerDialoguePlugin)) return false;
final PlayerDialoguePlugin other = (PlayerDialoguePlugin) o;
if (!other.canEqual((Object) this)) return false;
final Object this$expression = this.getExpression();
final Object other$expression = other.getExpression();
if (this$expression == null ? other$expression != null : !this$expression.equals(other$expression))
return false;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof PlayerDialoguePlugin;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $expression = this.getExpression();
result = result * PRIME + ($expression == null ? 43 : $expression.hashCode());
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
return result;
}
public String toString() {
return "PlayerDialoguePlugin(expression=" + this.getExpression() + ", lines=" + java.util.Arrays.deepToString(this.getLines()) + ")";
}
}
@@ -1,60 +0,0 @@
package com.rs2.game.dialogues;
/**
* The {@link ChainablePlugin} implementation that represents a dialogue with a single statement; which
* has no models on the dialogue.
*
* @author Vult-R
*/
public class StatementDialoguePlugin implements ChainablePlugin {
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* Creates a new {@link StatementDialoguePlugin}.
*
* @param lines The text for this dialogue.
*/
public StatementDialoguePlugin(String... lines) {
this.lines = lines;
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendStatement(this);
}
// Delombok'd code below
public String[] getLines() {
return this.lines;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof StatementDialoguePlugin)) return false;
final StatementDialoguePlugin other = (StatementDialoguePlugin) o;
if (!other.canEqual((Object) this)) return false;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof StatementDialoguePlugin;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
return result;
}
public String toString() {
return "AstraeusStatementDialogue(lines=" + java.util.Arrays.deepToString(this.getLines()) + ")";
}
}
@@ -724,6 +724,18 @@ public class NpcActions {
}
break;
case 278:
if (player.cookAss == 0) {
player.getDialogueHandler().sendDialogues(50, npcType);
} else if (player.cookAss == 1) {
player.getDialogueHandler().sendDialogues(67, npcType);
} else if (player.cookAss == 2) {
player.getDialogueHandler().sendDialogues(69, npcType);
} else if (player.cookAss == 3) {
player.getDialogueHandler().sendDialogues(76, npcType);
}
break;
case 608:
if (player.blackKnight == 0 && player.questPoints >= 12) {
player.getDialogueHandler().sendDialogues(3902, npcType);
@@ -1049,14 +1049,10 @@ public class NpcHandler {
// These npcs shouldn't have drops
return;
}
boolean isDropped = false;
for (ItemDrop possible_drop : NPCDropsHandler.getNpcDrops(getNpcListName(npcs[i].npcType).toLowerCase().replace(" ", "_"), npcs[i].npcType)) {
if (Misc.random(possible_drop.getChance()) == 0 && !isDropped) {
if (Misc.random(possible_drop.getChance()) == 0) {
int amt = possible_drop.getAmount();
GameEngine.itemHandler.createGroundItem(c, possible_drop.getItemID(), npcs[i].absX, npcs[i].absY, amt, c.playerId);
//Making sure items that always drop don't cost us our drop table roll
if (possible_drop.getChance() > 1)
isDropped = true;
}
}
switch (npcs[i].npcType) {
@@ -1,9 +1,19 @@
package com.rs2.game.players;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import com.everythingrs.hiscores.Hiscores;
import com.rs2.event.*;
import com.rs2.plugin.PluginService;
import org.apache.mina.common.IoSession;
import com.rs2.GameConstants;
import com.rs2.GameEngine;
import com.rs2.event.*;
import com.rs2.game.content.BankPin;
import com.rs2.game.content.EmoteHandler;
import com.rs2.game.content.combat.CombatAssistant;
@@ -25,11 +35,28 @@ import com.rs2.game.content.minigames.magetrainingarena.MageTrainingArena;
import com.rs2.game.content.music.PlayList;
import com.rs2.game.content.music.sound.SoundList;
import com.rs2.game.content.skills.SkillInterfaces;
import com.rs2.game.content.skills.agility.*;
import com.rs2.game.content.skills.agility.Agility;
import com.rs2.game.content.skills.agility.ApeAtollAgility;
import com.rs2.game.content.skills.agility.BarbarianAgility;
import com.rs2.game.content.skills.agility.GnomeAgility;
import com.rs2.game.content.skills.agility.PyramidAgility;
import com.rs2.game.content.skills.agility.WerewolfAgility;
import com.rs2.game.content.skills.agility.WildernessAgility;
import com.rs2.game.content.skills.cooking.Potatoes;
import com.rs2.game.content.skills.core.Mining;
import com.rs2.game.content.skills.crafting.GlassBlowing;
import com.rs2.game.content.skills.farming.*;
import com.rs2.game.content.skills.farming.Allotments;
import com.rs2.game.content.skills.farming.Bushes;
import com.rs2.game.content.skills.farming.Compost;
import com.rs2.game.content.skills.farming.Flowers;
import com.rs2.game.content.skills.farming.FruitTree;
import com.rs2.game.content.skills.farming.Herbs;
import com.rs2.game.content.skills.farming.Hops;
import com.rs2.game.content.skills.farming.Seedling;
import com.rs2.game.content.skills.farming.SpecialPlantOne;
import com.rs2.game.content.skills.farming.SpecialPlantTwo;
import com.rs2.game.content.skills.farming.ToolLeprechaun;
import com.rs2.game.content.skills.farming.WoodTrees;
import com.rs2.game.content.skills.fletching.LogCuttingInterface;
import com.rs2.game.content.skills.runecrafting.Runecrafting;
import com.rs2.game.content.skills.slayer.Slayer;
@@ -37,17 +64,18 @@ import com.rs2.game.content.skills.smithing.Smithing;
import com.rs2.game.content.skills.smithing.SmithingInterface;
import com.rs2.game.content.traveling.DesertCactus;
import com.rs2.game.content.traveling.DesertHeat;
import com.rs2.game.dialogues.DialoguePlugin;
import com.rs2.game.dialogues.DialogueFactoryPlugin;
import com.rs2.game.dialogues.OptionDialoguePlugin;
import com.rs2.game.dialogues.DialogueHandler;
import com.rs2.game.globalworldobjects.DoubleGates;
import com.rs2.game.globalworldobjects.GateHandler;
import com.rs2.game.globalworldobjects.SingleGates;
import com.rs2.game.items.*;
import com.rs2.game.items.impl.Greegree.MonkeyData;
import com.rs2.game.items.GameItem;
import com.rs2.game.items.Inventory;
import com.rs2.game.items.ItemData;
import com.rs2.game.items.ItemAssistant;
import com.rs2.game.items.ItemConstants;
import com.rs2.game.items.impl.PotionMixing;
import com.rs2.game.items.impl.Teles;
import com.rs2.game.items.impl.Greegree.MonkeyData;
import com.rs2.game.npcs.Npc;
import com.rs2.game.npcs.NpcActions;
import com.rs2.game.npcs.NpcHandler;
@@ -60,15 +88,11 @@ import com.rs2.net.PacketSender;
import com.rs2.net.StaticPacketBuilder;
import com.rs2.net.packets.PacketHandler;
import com.rs2.net.packets.impl.ChallengePlayer;
import com.rs2.plugin.PluginService;
import com.rs2.util.ISAACRandomGen;
import com.rs2.util.Misc;
import com.rs2.util.Stream;
import com.rs2.world.Boundary;
import com.rs2.world.ObjectManager;
import org.apache.mina.common.IoSession;
import java.util.*;
public abstract class Player {
@@ -120,14 +144,6 @@ public abstract class Player {
private final Slayer slayer = new Slayer(this);
private final PacketSender packetSender = new PacketSender(this);
private final DialogueHandler dialogues = new DialogueHandler(this);
private final DialogueFactoryPlugin dialogueFactory = new DialogueFactoryPlugin(this);
private Optional<DialoguePlugin> dialogue = Optional.empty();
private Optional<OptionDialoguePlugin> optionDialogue = Optional.empty();
private final GnomeAgility gnomeStrongHold = new GnomeAgility(this);
private final WildernessAgility wildernessAgility = new WildernessAgility(this);
private final BarbarianAgility barbarianAgility = new BarbarianAgility(this);
@@ -489,26 +505,6 @@ public abstract class Player {
private Map<Integer, TinterfaceText> interfaceText = new HashMap<Integer, TinterfaceText>();
public DialogueFactoryPlugin getDialogueFactory() {
return this.dialogueFactory;
}
public Optional<DialoguePlugin> getDialogue() {
return this.dialogue;
}
public Optional<OptionDialoguePlugin> getOptionDialogue() {
return this.optionDialogue;
}
public void setDialogue(Optional<DialoguePlugin> dialogue) {
this.dialogue = dialogue;
}
public void setOptionDialogue(Optional<OptionDialoguePlugin> optionDialogue) {
this.optionDialogue = optionDialogue;
}
public class TinterfaceText {
public int id;
public String currentState;
@@ -32,7 +32,6 @@ public class JavaCord {
api.addListener(new Forum());
api.addListener(new Hiscores());
api.addListener(new Issues());
api.addListener(new Link());
api.addListener(new Online());
api.addListener(new Players());
api.addListener(new Vote());
@@ -11,8 +11,6 @@ public class Commands implements MessageCreateListener {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " commands")) {
event.getChannel().sendMessage("```fix"
+ System.lineSeparator() +
"::link"
+ System.lineSeparator() +
"::forum/::forums"
+ System.lineSeparator() +
@@ -1,18 +0,0 @@
package com.rs2.integrations.discord.commands;
import org.javacord.api.entity.message.Message;
import org.javacord.api.entity.user.User;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
public class Link implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
User user = message.getAuthor().asUser().get();
if (message.getContent().equalsIgnoreCase("::link")) {
event.getChannel().sendMessage(user.getMentionTag() + ", Please check your DM's to continue.");
user.sendMessage("Please copy/paste the following in-game to link your Discord account: \n ```::link " + user.getIdAsString() + "```");
}
}
}
@@ -1,7 +1,7 @@
package com.rs2.net.packets;
import com.rs2.GameConstants;
import com.rs2.net.packets.impl.DialoguePacket;
import com.rs2.game.dialogues.Dialogue;
import com.rs2.game.players.Player;
import com.rs2.net.packets.impl.AttackPlayer;
import com.rs2.net.packets.impl.Bank10;
@@ -73,7 +73,7 @@ public class PacketHandler {
packetId[150] = u;
packetId[120] = new ClickTab();
packetId[14] = new ItemOnPlayer();
packetId[40] = new DialoguePacket();
packetId[40] = new Dialogue();
ClickObject co = new ClickObject();
packetId[132] = co;
packetId[252] = co;
@@ -154,7 +154,7 @@ public class ClickObject implements PacketType {
if (player.spiritTree == false && player.clickedTree == false) {
player.getPacketSender().sendMessage("You attempt to chop the tree, and a tree spirit appears !");
player.getPacketSender().sendSound(300, 100, 1);
NpcHandler.spawnNpc(player, 655, player.getX(), player.getY(), 0, 0, 85, 10, 80, 80, true, true);
NpcHandler.spawnNpc(player, 655, player.getX(), player.getY(), 0, 0, 225, 20, 80, 80, true, true);
player.clickedTree = true;
} else if (player.spiritTree && player.lostCity >= 2) {
Woodcutting.startWoodcutting(player, player.objectId, player.objectX, player.objectY, player.clickObjectType);
@@ -59,7 +59,7 @@ public class ClickingButtons implements PacketType {
SilverCrafting.makeSilver(player, actionButtonId, 0);
Climbing.handleLadderButtons(player, actionButtonId);
Specials.specialClicking(player, actionButtonId);
//DialogueOptions.handleDialogueOptions(player, actionButtonId);
DialogueOptions.handleDialogueOptions(player, actionButtonId);
DairyChurn.churnItem(player, actionButtonId);
if (EnchantStaff.staffButtons(player, actionButtonId)) {
return;
@@ -1,28 +0,0 @@
package com.rs2.net.packets.impl;
import com.rs2.game.players.Player;
import com.rs2.net.packets.PacketType;
/**
* Dialogue Packet
**/
public class DialoguePacket implements PacketType {
@Override
public void processPacket(Player player, int packetType, int packetSize) {
/*
TODO: Remove the below dialogue handler code when everything has been converted over
to the new system. Expect to see flickering in some Astraeus Dialogues as the old
dialogue handler activates before it.
*/
/*if (player.nextChat > 0) {
player.getDialogueHandler().sendDialogues(player.nextChat, player.talkingNpc);
} else {
player.getDialogueHandler().sendDialogues(0, -1);
}*/
// New Dialogue System
player.getDialogueFactory().execute();
}
}
@@ -5,33 +5,27 @@ import java.util.ArrayList;
public class Misc {
/*
* String Functions
*/
public static final char playerNameXlateTable[] = { '_', 'a', 'b', 'c',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', '[', ']', '/', '-', ' '
};
public static char xlateTable[] = { ' ', 'e', 't', 'a', 'o', 'i', 'h', 'n',
's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b',
'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', ' ', '!', '?', '.', ',', ':', ';', '(', ')', '-',
'&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"',
'[', ']'
};
public static String formatPlayerName(String str) {
str = ucFirst(str);
str.replace("_", " ");
return str;
}
public static String format(int num) {
return NumberFormat.getInstance().format(num);
public static int random(final float range) {
return (int) (java.lang.Math.random() * (range + 1));
}
// return a random number from 0 range - 1
public static int randomMinusOne(int range) {
return (int) Math.random() * range;
}
public static double distance(int x1, int y1, int x2, int y2 ) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
public static boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
return objectX - playerX <= distance && objectX - playerX >= -distance && objectY - playerY <= distance && objectY - playerY >= -distance;
}
public static String longToReportPlayerName(long l) {
@@ -45,6 +39,14 @@ public class Misc {
return new String(ac, 12 - i, i);
}
public static int random3(int range) {
return (int) (java.lang.Math.random() * range);
}
public static int randomNumber(int range) {
return (int) (Math.random() * range);
}
public static String longToPlayerName(long l) {
int i = 0;
char ac[] = new char[12];
@@ -58,6 +60,11 @@ public class Misc {
return new String(ac, 12 - i, i);
}
public static final char playerNameXlateTable[] = { '_', 'a', 'b', 'c',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', '[', ']', '/', '-', ' ' };
public static String longToPlayerName2(long l) {
int i = 0;
char ac[] = new char[99];
@@ -69,6 +76,10 @@ public class Misc {
return new String(ac, 12 - i, i);
}
public static String format(int num) {
return NumberFormat.getInstance().format(num);
}
public static String ucFirst(String str) {
str = str.toLowerCase();
if (str.length() > 1) {
@@ -113,6 +124,63 @@ public class Misc {
}
return temp.toUpperCase().trim();
}
public static int hexToInt(byte data[], int offset, int len) {
int temp = 0;
int i = 1000;
for (int cntr = 0; cntr < len; cntr++) {
int num = (data[offset + cntr] & 0xFF) * i;
temp += num;
if (i > 1) {
i = i / 1000;
}
}
return temp;
}
public static int random2(int range) {
return (int) (java.lang.Math.random() * range + 1);
}
// return a random number from 0 range (including range)
public static int random(int range) {
return (int) (java.lang.Math.random() * (++range));
}
// return a random number between & including the min/max values
public static int random(int min, int max) {
++max;
return (int) Math.floor(Math.random() * (max - min)) + min;
}
public static int randomArrayItem(int[] arr) {
return arr[(int) Math.floor(Math.random() * arr.length)];
}
public static int randomArrayListItem(ArrayList<Integer> arr) {
int index = (int) Math.floor(Math.random() * arr.size());
return arr.get(index);
}
public static long playerNameToInt64(String s) {
long l = 0L;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
l *= 37L;
if (c >= 'A' && c <= 'Z') {
l += 1 + c - 65;
} else if (c >= 'a' && c <= 'z') {
l += 1 + c - 97;
} else if (c >= '0' && c <= '9') {
l += 27 + c - 48;
}
}
while (l % 37L == 0L && l != 0L) {
l /= 37L;
}
return l;
}
private static char decodeBuf[] = new char[4096];
public static String textUnpack(byte packedData[], int size) {
@@ -190,126 +258,12 @@ public class Misc {
}
}
public static String capitalize(String s) {
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
s = String.format("%s%s", Character.toUpperCase(s.charAt(0)),
s.substring(1));
}
if (!Character.isLetterOrDigit(s.charAt(i))) {
if (i + 1 < s.length()) {
s = String.format("%s%s%s", s.subSequence(0, i + 1), Character.toUpperCase(s.charAt(i + 1)), s.substring(i + 2));
}
}
}
return s;
}
/*
* Number Functions
*/
public static int hexToInt(byte data[], int offset, int len) {
int temp = 0;
int i = 1000;
for (int cntr = 0; cntr < len; cntr++) {
int num = (data[offset + cntr] & 0xFF) * i;
temp += num;
if (i > 1) {
i = i / 1000;
}
}
return temp;
}
public static long playerNameToInt64(String s) {
long l = 0L;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
l *= 37L;
if (c >= 'A' && c <= 'Z') {
l += 1 + c - 65;
} else if (c >= 'a' && c <= 'z') {
l += 1 + c - 97;
} else if (c >= '0' && c <= '9') {
l += 27 + c - 48;
}
}
while (l % 37L == 0L && l != 0L) {
l /= 37L;
}
return l;
}
/*
* Random Number Generator Functions
*/
// return a random number from 0 range (including range)
public static int random(int range) {
return (int) (java.lang.Math.random() * (++range));
}
// return a random number between & including the min/max values
public static int random(int min, int max) {
++max;
return (int) Math.floor(Math.random() * (max - min)) + min;
}
public static int random(final float range) {
return (int) (java.lang.Math.random() * (range + 1));
}
public static int random2(int range) {
return (int) (java.lang.Math.random() * range + 1);
}
public static int random3(int range) {
return (int) (java.lang.Math.random() * range);
}
public static int randomNumber(int range) {
return (int) (Math.random() * range);
}
// return a random number from 0 range - 1
public static int randomMinusOne(int range) {
return (int) Math.random() * range;
}
public static int randomArrayItem(int[] arr) {
return arr[(int) Math.floor(Math.random() * arr.length)];
}
public static int randomArrayListItem(ArrayList<Integer> arr) {
int index = (int) Math.floor(Math.random() * arr.size());
return arr.get(index);
}
/*
* Positioning Functions
*/
public static byte directionDeltaX[] = new byte[] { 0, 1, 1, 1, 0, -1, -1, -1 };
public static byte directionDeltaY[] = new byte[] { 1, 1, 0, -1, -1, -1, 0, 1 };
public static byte xlateDirectionToClient[] = new byte[] { 1, 2, 4, 7, 6, 5, 3, 0 };
public static double distance(int x1, int y1, int x2, int y2 ) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
public static boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
return objectX - playerX <= distance && objectX - playerX >= -distance && objectY - playerY <= distance && objectY - playerY >= -distance;
}
public static char xlateTable[] = { ' ', 'e', 't', 'a', 'o', 'i', 'h', 'n',
's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b',
'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', ' ', '!', '?', '.', ',', ':', ';', '(', ')', '-',
'&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"',
'[', ']' };
public static int[] delta(int x1, int y1, int x2, int y2) {
return new int[] {x2 - x1, y2 - y1};
@@ -342,4 +296,24 @@ public class Misc {
* changeY == directionDeltaY[j]) return j; } return -1;
*/
}
public static byte directionDeltaX[] = new byte[] { 0, 1, 1, 1, 0, -1, -1, -1 };
public static byte directionDeltaY[] = new byte[] { 1, 1, 0, -1, -1, -1, 0, 1 };
public static byte xlateDirectionToClient[] = new byte[] { 1, 2, 4, 7, 6,
5, 3, 0 };
public static String capitalize(String s) {
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
s = String.format("%s%s", Character.toUpperCase(s.charAt(0)),
s.substring(1));
}
if (!Character.isLetterOrDigit(s.charAt(i))) {
if (i + 1 < s.length()) {
s = String.format("%s%s%s", s.subSequence(0, i + 1), Character.toUpperCase(s.charAt(i + 1)), s.substring(i + 2));
}
}
}
return s;
}
}
+25 -8
View File
@@ -22,14 +22,31 @@
To compile any module from the command line, run `mvn clean install`
## Using Parabot with your local server:
- **1:** Download the latest `2006-Scape Fork Of Parabot` from [here](https://github.com/2006-Scape/Parabot/actions/workflows/maven.yml)
- **2:** Run the parabot client with the following args:
```fix
java -jar Parabot-V3.0.0.jar -login username password -loadlocal -v -clearcache
## Using Parabot with your local server: (OUTDATED)
- **1:** Download the latest `localhost_2006Scape.jar` from [here](https://github.com/2006-Scape/2006Scape/releases) (or, if testing server changes, compile it yourself like [this](https://i.imgur.com/uDrF0gl.png))
- **2:** Download the latest `Provider-version.jar` file from [here](http://v3.bdn.parabot.org/api/bot/download/default-provider?nightly=false)
- **3:** Create a file called `localhost.json` in `{user}\Documents\Parabot\servers`
- **4:** Put the following in the file
```json
{
"name": "localhost",
"author": "RedSparr0w",
"version": 1.0,
"client-class": "LocalGame",
"locations":{
"provider": "pathToYourJar/Provider-1.21.5.jar",
"server": "pathToYourJar/localhost_2006Scape.jar",
"hooks": "http://bdn.parabot.org/data/hooks/carmeuses/2006rebotted_hooks.xml"
}
}
```
- **3:** ???
- **4:** PROFIT
_(you will need to put the path to the jar files yourself)_
- 5: Run the parabot client with the following args:
```fix
java -jar Client-2.8.1.jar -login username password -loadlocal -v -clearcache
```
- **6:** ???
- **7:** PROFIT
### Server source layout
@@ -39,4 +56,4 @@ java -jar Parabot-V3.0.0.jar -login username password -loadlocal -v -clearcache
## Building from command line
Run `mvn -B clean package`
Run `mvn -B clean install`
-6
View File
@@ -1,6 +0,0 @@
:: Runs The Server & FileServer
start cmd /k java -jar Server.jar -c ServerConfig.json
:: Used To Wait 6 Seconds Before Running The Client
PING localhost -n 6 >NUL
:: Starts The Client
start cmd /k java -jar Client.jar -s localhost