Files
2006Scape/2006Scape Server/src/main/java/com/rs2/game/players/PlayerHandler.java
T
Josh Shippam 55ca851d07 Various Changes (#614)
* Clean Old Log Files

* Various Changes

* Moved minutes.log to log folder
* Made SERVER_LOG_DIR constant
* Moved FILE_SYSTEM_DIR to GameConstants & Deleted org.apollo.jagcached.Constants
* Removed unused minutes.log from data/data
* Removed Duplicate RSAKeyGen
* Moved RSAKeyGen from com.rs2.net.rsa to com.rs2.util.rsa

* Removed data/net.xml & Created Moved NetworkConstants.java

* Add HTTP & Jaggrab Port's to ConfigLoader

* IntelliJ Reformat ConfigLoader.java

* Fix Mistake

* Attempt #2

* Woops, wrong port
2023-02-09 01:05:06 +00:00

421 lines
11 KiB
Java

package com.rs2.game.players;
import java.net.InetSocketAddress;
import com.rs2.Constants;
import com.rs2.GameEngine;
import com.rs2.game.content.minigames.castlewars.CastleWars;
import com.rs2.game.npcs.Npc;
import com.rs2.game.npcs.NpcHandler;
import com.rs2.util.Misc;
import com.rs2.util.Stream;
import com.rs2.world.GlobalDropsHandler;
public class PlayerHandler {
public static Player players[] = new Player[Constants.MAX_PLAYERS];
public static int playerCount = 0, playerShopCount = 0;
public static String playersCurrentlyOn[] = new String[Constants.MAX_PLAYERS];
public static boolean updateAnnounced;
public static boolean updateRunning;
public static int updateSeconds;
public static long updateStartTime;
private boolean kickAllPlayers = false;
static {
for (int i = 0; i < Constants.MAX_PLAYERS; i++) {
players[i] = null;
}
}
public boolean newPlayerClient(Client client1) {
int slot = -1;
for (int i = 1; i < Constants.MAX_PLAYERS; i++) {
if (players[i] == null || players[i].disconnected) {
slot = i;
break;
}
}
if (slot == -1) {
return false;
}
client1.handler = this;
client1.playerId = slot;
players[slot] = client1;
players[slot].isActive = true;
players[slot].connectedFrom = client1.isBot ? "127.0.0.1" : ((InetSocketAddress) client1.getSession().getRemoteAddress()).getAddress().getHostAddress();
if (Constants.SERVER_DEBUG) {
Misc.println("Player Slot " + slot + " slot 0 " + players[0]
+ " Player Hit " + players[slot]);
}
return true;
}
public static int getPlayerCount() {
return playerCount;
}
public static int getNonPlayerCount() {
int count = 0;
for (int i = 0; i < Constants.MAX_PLAYERS; i++) {
if (players[i] != null) {
if (players[i].playerRights >= 1) {
count++;
}
}
}
return count;
}
public static int getPlayerShopCount() {
return playerShopCount;
}
public void updatePlayerNames() {
playerShopCount = 0;
playerCount = 0;
for (int i = 0; i < Constants.MAX_PLAYERS; i++) {
if (players[i] != null) {
playersCurrentlyOn[i] = players[i].playerName;
if (players[i].isBot)
playerShopCount++;
else
playerCount++;
} else {
playersCurrentlyOn[i] = "";
}
}
}
public static int getPlayerID(String playerName) {
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (playersCurrentlyOn[i] != null) {
if (playersCurrentlyOn[i].equalsIgnoreCase(playerName)) {
return i;
}
}
}
return -1;
}
public static boolean isPlayerOn(String playerName) {
// synchronized (PlayerHandler.players) {
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (playersCurrentlyOn[i] != null) {
if (playersCurrentlyOn[i].equalsIgnoreCase(playerName)) {
return true;
}
}
}
return false;
}
public void process() {
updatePlayerNames();
if (kickAllPlayers) {
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (players[i] != null) {
players[i].disconnected = true;
}
}
if (updateRunning) //If there's an update intended, and that's why we kicked everyone:
{
GameEngine.shutdownServer = true;
}
}
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (players[i] == null || !players[i].isActive) {
continue;
}
try {
Client t = (Client) PlayerHandler.players[i];
if (players[i].disconnected) {
if (players[i].playerEquipment[t.playerCape] == 4042
|| players[i].playerEquipment[t.playerCape] == 4041) {
CastleWars.deleteGameItems(t);
}
PlayerSave.saveGame(t);
}
if (players[i].disconnected
&& (System.currentTimeMillis() - players[i].logoutDelay > 10000
|| players[i].properLogout || kickAllPlayers)) {
if (players[i].inTrade) {
Client o = (Client) PlayerHandler.players[players[i].tradeWith];
if (o != null) {
o.getTrading().declineTrade();
}
}
if(GameEngine.trawler.players.contains(players[i])) {
GameEngine.trawler.players.remove(players[i]);
}
players[i].lastX = players[i].absX;
players[i].lastY = players[i].absY;
players[i].lastH = players[i].heightLevel;
if (players[i].hasNpc) {
t.getSummon().quickPickup(t, players[i].summonId);
}
if (players[i].duelStatus == 5) {
Client o = (Client) PlayerHandler.players[players[i].duelingWith];
if (o != null) {
o.getDueling().duelVictory();
}
} else if (players[i].duelStatus <= 4
&& players[i].duelStatus >= 1) {
Client o = (Client) PlayerHandler.players[players[i].duelingWith];
if (o != null) {
o.getDueling().declineDuel();
}
}
Client o = (Client) PlayerHandler.players[i];
if (PlayerSave.saveGame(o)) {
System.out.println("Game saved for player "
+ players[i].playerName);
} else {
System.out.println("Could not save for "
+ players[i].playerName);
}
removePlayer(players[i]);
players[i] = null;
continue;
}
players[i].processQueuedPackets();
players[i].process();
players[i].postProcessing();
players[i].getNextPlayerMovement();
players[i].preProcessing();
} catch (Exception e) {
e.printStackTrace();
}
}
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (players[i] == null || !players[i].isActive) {
continue;
}
try {
Client t = (Client) PlayerHandler.players[i];
if (players[i].disconnected) {
if (players[i].playerEquipment[t.playerCape] == 4042
|| players[i].playerEquipment[t.playerCape] == 4041) {
CastleWars.deleteGameItems(t);
}
PlayerSave.saveGame(t);
}
if (players[i].disconnected
&& (System.currentTimeMillis() - players[i].logoutDelay > 10000
|| players[i].properLogout || kickAllPlayers)) {
if (players[i].inTrade) {
Client o = (Client) PlayerHandler.players[players[i].tradeWith];
if (o != null) {
o.getTrading().declineTrade();
}
}
if(GameEngine.trawler.players.contains(players[i])) {
GameEngine.trawler.players.remove(players[i]);
}
players[i].lastX = players[i].absX;
players[i].lastY = players[i].absY;
players[i].lastH = players[i].heightLevel;
if (players[i].hasNpc) {
t.getSummon().quickPickup(t, players[i].summonId);
}
if (players[i].duelStatus == 5) {
Client o1 = (Client) PlayerHandler.players[players[i].duelingWith];
if (o1 != null) {
o1.getDueling().duelVictory();
}
} else if (players[i].duelStatus <= 4
&& players[i].duelStatus >= 1) {
Client o1 = (Client) PlayerHandler.players[players[i].duelingWith];
if (o1 != null) {
o1.getDueling().declineDuel();
}
}
Client o1 = (Client) PlayerHandler.players[i];
if (PlayerSave.saveGame(o1)) {
System.out.println("Game saved for player " + players[i].playerName);
} else {
System.out.println("Could not save for " + players[i].playerName);
}
removePlayer(players[i]);
players[i] = null;
} else {
if (!players[i].initialized) {
players[i].getPacketSender().loginPlayer();
players[i].initialized = true;
} else {
players[i].update();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (updateRunning && !updateAnnounced) {
updateAnnounced = true;
GameEngine.updateServer = true;
}
if (updateRunning
&& System.currentTimeMillis() - updateStartTime > updateSeconds * 1000) {
kickAllPlayers = true;
}
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (players[i] == null || !players[i].isActive) {
continue;
}
try {
players[i].clearUpdateFlags();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void updateNPC(Player plr, Stream str) {
// synchronized(plr) {
updateBlock.currentOffset = 0;
if (str != null) {
str.createFrameVarSizeWord(65);
str.initBitAccess();
str.writeBits(8, plr.npcListSize);
}
int size = plr.npcListSize;
plr.npcListSize = 0;
for (int i = 0; i < size; i++) {
if (plr.rebuildNPCList == false && plr.withinDistance(plr.npcList[i])) {
plr.npcList[i].updateNPCMovement(str);
plr.npcList[i].appendNPCUpdateBlock(updateBlock);
plr.npcList[plr.npcListSize++] = plr.npcList[i];
} else {
int id = plr.npcList[i].npcId;
plr.npcInListBitmap[id >> 3] &= ~(1 << (id & 7));
if (str != null) {
str.writeBits(1, 1);
str.writeBits(2, 3);
}
}
}
for (Npc i : NpcHandler.npcs) {
if (i != null) {
int id = i.npcId;
if (plr.rebuildNPCList == false
&& (plr.npcInListBitmap[id >> 3] & 1 << (id & 7)) != 0) {
} else if (plr.withinDistance(i) == false) {
} else {
plr.addNewNPC(i, str, updateBlock);
}
}
}
plr.rebuildNPCList = false;
if (str != null) {
if (updateBlock.currentOffset > 0) {
str.writeBits(14, 16383);
str.finishBitAccess();
str.writeBytes(updateBlock.buffer, updateBlock.currentOffset, 0);
} else {
str.finishBitAccess();
}
str.endFrameVarSizeWord();
}
}
private final Stream updateBlock = new Stream(
new byte[Constants.BUFFER_SIZE]);
public void updatePlayer(Player plr, Stream outStr) {
// synchronized(plr) {
updateBlock.currentOffset = 0;
if (updateRunning && !updateAnnounced && outStr != null) {
outStr.createFrame(114);
outStr.writeWordBigEndian(updateSeconds * 50 / 30);
}
plr.updateThisPlayerMovement(outStr);
boolean saveChatTextUpdate = plr.isChatTextUpdateRequired();
plr.setChatTextUpdateRequired(false);
plr.appendPlayerUpdateBlock(updateBlock);
plr.setChatTextUpdateRequired(saveChatTextUpdate);
if (outStr != null) {
outStr.writeBits(8, plr.playerListSize);
}
int size = plr.playerListSize;
if (size > 255) {
size = 255;
}
plr.playerListSize = 0;
for (int i = 0; i < size; i++) {
if (!plr.didTeleport && !plr.playerList[i].didTeleport
&& plr.withinDistance(plr.playerList[i])) {
plr.playerList[i].updatePlayerMovement(outStr);
plr.playerList[i].appendPlayerUpdateBlock(updateBlock);
plr.playerList[plr.playerListSize++] = plr.playerList[i];
} else {
int id = plr.playerList[i].playerId;
plr.playerInListBitmap[id >> 3] &= ~(1 << (id & 7));
if (outStr != null) {
outStr.writeBits(1, 1);
outStr.writeBits(2, 3);
}
}
}
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (players[i] == null || !players[i].isActive || players[i] == plr) {
continue;
}
int id = players[i].playerId;
if ((plr.playerInListBitmap[id >> 3] & 1 << (id & 7)) != 0) {
continue;
}
if (!plr.withinDistance(players[i])) {
continue;
}
plr.addNewPlayer(players[i], outStr, updateBlock);
}
if (outStr != null) {
if (updateBlock.currentOffset > 0) {
outStr.writeBits(11, 2047);
outStr.finishBitAccess();
outStr.writeBytes(updateBlock.buffer, updateBlock.currentOffset, 0);
} else {
outStr.finishBitAccess();
}
outStr.endFrameVarSizeWord();
}
if (plr.refresh) {
GlobalDropsHandler.reset((Client)plr);
GameEngine.itemHandler.reloadItems(plr);
plr.refresh = false;
}
}
private void removePlayer(Player plr) {
if (plr.privateChat != 2) {
for (int i = 1; i < PlayerHandler.players.length; i++) {
if (players[i] == null || players[i].isActive == false) {
continue;
}
Client o = (Client) PlayerHandler.players[i];
if (o != null) {
o.getPlayerAssistant().updatePM(plr.playerId, 0);
}
}
}
plr.destruct();
}
}