mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-10 10:20:41 -07:00
Fixed bracelet of clay charge counting (now uses an attribute)
Removed GatheringSkillPulse
This commit is contained in:
parent
6dd470cc66
commit
e3623e16ec
6 changed files with 10 additions and 405 deletions
|
|
@ -10,7 +10,6 @@ import core.game.node.entity.npc.NPC;
|
|||
import core.game.node.entity.player.Player;
|
||||
import core.game.node.entity.player.link.TeleportManager.TeleportType;
|
||||
import core.game.node.entity.player.link.quest.Quest;
|
||||
import core.game.node.entity.skill.gather.GatheringSkillPulse;
|
||||
import core.game.node.entity.skill.gather.SkillingTool;
|
||||
import core.game.node.item.Item;
|
||||
import core.game.node.scenery.Scenery;
|
||||
|
|
@ -44,7 +43,6 @@ public final class LostCityPlugin extends OptionHandler {
|
|||
ItemDefinition.forId(5680).getHandlers().put("option:wield", this);
|
||||
SceneryDefinition.forId(2409).getHandlers().put("option:chop", this);
|
||||
SceneryDefinition.forId(2406).getHandlers().put("option:open", this);
|
||||
SceneryDefinition.forId(1292).getHandlers().put("option:chop down", this);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
@ -55,29 +53,6 @@ public final class LostCityPlugin extends OptionHandler {
|
|||
case 2409:
|
||||
handleShamusTree(player, quest);
|
||||
break;
|
||||
case 1292:
|
||||
if (SkillingTool.getHatchet(player) == null) {
|
||||
player.getPacketDispatch().sendMessage("You do not have an axe which you have the level to use.");
|
||||
return true;
|
||||
}
|
||||
if (quest.getStage(player) < 20) {
|
||||
return true;
|
||||
}
|
||||
if (quest.getStage(player) == 20) {
|
||||
if (player.getAttribute("treeSpawned", false)) {
|
||||
return true;
|
||||
}
|
||||
TreeSpiritNPC spirit = (TreeSpiritNPC) TreeSpiritNPC.create(655, Location.create(2862, 9734, 0));
|
||||
spirit.setPlayer(player);
|
||||
spirit.setRespawn(false);
|
||||
spirit.init();
|
||||
spirit.attack(player);
|
||||
player.setAttribute("treeSpawned", true);
|
||||
spirit.sendChat("You must defeat me before touching the tree!");
|
||||
return true;
|
||||
}
|
||||
player.getPulseManager().run(new GatheringSkillPulse(player, (Scenery) node));
|
||||
break;
|
||||
case 2406:
|
||||
final boolean dramenTeleport = player.getEquipment().containsItem(DRAMEN_STAFF) && quest.getStage(player) > 20 && player.getLocation().getX() <= 3201;
|
||||
DoorActionHandler.handleAutowalkDoor(player, (Scenery) node);
|
||||
|
|
|
|||
|
|
@ -152,11 +152,6 @@ public final class GlobalData {
|
|||
*/
|
||||
private int ectoCharges;
|
||||
|
||||
/**
|
||||
* The bracelet of clay uses.
|
||||
*/
|
||||
private int braceletClayUses;
|
||||
|
||||
/**
|
||||
* The abbyss data.
|
||||
*/
|
||||
|
|
@ -344,7 +339,6 @@ public final class GlobalData {
|
|||
}
|
||||
forgingUses = Integer.parseInt( data.get("forgingUses").toString());
|
||||
ectoCharges = Integer.parseInt( data.get("ectoCharges").toString());
|
||||
braceletClayUses = Integer.parseInt( data.get("braceletClayUses").toString());
|
||||
dropDelay = Long.parseLong(data.get("dropDelay").toString());
|
||||
JSONArray ad = (JSONArray) data.get("abyssData");
|
||||
for(int i = 0; i < ad.size(); i++){
|
||||
|
|
@ -904,21 +898,6 @@ public final class GlobalData {
|
|||
this.ectoCharges = ectoCharges;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the braceletClayUses.
|
||||
* @return The braceletClayUses.
|
||||
*/
|
||||
public int getBraceletClayUses() {
|
||||
return braceletClayUses;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments the bracelet of clay uses.
|
||||
*/
|
||||
public void incrementBraceletOfClay() {
|
||||
this.braceletClayUses += 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the abyss data.
|
||||
*/
|
||||
|
|
@ -945,14 +924,6 @@ public final class GlobalData {
|
|||
return abyssData[ordinal];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the braceletClayUses.
|
||||
* @param braceletClayUses The braceletClayUses to set.
|
||||
*/
|
||||
public void setBraceletClayUses(int braceletClayUses) {
|
||||
this.braceletClayUses = braceletClayUses;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the dropDelay.
|
||||
* @return The dropDelay.
|
||||
|
|
|
|||
|
|
@ -1,338 +0,0 @@
|
|||
package core.game.node.entity.skill.gather;
|
||||
|
||||
import core.cache.def.impl.ItemDefinition;
|
||||
import core.game.container.impl.EquipmentContainer;
|
||||
import core.game.content.dialogue.FacialExpression;
|
||||
import core.game.content.global.BirdNest;
|
||||
import core.game.content.global.SkillingPets;
|
||||
import core.game.node.entity.impl.Projectile;
|
||||
import core.game.node.entity.player.Player;
|
||||
import core.game.node.entity.skill.SkillPulse;
|
||||
import core.game.node.entity.skill.Skills;
|
||||
import core.game.node.item.Item;
|
||||
import core.game.node.scenery.Scenery;
|
||||
import core.game.node.scenery.SceneryBuilder;
|
||||
import core.game.world.map.Location;
|
||||
import core.tools.RandomFunction;
|
||||
import core.tools.StringUtils;
|
||||
import rs09.game.world.GameWorld;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Handles a gathering skill, such as woodcutting, mining, ...
|
||||
* @author Emperor
|
||||
*/
|
||||
public final class GatheringSkillPulse extends SkillPulse<Scenery> {
|
||||
|
||||
/**
|
||||
* The gem rewards.
|
||||
*/
|
||||
private static final Item[] GEM_REWARDS = { new Item(1623), new Item(1621), new Item(1619), new Item(1617) };
|
||||
|
||||
/**
|
||||
* Is the player is mining.
|
||||
*/
|
||||
private boolean isMining;
|
||||
|
||||
/**
|
||||
* Is the player is mining essence.
|
||||
*/
|
||||
private boolean isMiningEssence;
|
||||
|
||||
/**
|
||||
* Is the player is mining gems.
|
||||
*/
|
||||
private boolean isMiningGems;
|
||||
|
||||
/**
|
||||
* Is the player is woodcutting.
|
||||
*/
|
||||
private boolean isWoodcutting;
|
||||
|
||||
/**
|
||||
* The amount of ticks it takes to get a log.
|
||||
*/
|
||||
private int ticks;
|
||||
|
||||
/**
|
||||
* Constructs a new {@code GatheringSkillPulse} {@code Object}.
|
||||
* @param player The player.
|
||||
* @param node The gathering resource.
|
||||
*/
|
||||
public GatheringSkillPulse(Player player, Scenery node) {
|
||||
super(player, node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
resource = SkillingResource.forId(
|
||||
node.getId());
|
||||
if (SkillingResource.isEmpty(node.getId())) {
|
||||
player.getPacketDispatch().sendMessage("This rock contains no ore.");
|
||||
return;
|
||||
}
|
||||
if (resource == null) {
|
||||
return;
|
||||
}
|
||||
isMining = resource.getSkillId() == Skills.MINING;
|
||||
isMiningEssence = resource == SkillingResource.RUNE_ESSENCE;
|
||||
isMiningGems = resource.getReward() == SkillingResource.GEM_ROCK_0.getReward();
|
||||
isWoodcutting = resource.getSkillId() == Skills.WOODCUTTING;
|
||||
super.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkRequirements() {
|
||||
if (player.getSkills().getLevel(resource.getSkillId()) < resource.getLevel()) {
|
||||
player.getPacketDispatch().sendMessage("You need a " + Skills.SKILL_NAME[resource.getSkillId()] + " level of " + resource.getLevel() + " to " + (isMining ? "mine this rock." : "cut this tree."));
|
||||
return false;
|
||||
}
|
||||
if (setTool() == null) {
|
||||
player.getPacketDispatch().sendMessage("You do not have a" + (isMining ? " pickaxe" : "n axe") + " to use.");
|
||||
return false;
|
||||
}
|
||||
if (player.getInventory().freeSlots() < 1) {
|
||||
player.getDialogueInterpreter().sendDialogue("Your inventory is too full to hold any more " + ItemDefinition.forId(resource.getReward()).getName().toLowerCase() + ".");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void animate() {
|
||||
if (resource.getAnimation() != null) {
|
||||
player.animate(resource.getAnimation());
|
||||
} else if (tool.getAnimation() != null) {
|
||||
player.animate(tool.getAnimation());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reward() {
|
||||
if (++ticks % (isMiningEssence ? 3 : 4) != 0) {
|
||||
return false;
|
||||
}
|
||||
if (node.getId() == 10041) {
|
||||
player.getDialogueInterpreter().sendDialogues(2574, FacialExpression.FURIOUS, RandomFunction.random(2) == 1 ? "You'll blow my cover! I'm meant to be hidden!" : "Will you stop that?");
|
||||
return true;
|
||||
}
|
||||
if (!checkReward()) {
|
||||
return false;
|
||||
}
|
||||
// 20% chance to auto burn logs when using "inferno adze" item
|
||||
if (isWoodcutting && tool.getId() == 13661 && RandomFunction.random(100) < 20){
|
||||
player.sendMessage("Your chop some logs. The heat of the inferno adze incinerates them.");
|
||||
Projectile.create(player, null, 1776, 35, 30, 20, 25).transform(player, new Location(player.getLocation().getX() + 2, player.getLocation().getY()), true, 25, 25).send();
|
||||
player.getSkills().addExperience(Skills.WOODCUTTING, resource.getExperience());
|
||||
player.getSkills().addExperience(Skills.FIREMAKING, resource.getExperience());
|
||||
return false;
|
||||
}
|
||||
int reward = resource.getReward();
|
||||
if (reward > 0) {
|
||||
reward = calculateReward(reward);
|
||||
applyAchievementTask(reward);
|
||||
// Give the player the items
|
||||
int rewardAmount = calculateRewardAmount(reward);
|
||||
Item item = new Item(reward, rewardAmount);
|
||||
player.getInventory().add(item);
|
||||
// Apply the experience points
|
||||
double experience = calculateExperience(reward, rewardAmount);
|
||||
player.getSkills().addExperience(resource.getSkillId(), experience, true);
|
||||
// Send a message to the player
|
||||
if (isMiningGems) {
|
||||
String gemName = ItemDefinition.forId(reward).getName().toLowerCase();
|
||||
player.sendMessage("You get " + (StringUtils.isPlusN(gemName) ? "an" : "a") + " " + gemName + ".");
|
||||
} else if (resource == SkillingResource.DRAMEN_TREE) {
|
||||
player.getPacketDispatch().sendMessage("You cut a branch from the Dramen tree.");
|
||||
} else {
|
||||
player.getPacketDispatch().sendMessage("You get some " + ItemDefinition.forId(reward).getName().toLowerCase() + ".");
|
||||
}
|
||||
// Calculate if the player should receive a bonus gem or bonus ore or both
|
||||
if (!isMiningEssence && isMining) {
|
||||
//check for bonus ore from shooting star buff
|
||||
if(isMining && (player.getAttribute("SS Mining Bonus", GameWorld.getTicks()) > GameWorld.getTicks())){
|
||||
if(RandomFunction.getRandom(7) == 5) {
|
||||
player.getPacketDispatch().sendMessage("...you manage to mine a second ore thanks to the Star Sprite.");
|
||||
player.getInventory().add(item);
|
||||
}
|
||||
}
|
||||
int chance = 282;
|
||||
boolean altered = false;
|
||||
if (new Item(player.getEquipment().getId(12)).getName().toLowerCase().contains("ring of wealth")) {
|
||||
chance /= 1.5;
|
||||
altered = true;
|
||||
}
|
||||
Item necklace = player.getEquipment().get(EquipmentContainer.SLOT_AMULET);
|
||||
if (necklace != null && (necklace.getId() > 1705 && necklace.getId() < 1713)) {
|
||||
chance /= 1.5;
|
||||
altered = true;
|
||||
}
|
||||
if (RandomFunction.random(chance) == 0) {
|
||||
Item gem = RandomFunction.getRandomElement(GEM_REWARDS);
|
||||
player.getPacketDispatch().sendMessage("You find a " + gem.getName() + "!");
|
||||
if (!player.getInventory().add(gem, player)) {
|
||||
player.getPacketDispatch().sendMessage("You do not have enough space in your inventory, so you drop the gem on the floor.");
|
||||
}
|
||||
}
|
||||
}
|
||||
// Calculate if the player should receive a bonus birds nest
|
||||
if (isWoodcutting) {
|
||||
int chance = 282;
|
||||
if (RandomFunction.random(chance) == 0) {
|
||||
BirdNest.drop(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
// not sure what this is exactly
|
||||
if (resource.getRespawnRate() != 0) {
|
||||
int charge = 1000 / resource.getRewardAmount();
|
||||
node.setCharge(node.getCharge() - RandomFunction.random(charge, charge << 2));
|
||||
if (node.getCharge() < 1) {
|
||||
node.setCharge(1000);
|
||||
// if (resource.isFarming()) {
|
||||
// PatchWrapper tree = player.getFarmingManager().getPatchWrapper(node.getWrapper().getId());
|
||||
// tree.addConfigValue(tree.getNode().getStumpBase());
|
||||
// tree.getCycle().setGrowthTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(resource.getRespawnDuration() + 10));
|
||||
// return true;
|
||||
// }
|
||||
if (resource.getEmptyId() > -1) {
|
||||
SceneryBuilder.replace(node, node.transform(resource.getEmptyId()), resource.getRespawnDuration());
|
||||
} else {
|
||||
SceneryBuilder.replace(node, node.transform(0), resource.getRespawnDuration());
|
||||
}
|
||||
node.setActive(false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the has completed any achievements from their diary
|
||||
*/
|
||||
private void applyAchievementTask(int reward) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the player gets rewarded.
|
||||
* @return {@code True} if so.
|
||||
*/
|
||||
private boolean checkReward() {
|
||||
int skill = isMining ? Skills.MINING : Skills.WOODCUTTING;
|
||||
int level = 1 + player.getSkills().getLevel(skill) + player.getFamiliarManager().getBoost(skill);
|
||||
double hostRatio = Math.random() * (100.0 * resource.getRate());
|
||||
double clientRatio = Math.random() * ((level - resource.getLevel()) * (1.0 + tool.getRatio()));
|
||||
return hostRatio < clientRatio;
|
||||
}
|
||||
|
||||
private int calculateReward(int reward) {
|
||||
// If the player is mining sandstone or granite, then i'm not sure what this does?
|
||||
if (resource == SkillingResource.SANDSTONE || resource == SkillingResource.GRANITE) {
|
||||
int value = RandomFunction.randomize(resource == SkillingResource.GRANITE ? 3 : 4);
|
||||
reward += value << 1;
|
||||
player.getSkills().addExperience(resource.getSkillId(), value * 10, true);
|
||||
}
|
||||
|
||||
// If the player is mining clay
|
||||
else if (reward == SkillingResource.CLAY_0.getReward()) {
|
||||
// Check if they have a bracelet of clay equiped
|
||||
if (player.getEquipment().contains(11074, 1)) {
|
||||
player.getSavedData().getGlobalData().incrementBraceletOfClay();
|
||||
if (player.getSavedData().getGlobalData().getBraceletClayUses() >= 28) {
|
||||
player.getSavedData().getGlobalData().setBraceletClayUses(0);
|
||||
player.getEquipment().remove(new Item(11074));
|
||||
player.sendMessage("Your bracelet of clay has disinegrated.");
|
||||
}
|
||||
// Give soft clay
|
||||
reward = 1761;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert rune essence to pure essence if the player is above level 30 mining
|
||||
else if (isMiningEssence && player.getSkills().getLevel(Skills.MINING) >= 30) {
|
||||
reward = 7936;
|
||||
}
|
||||
|
||||
// Calculate a random gem for the player
|
||||
else if (isMiningGems) {
|
||||
int random = RandomFunction.random(100);
|
||||
List<Integer> gems = new ArrayList<>(20);
|
||||
if (random < 2) {
|
||||
gems.add(1617);
|
||||
} else if (random < 25) {
|
||||
gems.add(1619);
|
||||
gems.add(1623);
|
||||
gems.add(1621);
|
||||
} else if (random < 40) {
|
||||
gems.add(1629);
|
||||
} else {
|
||||
gems.add(1627);
|
||||
gems.add(1625);
|
||||
}
|
||||
reward = gems.get(RandomFunction.random(gems.size()));
|
||||
}
|
||||
|
||||
return reward;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the total amount of items the player should receive
|
||||
* @return amount of items
|
||||
*/
|
||||
private int calculateRewardAmount(int reward) {
|
||||
int amount = 1;
|
||||
|
||||
// 3239: Hollow tree (bark) 10% chance of obtaining
|
||||
if (reward == 3239 && RandomFunction.random(100) >= 10) {
|
||||
amount = 0;
|
||||
}
|
||||
|
||||
SkillingPets.checkPetDrop(player, isMining ? SkillingPets.GOLEM : SkillingPets.BEAVER);
|
||||
|
||||
return amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the total experience the player should receive
|
||||
* @return amount of experience
|
||||
*/
|
||||
private double calculateExperience(int reward, int amount) {
|
||||
double experience = resource.getExperience();
|
||||
|
||||
// Bark
|
||||
if (reward == 3239) {
|
||||
// If we receive the item, give the full experience points otherwise give the base amount
|
||||
if (amount >= 1) {
|
||||
experience = 275.2;
|
||||
} else {
|
||||
amount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return experience * amount;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void message(int type) {
|
||||
switch (type) {
|
||||
case 0:
|
||||
player.getPacketDispatch().sendMessage("You swing your " + (isMining ? "pickaxe at the rock..." : "axe at the tree..."));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the tool used.
|
||||
*/
|
||||
private SkillingTool setTool() {
|
||||
if (!isMining) {
|
||||
tool = SkillingTool.getHatchet(player);
|
||||
} else {
|
||||
tool = SkillingTool.getPickaxe(player);
|
||||
}
|
||||
return tool;
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ package rs09.game.content.quest.members.thelostcity
|
|||
|
||||
import core.game.content.quest.members.lostcity.TreeSpiritNPC
|
||||
import core.game.node.scenery.Scenery
|
||||
import core.game.node.entity.skill.gather.GatheringSkillPulse
|
||||
import core.game.node.entity.skill.gather.woodcutting.WoodcuttingSkillPulse
|
||||
import core.game.node.entity.skill.gather.SkillingTool
|
||||
import core.game.world.map.Location
|
||||
import rs09.game.interaction.InteractionListener
|
||||
|
|
@ -35,7 +35,7 @@ class DramenTreeListener : InteractionListener {
|
|||
spirit.sendChat("You must defeat me before touching the tree!")
|
||||
return@on true
|
||||
}
|
||||
player.getPulseManager().run(GatheringSkillPulse(player, node as Scenery?))
|
||||
player.getPulseManager().run(WoodcuttingSkillPulse(player, node as Scenery?))
|
||||
return@on true
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -386,7 +386,6 @@ class PlayerSaver (val player: Player){
|
|||
globalData.put("readPlaques",readPlaques)
|
||||
globalData.put("forgingUses",player.savedData.globalData.forgingUses.toString())
|
||||
globalData.put("ectoCharges",player.savedData.globalData.ectoCharges.toString())
|
||||
globalData.put("braceletClayUses",player.savedData.globalData.braceletClayUses.toString())
|
||||
globalData.put("dropDelay",player.savedData.globalData.dropDelay.toString())
|
||||
val abyssData = JSONArray()
|
||||
player.savedData.globalData.abyssData.map {
|
||||
|
|
|
|||
|
|
@ -122,10 +122,6 @@ class MiningSkillPulse(private val player: Player, private val node: Node) : Pul
|
|||
if (++ticks % (if (isMiningEssence) 3 else 4) != 0) {
|
||||
return false
|
||||
}
|
||||
if (node.id == 10041) {
|
||||
sendNPCDialogue(player, NPCs.BANK_GUARD_2574,if (RandomFunction.random(2) == 1) "You'll blow my cover! I'm meant to be hidden!" else "Will you stop that?", FacialExpression.FURIOUS)
|
||||
return true
|
||||
}
|
||||
if (!checkReward()) {
|
||||
return false
|
||||
}
|
||||
|
|
@ -148,15 +144,17 @@ class MiningSkillPulse(private val player: Player, private val node: Node) : Pul
|
|||
if(reward == Items.CLAY_434){
|
||||
val bracelet = getItemFromEquipment(player, EquipmentSlot.HANDS)
|
||||
if(bracelet != null && bracelet.id == Items.BRACELET_OF_CLAY_11074){
|
||||
if(bracelet.charge > 28) bracelet.charge = 28
|
||||
bracelet.charge--
|
||||
var charges = player.getAttribute("jewellery-charges:bracelet-of-clay", 28);
|
||||
charges--
|
||||
reward = Items.SOFT_CLAY_1761
|
||||
sendMessage(player, "Your bracelet of clay softens the clay for you.")
|
||||
if(bracelet.charge <= 0){
|
||||
if(removeItem(player, bracelet)) {
|
||||
if(charges <= 0) {
|
||||
if(removeItem(player, bracelet, Container.EQUIPMENT)) {
|
||||
sendMessage(player, "Your bracelet of clay crumbles to dust.")
|
||||
charges = 28
|
||||
}
|
||||
}
|
||||
player.setAttribute("/save:jewellery-charges:bracelet-of-clay", charges)
|
||||
}
|
||||
}
|
||||
val rewardName = getItemName(reward).lowercase()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue