Files
2006Scape/2006Redone Server/src/redone/game/content/combat/Specials.java
T
Danial 8570b5f531 Minor tidy up, Update specials stats (#189)
* Fix local Parabot instructions

* Add kick command, and force logout function

* fixup abyss

* fixup tokkull selling

* tidy up

* update abyssal whip special accuracy

* update specials from wiki

* eh

* remove system log
2019-11-17 14:23:28 -05:00

401 lines
13 KiB
Java

package redone.game.content.combat;
import java.util.HashMap;
import redone.Constants;
import redone.game.content.combat.range.RangeData;
import redone.game.content.music.sound.CombatSounds;
import redone.game.npcs.NpcHandler;
import redone.game.players.Client;
import redone.game.players.PlayerHandler;
import redone.util.Misc;
public class Specials {
private final Client player;
public Specials(Client c) {
this.player = c;
}
private enum specialAttack {
// ItemName(ItemId, SpecDamage, SpecAccuracy, SpecAmount, Anim, GFX0,
// GFX100, DoubleHit, SsSpec, SpecEffect)
ABYSSAL_WHIP(4151, 1, 1.25, 5, 1658, 341, -1, false, false, 0),
DRAGON_DAGGER(1215, 1.15, 1.25, 2.5, 1062, -1, 252, true, false, 0),
DRAGON_DAGGER_P(1231, 1.15, 1.25, 2.5, 1062, -1, 252, true, false, 0),
DRAGON_DAGGER_PP(5698, 1.15, 1.25, 2.5, 1062, -1, 252, true, false, 0),
DRAGON_DAGGER_PPP(5680, 1.15, 1.25, 2.5, 1062, -1, 252, true, false, 0),
DRAGON_LONG(1305, 1.20, 1.10, 2.5, 1058, -1, 248, false, false, 0),
DRAGON_MACE(1434, 1.55, 1.25, 2.5, 1060, -1, 251, false, false, 0),
DRAGON_SCIMITAR(4587, 1, 1.25, 5.5, 1872, -1, 347, false, false, 1),
DRAGON_HALBERD(3204, 1.25, .85, 3, 1203, -1, 282, true, false, 0),
GRANITE_MAUL(4153, 1.10, .85, 5, 1667, -1, 337, false, false, 0),
MAGIC_SHORTBOW(861, 1.05, .95, 5.5, 1074, -1, -1, true, false, 0),
MAGIC_LONGBOW(859, 1.20, 1.05, 5.5, 426, -1, -1, false, false, 0);
private int weapon, anim, gfx1, gfx2, specEffect;
private double specDamage, specAccuracy, specAmount;
private boolean doubleHit, ssSpec;
private specialAttack(int weapon, double specDamage,
double specAccuracy, double specAmount, int anim, int gfx1,
int gfx2, boolean doubleHit, boolean ssSpec, int specEffect) {
this.weapon = weapon;
this.specDamage = specDamage;
this.specAccuracy = specAccuracy;
this.specAmount = specAmount;
this.anim = anim;
this.gfx1 = gfx1;
this.gfx2 = gfx2;
this.doubleHit = doubleHit;
this.ssSpec = ssSpec;
this.specEffect = specEffect;
}
private int getWeapon() {
return weapon;
}
private double getSpecDamage() {
return specDamage;
}
private double getSpecAccuracy() {
return specAccuracy;
}
private double getSpecAmount() {
return specAmount;
}
private int getAnim() {
return anim;
}
private int getGfx1() {
return gfx1;
}
private int getGfx2() {
return gfx2;
}
private boolean getDoubleHit() {
return doubleHit;
}
private boolean getSsSpec() {
return ssSpec;
}
@SuppressWarnings("unused")
private int getSpecEffect() {
return specEffect;
}
public static HashMap<Integer, specialAttack> specialAttack = new HashMap<Integer, specialAttack>();
@SuppressWarnings("unused")
public static specialAttack getWeapon(int weapon) {
return specialAttack.get(weapon);
}
static {
for (specialAttack SA : specialAttack.values()) {
specialAttack.put(SA.getWeapon(), SA);
}
}
}
public void activateSpecial(int weapon, int i) {
int equippedWeapon = player.playerEquipment[player.playerWeapon];
if (NpcHandler.npcs[i] == null && player.npcIndex > 0
|| PlayerHandler.players[player.playerIndex] == null
&& player.playerIndex > 0) {
return;
}
player.doubleHit = false;
player.specEffect = 0;
player.projectileStage = 0;
player.specMaxHitIncrease = 2;
if (player.npcIndex > 0) {
player.oldNpcIndex = i;
} else if (player.playerIndex > 0) {
player.oldPlayerIndex = i;
PlayerHandler.players[i].underAttackBy = player.playerId;
PlayerHandler.players[i].logoutDelay = System.currentTimeMillis();
PlayerHandler.players[i].singleCombatDelay = System
.currentTimeMillis();
PlayerHandler.players[i].killerId = player.playerId;
}
player.specEffect = 0;
player.projectileStage = 0;
for (specialAttack SA : specialAttack.values()) {
if (NpcHandler.npcs[player.npcIndex] == null && player.npcIndex > 0) {
return;
}
if (PlayerHandler.players[player.playerIndex] == null
&& player.playerIndex > 0) {
return;
}
if (equippedWeapon == SA.getWeapon()) {
if (SA.getWeapon() == 11235) {
player.usingBow = true;
player.dbowSpec = true;
player.rangeItemUsed = player.playerEquipment[player.playerArrows];
player.getItemAssistant().deleteArrow();
player.getItemAssistant().deleteArrow();
player.lastWeaponUsed = weapon;
player.hitDelay = 3;
player.startAnimation(426);
player.projectileStage = 1;
player.gfx100(RangeData.getRangeStartGFX(player));
player.hitDelay = player.getCombatAssistant().getHitDelay();
if (player.fightMode == 2) {
player.attackTimer--;
}
if (player.playerIndex > 0) {
player.getCombatAssistant().fireProjectilePlayer();
} else if (player.npcIndex > 0) {
player.getCombatAssistant().fireProjectileNpc();
}
player.specAccuracy = SA.getSpecAccuracy();
player.specDamage = SA.getSpecDamage();
} else if (SA.getWeapon() == 15241) {
player.usingBow = true;
player.rangeItemUsed = player.playerEquipment[player.playerArrows];
player.getItemAssistant().deleteArrow();
player.lastWeaponUsed = weapon;
player.startAnimation(12175);
player.specAccuracy = SA.getSpecAccuracy();
player.specDamage = SA.getSpecDamage();
player.hitDelay = 5;
player.attackTimer -= 7;
player.hitDelay = player.getCombatAssistant().getHitDelay();
if (player.fightMode == 2) {
if (player.playerIndex > 0) {
player.getCombatAssistant().fireProjectilePlayer();
} else if (player.npcIndex > 0) {
player.getCombatAssistant().fireProjectileNpc();
}
}
} else if (SA.getWeapon() == 13879 || SA.getWeapon() == 13883) {
player.usingRangeWeapon = true;
player.rangeItemUsed = player.playerEquipment[player.playerWeapon];
player.getItemAssistant().deleteArrow();
player.lastWeaponUsed = weapon;
player.startAnimation(SA.getAnim());
player.gfx0(SA.getGfx1());
player.specAccuracy = SA.getSpecAccuracy();
player.specDamage = SA.getSpecDamage();
player.projectileStage = 1;
player.hitDelay = player.getCombatAssistant().getHitDelay();
if (player.fightMode == 2) {
player.attackTimer--;
}
if (player.playerIndex > 0) {
player.getCombatAssistant().fireProjectilePlayer();
} else if (player.npcIndex > 0) {
player.getCombatAssistant().fireProjectileNpc();
}
} else if (SA.getWeapon() == 859 || SA.getWeapon() == 861) {
player.usingBow = true;
player.bowSpecShot = 1;
player.rangeItemUsed = player.playerEquipment[player.playerArrows];
player.getItemAssistant().deleteArrow();
player.lastWeaponUsed = weapon;
player.startAnimation(SA.getAnim());
player.projectileStage = 1;
player.hitDelay = player.getCombatAssistant().getHitDelay();
if (player.fightMode == 2) {
player.attackTimer--;
}
if (player.playerIndex > 0) {
player.getCombatAssistant().fireProjectilePlayer();
} else if (player.npcIndex > 0) {
player.getCombatAssistant().fireProjectileNpc();
}
} else if (SA.getGfx1() == -1) {
player.gfx100(SA.getGfx2());
player.startAnimation(SA.getAnim());
player.specDamage = SA.getSpecDamage();
player.specAccuracy = SA.getSpecAccuracy();
player.hitDelay = player.getCombatAssistant().getHitDelay();
player.doubleHit = SA.getDoubleHit();
player.ssSpec = SA.getSsSpec();
} else {
player.gfx0(SA.getGfx1());
player.startAnimation(SA.getAnim());
player.specDamage = SA.getSpecDamage();
player.specAccuracy = SA.getSpecAccuracy();
player.hitDelay = player.getCombatAssistant().getHitDelay();
player.doubleHit = SA.getDoubleHit();
player.ssSpec = SA.getSsSpec();
}
}
player.delayedDamage = Misc.random(player.getCombatAssistant().meleeMaxHit());
player.delayedDamage2 = Misc
.random(player.getCombatAssistant().meleeMaxHit());
player.usingSpecial = false;
player.getItemAssistant().updateSpecialBar();
if (Constants.combatSounds) {
player.getActionSender()
.sendSound(
CombatSounds
.specialSounds(player.playerEquipment[player.playerWeapon]),
100, 0);
}
}
}
public void handleGmaul() {
if (player.npcIndex > 0 && NpcHandler.npcs[player.npcIndex] != null) {
if (player.goodDistance(player.getX(), player.getY(), NpcHandler.npcs[player.npcIndex]
.getX(), NpcHandler.npcs[player.npcIndex].getY(), player
.getCombatAssistant().getRequiredDistance())) {
if (player.getCombatAssistant().checkSpecAmount(4153)) {
boolean hit = Misc.random(player.getCombatAssistant().calcAtt()) > Misc
.random(NpcHandler.npcs[player.npcIndex].defence);
int damage = 0;
if (hit) {
damage = Misc.random(player.getCombatAssistant()
.meleeMaxHit());
NpcHandler.npcs[player.npcIndex].HP -= damage;
NpcHandler.npcs[player.npcIndex].hitDiff2 = damage;
NpcHandler.npcs[player.npcIndex].hitUpdateRequired2 = true;
NpcHandler.npcs[player.npcIndex].updateRequired = true;
player.startAnimation(1667);
player.gfx100(340);
}
}
}
} else if (player.playerIndex > 0) {
final Client o = (Client) PlayerHandler.players[player.playerIndex];
if (player.goodDistance(player.getX(), player.getY(), o.getX(), o.getY(), player
.getCombatAssistant().getRequiredDistance())) {
if (player.getCombatAssistant().checkReqs()) {
if (player.getCombatAssistant().checkSpecAmount(4153)) {
boolean hit = Misc.random(player.getCombatAssistant()
.calcAtt()) > Misc.random(o
.getCombatAssistant().calcDef());
int damage = 0;
if (hit) {
damage = Misc.random(player.getCombatAssistant()
.meleeMaxHit());
}
if (o.getPrayer().prayerActive[18]
&& System.currentTimeMillis()
- o.protMeleeDelay > 1500) {
damage *= .6;
}
if (o.playerLevel[3] - damage <= 0) {
damage = o.playerLevel[3];
}
if (o.playerLevel[3] > 0) {
o.handleHitMask(damage);
player.startAnimation(1667);
o.gfx100(337);
o.dealDamage(damage);
}
}
}
}
}
}
public double specAmount() {
for (specialAttack SA : specialAttack.values()) {
if (player.playerEquipment[player.playerWeapon] == SA.getWeapon()) {
return SA.getSpecAmount();
}
}
return 0;
}
public static void specialClicking(Client player, int actionButtonId) {
switch (actionButtonId) {
case 29188:
if (player.playerEquipment[player.playerWeapon] == 1434) {
player.specBarId = 7636;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 29163:
if (player.playerEquipment[player.playerWeapon] == 4587) {
player.specBarId = 7611;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 33033:
if (player.playerEquipment[player.playerWeapon] == 4153) {
player.specBarId = 8505;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 29038:
if (player.playerEquipment[player.playerWeapon] == 4153) {
player.specBarId = 7486;
player.getSpecials().handleGmaul();
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 29063:
if (player.playerEquipment[player.playerWeapon] == 1377) {
if (player.getCombatAssistant().checkSpecAmount(1377)) {
player.gfx0(246);
player.forcedChat("Raarrrrrgggggghhhhhhh!");
player.startAnimation(1056);
player.playerLevel[2] = player.getLevelForXP(player.playerXP[2]) + player.getLevelForXP(player.playerXP[2]) * 15 / 100;
player.getPlayerAssistant().refreshSkill(2);
player.getItemAssistant().updateSpecialBar();
} else {
player.getActionSender().sendMessage("You don't have the required special energy to use this attack.");
}
}
break;
case 48023:
if (player.playerEquipment[player.playerWeapon] == 4151) {
player.specBarId = 12335;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 29138:
if (player.playerEquipment[player.playerWeapon] == 1215 || player.playerEquipment[player.playerWeapon] == 1231 || player.playerEquipment[player.playerWeapon] == 5680 || player.playerEquipment[player.playerWeapon] == 5698) {
player.specBarId = 7586;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 29113:
if (player.playerEquipment[player.playerWeapon] == 861 || player.playerEquipment[player.playerWeapon] == 859) {
player.specBarId = 7561;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
}
break;
case 29238:
player.specBarId = 7686;
player.usingSpecial = !player.usingSpecial;
player.getItemAssistant().updateSpecialBar();
break;
}
}
}