Hello, this is very basic but works like charm, to add a perk to a pet, u must go to wherever you want that perk thingy and check if player's current pet is the id specified,
if so, proceed with the perk.
/**
* @author Sagacity - http://rune-server.ee/members/sagacity -
* @[Only registered and activated users can see links. Click Here To Register...]
*/
public class PetPerksManager implements Serializable {
private static final long serialVersionUID = 2011932556974180375L;
private transient Player player;
private int currentPet;
public int getCurrentPet() {
return currentPet;
}
public void setCurrentPet(int currentPet) {
this.currentPet = currentPet;
}
private enum Pet {
//petId - itemId, object{bonusIndex, bonusModifier}
GRAARDOR(Pets.TREASURE_FAIRY_PET.getBabyNpcId(), Pets.TREASURE_FAIRY_PET.getBabyItemId(), new BonusMultiplier[] {
new BonusMultiplier(CombatDefinitions.STAB_ATTACK, 50.0),
new BonusMultiplier(CombatDefinitions.SLASH_ATTACK, 50.0)
});
int petId;
public int getPetItemId() {
return petItemId;
}
public void setPetItemId(int petItemId) {
this.petItemId = petItemId;
}
int petItemId;
public BonusMultiplier[] getCurrentBonuses() {
return currentBonuses;
}
public void setCurrentBonuses(BonusMultiplier[] currentBonuses) {
this.currentBonuses = currentBonuses;
}
private void findAndEnablePerk() {
if (player.getPet() == null)
return;
for (Pet pet : Pet.values()) {
if (player.getPet().getId() == pet.getPetId() && getCurrentPet() == -1) {
setCurrentPet(pet.getPetId());
applyBonuses(pet);
player.sm("Pet perk activated for " + NPCDefinitions.getNPCDefinitions(pet.getPetId()).getName());
return;
}
}
}
public boolean isPerkPet(int itemId) {
for (Pet pet : Pet.values()) {
if(pet.getPetItemId() == itemId)
return true;
}
return false;
}
public void findAndDisablePerk() {
for (Pet pet : Pet.values()) {
if (player.getPet().getId() == pet.getPetId()) {
setCurrentPet(-1);
removeBonuses(pet);
player.sm("Pet perk deactivated for " + NPCDefinitions.getNPCDefinitions(pet.getPetId()).getName());
break;
}
}
}
private void applyBonuses(Pet pet) {
if (pet.getCurrentBonuses() == null)
return;
for (int i = 0; i < pet.getCurrentBonuses().length; i++) {
if (pet.getCurrentBonuses()[i] != null) {
player.getCombatDefinitions().getBonuses()[pet.getCurrentBonuses()[i].getBonusIndex()] += (int) pet.getCurrentBonuses()[i].getBonusMultiplier();
player.sm(pet.getCurrentBonuses()[i].getBonusIndex()+ " - "+ (int) pet.getCurrentBonuses()[i].getBonusMultiplier());
}
}
}
private void removeBonuses(Pet pet) {
if (pet.getCurrentBonuses() == null)
return;
for (int i = 0; i < pet.getCurrentBonuses().length; i++) {
if (pet.getCurrentBonuses()[i] != null) {
player.getCombatDefinitions().getBonuses()[pet.getCurrentBonuses()[i].getBonusIndex()] -= (int) pet.getCurrentBonuses()[i].getBonusMultiplier();
player.sm(pet.getCurrentBonuses()[i].getBonusIndex()+ " - "+ (int) pet.getCurrentBonuses()[i].getBonusMultiplier());
}
}
}
}
}
BonusMultiplier.java
Code:
package com.rs.game.npc.pets.perks;
/**
* @author Sagacity - http://rune-server.ee/members/sagacity
* @[Only registered and activated users can see links. Click Here To Register...] 16/11/2019
*/
public class BonusMultiplier {
private int bonusIndex;
private double bonusMultiplier;
// If player actual pet is general graardor, then doublexp (place this at Skills.java inside addXp() method
if (player.getPetPerksManager().getCurrentPet() == Pets.GENERAL_GRAARDOR.getBabyNpcId()) {
exp *= 2;
}
Optional: (Perk pets always saved on death)
Spoiler for Click to show the code:
Player.java on "for (Item item : containedItems) {"
if (ItemConstants.isTradeable(item)) {
if (getPetPerksManager().isPerkPet(item.getId())) {
getInventory().addItem(item);
containedItems.remove(item);
sm("You saved your perk pet!");
} else {
World.addGroundItem(item, getLastWorldTile(), killer == null ? this : killer, false, 180, true, true);
}
}
You can add more pets to the list here and choose whichever perk it should have, enjoy! GRAARDOR(Pets.GENERAL_GRAARDOR.getBabyNpcId());
Edit: Also now, you can add stat bonuses per pet like add that STR bonus pet xD, u just have to add a new instance: new BonusMultiplier(CombatDefinitions.STAB_ATTACK, 50.0), as a third parameter
for Pet enum class, and if you want a pet with no bonuses at all, you just write a null instead of a new bonusmultiplier, or either remove that line and it should work fine ;)
11-16-2019, 10:29 PM
Shnek
Carefull with Serializable, wouldn't advice putting everything in the ser class
11-16-2019, 10:30 PM
01053
Pretty ordinary but I'm sure someone will use it.
You should check out [Only registered and activated users can see links. Click Here To Register...] will remove the need for getters/setters very useful and keeps things tidy.