Files
2006Scape/2006Redone Server/src/com/rebotted/net/packets/impl/ClickNPC.java
T
Gptaqbc 55a35a26b2 A lot of fixes (#242)
* Fixed stuff related to shop trading

> Refactored stuff to facilitate resolving an issue regarding sellnig item to a full shop
> Removed double value message in shop

* Fixed some stuff related to agility

-Removed a useless obstacle in wilderness course that alowed insane xp gains;
-Added some 'flexibility' to some obstacles at agility pyramid;
-Removed useless vars;
-Added proper xp to obstacles;
-Added bonus xp for completing agility pyramid
-Most likely more;

***Animations still missing: Crossing gaps and jumping gaps***

* resolve conflicts

* delete old files

* A lot of fixes

Christmas Cracker (anim other player & text & admin right & rare protection)
Added check in stack value when withdrawing from bank to prevent losing items when max int value is reached
fixed double message on pickpocketing when in combat
Renamed methods
Removed unused methods
Removed admin restriction when trying to use the cannon
Cleaned KBD drops
Boots of lightness weight reduction is fixed
More...
2019-12-07 21:16:18 -05:00

364 lines
12 KiB
Java

package com.rebotted.net.packets.impl;
import com.rebotted.event.CycleEvent;
import com.rebotted.event.CycleEventContainer;
import com.rebotted.event.CycleEventHandler;
import com.rebotted.game.content.combat.CombatConstants;
import com.rebotted.game.content.combat.magic.MagicData;
import com.rebotted.game.content.combat.range.RangeData;
import com.rebotted.game.content.skills.thieving.Pickpocket;
import com.rebotted.game.items.ItemAssistant;
import com.rebotted.game.npcs.NpcHandler;
import com.rebotted.game.players.Player;
import com.rebotted.net.packets.PacketType;
/**
* Click NPC
*/
public class ClickNPC implements PacketType {
public static final int ATTACK_NPC = 72, MAGE_NPC = 131, FIRST_CLICK = 155,
SECOND_CLICK = 17, THIRD_CLICK = 21;
@Override
public void processPacket(final Player client, int packetType, int packetSize) {
client.npcIndex = 0;
client.npcClickIndex = 0;
client.playerIndex = 0;
client.clickNpcType = 0;
client.getPlayerAssistant().resetFollow();
client.getCombatAssistant().resetPlayerAttack();
client.getPlayerAssistant().requestUpdates();
client.endCurrentTask();
switch (packetType) {
/**
* Attack npc melee or range
**/
case ATTACK_NPC:
if (client.tutorialProgress == 24) {
client.getPacketSender().chatbox(6180);
client.getDialogueHandler()
.chatboxText(
client,
"While you are fighting you will see a bar over your head. The",
"bar shows how much health you have left. Your opponent will",
"have one too. You will continue to attack the rat until it's dead",
"or you do something else.",
"Sit back and watch");
client.getPacketSender().chatbox(6179);
}
if (client.tutorialProgress == 33) {
client.getPacketSender()
.sendMessage(
"You can't range these chickens you have to mage them!");
return;
}
if (!client.mageAllowed) {
client.mageAllowed = true;
client.getPacketSender().sendMessage("I can't reach that.");
break;
}
client.npcIndex = client.getInStream().readUnsignedWordA();
if (NpcHandler.npcs[client.npcIndex] == null) {
client.npcIndex = 0;
break;
}
if (NpcHandler.npcs[client.npcIndex].MaxHP == 0) {
client.npcIndex = 0;
break;
}
if (NpcHandler.npcs[client.npcIndex] == null) {
break;
}
if (client.autocastId > 0) {
client.autocasting = true;
}
if (!client.autocasting && client.spellId > 0) {
client.spellId = 0;
}
client.faceUpdate(client.npcIndex);
client.usingMagic = false;
boolean usingBow = false;
boolean usingOtherRangeWeapons = false;
boolean usingArrows = false;
boolean usingCross = client.playerEquipment[client.playerWeapon] == 9185;
if (client.playerEquipment[client.playerWeapon] >= 4214
&& client.playerEquipment[client.playerWeapon] <= 4223) {
usingBow = true;
}
for (int bowId : RangeData.BOWS) {
if (client.playerEquipment[client.playerWeapon] == bowId) {
usingBow = true;
for (int arrowId : RangeData.ARROWS) {
if (client.playerEquipment[client.playerArrows] == arrowId) {
usingArrows = true;
}
}
}
}
for (int otherRangeId : RangeData.OTHER_RANGE_WEAPONS) {
if (client.playerEquipment[client.playerWeapon] == otherRangeId) {
usingOtherRangeWeapons = true;
}
}
if ((usingBow || client.autocasting)
&& client.goodDistance(client.getX(), client.getY(),
NpcHandler.npcs[client.npcIndex].getX(),
NpcHandler.npcs[client.npcIndex].getY(), 7)) {
client.stopMovement();
}
if (usingOtherRangeWeapons
&& client.goodDistance(client.getX(), client.getY(),
NpcHandler.npcs[client.npcIndex].getX(),
NpcHandler.npcs[client.npcIndex].getY(), 4)) {
client.stopMovement();
}
if (!usingCross && !usingArrows && usingBow
&& client.playerEquipment[client.playerWeapon] < 4212
&& client.playerEquipment[client.playerWeapon] > 4223 && !usingCross) {
client.getPacketSender().sendMessage(
"You have run out of arrows!");
break;
}
if (RangeData.correctBowAndArrows(client) < client.playerEquipment[client.playerArrows]
&& CombatConstants.CORRECT_ARROWS
&& usingBow
&& !RangeData.usingCrystalBow(client)
&& client.playerEquipment[client.playerWeapon] != 9185) {
client.getPacketSender().sendMessage(
"You can't use "
+ ItemAssistant.getItemName(
client.playerEquipment[client.playerArrows])
.toLowerCase()
+ "s with a "
+ ItemAssistant.getItemName(
client.playerEquipment[client.playerWeapon])
.toLowerCase() + ".");
client.stopMovement();
client.getCombatAssistant().resetPlayerAttack();
return;
}
if (client.playerEquipment[client.playerWeapon] == 9185
&& !client.getCombatAssistant().properBolts()) {
client.getPacketSender().sendMessage(
"You must use bolts with a crossbow.");
client.stopMovement();
client.getCombatAssistant().resetPlayerAttack();
return;
}
if (client.followId > 0) {
client.getPlayerAssistant().resetFollow();
}
if (client.attackTimer <= 0) {
client.getCombatAssistant().attackNpc(client.npcIndex);
client.attackTimer++;
}
break;
/**
* Attack npc with magic
**/
case MAGE_NPC:
if (client.tutorialProgress == 33) {
client.getPacketSender().chatbox(6180);
client.getDialogueHandler()
.chatboxText(
client,
"",
"All you need to do is move on to the mainland. Just speak",
"with Terrova and he'll teleport you to Lumbridge Castle.",
"", "You have almost completed the tutorial!");
client.getPacketSender().chatbox(6179);
// c.getDialogues().sendStatement4("You have almost completed the tutorial!",
// "All you need to do is move on to the mainland. Just speak",
// "with Terrova and he'll teleport you to Lumbridge.", "");
client.tutorialProgress = 34;
client.getPacketSender().createArrow(1, 9);
}
if (!client.mageAllowed) {
client.mageAllowed = true;
client.getPacketSender().sendMessage("I can't reach that.");
break;
}
// c.usingSpecial = false;
// c.getItems().updateSpecialBar();
client.npcIndex = client.getInStream().readSignedWordBigEndianA();
int castingSpellId = client.getInStream().readSignedWordA();
client.usingMagic = false;
if (NpcHandler.npcs[client.npcIndex] == null) {
break;
}
if (NpcHandler.npcs[client.npcIndex].MaxHP == 0
|| NpcHandler.npcs[client.npcIndex].npcType == 944) {
client.getPacketSender().sendMessage(
"You can't attack this npc.");
break;
}
for (int i = 0; i < MagicData.MAGIC_SPELLS.length; i++) {
if (castingSpellId == MagicData.MAGIC_SPELLS[i][0]) {
client.spellId = i;
client.usingMagic = true;
break;
}
}
if (client.autocasting) {
client.autocasting = false;
}
if (client.usingMagic) {
if (client.goodDistance(client.getX(), client.getY(),
NpcHandler.npcs[client.npcIndex].getX(),
NpcHandler.npcs[client.npcIndex].getY(), 6)) {
client.stopMovement();
}
if (client.attackTimer <= 0) {
client.getCombatAssistant().attackNpc(client.npcIndex);
client.attackTimer++;
}
}
break;
case FIRST_CLICK:
client.npcClickIndex = client.inStream.readSignedWordBigEndian();
client.npcType = NpcHandler.npcs[client.npcClickIndex].npcType;
if (client.goodDistance(NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY(), client.getX(),
client.getY(), 2)) {
client.turnPlayerTo(NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY());
NpcHandler.npcs[client.npcClickIndex].facePlayer(client.playerId);
client.getNpcs().firstClickNpc(client.npcType);
} else {
client.clickNpcType = 1;
CycleEventHandler.getSingleton().addEvent(client, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if (client.clickNpcType == 1
&& NpcHandler.npcs[client.npcClickIndex] != null) {
if (client.goodDistance(client.getX(), client.getY(),
NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY(), 1)) {
client.turnPlayerTo(
NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY());
NpcHandler.npcs[client.npcClickIndex]
.facePlayer(client.playerId);
client.getNpcs().firstClickNpc(client.npcType);
container.stop();
}
}
if (client.clickNpcType == 0 || client.clickNpcType > 1) {
container.stop();
}
}
@Override
public void stop() {
client.clickNpcType = 0;
}
}, 1);
}
break;
case SECOND_CLICK:
client.npcClickIndex = client.inStream.readUnsignedWordBigEndianA();
client.npcType = NpcHandler.npcs[client.npcClickIndex].npcType;
if (client.goodDistance(NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY(), client.getX(),
client.getY(), 2)) {
client.turnPlayerTo(NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY());
NpcHandler.npcs[client.npcClickIndex].facePlayer(client.playerId);
client.getNpcs().secondClickNpc(client.npcType);
if (Pickpocket.isNPC(client, client.npcType) && !((client.underAttackBy > 0 || client.underAttackBy2 > 0))) {
Pickpocket.attemptPickpocket(client, client.npcType);
return;
}
} else {
client.clickNpcType = 2;
CycleEventHandler.getSingleton().addEvent(client, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if (client.clickNpcType == 2
&& NpcHandler.npcs[client.npcClickIndex] != null) {
if (client.goodDistance(client.getX(), client.getY(),
NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY(), 1)) {
client.turnPlayerTo(
NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY());
NpcHandler.npcs[client.npcClickIndex]
.facePlayer(client.playerId);
client.getNpcs().secondClickNpc(client.npcType);
container.stop();
}
}
if (client.clickNpcType < 2 || client.clickNpcType > 2) {
container.stop();
}
}
@Override
public void stop() {
client.clickNpcType = 0;
}
}, 1);
}
break;
case THIRD_CLICK:
client.npcClickIndex = client.inStream.readSignedWord();
client.npcType = NpcHandler.npcs[client.npcClickIndex].npcType;
if (client.goodDistance(NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY(), client.getX(),
client.getY(), 2)) {
client.turnPlayerTo(NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY());
NpcHandler.npcs[client.npcClickIndex].facePlayer(client.playerId);
client.getNpcs().thirdClickNpc(client.npcType);
} else {
client.clickNpcType = 3;
CycleEventHandler.getSingleton().addEvent(client, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if (client.clickNpcType == 3
&& NpcHandler.npcs[client.npcClickIndex] != null) {
if (client.goodDistance(client.getX(), client.getY(),
NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY(), 1)) {
client.turnPlayerTo(
NpcHandler.npcs[client.npcClickIndex].getX(),
NpcHandler.npcs[client.npcClickIndex].getY());
NpcHandler.npcs[client.npcClickIndex]
.facePlayer(client.playerId);
client.getNpcs().thirdClickNpc(client.npcType);
container.stop();
}
}
if (client.clickNpcType < 3) {
container.stop();
}
}
@Override
public void stop() {
client.clickNpcType = 0;
}
}, 1);
}
break;
}
}
}