Jump to content

Featured Replies

  • Replies 46
  • Views 9.4k
  • Created
  • Last Reply

Top Posters In This Topic

  • 2 weeks later...
  • 3 weeks later...
  • 2 weeks later...
  • 4 weeks later...
  • 3 weeks later...
  • 1 month later...
  • 3 months later...
comment_81840
On 10/27/2017 at 9:16 PM, Bananastreet said:

Hey boys and grills, 
These kids in the Discord chat are like, "You don't contribute anything to the website." Well I'll show them losers.

So, I used this on the simplicity source, but it should work on all ruse related servers.

Make a new file in

com.ruseps.net.packet.impl

I called it "MagicOnObjectPacketListener" so I kept the naming scheme throughout.

Add the contents in that file.

package com.ruseps.net.packet.impl;

import com.ruseps.GameSettings;
import com.ruseps.engine.task.impl.WalkToTask;
import com.ruseps.engine.task.impl.WalkToTask.FinalizedMovementTask;
import com.ruseps.model.Animation;
import com.ruseps.model.GameObject;
import com.ruseps.model.Graphic;
import com.ruseps.model.GraphicHeight;
import com.ruseps.model.PlayerRights;
import com.ruseps.model.Position;
import com.ruseps.model.Skill;
import com.ruseps.model.definitions.GameObjectDefinition;
import com.ruseps.net.packet.Packet;
import com.ruseps.net.packet.PacketListener;
import com.ruseps.world.clip.region.RegionClipping;
import com.ruseps.world.content.combat.magic.MagicSpells;
import com.ruseps.world.content.combat.magic.Spell;
import com.ruseps.world.entity.impl.player.Player;

/**
 * Magic on object packet listener.
 * @author Bananastreet
 *
 */
public class MagicOnObjectPacketListener implements PacketListener {

	/**
	 * Handles the click option for an object.
	 * @param player		The player that clicked on the object.
	 * @param packet		The packet containing the object's and spell's information.
	 */
	@Override
	public void handleMessage(Player player, Packet packet) {
		final int objectX = packet.readLEShort();
		final int spellId = packet.readShortA();
		final int objectY = packet.readShortA();
		final int objectId = packet.readLEShort();
		//Objects position.
		final Position position = new Position(objectX, objectY, player.getPosition().getZ());
		//Intialize a new game object from the packets.
		final GameObject gameObject = new GameObject(objectId, position);
		//Check if the object exists in the region.
		if (!RegionClipping.objectExists(gameObject)) {
			if (player.getRights().isStaff()) {
				player.getPacketSender().sendMessage("Object with id " + objectId + " does not exist").sendMessage("Please report to Bananastreet");
			} else {
				player.getPacketSender().sendMessage("An error occured. Error code: " + objectId).sendMessage("Please report the error to a staff member.");
			}
			return;
		}
		//Check if the spell id is less than 0.
		if (spellId < 0) {
			if (player.getRights() == PlayerRights.DEVELOPER) {
				player.getPacketSender().sendMessage("Error in MagicOnObjectPacketListener!");
			}
			return;
		}
		//Getting the magic spell from the spell id.
		final MagicSpells magicSpell = MagicSpells.forSpellId(spellId);
		//Checking if the spell is null.
		if (magicSpell == null) {
			player.getPacketSender().sendMessage("magicSpell is null");
			return;
		}
		//Initializing a new spell from the magic spell.
		Spell spell = magicSpell.getSpell();
		//Get the object definition from the object id.
		final GameObjectDefinition def = GameObjectDefinition.forId(objectId);
		//Calculate the size of the object.
		final int size = def.getSizeX() - def.getSizeY() - 1;
		//Set the game objects size.
		gameObject.setSize(size);
		//Walk towards the object and set which object we are interacting with. 
		player.setInteractingObject(gameObject).setWalkToTask(new WalkToTask(player, position, gameObject.getSize(), new FinalizedMovementTask () {
			@Override
			public void execute() {
				//Face the object.
				player.setPositionToFace(gameObject.getPosition());
				switch (objectId) {
				case 2151:
					if (magicSpell.equals(MagicSpells.CHARGE_WATER_ORB)) {
						if (spell == null || !spell.canCast(player, true)) {
							return;
						}
						if (player.getInventory().contains(567)) {
							player.getInventory().delete(567, 1);
						}
						player.performAnimation(ORB_ANIMATION);
						player.performGraphic(WATER_ORB_GRAPHIC);
						player.getSkillManager().addExperience(Skill.MAGIC, spell.baseExperience());
						player.getInventory().add(571, 1);
						return;
					} else {
						player.getPacketSender().sendMessage("You can only use Charge Water Orb spell on this obelisk.");
					}
					player.getPacketSender().sendInterfaceRemoval();
					player.getSkillManager().stopSkilling();
					break;
				case 2153:
					if (magicSpell.equals(MagicSpells.CHARGE_FIRE_ORB)) {
						if (spell == null || !spell.canCast(player, true)) {
							return;
						}
						player.getPacketSender().sendTab(GameSettings.INVENTORY_TAB);
						if (player.getInventory().contains(567)) {
							player.getInventory().delete(567, 1);
						}
						player.performAnimation(ORB_ANIMATION);
						player.performGraphic(FIRE_ORB_GRAPHIC);
						player.getSkillManager().addExperience(Skill.MAGIC, spell.baseExperience());
						player.getInventory().add(569, 1);
						player.getPacketSender().sendTab(GameSettings.MAGIC_TAB);
					} else {
						player.getPacketSender().sendMessage("You can only use Charge Fire Orb spell on this obelisk.");
					}
					break;
				}
			}
			
		}));
		player.getClickDelay().reset();
		player.getInventory().refreshItems();
	}
	
	private static final Animation ORB_ANIMATION = new Animation(726);
	private static final Animation DEFAULT_ANIMATION = new Animation(65535);
	private static final Graphic WATER_ORB_GRAPHIC = new Graphic(149, GraphicHeight.HIGH);
	private static final Graphic FIRE_ORB_GRAPHIC = new Graphic(152, GraphicHeight.HIGH);
	private static final Graphic EARTH_ORB_GRAPHIC = new Graphic(151, GraphicHeight.HIGH);
	private static final Graphic AIR_ORB_GRAPHIC = new Graphic(150, GraphicHeight.HIGH);
	public static final int MAGIC_ON_OBJECTS = 35;
}

You'll probably get a few errors telling you that "CHARGE_WATER_ORB" and the others don't exist. On to step 2:

Add these spells in your MagicSpells enum:

CHARGE_WATER_ORB(new Spell() {

		@Override
		public int spellId() {
			return 1179;
		}

		@Override
		public int levelRequired() {
			return 56;
		}

		@Override
		public int baseExperience() {
			return 66;
		}

		@Override
		public Optional<Item[]> itemsRequired(Player player) {
			return Optional.of(new Item[] {new Item(555, 30), new Item(564, 3), new Item(567)});
		}

		@Override
		public Optional<Item[]> equipmentRequired(Player player) {
			return Optional.empty();
		}

		@Override
		public void startCast(Character cast, Character castOn) {
			//Empty
		}
		
	}),
    CHARGE_FIRE_ORB(new Spell() {

		@Override
		public int spellId() {
			return 1184;
		}

		@Override
		public int levelRequired() {
			return 63;
		}

		@Override
		public int baseExperience() {
			return 73;
		}

		@Override
		public Optional<Item[]> itemsRequired(Player player) {
			return Optional.of(new Item[] {new Item(554, 30), new Item(564, 3), new Item(567)});
		}

		@Override
		public Optional<Item[]> equipmentRequired(Player player) {
			return Optional.empty();
		}

		@Override
		public void startCast(Character cast, Character castOn) {
		}
		
	}), 

Then at last we need to call the MagicOnPacketListener into the packets.

Open up PacketConstants and add this with the other magic on stuff to keep it close together.

PACKETS[MagicOnObjectPacketListener.MAGIC_ON_OBJECTS] = new MagicOnObjectPacketListener();

Remember to make all of your imports. Which is Ctrl + Shift + O in eclipse.

If I missed anything let me know, and on a side note, I know this isn't complete, or done "properly", I just used it to test if the packet was working, and whether I could actually perform the spell on the object.

xfZ7oqz.gif

thanks for this

  • 2 months later...
  • 2 months later...

Create an account or sign in to comment