Pushed start of Fist of Guthix work

This commit is contained in:
ceikry 2021-07-22 19:32:15 -05:00
parent 8d76c54ae3
commit baafb941a3
10 changed files with 1841 additions and 319 deletions

View file

@ -1,91 +0,0 @@
package core.game.content.activity.fog;
import core.cache.def.impl.SceneryDefinition;
import core.game.content.activity.ActivityPlugin;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.player.Player;
import core.game.world.map.Location;
import core.game.world.map.zone.ZoneBorders;
import core.plugin.Plugin;
import rs09.plugin.PluginManager;
/**
* Represents the fist of guthix activity.
* @author Vexia
*/
public class FOGActivityPlugin extends ActivityPlugin {
/**
* The maximum amount of players in a game.
*/
public static final int MAX_PLAYERS = 250;
/**
* The waiting interface id.
*/
public static final int WAITING_INTERFACE = 731;
/**
* The current fist of guthix round.
*/
private int round;
/**
* Constructs a new {@code FOGActivityPlugin} {@code Object}
*/
public FOGActivityPlugin() {
super("Fist of Guthix", false, true, true);
}
@Override
public ActivityPlugin newInstance(Player p) throws Throwable {
return new FOGActivityPlugin();
}
@Override
public Location getSpawnLocation() {
return null;
}
@Override
public void configure() {
PluginManager.definePlugin(new FOGLobbyZone());
PluginManager.definePlugin(new FOGWaitingZone());
PluginManager.definePlugin(new OptionHandler() {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
SceneryDefinition.forId(30204).getHandlers().put("option:enter", this);
return this;
}
@Override
public boolean handle(Player player, Node node, String option) {
switch (node.getId()) {
case 30204:
player.teleport(Location.create(1675, 5599, 0));
return true;
}
return true;
}
});
register(new ZoneBorders(1625, 5638, 1715, 5747));
}
/**
* Gets the round.
* @return the round
*/
public int getRound() {
return round;
}
/**
* Sets the round.
* @param round the round to set.
*/
public void setRound(int round) {
this.round = round;
}
}

View file

@ -1,75 +0,0 @@
package core.game.content.activity.fog;
import core.game.component.Component;
import core.game.interaction.Option;
import core.game.node.Node;
import core.game.node.entity.Entity;
import core.game.node.entity.player.Player;
import core.game.world.map.Location;
import core.game.world.map.zone.MapZone;
import core.game.world.map.zone.ZoneBuilder;
import core.plugin.Plugin;
/**
* Represents a zone where players can prepare for a game.
* @author Vexia
*/
public class FOGLobbyZone extends MapZone implements Plugin<Object> {
/**
* Constructs a new {@code FOGHallZone} {@code Object}
*/
public FOGLobbyZone() {
super("Fog Lobby", true);
}
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
ZoneBuilder.configure(this);
return this;
}
@Override
public boolean enter(Entity e) {
if (e.isPlayer()) {
sendInterface(e.asPlayer());
}
return super.enter(e);
}
@Override
public boolean interact(Entity e, Node target, Option option) {
if (!e.isPlayer()) {
return super.interact(e, target, option);
}
Player player = e.asPlayer();
switch (target.getId()) {
case 30203:
player.teleport(Location.create(3242, 3574, 0));
return true;
}
return super.interact(e, target, option);
}
/**
* Sends the fist of guthix lobby interface.
* @param player the player.
*/
private void sendInterface(Player player) {
player.getInterfaceManager().openOverlay(new Component(FOGActivityPlugin.WAITING_INTERFACE));
player.getPacketDispatch().sendInterfaceConfig(FOGActivityPlugin.WAITING_INTERFACE, 17, true);
player.getPacketDispatch().sendInterfaceConfig(FOGActivityPlugin.WAITING_INTERFACE, 26, true);
player.getPacketDispatch().sendString("Rating: " + player.getSavedData().getActivityData().getFogRating(), FOGActivityPlugin.WAITING_INTERFACE, 7);
}
@Override
public Object fireEvent(String identifier, Object... args) {
return null;
}
@Override
public void configure() {
super.registerRegion(6743);
}
}

View file

@ -1,104 +0,0 @@
package core.game.content.activity.fog;
import core.game.node.entity.player.Player;
/**
* Represents a fist of guthix player.
* @author Vexia
*/
public class FOGPlayer {
/**
* The player instance.
*/
private final Player player;
/**
* The target FOG player.
*/
private final FOGPlayer target;
/**
* If the player is hunted or a hunter.
*/
private boolean hunted;
/**
* The amount of fist of guthix charges.
*/
private int charges;
/**
* Constructs a new {@code FOGPlayer} {@code Object}
* @param player the player.
* @param oponent the other player.
*/
public FOGPlayer(Player player, FOGPlayer oponent) {
this.player = player;
this.target = oponent;
}
/**
* Switches the roles of the player.
*/
public void switchRoles() {
hunted = !hunted;
}
/**
* Increments the energy charges.
* @param increment the number to increment.
*/
public void incrementCharges(int increment) {
charges += increment;
}
/**
* Gets the hunted.
* @return the hunted
*/
public boolean isHunted() {
return hunted;
}
/**
* Sets the hunted.
* @param hunted the hunted to set.
*/
public void setHunted(boolean hunted) {
this.hunted = hunted;
}
/**
* Gets the charges.
* @return the charges
*/
public int getCharges() {
return charges;
}
/**
* Sets the charges.
* @param charges the charges to set.
*/
public void setCharges(int charges) {
this.charges = charges;
}
/**
* Gets the player.
* @return the player
*/
public Player getPlayer() {
return player;
}
/**
* Gets the target.
* @return the target
*/
public FOGPlayer getTarget() {
return target;
}
}

View file

@ -1,49 +0,0 @@
package core.game.content.activity.fog;
import core.game.interaction.Option;
import core.game.node.Node;
import core.game.node.entity.Entity;
import core.game.world.map.zone.MapZone;
import core.game.world.map.zone.ZoneBuilder;
import core.plugin.Plugin;
/**
* Represents the zone where players wait for a match.
* @author Vexia
*/
public class FOGWaitingZone extends MapZone implements Plugin<Object> {
/**
* Constructs a new {@code FOGLobbyZone} {@code Object}
*/
public FOGWaitingZone() {
super("Fog Waiting Room", true);
}
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
ZoneBuilder.configure(this);
return this;
}
@Override
public boolean enter(Entity e) {
return super.enter(e);
}
@Override
public boolean interact(Entity e, Node target, Option option) {
return super.interact(e, target, option);
}
@Override
public Object fireEvent(String identifier, Object... args) {
return null;
}
@Override
public void configure() {
super.registerRegion(6487);
}
}

View file

@ -0,0 +1,110 @@
package rs09.game.content.activity.fog
import api.ContentAPI
import core.game.node.entity.player.Player
import core.game.world.map.Location
import core.tools.RandomFunction
import org.rs09.consts.Items
class FOGSession(val playerA: Player, val playerB: Player) {
var hunter = playerA
var hunted = playerB
var isActive = true
var winner: Player? = null
var loser: Player? = null
var playerAScore = 0
var playerBScore = 0
var round = 1
var roundTimer = 0
fun start(){
playerA.setAttribute("fog-session",this)
playerA.logoutListeners["fog-logout"] = { player -> ContentAPI.teleport(player, Location.create(1714, 5599, 0)); isActive = false }
playerB.setAttribute("fog-session",this)
playerB.logoutListeners["fog-logout"] = { player -> ContentAPI.teleport(player, Location.create(1714, 5599, 0)); isActive = false }
}
fun tick() {
roundTimer++
playerA.varpManager.get(FOGUtils.TIMER_VARP).setVarbit(4, roundTimer).send(playerA)
playerB.varpManager.get(FOGUtils.TIMER_VARP).setVarbit(4, roundTimer).send(playerB)
if(FOGUtils.carryingStone(hunted) && roundTimer % 5 == 0){
FOGUtils.incrementHuntedScore(this, FOGUtils.getTickScore(hunted))
} else if (!ContentAPI.inInventory(hunted, Items.STONE_OF_POWER_12845)){
FOGUtils.showStoneNotice(hunted)
}
if((roundTimer == 1000 || getCurrentHuntedScore() >= 5000) && isActive){
changeRounds()
}
}
fun getCurrentHuntedScore(): Int {
return when(round){
1 -> playerBScore
2 -> playerAScore
else -> -1
}
}
fun changeRounds(){
if(round == 2){
finishGame()
} else {
round = 2
hunted = playerA
hunter = playerB
FOGUtils.updateHuntStatus(playerA, playerA == hunter)
FOGUtils.updateHuntStatus(playerB, playerB == hunter)
hunted.properties.teleportLocation = FOGUtils.getRandomStartLocation()
hunter.properties.teleportLocation = FOGUtils.getRandomStartLocation()
}
}
fun finishGame(){
if(playerAScore > playerBScore){
winner = playerA
loser = playerB
} else if (playerBScore > playerAScore){
winner = playerB
loser = playerA
}
if(winner == null) {
//draw
rewardLoss(playerA)
rewardLoss(playerB)
} else {
rewardLoss(loser!!)
rewardVictory(winner!!)
}
}
fun getScore(player: Player): Int{
return when(player){
playerA -> playerAScore
playerB -> playerBScore
else -> 0
}
}
fun rewardLoss(player: Player){
ContentAPI.addItemOrDrop(player, Items.FIST_OF_GUTHIX_TOKEN_12852, RandomFunction.random(1,3))
ContentAPI.sendMessage(player, "You lost and were given some tokens for your effort.")
}
fun rewardVictory(player: Player){
var tokens = getScore(player) / 200.0
tokens += player.skills.totalLevel / 100.0
ContentAPI.addItemOrDrop(player, Items.FIST_OF_GUTHIX_TOKEN_12852, tokens.toInt())
ContentAPI.sendMessage(player, "Guthix smiles upon your victory and rewards you.")
}
}

View file

@ -0,0 +1,129 @@
package rs09.game.content.activity.fog
import api.ContentAPI
import core.game.node.entity.combat.DeathTask
import core.game.node.entity.player.Player
import core.game.world.map.Location
import org.rs09.consts.Items
import kotlin.math.max
object FOGUtils {
const val TIMER_VARP = 1215
fun getRandomStartLocation(): Location {
return startLocations.random()
}
fun getSession(player: Player): FOGSession? {
return player.getAttribute("fog-session")
}
fun carryingStone(player: Player): Boolean {
return ContentAPI.inEquipment(player, Items.STONE_OF_POWER_12845)
}
fun isHunted(player: Player): Boolean {
val session = getSession(player) ?: return false
return session.hunted == player
}
fun isHunter(player: Player): Boolean {
return !isHunted(player)
}
fun incrementHuntedScore(session: FOGSession, amount: Int){
if(DeathTask.isDead(session.hunted)) return
when(session.round){
1 -> session.playerBScore += amount
2 -> session.playerAScore += amount
}
}
fun updateHuntStatus(player: Player, hunter: Boolean){
player.packetDispatch.sendInterfaceConfig(730, 25, hunter)
player.packetDispatch.sendInterfaceConfig(730, 26, !hunter)
if(hunter){
player.packetDispatch.sendString(getSession(player)?.hunted?.name ?: "AAAAA", 730, 18)
} else {
player.packetDispatch.sendString(getSession(player)?.hunter?.name ?: "AAAAA", 730, 18)
}
}
fun getTickScore(player: Player): Int {
return max(50 - player.location.getDistance(getClosestCentralTile(player)).toInt(), 10)
}
fun getClosestCentralTile(player: Player): Location{
var closest = centralTiles.first()
for(loc in centralTiles){
if(player.location.getDistance(loc) < player.location.getDistance(closest)) closest = loc
}
return closest
}
fun hideStoneNotice(player: Player){
player.packetDispatch.sendInterfaceConfig(730, 23, true)
}
fun showStoneNotice(player: Player){
player.packetDispatch.sendInterfaceConfig(730, 23, false)
}
val startLocations = arrayOf(
Location.create(1627, 5708, 0),
Location.create(1624, 5697, 0),
Location.create(1626, 5692, 0),
Location.create(1629, 5685, 0),
Location.create(1631, 5680, 0),
Location.create(1635, 5672, 0),
Location.create(1642, 5665, 0),
Location.create(1648, 5660, 0),
Location.create(1655, 5657, 0),
Location.create(1660, 5657, 0),
Location.create(1666, 5658, 0),
Location.create(1673, 5660, 0),
Location.create(1681, 5663, 0),
Location.create(1687, 5665, 0),
Location.create(1692, 5669, 0),
Location.create(1695, 5674, 0),
Location.create(1700, 5681, 0),
Location.create(1701, 5685, 0),
Location.create(1703, 5690, 0),
Location.create(1697, 5697, 0),
Location.create(1694, 5706, 0),
Location.create(1690, 5713, 0),
Location.create(1687, 5717, 0),
Location.create(1681, 5724, 0),
Location.create(1675, 5727, 0),
Location.create(1669, 5729, 0),
Location.create(1663, 5732, 0),
Location.create(1656, 5730, 0),
Location.create(1647, 5727, 0),
Location.create(1637, 5723, 0),
Location.create(1634, 5719, 0),
Location.create(1627, 5712, 0),
Location.create(1624, 5704, 0),
Location.create(1624, 5695, 0),
Location.create(1628, 5686, 0),
Location.create(1633, 5678, 0),
Location.create(1636, 5670, 0),
Location.create(1642, 5665, 0),
Location.create(1648, 5660, 0),
Location.create(1655, 5657, 0),
Location.create(1633, 5718, 0),
Location.create(1644, 5727, 0),
Location.create(1656, 5731, 0),
Location.create(1667, 5731, 0),
Location.create(1682, 5722, 0),
Location.create(1691, 5711, 0)
)
val centralTiles = arrayOf(
Location.create(1663, 5695, 0),
Location.create(1664, 5695, 0),
Location.create(1664, 5696, 0),
Location.create(1663, 5696, 0)
)
}

View file

@ -0,0 +1,46 @@
package rs09.game.content.activity.fog
import api.ContentAPI
import core.game.node.entity.player.Player
import core.game.system.task.Pulse
object FOGWaitingArea {
val currentlyWaiting = ArrayList<Player>()
val activeSessions = ArrayList<FOGSession>()
val pulse = object : Pulse(10){
override fun pulse(): Boolean {
if(currentlyWaiting.size < 4) return false
val sortedByCombat = currentlyWaiting.sortedBy { it.properties.currentCombatLevel }.toMutableList()
if(sortedByCombat.size % 2 != 0) sortedByCombat.removeLast()
var previousPlayer: Player? = null
for(player in sortedByCombat){
if(previousPlayer == null) previousPlayer = player
else{
val session = FOGSession(previousPlayer, player)
session.start()
activeSessions.add(session)
previousPlayer = null
}
}
return false
}
}
fun register(player: Player): Boolean {
if(!pulse.isRunning) ContentAPI.submitWorldPulse(pulse)
return currentlyWaiting.add(player)
}
fun clear(player: Player): Boolean {
return currentlyWaiting.remove(player)
}
fun isFull(): Boolean {
return activeSessions.size >= 125
}
}

View file

@ -0,0 +1,87 @@
package rs09.game.content.activity.fog
import api.ContentAPI
import core.game.interaction.Option
import core.game.node.Node
import core.game.node.entity.Entity
import core.game.node.entity.player.Player
import core.game.system.task.Pulse
import core.game.world.map.zone.MapZone
import core.game.world.map.zone.ZoneBuilder
import core.game.world.map.zone.ZoneRestriction
import core.plugin.Initializable
import core.plugin.Plugin
import org.rs09.consts.Items
@Initializable
class FOGZone : MapZone("Fist of Guthix", true, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FIRES), Plugin<Any> {
override fun newInstance(arg: Any?): Plugin<Any> {
ZoneBuilder.configure(this)
ContentAPI.submitWorldPulse(pulse)
return this
}
override fun configure() {
registerRegion(6488)
registerRegion(6489)
registerRegion(6745)
registerRegion(6744)
}
override fun fireEvent(identifier: String?, vararg args: Any?): Any {
return Unit
}
override fun enter(e: Entity?): Boolean {
if(e is Player){
ContentAPI.openOverlay(e, 730)
}
return super.enter(e)
}
override fun leave(e: Entity?, logout: Boolean): Boolean {
if(e is Player) {
ContentAPI.closeOverlay(e)
}
return super.leave(e, logout)
}
val pulse = object : Pulse(){
override fun pulse(): Boolean {
for(session in FOGWaitingArea.activeSessions){
session.tick()
}
return false
}
}
override fun interact(e: Entity?, target: Node?, option: Option?): Boolean {
if(e !is Player) return false
when(option?.name?.toLowerCase()){
"take-stone" -> {
if(FOGUtils.getSession(e)?.hunted != e){
ContentAPI.sendMessage(e, "You can't take that right now.")
return true
}
if(FOGUtils.carryingStone(e) || ContentAPI.inInventory(e, Items.STONE_OF_POWER_12845)){
ContentAPI.sendMessage(e, "You already have a stone.")
return true
}
ContentAPI.addItem(e, Items.STONE_OF_POWER_12845)
return true
}
"pass" -> {
ContentAPI.forceWalk(e, e.location.transform(e.direction), "clip")
}
}
return super.interact(e, target, option)
}
}

View file

@ -0,0 +1,27 @@
package rs09.game.interaction.region.fog
import api.ContentAPI
import core.game.world.map.Location
import rs09.game.content.activity.fog.FOGWaitingArea
import rs09.game.interaction.InteractionListener
class FOGLobbyListeners : InteractionListener(){
val FOG_WAITING_ROOM = Location.create(1653, 5600, 0)
val FOG_ARENA = Location.create(1663, 5695, 0)
val WAITING_ROOM_ENTRANCE = 30224
override fun defineListeners() {
on(WAITING_ROOM_ENTRANCE, SCENERY, "go-through"){player, node ->
if(FOGWaitingArea.isFull()){
ContentAPI.sendMessage(player, "The game is currently full. Please wait.")
return@on true
}
ContentAPI.teleport(player, FOG_WAITING_ROOM)
FOGWaitingArea.register(player)
return@on true
}
}
}

1442
dumps/530/coords Normal file

File diff suppressed because it is too large Load diff