Code:
package server.model.player;
import java.util.HashMap;
import java.util.Map;
import server.Constants;
import server.Server;
import server.content.skill.SkillConstants;
import server.events.Event;
import server.events.EventContainer;
import server.events.EventManager;
import server.model.FloorItem;
import server.model.Item;
import server.model.ItemDefinition;
import server.model.npc.NPC;
import server.world.AnimationManager;
import server.world.PlayerManager;
import server.util.Misc;
import server.model.player.packet.Following;
import server.model.npc.FollowingNPC;
import server.model.npc.AttackNPC;
import server.model.player.WeaponSounds;
import server.model.player.packet.SubClasses.Wear;
import server.model.player.packet.SubClasses.HitManager;
/**
* Combat manager
*
* @author Graham
*
*/
public class CombatManager {
public Client attacker;
public Map<Client, Integer> attackers = new HashMap<Client, Integer>();
public Map<Client, Integer> previousAttackers = null;
public static final int BASE_TICK = 500;
public static final int MODIFIER = 500;
public static final double SWAP_FACTOR = 0.2;
public Client client;
public boolean isFighting = false;
public NPC targetNPC;
public Client targetPlayer;
public boolean doubleHit = false;
public int[] bonus = new int[12];
public int poisHit = 6;
public int recoilDamageDone;
public int lastWildernessLevel = 0, wildernessLevel = 0;
public CombatManager(Client client) {
this.client = client;
}
public boolean destroyItem(int ITEM){
for(int i = 0; i < Item.destroyItemList.length; i++){
if(Item.destroyItemList[i] == ITEM)
return true;
}
return false;
}
public void dropItems() {
Client highestHitter = null;
int highestHit = -1;
for (Map.Entry<Client, Integer> entry : previousAttackers.entrySet()) {
if (entry.getValue() > highestHit) {
highestHit = entry.getValue();
highestHitter = entry.getKey();
}
}
for(int i = 0; i < client.playerItems.length; i++) {
if(client.playerItems[i] <= 0) continue;
FloorItem item = new FloorItem((client.playerItems[i]-1), client.playerItemsN[i], highestHitter, client.getAbsX(), client.getAbsY(), client.getHeightLevel(), client.currentRegion);
if(highestHitter != null) {
Server.getItemManager().newDrop(item, highestHitter);
} else {
Server.getItemManager().newDrop(item, null);
Server.getItemManager().showDrop(item);
}
client.playerItems[i] = 0;
client.playerItemsN[i] = 1;
}
for(int i = 0; i < client.playerEquipment.length; i++) {
if(client.playerEquipment[i] <= -1) continue;
if(i == 6 || i == 8 || i == 11 || i == 13) continue;
FloorItem item = new FloorItem(client.playerEquipment[i], client.playerEquipmentN[i], highestHitter, client.getAbsX(), client.getAbsY(), client.getHeightLevel(), client.currentRegion);
if(highestHitter != null) {
Server.getItemManager().newDrop(item, highestHitter);
} else {
Server.getItemManager().newDrop(item, null);
Server.getItemManager().showDrop(item);
}
client.getOutStream().createFrame(34);
client.getOutStream().writeWord(6);
client.getOutStream().writeWord(1688);
client.getOutStream().writeByte(i);
client.getOutStream().writeWord(0);
client.getOutStream().writeByte(0);
client.flushOutStream();
client.playerEquipment[i] = -1;
client.playerEquipmentN[i] = 1;
}
FloorItem item = new FloorItem(526, 1, highestHitter, client.getAbsX(), client.getAbsY(), client.getHeightLevel(), client.currentRegion);
if(highestHitter != null) {
Server.getItemManager().newDrop(item, highestHitter);
} else {
Server.getItemManager().newDrop(item, null);
Server.getItemManager().showDrop(item);
}
client.getActionAssistant().resetItems();
client.updateRequired = true;
client.appearanceUpdateRequired = true;
previousAttackers = null;
}
public void FightPitsHitter() {
Client highestHitter = null;
int highestHit = -1;
for (Map.Entry<Client, Integer> entry : previousAttackers.entrySet()) {
if (entry.getValue() > highestHit) {
highestHit = entry.getValue();
highestHitter = entry.getKey();
}
}
final Client hhgg = highestHitter;
EventManager.getSingleton().addEvent(null, new Event() {
@Override
public void execute(EventContainer c) {
Server.getFightPits().PlayersInGame -= 1;
Server.getFightPits().PlayersReady += 1;
Server.getFightPits().processPits();
c.stop();
}
@Override
public void stop() {
if(Server.getFightPits().PlayersInGame <= 1){
Server.getFightPits().ChampionName = hhgg.playerName;
Server.getFightPits().killOffOldNPCs1();
Server.getFightPits().killOffOldNPCs2();
Server.getFightPits().killOffOldNPCs3();
Server.getFightPits().TIMER = 10;
Server.getFightPits().WonFightPits(hhgg);
}
}
}, 1000);
}
public void CastleWarsHitter() {
Client highestHitter = null;
int highestHit = -1;
for (Map.Entry<Client, Integer> entry : previousAttackers.entrySet()) {
if (entry.getValue() > highestHit) {
highestHit = entry.getValue();
highestHitter = entry.getKey();
}
}
if(highestHitter != null){
highestHitter.CWKills += 1;
}
}
public static void specialAmount(Client client, int weapon, double specAmount, int barId) {
client.specBarId = barId;
sendFrame70(client, specAmount >= 10 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 9 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 8 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 7 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 6 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 5 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 4 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 3 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 2 ? 150 : 0, 0, (--barId));
sendFrame70(client, specAmount >= 1 ? 150 : 0, 0, (--barId));
updateSpecialBar(client);
client.getCombat().getMethods().sendWeapon(client);
}
public static void updateSpecialBar(Client client) {
if(client.usingSpecial) {
client.getActionAssistant().sendFrame126("@yel@S P E C I A L A T T A C K", client.specBarId);
} else {
client.getActionAssistant().sendFrame126("@bla@S P E C I A L A T T A C K", client.specBarId);
}
}
public static void sendFrame70(Client client, int i, int o, int id) {
if(client.getOutStream() != null && client != null) {
client.getOutStream().createFrame(70);
client.getOutStream().writeWord(i);
client.getOutStream().writeWordBigEndian(o);
client.getOutStream().writeWordBigEndian(id);
client.flushOutStream();
}
}
public static void sendFrame171(Client client, int i, int j) {
if(client.getOutStream() != null && client != null) {
client.getOutStream().createFrame(171);
client.getOutStream().writeByte(i);
client.getOutStream().writeWord(j);
client.flushOutStream();
}
}
public void process() {
if (client.isDead()) {
if (previousAttackers == null) {
previousAttackers = attackers;
attackers = new HashMap<Client, Integer>();
}
}
if(client.usingSpecial){
if(client.playerEquipment[3] == 4153){
client.doubleHit = false;
if(client.getCombat().getTargetNpc() != null && client.AttackEventRunning && !client.getCombat().getTargetNpc().isDead){
if(client.specAmount == 10){
client.specAmount -= 5;
sendFrame171(client, 0, 7474);
specialAmount(client, 4153, client.specAmount, 7486);
client.getCombat().getTargetNpc().hit2(client, client.getCombat().CalculateHits().Calculate_PVN_Melee_Hit(client, client.getCombat().getTargetNpc()), 1);
client.gfx100(340);
client.getActionAssistant().startAnimation(1667);
} else if(client.specAmount >= 5){
client.specAmount -= 5;
sendFrame171(client, 0, 7474);
specialAmount(client, 4153, client.specAmount, 7486);
client.getCombat().getTargetNpc().hit(client, client.getCombat().CalculateHits().Calculate_PVN_Melee_Hit(client, client.getCombat().getTargetNpc()), 1);
client.gfx100(340);
client.getActionAssistant().startAnimation(1667);
} else {
client.getActionAssistant().sendMessage("You don't have the required special energy to use this attack.");
}
}
if(client.getCombat().getTargetPlayer() != null && client.AttackEventRunning && !client.getCombat().getTargetPlayer().isDead){
if(client.specAmount == 10){
client.specAmount -= 5;
sendFrame171(client, 0, 7474);
specialAmount(client, 4153, client.specAmount, 7486);
client.getCombat().getTargetPlayer().getActionAssistant().hit2(client.getCombat().CalculateHits().Calculate_PVN_Melee_Hit(client, client.getCombat().getTargetPlayer()), 1);
client.gfx100(340);
client.getActionAssistant().startAnimation(1667);
} else if(client.specAmount >= 5){
client.specAmount -= 5;
sendFrame171(client, 0, 7474);
specialAmount(client, 4153, client.specAmount, 7486);
client.getCombat().getTargetPlayer().getActionAssistant().hit(client.getCombat().CalculateHits().Calculate_PVN_Melee_Hit(client, client.getCombat().getTargetPlayer()), 1);
client.gfx100(340);
client.getActionAssistant().startAnimation(1667);
} else {
client.getActionAssistant().sendMessage("You don't have the required special energy to use this attack.");
}
}
client.usingSpecial = false;
client.getActionAssistant().updateSpecialBar();
}
}
if (client.getAbsY() >= 3518 && client.getAbsX() > 2930 && client.getAbsX() < 3400) {
wildernessLevel = (((client.getAbsY() - 3518) / 8) + 1);
client.getExtraData().put("wildernessWarned", Boolean.TRUE);
} else if (client.getAbsY() >= 9918 && client.getAbsX() > 3050 && client.getAbsX() < 3142) {
wildernessLevel = (((client.getAbsY() - 9918) / 8) + 1);
client.getExtraData().put("wildernessWarned", Boolean.TRUE);
} else {
wildernessLevel = -1;
}
if (client.getAbsY() >= 3516 && client.getAbsX() > 2930 && client.getAbsX() < 3400 || client.getAbsY() >= 9918 && client.getAbsX() > 3050 && client.getAbsX() < 3142) {
if (!client.getExtraData().containsKey("wildernessWarned")) {
client.getActionAssistant().sendFrame248(1908, 3213);
client.stopMovement();
client.resetWalkingQueue();
client.setCanWalk(false);
client.setBusy(true);
client.getExtraData().put("wildernessWarned", Boolean.TRUE);
EventManager.getSingleton().addEvent(null, new Event() {
@Override
public void execute(EventContainer c) {
c.stop();
}
@Override
public void stop() {
client.setCanWalk(true);
client.setBusy(false);
}
}, 1000);
}
}
if(!client.inBarrows() && !client.inPcBoat() && !client.inSnow()){
if (client.inWild()) {
client.getOutStream().createFrame(208);
client.getOutStream().writeWordBigEndian_dup(197);
client.getActionAssistant().sendQuest(
"Level: " + wildernessLevel, 199);
client.flushOutStream();
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(1); // 0 or 1; 0 if command should be placed on top
// in context menu
client.getOutStream().writeString("Attack");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
} else if (client.duelArea1() || client.duelArea2()) {
client.getOutStream().createFrame(208);
client.getOutStream().writeWordBigEndian_dup(201);
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(1); // 0 or 1; 0 if command should be placed on top
client.getOutStream().writeString("Fight");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
} else if(client.inFightPits() || client.inCastleWars()){
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(1); // 0 or 1; 0 if command should be placed on top
client.getOutStream().writeString("Attack");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
} else if(client.inDuelArena()){
client.getOutStream().createFrame(208);
client.getOutStream().writeWordBigEndian_dup(201);
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(0); // 0 or 1; 0 if command should be placed on top
// in context menu
client.getOutStream().writeString("Challenge");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
} else if(client.inFightPitsLobby() || client.inCWSafe() || Server.getCastleWars().inSaraLobby(client) || Server.getCastleWars().inZammyLobby(client)){
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(0); // 0 or 1; 0 if command should be placed on top
// in context menu
client.getOutStream().writeString("null");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
} else if(client.acceptedFUNDuel){
client.getOutStream().createFrame(208);
client.getOutStream().writeWordBigEndian_dup(-1);
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(1); // 0 or 1; 0 if command should be placed on top
// in context menu
client.getOutStream().writeString("Attack");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
} else {
client.getOutStream().createFrame(208);
client.getOutStream().writeWordBigEndian_dup(-1);
client.getOutStream().createFrameVarSize(104);
client.getOutStream().writeByteC(1); // command slot (does it matter which one?)
client.getOutStream().writeByteA(1); // 0 or 1; 0 if command should be placed on top
// in context menu
client.getOutStream().writeString("null");
client.getOutStream().endFrameVarSize();
client.flushOutStream();
}
}
}
public boolean isFighting() {
return isFighting;
}
public void resetAttack() {
isFighting = false;
client.faceNPC(-1);
client.attackTimer = 0;
client.hitDelay = 0;
client.doubleHit = false;
client.followId = 0;
client.setBusyFollow(false);
if(!client.autocasting){
client.getActionAssistant().setClientConfig(108, 0);
}
if (targetNPC != null) {
targetNPC.getAttackers().remove(client);
if (targetNPC.getAttacker() == client) {
if (targetNPC.getAttackers().entrySet().iterator().hasNext()) {
targetNPC.setAttacker(targetNPC.getAttackers().entrySet().iterator().next().getKey());
} else {
targetNPC.setWalking(targetNPC.isWasWalking());
targetNPC.setAttacker(null);
}
}
targetNPC = null; // lose our ref
}
if(targetPlayer != null) {
targetPlayer.getCombatManager().attackers.remove(client);
if(targetPlayer.getCombatManager().attacker == client) {
targetPlayer.getCombatManager().attacker = null;
if(targetPlayer.getCombatManager().attackers.entrySet().iterator().hasNext()) {
targetPlayer.getCombatManager().attacker = targetPlayer.getCombatManager().attackers.entrySet().iterator().next().getKey();
} else {
//targetPlayer.getCombatManager().resetAttack();
}
}
targetPlayer = null;
}
}
/**
* UTILITY METHODS.
*/
public void calculateBonus() {
for (int i = 0; i < client.playerBonus.length; i++) {
client.playerBonus[i] = 0;
}
for (int i = 0; i < client.playerEquipment.length; i++) {
if (client.playerEquipment[i] > -1) {
ItemDefinition def = Server.getItemManager().getItemDefinition(client.playerEquipment[i]);
for (int k = 0; k < client.playerBonus.length; k++) {
client.playerBonus[k] += def.getBonus(k);
}
}
}
for (int i = 0; i < client.playerBonus.length; i++) {
String text = "";
int offset = 0;
if (client.playerBonus[i] >= 0) {
text = Constants.BONUS_NAME[i] + ": +" + client.playerBonus[i];
} else {
text = Constants.BONUS_NAME[i] + ": -" + Math.abs(client.playerBonus[i]);
}
if (i >= 12) {
offset = 1;
}
int interfaceid = 1676 + i + offset;
client.getActionAssistant().sendQuest(text, interfaceid);
}
}
public void sendWeapon() {
int weapon = client.playerEquipment[PlayerConstants.PLAYER_WEAPON];
String WeaponName = null;
if (weapon == -1) {
WeaponName = "Unarmed";
} else {
ItemDefinition def = Server.getItemManager().getItemDefinition(weapon);
WeaponName = def.getName();
}
String WeaponName2 = WeaponName.replaceAll("Bronze", "");
WeaponName2 = WeaponName2.replaceAll("Iron", "");
WeaponName2 = WeaponName2.replaceAll("Steel", "");
WeaponName2 = WeaponName2.replaceAll("Black", "");
WeaponName2 = WeaponName2.replaceAll("Mithril", "");
WeaponName2 = WeaponName2.replaceAll("Adamant", "");
WeaponName2 = WeaponName2.replaceAll("Rune", "");
WeaponName2 = WeaponName2.replaceAll("Granite", "");
WeaponName2 = WeaponName2.replaceAll("Dragon", "");
WeaponName2 = WeaponName2.replaceAll("Crystal", "");
WeaponName2 = WeaponName2.trim();
client.getActionAssistant().sendFrame126("Combat Level: "+client.combatLevel, 19999);
if(client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 4587) {
client.getActionAssistant().setSidebarInterface(0, 2423);
client.getActionAssistant().sendFrame126(WeaponName, 2426);
}
else if(client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 1305) {
client.getActionAssistant().setSidebarInterface(0, 2423);
client.getActionAssistant().sendFrame126(WeaponName, 2426);
}
else if (WeaponName.equals("Unarmed") || client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == -1) {
client.getActionAssistant().setSidebarInterface(0, 5855);
client.getActionAssistant().sendFrame126(WeaponName, 5857);
}
else if(client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 7158) {
client.getActionAssistant().setSidebarInterface(0, 4705);
client.getActionAssistant().sendFrame126(WeaponName, 4708);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 1434) {
client.getActionAssistant().setSidebarInterface(0, 3796);
client.getActionAssistant().sendFrame126(WeaponName, 3799);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 4153) {
client.getActionAssistant().setSidebarInterface(0, 425);
client.getActionAssistant().sendFrame126(WeaponName, 428);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 5698) {
client.getActionAssistant().setSidebarInterface(0, 2276);
client.getActionAssistant().sendFrame126(WeaponName, 2279);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 6739 || WeaponName2.contains("axe") || WeaponName.contains("axe")) {
client.getActionAssistant().setSidebarInterface(0, 1698);
client.getActionAssistant().sendFrame126(WeaponName, 1701);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 1377) {
client.getActionAssistant().setSidebarInterface(0, 1698);
client.getActionAssistant().sendFrame126(WeaponName, 1701);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 4718 || WeaponName.contains("battleaxe")) {
client.getActionAssistant().setSidebarInterface(0, 1698);
client.getActionAssistant().sendFrame126(WeaponName, 1701);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 4747) {
client.getActionAssistant().setSidebarInterface(0, 425);
client.getActionAssistant().sendFrame126(WeaponName, 428);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 1249 || WeaponName.equals("spear") || WeaponName.contains("spear") || WeaponName.endsWith("spear")) {
client.getActionAssistant().setSidebarInterface(0, 4679);
client.getActionAssistant().sendFrame126(WeaponName, 4682);
}
else if (WeaponName2.contains("pickaxe")) {
client.getActionAssistant().setSidebarInterface(0, 5570);
client.getActionAssistant().sendFrame126(WeaponName, 5573);
}
else if (WeaponName.equals("2h") || WeaponName.contains("2h") || WeaponName.endsWith("2h")) {
client.getActionAssistant().setSidebarInterface(0, 4705);
client.getActionAssistant().sendFrame126(WeaponName, 4708);
}
else if (WeaponName.equals("dart") || WeaponName.contains("dart") || WeaponName.endsWith("dart") ||
WeaponName.equals("knife") || WeaponName.contains("knife") || WeaponName.endsWith("knife") ||
WeaponName.equals("javelin") || WeaponName.contains("javelin") || WeaponName.endsWith("javelin")) {
client.getActionAssistant().setSidebarInterface(0, 4446);
client.getActionAssistant().sendFrame126(WeaponName, 4449);
}
else if(WeaponName2.endsWith("mace") || WeaponName2.endsWith("warhammer") || client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 4755) {
client.getActionAssistant().setSidebarInterface(0, 3796);
client.getActionAssistant().sendFrame126(WeaponName, 3799);
}
else if (WeaponName.contains("whip")) {
client.getActionAssistant().setSidebarInterface(0, 12290);
client.getActionAssistant().sendFrame126(WeaponName, 12293);
}
else if (WeaponName.startsWith("Staff") || WeaponName.endsWith("staff") || WeaponName.endsWith("wand")) {
client.getActionAssistant().setSidebarInterface(0, 328);
client.getActionAssistant().sendFrame126(WeaponName, 331);
}
else if (WeaponName.equals("crossbow") || WeaponName.contains("crossbow") || WeaponName.endsWith("crossbow") || WeaponName.equals("c'bow") || WeaponName.contains("c'bow") || WeaponName.endsWith("c'bow") || WeaponName.contains("Karils") || WeaponName.contains("karils")) {
client.getActionAssistant().setSidebarInterface(0, 1749);
client.getActionAssistant().sendFrame126(WeaponName, 1752);
}
else if (client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 861 || client.playerEquipment[PlayerConstants.PLAYER_WEAPON] == 6724) {
client.getActionAssistant().setSidebarInterface(0, 1764);
client.getActionAssistant().sendFrame126(WeaponName, 1767);
}
else if (WeaponName.contains("bow") || WeaponName.startsWith("Crystal bow") || WeaponName.contains("bow")) {
client.getActionAssistant().setSidebarInterface(0, 1764);
client.getActionAssistant().sendFrame126(WeaponName, 1767);
}
else if (WeaponName2.contains("dagger")) {
client.getActionAssistant().setSidebarInterface(0, 2276);
client.getActionAssistant().sendFrame126(WeaponName, 2279);
}
else if (WeaponName2.endsWith("halberd")) {
client.getActionAssistant().setSidebarInterface(0, 8460);
client.getActionAssistant().sendFrame126(WeaponName, 8463);
}
else if (WeaponName2.endsWith("claws")) {
client.getActionAssistant().setSidebarInterface(0, 7762);
client.getActionAssistant().sendFrame126(WeaponName, 7765);
}
else if (WeaponName.contains("Staff") || WeaponName.endsWith("staff")) {
client.getActionAssistant().setSidebarInterface(0, 328);
client.getActionAssistant().sendFrame126(WeaponName, 331);
}
else {
client.getActionAssistant().setSidebarInterface(0, 2423);
client.getActionAssistant().sendFrame126(WeaponName, 2426);
}
}
}