diff --git a/Server/build.gradle b/Server/build.gradle index ff4459643..6da663610 100644 --- a/Server/build.gradle +++ b/Server/build.gradle @@ -40,7 +40,7 @@ dependencies { jar { manifest { - attributes 'Main-Class': 'core.Server' + attributes 'Main-Class': 'rs09.Server' } from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } } } \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java index 4b8eebd5c..75c775134 100644 --- a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java @@ -44,7 +44,7 @@ public final class AvasDevicePlugin implements Plugin { break; } } - if(player.hasActiveState("avadevice")) player.states.get("avadevice").getPulse().stop(); + if(player.hasActiveState("avadevice")) player.clearState("avadevice"); break; } return true; diff --git a/Server/src/main/java/core/game/interaction/MovementPulse.java b/Server/src/main/java/core/game/interaction/MovementPulse.java index 591d1e874..3a9e8b2aa 100644 --- a/Server/src/main/java/core/game/interaction/MovementPulse.java +++ b/Server/src/main/java/core/game/interaction/MovementPulse.java @@ -14,6 +14,7 @@ import core.net.packet.PacketRepository; import core.net.packet.context.PlayerContext; import core.net.packet.out.ClearMinimapFlag; import kotlin.jvm.functions.Function1; +import rs09.game.system.SystemLogger; import java.util.Deque; @@ -225,6 +226,12 @@ public abstract class MovementPulse extends Pulse { if (mover instanceof NPC && mover.asNpc().isNeverWalks()) { return; } + if(destination.getLocation() == null){ + SystemLogger.logAlert(destination.getId() + " < ID"); + SystemLogger.logAlert(destination.getName() + " < NAME"); + SystemLogger.logAlert("ASDAD"); + return; + } boolean inside = isInsideEntity(mover.getLocation()); if (last != null && last.equals(destination.getLocation()) && !inside) { return; diff --git a/Server/src/main/java/core/game/node/entity/player/Player.java b/Server/src/main/java/core/game/node/entity/player/Player.java index 700252aaf..6208cbd05 100644 --- a/Server/src/main/java/core/game/node/entity/player/Player.java +++ b/Server/src/main/java/core/game/node/entity/player/Player.java @@ -1354,9 +1354,7 @@ public class Player extends Entity { } public State registerState(String key){ - State state = StateRepository.forKey(key,this); - if(state != null) return state; - return null; + return StateRepository.forKey(key, this); } public void clearState(String key){ diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.java deleted file mode 100644 index d96b44ffa..000000000 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.java +++ /dev/null @@ -1,49 +0,0 @@ -package core.game.node.entity.skill.construction.decoration.chapel; - - -import core.cache.def.impl.ObjectDefinition; -import core.game.interaction.OptionHandler; -import core.game.node.Node; -import core.game.node.entity.player.Player; -import core.game.node.item.Item; -import core.game.node.object.GameObject; -import core.game.node.object.ObjectBuilder; -import core.game.world.update.flag.context.Animation; -import core.plugin.Initializable; -import core.plugin.Plugin; -import core.tools.RandomFunction; - -/** - * Handles the lighting of the torches of the Chapel. - * @author Splinter - */ -@Initializable -public class TorchLightPlugin extends OptionHandler { - - @Override - public Plugin newInstance(Object arg) throws Throwable { - for (int i = 13202; i < 13214; i++) { - ObjectDefinition.forId(i).getHandlers().put("option:light", this); - } - return this; - } - - @Override - public boolean handle(Player player, Node node, String option) { - if (player.getIronmanManager().checkRestriction() && !player.getHouseManager().isInHouse(player)) { - return true; - } - if (!player.getInventory().containsItem(new Item(590)) || !player.getInventory().containsItem(new Item(251))) { - player.getDialogueInterpreter().sendDialogue("You'll need a tinderbox and a clean marrentill herb in order to", "light the burner."); - return true; - } - if (player.getInventory().remove(new Item(251))) { - player.lock(1); - player.animate(Animation.create(3687)); - player.sendMessage("You burn some marrentill in the incense burner."); - ObjectBuilder.replace(node.asObject(), new GameObject(node.asObject().getId() + 1, node.getLocation()), RandomFunction.random(100, 175)); - } - return true; - } - -} \ No newline at end of file diff --git a/Server/src/main/java/core/net/packet/in/InteractionPacket.java b/Server/src/main/java/core/net/packet/in/InteractionPacket.java index be5d998b4..f60fd6209 100644 --- a/Server/src/main/java/core/net/packet/in/InteractionPacket.java +++ b/Server/src/main/java/core/net/packet/in/InteractionPacket.java @@ -186,7 +186,7 @@ public final class InteractionPacket implements IncomingPacket { player.debug("spawn=" + npc.getProperties().getSpawnLocation() + "."); player.debug("Varp ID= " + npc.getDefinition().getConfigId() + " Offset=" + npc.getDefinition().getVarbitOffset() + " Size=" + npc.getDefinition().getVarbitSize()); handleAIPLegion(player, 0, optionIndex, index); - if(Listeners.run(shown.getId(),2, option.getName(),player,shown)){ + if(Listeners.run(npc.getId(),2, option.getName(),player,npc)){ return; } if(PluginInteractionManager.handle(player,shown,option)){ diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thelostcity/DramenTreeListener.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thelostcity/DramenTreeListener.kt new file mode 100644 index 000000000..ebd03ea6f --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thelostcity/DramenTreeListener.kt @@ -0,0 +1,44 @@ +package rs09.game.content.quest.members.thelostcity + +import core.game.content.quest.members.lostcity.TreeSpiritNPC +import core.game.node.`object`.GameObject +import core.game.node.entity.skill.gather.GatheringSkillPulse +import core.game.node.entity.skill.gather.SkillingTool +import core.game.world.map.Location +import rs09.game.interaction.InteractionListener + +class DramenTreeListener : InteractionListener() { + + val DRAMEN_TREE = 1292 + + override fun defineListeners() { + + on(DRAMEN_TREE,OBJECT,"chop down"){player,node -> + val quest = player.questRepository.getQuest("Lost City") + if (SkillingTool.getHatchet(player) == null) { + player.getPacketDispatch().sendMessage("You do not have an axe which you have the level to use.") + return@on true + } + if (quest.getStage(player) < 20) { + return@on true + } + if (quest.getStage(player) == 20) { + if (player.getAttribute("treeSpawned", false)) { + return@on true + } + val spirit = TreeSpiritNPC.create(655, Location.create(2862, 9734, 0)) as TreeSpiritNPC + spirit.player = player + spirit.isRespawn = false + spirit.init() + spirit.attack(player) + player.setAttribute("treeSpawned", true) + spirit.sendChat("You must defeat me before touching the tree!") + return@on true + } + player.getPulseManager().run(GatheringSkillPulse(player, node as GameObject?)) + return@on true + } + + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt index c2b865534..147f9d94f 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt @@ -15,6 +15,7 @@ import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import rs09.ServerConstants +import rs09.game.node.entity.skill.farming.CompostBins import rs09.game.node.entity.skill.farming.FarmingPatch import rs09.game.system.SystemLogger import rs09.game.world.GameWorld @@ -33,7 +34,7 @@ class PlayerSaveParser(val player: Player) { var read = true val patch_varps = FarmingPatch.values().map { it.varpIndex }.toIntArray() - val bin_varps = FarmingPatch.values().map { it.varpIndex }.toIntArray() + val bin_varps = CompostBins.values().map { it.varpIndex }.toIntArray() init { reader diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/chapel/BurnerListener.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/chapel/BurnerListener.kt new file mode 100644 index 000000000..eca00c257 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/chapel/BurnerListener.kt @@ -0,0 +1,43 @@ +package rs09.game.node.entity.skill.construction.decoration.chapel + +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.tools.RandomFunction +import rs09.game.interaction.InteractionListener + +/** + * Handles the lighting of the torches of the Chapel. + * @author Splinter + */ +class BurnerListener : InteractionListener() { + + val IDs = intArrayOf(13202,13203,13204,13205,13206,13207,13208,13209,13210,13211,13212,13213) + + override fun defineListeners() { + on(IDs,OBJECT,"light"){player,node -> + if (player.ironmanManager.checkRestriction() && !player.houseManager.isInHouse(player)) { + return@on true + } + if (!player.inventory.containsItem(Item(590)) || !player.inventory.containsItem(Item(251))) { + player.dialogueInterpreter.sendDialogue( + "You'll need a tinderbox and a clean marrentill herb in order to", + "light the burner." + ) + return@on true + } + if (player.inventory.remove(Item(251))) { + player.lock(1) + player.animate(Animation.create(3687)) + player.sendMessage("You burn some marrentill in the incense burner.") + ObjectBuilder.replace( + node.asObject(), + GameObject(node.asObject().id + 1, node.location), + RandomFunction.random(100, 175) + ) + } + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt index 98defcfa0..6c3608856 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt @@ -6,6 +6,7 @@ import core.tools.RandomFunction import org.json.simple.JSONArray import org.json.simple.JSONObject import org.rs09.consts.Items +import rs09.game.system.SystemLogger import java.util.concurrent.TimeUnit class CompostBin(val player: Player, val bin: CompostBins) { @@ -102,6 +103,7 @@ class CompostBin(val player: Player, val bin: CompostBins) { } if (isClosed) player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest + 6, 1) } + SystemLogger.logAlert("Sending " + player.varpManager.get(bin.varpIndex).getValue()) player.varpManager.get(bin.varpIndex).send(player) } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt index 3a659a40a..3fe06861b 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt @@ -100,6 +100,10 @@ object UseWithPatchHandler{ if(!p.isWatered && (t == PatchType.ALLOTMENT || t == PatchType.FLOWER || t == PatchType.HOPS) && !p.isGrown()){ player.pulseManager.run(object : Pulse(){ override fun pulse(): Boolean { + if(p.isWeedy()){ + player.sendMessage("You should grow something first.") + return true + } player.animator.animate(wateringCanAnim) if(player.inventory.remove(event.usedItem)){ player.inventory.add(Item(usedItem.id.getNext())) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt index bfa8f6bb0..5617a48b6 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt @@ -8,9 +8,9 @@ object StateRepository { @JvmStatic fun init() { - val result = ClassGraph().enableClassInfo().enableAnnotationInfo().acceptPackages("core.game.node.entity.state").scan() - result.getClassesWithAnnotation("core.game.node.entity.state.newsys.PlayerState").forEach{ - val key = it.getAnnotationInfo("core.game.node.entity.state.newsys.PlayerState").parameterValues[0].value as String + val result = ClassGraph().enableClassInfo().enableAnnotationInfo().acceptPackages("rs09.game.node.entity.state").scan() + result.getClassesWithAnnotation("rs09.game.node.entity.state.newsys.PlayerState").forEach{ + val key = it.getAnnotationInfo("rs09.game.node.entity.state.newsys.PlayerState").parameterValues[0].value as String val clazz = it.loadClass().newInstance() if(clazz is State) { states.put(key, clazz) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/AvaDeviceState.kt b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/AvaDeviceState.kt index 6fe0ddbba..45fac8e30 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/AvaDeviceState.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/AvaDeviceState.kt @@ -22,7 +22,8 @@ class AvaDeviceState(player: Player? = null) : State(player) { private val ACCUMULATOR_REWARDS = arrayOf(Items.STEEL_BAR_2353,Items.STEEL_2H_SWORD_1311,Items.STEEL_KNIFE_865,Items.STEEL_DAGGER_1207,Items.STEEL_MED_HELM_1141,Items.STEEL_DART_808,Items.STEEL_BOLTS_9141,Items.STEEL_ARROW_886,Items.IRON_BAR_2351) override fun save(root: JSONObject) { - root.put("device-id",device) + if(pulse == null || !pulse!!.isRunning) + root.put("device-id",device) } override fun parse(_data: JSONObject) { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/FarmingState.kt b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/FarmingState.kt index 581f37ae2..5551ae44c 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/FarmingState.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/states/FarmingState.kt @@ -1,15 +1,15 @@ package rs09.game.node.entity.state.newsys.states import core.game.node.entity.player.Player -import rs09.game.node.entity.skill.farming.* -import rs09.game.node.entity.state.newsys.PlayerState -import rs09.game.node.entity.state.newsys.State -import rs09.game.system.SystemLogger import core.game.system.task.Pulse import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.json.simple.JSONArray import org.json.simple.JSONObject +import rs09.game.node.entity.skill.farming.* +import rs09.game.node.entity.state.newsys.PlayerState +import rs09.game.node.entity.state.newsys.State +import rs09.game.system.SystemLogger import java.util.concurrent.TimeUnit @PlayerState("farming") @@ -70,11 +70,8 @@ class FarmingState(player: Player? = null) : State(player) { val bin = it as JSONObject val binOrdinal = bin["bin-ordinal"].toString().toInt() val cBin = CompostBins.values()[binOrdinal] - val b = CompostBin(player,cBin) + val b = cBin.getBinForPlayer(player) b.parse(bin["binData"] as JSONObject) - if(binMap[cBin] == null) { - binMap[cBin] = b - } SystemLogger.logErr("bin size " + binMap.size) } } @@ -133,35 +130,33 @@ class FarmingState(player: Player? = null) : State(player) { } override fun createPulse() { - if(patchMap.isNotEmpty() || binMap.isNotEmpty()){ - pulse = object : Pulse(3){ - override fun pulse(): Boolean { + pulse = object : Pulse(3){ + override fun pulse(): Boolean { - GlobalScope.launch { - var removeList = ArrayList() - for((_,patch) in patchMap){ - - if(patch.getCurrentState() in 1..3 && patch.nextGrowth == 0L){ - patch.nextGrowth = System.currentTimeMillis() + 60000 - continue - } - - if(patch.nextGrowth < System.currentTimeMillis() && !patch.isDead){ - patch.update() - patch.nextGrowth = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(patch.patch.type.stageGrowthTime.toLong()) - } + GlobalScope.launch { + var removeList = ArrayList() + for((_,patch) in patchMap){ + if(patch.getCurrentState() in 1..3 && patch.nextGrowth == 0L){ + patch.nextGrowth = System.currentTimeMillis() + 60000 + continue } - for((_,bin) in binMap){ - if(bin.isReady() && !bin.isFinished){ - bin.finish() - } + if(patch.nextGrowth < System.currentTimeMillis() && !patch.isDead){ + patch.update() + patch.nextGrowth = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(patch.patch.type.stageGrowthTime.toLong()) } + } - return false + for((_,bin) in binMap){ + if(bin.isReady() && !bin.isFinished){ + bin.finish() + } + } } + + return false } } } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt index 6d8c63351..30281e04c 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt @@ -163,13 +163,15 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ for (i in 0..310) { player!!.packetDispatch.sendString("", 275, i) } + val offerList = offers.keys.map { "${ItemDefinition.forId(it).name} - ${offers[it]}" }.sorted() + var lineId = 11 player!!.packetDispatch.sendString("Active Sell Offers", 275, 2) var counter = 0 for(i in 0..299) { - val offer = offers.entries.elementAtOrNull(i) + val offer = offerList.elementAtOrNull(i) if (offer != null) - player.packetDispatch.sendString("${ItemDefinition.forId(offer.key).name} x${offer.value}", 275, lineId++) + player.packetDispatch.sendString(offer, 275, lineId++) else player.packetDispatch.sendString("", 275, lineId++) } diff --git a/Tools/update-utils b/Tools/update-utils index 03700d8ea..137a75225 100755 --- a/Tools/update-utils +++ b/Tools/update-utils @@ -17,15 +17,15 @@ copy_configs () { } build_jars () { - cp ~/IdeaProjects/rs09-remake/Server/src/main/java/Server/core/ServerConstants.kt ~/IdeaProjects/rs09-remake/Server/src/main/java/Server/core/ServerConstants.backup + cp ~/IdeaProjects/rs09-remake/Server/src/main/kotlin/rs09/ServerConstants.kt ~/IdeaProjects/rs09-remake/Server/src/main/kotlin/rs09/ServerConstants.kt.backup cp ~/IdeaProjects/rs09-remake/Client/src/main/kotlin/org/rs09/client/config/GameConfig.kt ~/IdeaProjects/rs09-remake/Client/src/main/kotlin/org/rs09/client/config/GameConfig.backup rsa_priv=`cat ~/IdeaProjects/rs09-remake/rsapriv | grep "private static final BigInteger RSA_EXPONENT = new BigInteger(" | sed 's/private static final BigInteger RSA_EXPONENT = new BigInteger(\"//' | sed 's/\")\;//'` rsa_pub=`cat ~/IdeaProjects/rs09-remake/rsapriv | grep "private static final BigInteger RSA_MODULUS = new BigInteger(" | sed 's/private static final BigInteger RSA_MODULUS = new BigInteger(\"//' | sed 's/\")\;//'` - sed -i "s/var EXPONENT = BigInteger(\"[0-9]*\")/var EXPONENT = BigInteger(\"$rsa_priv\")/" ~/IdeaProjects/rs09-remake/Server/src/main/java/Server/core/ServerConstants.kt - sed -i "s/var MODULUS = BigInteger(\"[0-9]*\")/var MODULUS = BigInteger(\"$rsa_pub\")/" ~/IdeaProjects/rs09-remake/Server/src/main/java/Server/core/ServerConstants.kt + sed -i "s/var EXPONENT = BigInteger(\"[0-9]*\")/var EXPONENT = BigInteger(\"$rsa_priv\")/" ~/IdeaProjects/rs09-remake/Server/src/main/kotlin/rs09/ServerConstants.kt + sed -i "s/var MODULUS = BigInteger(\"[0-9]*\")/var MODULUS = BigInteger(\"$rsa_pub\")/" ~/IdeaProjects/rs09-remake/Server/src/main/kotlin/rs09/ServerConstants.kt sed -i "s/var MODULUS = BigInteger(\"[0-9]*\")/var MODULUS = BigInteger(\"$rsa_pub\")/" ~/IdeaProjects/rs09-remake/Client/src/main/kotlin/org/rs09/client/config/GameConfig.kt @@ -34,7 +34,7 @@ build_jars () { cd ../Server gradle jar - cp ~/IdeaProjects/rs09-remake/Server/src/main/java/Server/core/ServerConstants.backup ~/IdeaProjects/rs09-remake/Server/src/main/java/Server/core/ServerConstants.kt + cp ~/IdeaProjects/rs09-remake/Server/src/main/kotlin/rs09/ServerConstants.kt.backup ~/IdeaProjects/rs09-remake/Server/src/main/kotlin/rs09/ServerConstants.kt cp ~/IdeaProjects/rs09-remake/Client/src/main/kotlin/org/rs09/client/config/GameConfig.backup ~/IdeaProjects/rs09-remake/Client/src/main/kotlin/org/rs09/client/config/GameConfig.kt @@ -43,7 +43,7 @@ build_jars () { copy_jars() { cd ~/IdeaProjects/rs09-remake/Client/build/libs - scp client-1.0.0.jar scape2009@play.rs09-remake.org:/opt/lampp/htdocs/2009scape.jar + scp client-1.0.0.jar scape2009@play.2009scape.org:/opt/lampp/htdocs/2009scape.jar cd ~/IdeaProjects/rs09-remake/Server/build/libs scp server-1.0.0.jar scape2009@play.2009scape.org:server.jar echo "Jars successfully copied to remote server"