1package com.osroyale.content.lms;
3import com.osroyale.Config;
4import com.osroyale.content.lms.crate.LMSCrate;
5import com.osroyale.content.lms.fog.Fog;
6import com.osroyale.content.lms.loadouts.LMSLoadout;
7import com.osroyale.content.lms.loadouts.LMSLoadoutManager;
8import com.osroyale.content.lms.lobby.LMSLobby;
9import com.osroyale.content.lms.lobby.LMSLobbyEvent;
10import com.osroyale.content.lms.safezone.LMSSafezone;
11import com.osroyale.game.Animation;
12import com.osroyale.game.Graphic;
13import com.osroyale.game.world.World;
14import com.osroyale.game.world.entity.combat.hit.Hit;
15import com.osroyale.game.world.entity.combat.hit.HitIcon;
16import com.osroyale.game.world.entity.combat.hit.Hitsplat;
17import com.osroyale.game.world.entity.combat.strategy.player.special.CombatSpecial;
18import com.osroyale.game.world.entity.combat.weapon.WeaponInterface;
19import com.osroyale.game.world.entity.mob.Direction;
20import com.osroyale.game.world.entity.mob.UpdateFlag;
21import com.osroyale.game.world.entity.mob.player.Player;
22import com.osroyale.game.world.entity.mob.player.PlayerOption;
23import com.osroyale.game.world.entity.mob.player.persist.PlayerSerializer;
24import com.osroyale.game.world.entity.skill.Skill;
25import com.osroyale.game.world.items.Item;
26import com.osroyale.game.world.items.ItemDefinition;
27import com.osroyale.game.world.items.ground.GroundItem;
28import com.osroyale.game.world.object.CustomGameObject;
29import com.osroyale.game.world.position.Area;
30import com.osroyale.game.world.position.Boundary;
31import com.osroyale.game.world.position.Position;
32import com.osroyale.net.packet.out.*;
33import com.osroyale.util.StringUtils;
34import com.osroyale.util.Utility;
95 private static Fog currentFog =
new Fog(-1, -1, -1, -1);
97 private static int lastFogCycle;
127 private static List<CustomGameObject> storedObjects =
new ArrayList<>();
134 private static String getGameTypeName() {
135 return currentGameType.getClass().getSimpleName();
141 private static List<Position> possible_spawns = Arrays.asList(
204 player.message(
"The game has not started yet.");
208 if (target.lmsImmunity > System.currentTimeMillis()) {
209 player.message(target.getUsername() +
" has temporary immunity from being attacked!");
213 if (target.
getCombat().isUnderAttack() && !target.
getCombat().isUnderAttackBy(player)) {
214 if (!
Area.inMulti(player) || !
Area.inMulti(target)) {
215 player.send(
new SendMessage(target.
getName() +
" is currently in combat and can not be attacked."));
230 if (player ==
null || !player.inventory.
contains(keyId) && !lootCrate)
235 boolean upgradedKey = keyId == 20608;
237 int lootTable =
Utility.random(1);
243 int maximumUnlocks = currentLoadout.getOffensiveItem().length + currentLoadout.getDefensiveItem().length + currentLoadout.getOffensiveItemUpgrades().length;
245 if (player.unlockedLMSItems.size() >= maximumUnlocks)
return;
249 loot = currentLoadout.getOffensiveItem()[
Utility.random(currentLoadout.getOffensiveItem().length - 1)];
250 else if (lootTable == 1)
251 loot = currentLoadout.getDefensiveItem()[
Utility.random(currentLoadout.getDefensiveItem().length - 1)];
253 loot = currentLoadout.getOffensiveItemUpgrades()[
Utility.random(currentLoadout.getOffensiveItemUpgrades().length - 1)];
256 if (player.unlockedLMSItems.contains(loot)) {
261 player.unlockedLMSItems.add(loot);
264 if (loot == 11235) player.unlockedLMSItems.add(11212);
266 if (loot == 19481) player.unlockedLMSItems.add(19484);
270 if (!lootCrate) player.inventory.
remove(keyId);
273 if (loot == 22636 || loot == 299) amount = 1000;
275 giveChestItems(loot, amount, player);
288 if (loot == 11235) secondary = 11212;
289 else if(loot == 19481) secondary = 19484;
293 giveChestItems(secondary, getItemAmountForItem(secondary), player);
302 private static void giveChestItems(
int loot,
int amount,
Player player) {
306 player.inventory.
add(loot, amount);
310 player.message(
"You have received " + amount +
"x " +
ItemDefinition.
get(loot).
getName() +
". It has been added to " + (space ?
"your inventory" :
"the ground"));
335 private static void start() {
347 private static void gearUpPlayers() {
348 List<Position> copySpawns =
new ArrayList<>();
349 copySpawns.addAll(possible_spawns);
351 gamePlayers.stream().filter(Objects::nonNull).forEach(player -> {
353 player.prayer.
reset();
355 player.unlockedLMSItems =
new ArrayList<>();
365 Collections.shuffle(copySpawns);
366 int randomPick =
Utility.random(copySpawns.size() - 1);
367 player.
move(copySpawns.get(randomPick));
368 copySpawns.remove(randomPick);
378 for(
int index = 0; index < currentGameType.getSkills().length; index++) {
379 int level = currentGameType.getSkills()[index];
380 Skill skill = player.skills.
get(index);
383 skill.setMaxLevel(level);
384 skill.setExperience(skill.getExperienceForLevel(level));
399 player.equipment.
clear();
400 player.inventory.
clear();
401 player.runePouch.clear();
405 player.spellbook = loadout.getSpellbook();
409 player.inventory.set(loadout.getInventorySetup().
getItems().clone());
412 player.equipment.
clear();
413 player.equipment.set(loadout.getEquipmentSetup().
getItems().clone());
418 for(
int index = 0; index < loadout.getRunePouchRunes().length; index++)
419 player.runePouch.
runes.add(
new Item(loadout.getRunePouchRunes()[index][0], loadout.getRunePouchRunes()[index][1]));
423 player.equipment.updateRangedEquipment();
424 player.runePouch.refresh();
428 player.updateFlags.add(
UpdateFlag.APPEARANCE);
441 player.graphic(
Graphic.RESET,
true);
443 player.inventory.
clear();
444 player.equipment.
clear();
445 player.runePouch.clear(
false);
447 player.inventory.set(player.inventory_copy.
getItems().clone());
449 player.equipment.set(player.equipment_copy.
getItems().clone());
450 for(
int index = 0; index < player.runePouch_copy.
runes.size(); index++)
451 player.runePouch.
runes.add(player.runePouch_copy.
runes.get(index));
457 player.inventory_copy.
clear();
458 player.equipment_copy.
clear();
459 player.runePouch_copy.clear(
false);
463 player.runePouch.refresh();
466 player.spellbook = player.spellbook_copy;
469 player.prayer.
reset();
485 private static void resetLevels(
Player player) {
486 for(
int index = 0; index < player.skills.
getSkills().length; index++) {
487 Skill skill = player.skills.
get(index);
488 Skill copy_skill = player.skills_copy.
get(index);
492 skill.setExperience(skill.getExperienceForLevel(copy_skill.
getLevel()));
503 gamePlayers.stream().forEach(player -> player.message(
"@red@Fog approaching. Get to the safezone at "+
StringUtils.capitalize(safeZone.name().toLowerCase().replaceAll(
"_",
" ")+
"!")));
505 for (
int i = safeZone.boundsYSW; i < safeZone.boundsYSW + 10; i++) {
508 storedObjects.add(gameObject);
510 for (
int i = safeZone.boundsXSW; i < safeZone.boundsXSW + 10; i++) {
513 storedObjects.add(gameObject);
515 for (
int i = safeZone.boundsXNE - 10; i < safeZone.boundsXNE; i++) {
518 storedObjects.add(gameObject);
520 for (
int i = safeZone.boundsYNE - 10; i <= safeZone.boundsYNE; i++) {
523 storedObjects.add(gameObject);
526 currentFog =
new Fog(safeZone.boundsXSW - 100, safeZone.boundsYSW - 100, safeZone.boundsXNE + 100, safeZone.boundsYNE + 100);
540 handleFogDamage(player);
547 private static void handleFogDamage(
Player player) {
548 if(safeZone ==
null)
return;
550 if(safeZone.inSafeZone(player))
return;
552 if(!
Boundary.isIn(player,
new Boundary(currentFog.getLowX(), currentFog.getLowY(), currentFog.getHighX(), currentFog.getHighY()))) {
556 int damage = (distanceX > distanceY) ? distanceY / 10 : distanceX / 10;
565 int fogStrength = (distanceX > distanceY) ? distanceY * 3 : distanceX * 3;
566 player.lastFogSent = fogStrength;
567 player.send(
new SendLMSFog(fogStrength > 155 ? 155 : fogStrength));
578 if (lastFogCycle == 10) {
579 if (currentFog ==
null) {
584 if (safeZone.boundsXSW == currentFog.getLowX() && safeZone.boundsYSW == currentFog.getLowY() && safeZone.boundsXNE == currentFog.getHighX() && safeZone.boundsYNE == currentFog.getHighY()) {
589 currentFog.decrease();
598 gamePlayers.stream().filter(Objects::nonNull).forEach(player -> {
600 player.send(
new SendString(
"Kills: " + player.lmsKills, 44665));
601 player.send(
new SendString(
"Fog: " + (currentFog.isSafe() ?
"Safe" :
"Approaching"), 44666));
611 killer.lmsImmunity = System.currentTimeMillis() + 20_000;
612 killer.runEnergy = 100;
617 killer.lmsTotalKills++;
620 if (killer.lmsKills == 5)
621 killer.lmsPoints += 2;
622 else if (killer.lmsKills == 3)
623 killer.lmsPoints += 1;
625 boolean inventory = killer.inventory.
getFreeSlots() > 0;
629 killer.inventory.
add(key);
633 for(
int index = 0; index < killer.inventory.
getItems().length; index++) {
634 if(killer.inventory.
get(index) ==
null)
continue;
635 Item potion = killer.inventory.
get(index);
638 if(def ==
null || !def.isPotion())
continue;
640 killer.inventory.
remove(potion);
652 for (
int i = 6; i < loadout.getInventory().length; i++) {
653 int itemId = loadout.getInventory()[i];
654 if(itemId == -1)
continue;
657 if(def ==
null || !def.isPotion())
continue;
659 player.inventory.
add(itemId, 1);
672 player.lmsTotalDeaths++;
676 int containerSize = player.unlockedLMSItems.size();
677 if(containerSize != 0) {
678 for (
int i = 0; i < containerSize; i++) {
679 int itemId = player.unlockedLMSItems.get(i);
680 Item item =
new Item(itemId, getItemAmountForItem(itemId));
688 player.lmsPoints += getPointsForPlacement(
gamePlayers.size());
689 player.message(
"You have been awarded: @red@"+getPointsForPlacement(
gamePlayers.size())+
" @bla@points for placing @red@#"+
gamePlayers.size());
698 winner.lmsPoints+= 5;
700 winner.message(
"Congratulations! You've won the LMS Game!");
701 winner.message(
"You have been awarded: @red@5 points@bla@ for your win!");
708 gameObject.unregister();
709 storedObjects.clear();
719 private static int getItemAmountForItem(
int loot) {
736 private static int getPointsForPlacement(
int remaining) {
739 else if (remaining == 3 || remaining == 4)
741 else if (remaining >= 5 && remaining <= 9)
743 else if (remaining >= 10 && remaining <= 19)
static void updateInterface()
static List< Player > gamePlayers
static void onDeath(Player player, boolean forceRemove)
static boolean inGameArea(Player player)
static void resupplyKiller(Player player)
static void moveToGame(List< Player > players)
static void rollChest(Player player, int keyId, boolean lootCrate)
static void setupSafezone()
static void giveItems(Player player, boolean clear)
static void onKill(Player killer)
static void processPlayer(Player player)
static boolean gameInProgress
static boolean isActivePlayer(Player player)
static void reset(Player player)
static void setLevels(Player player)
static boolean canAttack(Player player, Player target)
static LMSLoadout currentGameType
static void sendObjectAnimation(int animation, GameObject object)
void move(Position position)
void face(GameObject object)
Combat< Player > getCombat()
void modifyLevel(Function< Integer, Integer > function)
static final int HITPOINTS
static ItemDefinition get(int id)
final Item get(int index)
boolean remove(Item item)
static void createGlobal(Player player, Item item)
static GroundItem create(Player player, Item item)
int getDistances(Position other)
static void restore(Player player, int amount)
static void execute(Player player, Item item)