diff --git a/CHANGELOG b/CHANGELOG index fc90ff6ad..c4e0bc6fd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -82,4 +82,5 @@ - Add proper sound effects for the explorer's ring and fix leaf-bladed sword's sound effects. - Fix wine of zamorak pickup interaction. - Static clue drop ids replaced with their level appropriate proxy values -- Fix a bug where clue scrolls were rerolled to easy for most NPCs \ No newline at end of file +- Fix a bug where clue scrolls were rerolled to easy for most NPCs +- Allow renewing summoning familiars, and make bobs drop items on dismissal even if their owners are ironmen. diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java index 34e3c8128..23a9b451d 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java @@ -55,13 +55,13 @@ public abstract class BurdenBeast extends Familiar { if (owner.getInterfaceManager().hasMainComponent(671)) { owner.getInterfaceManager().close(); } - if (!owner.getIronmanManager().isIronman()) { - for (Item item : container.toArray()) { - if (item != null) { - GroundItemManager.create(new GroundItem(item, location, 500, owner)); - } - } - } + + for (Item item : container.toArray()) { + if (item != null) { + GroundItemManager.create(new GroundItem(item, location, 500, owner)); + } + } + container.clear(); super.dismiss(); } @@ -209,4 +209,4 @@ public abstract class BurdenBeast extends Familiar { return container; } -} \ No newline at end of file +} diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java index f418ac465..44be7a43a 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java @@ -311,13 +311,20 @@ public abstract class Familiar extends NPC implements Plugin { } } + public void refreshTimer() { + ticks = maximumTicks; + } + /** * Sends the time remaining. */ private void sendTimeRemaining() { - int minutes = (int) Math.ceil(ticks * 0.01); - int hash = minutes << 7 | ((ticks - (minutes * 100)) > 49 ? 1 : 0) << 6; - owner.getConfigManager().set(1176, hash); + int minutes = ticks / 100; + int centiminutes = ticks % 100; + owner.varpManager.get(1176) + .setVarbit(7, minutes) + .setVarbit(6, centiminutes > 49 ? 1 : 0) + .send(owner); } /** diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java index 122f4d212..c22e7b7b3 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java @@ -126,9 +126,14 @@ public final class FamiliarManager { * @param deleteItem we should delete the item. */ public void summon(Item item, boolean pet, boolean deleteItem) { + boolean renew = false; if (hasFamiliar()) { - player.getPacketDispatch().sendMessage("You already have a follower."); - return; + if(familiar.getPouchId() == item.getId()) { + renew = true; + } else { + player.getPacketDispatch().sendMessage("You already have a follower."); + return; + } } if (player.getZoneMonitor().isRestricted(ZoneRestriction.FOLLOWERS) && !player.getLocks().isLocked("enable_summoning")) { player.getPacketDispatch().sendMessage("This is a Summoning-free area."); @@ -151,24 +156,30 @@ public final class FamiliarManager { return; } final int npcId = pouch.getNpcId(); - Familiar fam = FAMILIARS.get(npcId); + Familiar fam = !renew ? FAMILIARS.get(npcId) : familiar; if (fam == null) { player.getPacketDispatch().sendMessage("Invalid familiar " + npcId + " - report on 2009scape github"); return; } - fam = fam.construct(player, npcId); - if (fam.getSpawnLocation() == null) { - player.getPacketDispatch().sendMessage("The spirit in this pouch is too big to summon here. You will need to move to a larger"); - player.getPacketDispatch().sendMessage("area."); - return; - } + if(!renew) { + fam = fam.construct(player, npcId); + if (fam.getSpawnLocation() == null) { + player.getPacketDispatch().sendMessage("The spirit in this pouch is too big to summon here. You will need to move to a larger"); + player.getPacketDispatch().sendMessage("area."); + return; + } + } if (!player.getInventory().remove(item)) { return; } player.getSkills().updateLevel(Skills.SUMMONING, -pouch.getSummonCost(), 0); player.getSkills().addExperience(Skills.SUMMONING, pouch.getSummonExperience()); - familiar = fam; - spawnFamiliar(); + if(!renew) { + familiar = fam; + spawnFamiliar(); + } else { + familiar.refreshTimer(); + } if (player.getSkullManager().isWilderness()) { player.getAppearance().sync(); } @@ -500,4 +511,4 @@ public final class FamiliarManager { public Map getPetDetails() { return petDetails; } -} \ No newline at end of file +}