Manipulating The Player

All things about the player

The Player, NPC, GameObject, Item classes will be used the most so we will be focused on them for the time being. You will see plenty of functions which take in a Player argument from which you could use to do all kinds of things to that player.

Example usage of Player

Take these examples where Player is passed into the plugin handler, see below:

/**
 * Handles when the player clicks on the shaking crates in the Lumber Yard.
 * @param The event to handle.
 */
public static NPCClickHandler handleShakingCrate = new NPCClickHandler(new Object[] { 7740 }, e -> {
	if (e.getPlayer().getQuestManager().getStage(Quest.GERTRUDES_CAT) == 7) {
		if (e.getPlayer().containsItem(13236))
			return;
		e.getPlayer().startConversation(new Conversation(new Dialogue()
				.addItem(13236, "You find three little kittens! You carefully place them in your backpack. This explains why Fluffs is so agitated.", () -> {
					e.getPlayer().getInventory().addItem(13236, 1);
				})));
	}
});
	public static ObjectClickHandler handleFrontDoor = new ObjectClickHandler(new Object[] { FORTRESS_FRONT_DOOR }, e -> {
		Player p = e.getPlayer();
		if (p.getY() > e.getObject().getY()) {
			handleDoor(p, e.getObject());
			return;
		}
		if (p.getEquipment().getHatId() != BRONZE_MED_HELM || p.getEquipment().getChestId() != IRON_CHAINBODY) {
			p.startConversation(new Conversation(p) {
				{
					addNPC(FORTRESS_FRONT_GAURD, HeadE.SKEPTICAL, "Password?");
					addPlayer(HeadE.SKEPTICAL_THINKING, "I don't know...");
					create();
				}
			});
			return;
		}
		handleDoor(p, e.getObject());
	});

When player is passed via e.getPlayer() or pretty much any function with the parameter Player passed into it you have access to what is inside the player class. If you look inside player you should see some pretty useful stuff, for example take a look at what is inside...

public class Player extends Entity {
  private String username;
  private Skills skills;
  private Inventory inventory;
	private Equipment equipment;
  private Bank bank;
  private MusicsManager musicsManager;
  private PrayerManager prayer;
  private QuestManager questManager;
  private transient Conversation conversation;
    
  public String getUsername() {	return username; }
  public Skills getSkills() {	return skills; }
  public Inventory getInventory() { return inventory; }
  public Equipment getEquipment() {	return equipment;	}
  public Bank getBank() { return bank; }
  //etc...
  
  public boolean startConversation(Conversation conversation) {
      //etc..
      return true;
	}
	//etc..
}
@PluginEventHandler
public final class Inventory {
  	private long coins;
		private ItemsContainer<Item> items;
  	private transient double inventoryWeight;
  
  	public int getFreeSlots() { return items.getFreeSlots(); }
  
  	public boolean addItem(int itemId, int amount) {
			//...
		}
  	public void deleteItem(int slot, Item item) {
			//...
		}
  //etc.
}
@PluginEventHandler  
public final class Skills {
  private short level[];
	private double xp[];
  
  public void addXp(int skill, double exp) {
    //...
  }
  
 	public void set(int skill, int newLevel) {
		level[skill] = (short) newLevel;
		markForRefresh(skill);
	}
  
  private void sendLevelUp(int skill) {
		//...	
	}
  
  public short[] getLevels() {
		return level;
	}

	public double[] getXp() {
		return xp;
	}

	public int getLevel(int skill) {
		return level[skill];
	}

	public double getXp(int skill) {
		return xp[skill];
	}
  //etc...
}

We can get these Object variables like Inventory, Skills, Equipment with the getter. Look below to see a getInventory call on line 3 of Example 1. Also, note many functions do not require a getter such as sendMessage or startConversation like in Example 2.

public static ItemOnObjectHandler handleRatTrap = new ItemOnObjectHandler(new Object[] { 40 }, e -> {
	if (e.getItem().getId() == 24) {
		e.getPlayer().getInventory().removeItems(new Item(24, 1));
		e.getPlayer().lock(5);
		for(NPC npc : World.getNPCsInRegion(e.getPlayer().getRegionId()))
			if(npc.getId() == 224) {
				npc.setIgnoreNPCClipping(true);
				npc.walkToAndExecute(WorldTile.of(2586, 9655, 0), ()->{
					npc.setIgnoreNPCClipping(false);
					npc.sendDeath(e.getPlayer());
				});
			}
		e.getPlayer().getTempAttribs().setB("ClockTowerPoisonedRats", true);
	}
});
	public static ItemOnObjectHandler handleUnusedSpindles = new ItemOnObjectHandler(new Object[] { 25, 26, 27, 28 }, e -> {
		if(e.getItem().getId() >= 20 && e.getItem().getId() <= 23) {
			e.getPlayer().sendMessage("The cog doesn't fit...");
			return;
		}
		e.getPlayer().startConversation(new Dialogue().addPlayer(HeadE.SKEPTICAL_THINKING, "What use is that?"));
	});

Updating the player permanently

Every manager you see above is usable from any plugin. You can access the Skills, Bank, Inventory, Equipment, QuestManager classes per player from whichever plugin or function. All classes, manager classes, or variables you update inside the player saves into MongoDB as long as it is not transient. So when you update the player here in the code you also automatically update the player in the RAM and eventually the MongoDB.

Just remember any changes you make are done server-side. The server stores the player class in its RAM and saves the player to Mongo on logout. At the same time, every 3 minutes the server saves all players logged in as well, just a note.