Thread: [Avalon] Better NPC drop system

Results 1 to 4 of 4
  1. #1 [Avalon] Better NPC drop system 
    Registered Member

    Join Date
    Mar 2011
    Age
    24
    Posts
    550
    Thanks given
    158
    Thanks received
    170
    Rep Power
    220
    Fixed up double drop method, rare drops & bonecrusher, herbicide.
    Easier to add custom drops like caskets & extra items.
    Fixed up lootshare.

    Code:
    public void drop() {
    		try {
    			Player killer = getMostDamageReceivedSourcePlayer();
    			if (killer == null)
    				return;
    			SlayerManager manager = killer.getSlayerManager();
    			if (manager.isValidTask(getName()))
    				manager.checkCompletedTask(getDamageReceived(killer), 0);
    			Drop[] dropsArray = NPCDrops.getDrops(id);
    			if (dropsArray == null) {
    				return;
    			}
    			List<Drop> drops = new ArrayList<>(Arrays.asList(dropsArray));
    			if (getId() == 2881) {
    				addRainPoints(killer, this);
    				killer.setDagannothSupremeKilled(killer.getDagannothSupremeKilled() + 1);
    				if (killer.getDagannothSupremeKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Dagannoth supremes");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getDagannothSupremeKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 2882) {
    				addRainPoints(killer, this);
    				killer.setDagannothPrimeKilled(killer.getDagannothPrimeKilled() + 1);
    				if (killer.getDagannothPrimeKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Dagannoth primes");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getDagannothPrimeKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 2883) {
    				addRainPoints(killer, this);
    				killer.setDagannothRexKilled(killer.getDagannothRexKilled() + 1);
    				if (killer.getDagannothRexKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Dagannoth rexs");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getDagannothRexKilled() + " " + getName() + "s.");
    			}
    			if (getName().toLowerCase().equalsIgnoreCase("tormented demon")) {
    				addRainPoints(killer, this);
    				killer.setTormentedDemonsKilled(killer.getTormentedDemonsKilled() + 1);
    				if (killer.getTormentedDemonsKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Tormented demons");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getTormentedDemonsKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 6260) {
    				addRainPoints(killer, this);
    				killer.bandosKilled++;
    				if (killer.getBandosKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 General graardors");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getBandosKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 6222) {
    				addRainPoints(killer, this);
    				killer.armadylKilled++;
    				if (killer.getArmadylKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Kree'arras");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getArmadylKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 6247) {
    				addRainPoints(killer, this);
    				killer.saradominKilled++;
    				if (killer.getSaradominKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Commander zilyana");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getSaradominKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 6203) {
    				addRainPoints(killer, this);
    				killer.zamorakKilled++;
    				if (killer.getZamorakKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 K'ril tsutsaroths");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getZamorakKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 8133) {
    				addRainPoints(killer, this);
    				killer.corpKilled++;
    				if (killer.getCorpKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 Corporeal beasts");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getCorpKilled() + " " + getName() + "s.");
    			}
    			if (getId() == 50) {
    				addRainPoints(killer, this);
    				killer.setKbdKilled(killer.getKbdKilled() + 1);
    				if (killer.getKbdKilled() == 25) {
    					killer.getPackets().sendGameMessage(
    							"<col=ff0000>Congratulations, you have completed a completionist cape requirement;");
    					killer.getPackets().sendGameMessage("<col=ff0000>Kill 25 King black dragons");
    				}
    				killer.getPackets().sendGameMessage(
    						"You have killed in total of " + killer.getKbdKilled() + " " + getName() + "s.");
    			}
    			if (killer.isAtWild() && killer.getControlerManager().getControler() instanceof WildernessControler) {
    				if (getCombatLevel() > 10) {
    					double combatLevel = getCombatLevel() * 0.5;
    					double wildyLevel = WildernessControler.getWildLevel(killer) * 0.5;
    					double points = combatLevel * wildyLevel;
    					double bonusPoints = (points * killer.getBonusPoints()) - points;
    					double totalPoints = points + bonusPoints;
    					killer.setAvalonPoints(killer.getAvalonPoints() + (int) totalPoints);
    					killer.getPackets().sendGameMessage("You gain " + totalPoints
    							+ (bonusPoints > 1 ? " (" + bonusPoints + " Bonus points)" : " ") + Settings.SERVER_NAME
    							+ " points for killing a level " + getCombatLevel() + " " + getName() + ".");
    				}
    			}
    			Charms charm = CharmDrops.calculateCharm(killer, this);
    			if (charm != null) {
    				int charmCount = CharmDrops.getCharmsAmount(this, charm);
    				Drop charmDrop = Drop.create(charm.getItemId(), 100, charmCount, charmCount, false);
    				drops.add(charmDrop);
    			}
    			Casket casket = CasketDrops.calculateDrop(killer, this);
    			if (casket != null) {
    				Drop casketDrop = Drop.create(casket.getItemId(), 100, 1, 1, false);
    				drops.add(casketDrop);
    			}
    			KeyPart keyPart = CrystalKeyDrops.calculateDrop(killer, this);
    			if (keyPart != null) {
    				Drop keyDrop = Drop.create(keyPart.getItemId(), 100, 1, 1, false);
    				drops.add(keyDrop);
    			}
    			Item bestDefender = new Item(WarriorsGuild.getBestDefender(killer));
    			if (getDefinitions().getName().toLowerCase().equalsIgnoreCase("cyclops")) {
    				if (Utils.getRandom(9) == 0 && bestDefender != null) {
    					Drop defenderDrop = Drop.create(bestDefender.getId(), 100, 1, 1, false);
    					drops.add(defenderDrop);
    					killer.sm("<col=216902>You received: " + bestDefender.getName() + " (" + getName() + ")");
    				}
    			}
    			Drop[] possibleDrops = new Drop[drops.size()];
    			int possibleDropsCount = 0;
    			for (Drop drop : drops) {
    				if (drop.getRate() == 100)
    					sendDrop(killer, drop);
    				else {
    					if ((Utils.getRandomDouble(99) + 1) <= (drop.getRate())) {
    						possibleDrops[possibleDropsCount++] = drop;
    					}
    				}
    			}
    			if (possibleDropsCount > 0)
    				sendDrop(killer, possibleDrops[Utils.getRandom(possibleDropsCount - 1)]);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} catch (Error e) {
    			e.printStackTrace();
    		}
    	}
    
    	public void handleBonecrusher(Player player, Drop drop, Item item, boolean lootShare) {
    		CopyOnWriteArrayList<Player> playersWithLs = new CopyOnWriteArrayList<Player>();
    		String dropName = ItemDefinitions.getItemDefinitions(drop.getItemId()).getName().toLowerCase();
    		if (lootShare) {
    			player.sm(String.format(("<col=216902>Your bonecrusher crushed: %s x %s. </col>"),
    					Utils.getFormattedNumber(item.getAmount(), ','), dropName));
    			for (Player p : playersWithLs) {
    				if (!p.equals(player)) {
    					p.sm(String.format("%s bonecrusher crushed: %s x %s.", player.getDisplayName(),
    							Utils.getFormattedNumber(item.getAmount(), ','), dropName));
    				}
    			}
    		}
    		for (int i = 0; i < item.getAmount(); i++)
    			player.getSkills().addXp(Skills.PRAYER, Burying.Bone.forId(item.getId()).getExperience());
    		item.setAmount(0);
    	}
    
    	public void handleHerbicide(Player player, Drop drop, Item item, boolean lootShare) {
    		CopyOnWriteArrayList<Player> playersWithLs = new CopyOnWriteArrayList<Player>();
    		String dropName = ItemDefinitions.getItemDefinitions(drop.getItemId()).getName().toLowerCase();
    		if (lootShare) {
    			player.sm(String.format(("<col=216902>Your herbicide burnt: %s x %s. </col>"),
    					Utils.getFormattedNumber(item.getAmount(), ','), dropName));
    			for (Player p : playersWithLs) {
    				if (!p.equals(player)) {
    					p.sm(String.format("%s herbicide burnt: %s x %s.", player.getDisplayName(),
    							Utils.getFormattedNumber(item.getAmount(), ','), dropName));
    				}
    			}
    		}
    		for (int i = 0; i < item.getAmount(); i++)
    			player.getSkills().addXp(Skills.HERBLORE, HerbCleaning.getHerb(drop.getItemId()).getExperience() * 2);
    		item.setAmount(0);
    	}
    
    	boolean sendDp = false;
    
    	public void sendLootshare(Player player, Drop drop, Item item) {
    		int size = getSize();
    		String dropName = ItemDefinitions.getItemDefinitions(drop.getItemId()).getName().toLowerCase();
    		ItemDefinitions defs = ItemDefinitions.getItemDefinitions(drop.getItemId());
    		/* LootShare/CoinShare */
    		FriendChatsManager fc = player.getCurrentFriendChat();
    		if (fc != null) {
    			CopyOnWriteArrayList<Player> players = fc.getPlayers();
    			CopyOnWriteArrayList<Player> playersWithLs = new CopyOnWriteArrayList<Player>();
    			for (Player p : players) {
    				if (p.isToogleLootShare() && p.getRegionId() == player.getRegionId())
    					playersWithLs.add(p);
    			}
    			Player luckyPlayer = playersWithLs.get((int) (Math.random() * playersWithLs.size()));
    			if (luckyPlayer.getInventory().containsItem(19675, 1) && defs.getName().toLowerCase().contains("grimy")) {
    				if (luckyPlayer.getSkills().getLevel(Skills.HERBLORE) >= HerbCleaning.getHerb(drop.getItemId())
    						.getLevel()) {
    					handleHerbicide(luckyPlayer, drop, item, true);
    					return;
    				}
    			}
    			if ((defs.getName().toLowerCase().equalsIgnoreCase("bones")
    					|| defs.getName().toLowerCase().contains(" bones"))
    					&& luckyPlayer.getInventory().containsItem(18337, 1)) {
    				handleBonecrusher(luckyPlayer, drop, item, true);
    				return;
    			}
    			if (item.getAmount() > 0) {
    				if (Settings.DOUBLE_DROP && rareDrop(dropName.toLowerCase()))
    					item.setAmount(item.getAmount() * 2);
    				World.updateGroundItem(item, new WorldTile(getCoordFaceX(size), getCoordFaceY(size), getPlane()),
    						luckyPlayer, 60, 0);
    				luckyPlayer.sm(String.format(
    						(rareDrop(dropName.toLowerCase()) ? "<col=ff0000>" : "<col=216902>")
    								+ "You received: %s x %s. (" + getName() + ") </col>",
    						Utils.getFormattedNumber(item.getAmount(), ','), dropName));
    				for (Player p : playersWithLs) {
    					if (!p.equals(luckyPlayer)) {
    						p.sm(String.format("%s received: %s x %s. (" + getName() + ") ", luckyPlayer.getDisplayName(),
    								Utils.getFormattedNumber(item.getAmount(), ','), dropName));
    					}
    				}
    				if (rareDrop(dropName.toLowerCase()))
    					World.sendWorldMessage("<img=7><col=36648b>News: " + luckyPlayer.getDisplayName() + " has recieved "
    							+ (item.getAmount() > 1 ? item.getAmount() + " x " + dropName : dropName)
    							+ " as loot from (" + getName() + ")!", false);
    			}
    		}
    		sendDp = false;
    	}
    
    	public void sendDrop(Player player, Drop drop) {
    		int size = getSize();
    		sendDp = true;
    		String dropName = ItemDefinitions.getItemDefinitions(drop.getItemId()).getName().toLowerCase();
    		Item item = ItemDefinitions.getItemDefinitions(drop.getItemId()).isStackable()
    				? new Item(drop.getItemId(),
    						(drop.getMinAmount() * Settings.DROP_RATE)
    								+ Utils.getRandom(drop.getExtraAmount() * Settings.DROP_RATE))
    				: new Item(drop.getItemId(), (drop.getMinAmount() + Utils.getRandom(drop.getExtraAmount())));
    		if (Settings.DOUBLE_DROP && (drop.getRate() == 100 || item.getDefinitions().isStackable()
    				|| item.getDefinitions().isNoted() || rareDrop(dropName.toLowerCase())))
    			item.setAmount(item.getAmount() * 2);
    		ItemDefinitions defs = ItemDefinitions.getItemDefinitions(drop.getItemId());
    		/* LootShare/CoinShare */
    		if (player.isToogleLootShare()) {
    			sendLootshare(player, drop, item);
    		} else if (!player.isToogleLootShare() || sendDp) {
    			if (player.getInventory().containsItem(19675, 1) && defs.getName().toLowerCase().contains("grimy")) {
    				if (player.getSkills().getLevel(Skills.HERBLORE) >= HerbCleaning.getHerb(drop.getItemId()).getLevel()) {
    					handleHerbicide(player, drop, item, false);
    					return;
    				}
    			}
    			if (defs.getName().toLowerCase().equalsIgnoreCase("bones")
    					|| defs.getName().toLowerCase().contains(" bones")
    							&& player.getInventory().containsItem(18337, 1)) {
    				handleBonecrusher(player, drop, item, false);
    				return;
    			}
    			if (item.getAmount() > 0) {
    				World.updateGroundItem(item, new WorldTile(getCoordFaceX(size), getCoordFaceY(size), getPlane()),
    						player, 60, 0);
    				if (rareDrop(dropName.toLowerCase())) {
    					World.sendWorldMessage("<img=7><col=36648b>News: " + player.getDisplayName() + " has recieved "
    							+ (item.getAmount() > 1 ? item.getAmount() + " x " + dropName : dropName)
    							+ " as loot from (" + getName() + ")!", false);
    				}
    			}
    		}
    
    	}
    
    	private boolean rareDrop(String name) {
    		if (name.contains("virtus") || name.contains("bandos chest") || name.contains("bandos tasset")
    				|| name.contains("bandos boots") || name.contains("hilt") || name.contains("visage")
    				|| name.contains("sigil") || name.contains("korasi") || name.contains("armadyl chain")
    				|| name.contains("armadyl helm") || name.contains("armadyl chest") || name.contains("dragon claws")
    				|| name.contains("berserker ring") || name.contains("archers' ring") || name.contains("seers' ring")
    				|| name.contains("warrior ring") || name.contains("zamorakian") || name.contains("saradomin sword")
    				|| name.contains("dragon pickaxe") || name.contains("ragefire") || name.contains("steadfast")
    				|| name.contains("glaiven") || name.contains("morrigan") || name.contains("zuriel")
    				|| name.contains("vesta") || name.contains("statius") || name.contains("fury"))
    			return true;
    		return false;
    	}
    AvalonPK Developer
    Reply With Quote  
     

  2. #2  
    Banned

    Join Date
    Sep 2011
    Posts
    1,037
    Thanks given
    133
    Thanks received
    257
    Rep Power
    0
    Well look who's on a releasing roll xD , nice mate
    Reply With Quote  
     

  3. Thankful user:


  4. #3  
    Registered Member

    Join Date
    Mar 2011
    Age
    24
    Posts
    550
    Thanks given
    158
    Thanks received
    170
    Rep Power
    220
    Quote Originally Posted by Dan_ View Post
    Well look who's on a releasing roll xD , nice mate
    Always mate! , Thanks
    AvalonPK Developer
    Reply With Quote  
     

  5. #4  
    Registered Member

    Join Date
    Mar 2011
    Age
    24
    Posts
    550
    Thanks given
    158
    Thanks received
    170
    Rep Power
    220
    Quote Originally Posted by Deathstrokepk View Post
    nice work
    Cheers.
    AvalonPK Developer
    Reply With Quote  
     


Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. NPC drops system
    By pljay03 in forum Show-off
    Replies: 3
    Last Post: 02-16-2010, 03:22 PM
  2. NPC drop Systems.
    By Bando in forum RS2 Server
    Replies: 12
    Last Post: 01-20-2010, 12:03 AM
  3. [Shard] Alternative NPC Drop System
    By Chachi in forum Snippets
    Replies: 6
    Last Post: 11-15-2009, 12:46 AM
  4. Alternate NPC Drop System
    By bloodargon in forum Tutorials
    Replies: 18
    Last Post: 07-15-2009, 07:45 AM
  5. Better NPC Spawn system
    By PrePay in forum Requests
    Replies: 2
    Last Post: 10-21-2008, 10:10 PM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •