Thread: NPC Item Drop Interface

Page 1 of 3 123 LastLast
Results 1 to 10 of 27
  1. #1 NPC Item Drop Interface 
    Success is the worst teacher

    Santa Hat's Avatar
    Join Date
    Oct 2012
    Age
    27
    Posts
    3,334
    Thanks given
    807
    Thanks received
    1,185
    Rep Power
    190
    What you're adding

    Attached image

    This gives the player the ability to right click 'Examine' a NPC to retrieve it's drops in a nice visual way. You can sort the display of the items listed by clicking the backpack in the bottom right corner.

    The sorting options consist of;
    • highest drop rate
    • Lowest drop rate
    • Highest market value
    • Lowest market value


    Spoiler for Code:

    Spoiler for ViewNPCDrops.java:

    Code:
    package com.rs.game.player.content;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    import com.rs.cache.loaders.ItemDefinitions;
    import com.rs.cache.loaders.NPCDefinitions;
    import com.rs.game.item.Item;
    import com.rs.game.npc.Drop;
    import com.rs.game.player.Player;
    import com.rs.utils.NPCDrops;
    import com.rs.utils.Utils;
    
    /**
     * @author Jake
     * Displays a list of all the NPC's item drops
     */
    public class ViewNPCDrops {
    
    	/**
    	 * Displays the interface
    	 */
    	public static void sendInterface(Player player, int npcId) {
    		Drop[] drops = getSortedList(player, NPCDrops.getDrops(npcId));
    		
    		if (drops == null) {
    			player.out("The " + NPCDefinitions.getNPCDefinitions(npcId).name + " doesn't have any drops to offer.");
    			return;
    		}
    		
    		player.getInterfaceManager().sendInterface(671);
    		player.getPackets().sendIComponentText(671, 14, "Drops for " + NPCDefinitions.getNPCDefinitions(npcId).name + ".");
    		
    		player.getNpcDrops().clear();
    		
    		
    		for (int i = 0; i < drops.length; i++) {
    			if (i > 30) //Maximum of 30 items on the interface
    				break;
    			player.getNpcDrops().add(new Item(drops[i].getItemId(), ItemDefinitions.getItemDefinitions(drops[i].getItemId()).isStackable() ? drops[i].getMaxAmount() : 1));
    		}
    		player.getPackets().sendItems(530, player.getNpcDrops());
    		
    	
    		player.getPackets().sendUnlockIComponentOptionSlots(671, 27, 0, 530, 0, 1, 2);
    		player.getPackets().sendInterSetItemsOptionsScript(671, 27, 530, 6, 5, "View", "Price Check", "Examine");
    		
    		player.getTemporaryAttributtes().put("drops", npcId);
    		
    		player.setCloseInterfacesEvent(new Runnable() {
    			@Override
    			public void run() {
    				player.getTemporaryAttributtes().remove("drops");
    			}
    		});
    	}
    	
    	/**
    	 * Contains all the different sorting options
    	 */
    	private static Object[] sortTypes = new Object[] { "highest drop rate" , "lowest drop rate",  "highest market value", "lowest market value" };
    	
    	/**
    	 * Modifies the sorting orders for the drops
    	 */
    	public static void changeSortType(Player player, int npcId) {
    		if (player.getDropSortingType() == 3) 
    			player.setDropSortingType(0);
    		else
    			player.setDropSortingType(player.getDropSortingType() + 1);
    		
    		player.sendSimpleDialogue("You are now sorting by <col=FF0000>"+ sortTypes[player.getDropSortingType()] + "</col>.");
    		sendInterface(player, npcId);
    	}
    	
    	/**
    	 * Sorts the drop list
    	 */
    	private static Drop[] getSortedList(Player player, Drop[] drops) {
    		/*
    		 * Populate DropList
    		 */
    		List<Drop> dropList = new ArrayList<Drop>();
    		for (int i = 0; i < drops.length; i++) {
    			dropList.add(drops[i]);
    		}
    		switch (player.getDropSortingType()) {
    			case 0: //Sort Drop List by highest drop rate 
    				Collections.sort(dropList, (s1, s2) -> Double.compare(s2.getRate(), s1.getRate()));
    				break;
    			case 1: //Sort Drop List by lowest drop rate 
    				Collections.sort(dropList, (s1, s2) -> Double.compare(s1.getRate(), s2.getRate()));
    				break;
    			case 2: //Sort by highest market value
    				Collections.sort(dropList, (s1, s2) -> Integer.compare(ItemDefinitions.getItemDefinitions(s2.getItemId()).getValue(), ItemDefinitions.getItemDefinitions(s1.getItemId()).getValue()));
    				break;
    			case 3: //Sort by lowest market value
    				Collections.sort(dropList, (s1, s2) -> Integer.compare(ItemDefinitions.getItemDefinitions(s1.getItemId()).getValue(), ItemDefinitions.getItemDefinitions(s2.getItemId()).getValue()));
    				break;
    		}
    	
    		return dropList.toArray(drops);
    	}
    	
    	/**
    	 * View Item Option
    	 * Displays Items Drop Rate Percentage
    	 */
    	public static void sendDropRateMessage(Player player, Item item, int npcId, int slotId) {		
    		player.sendSimpleDialogue("<col=FF0000>"+Item.getItemName(item) + "</col> has a <col=FF0000>" + getDropRate(item.getId(), npcId) + "%</col> chance of being dropped by the " + NPCDefinitions.getNPCDefinitions(npcId).name + ".");
    	}
    	
    	/**
    	 * Sends Price Check
    	 */
    	public static void sendPriceCheckMessage(Player player, Item item) {
    		int value = item.getDefinitions().getValue();
    		player.sendSimpleDialogue("The " + item.getDefinitions().getName() + " has a market value of <col=FF0000>" + Utils.getFormat(value) + "</col> coins.");
    	}
    	
    	/**
    	 * Returns the drop rate of an item
    	 */
    	public static double getDropRate(int itemId, int npcId) {
    		Drop[] drops = NPCDrops.getDrops(npcId);
    		
    		for (int i = 0; i < drops.length; i++) {
    			if (drops[i].getItemId() == itemId) {
    				return drops[i].getRate();
    			}
    		}
    		return 0;
    	}
    	
    }



    Spoiler for Player.java:

    Code:
    	/**
    	 * NPC Drops
    	 */
    	
    	private int dropSortingType = 0;
    	
    	public int getDropSortingType() {
    		return dropSortingType;
    	}
    
    	public void setDropSortingType(int dropSortingType) {
    		this.dropSortingType = dropSortingType;
    	}
    	
    	private boolean toggleDrops;
    	
    	public boolean isToggleDrops() {
    		return toggleDrops;
    	}
    
    	public void setToggleDrops(boolean toggleDrops) {
    		this.toggleDrops = toggleDrops;
    	}
    	
    	private ItemsContainer<Item> npcDrops = new ItemsContainer<Item>(31, false);
    	
    	public ItemsContainer<Item> getNpcDrops() {
    		return npcDrops;
    	}
    
    	public void setNpcDrops(ItemsContainer<Item> npcDrops) {
    		this.npcDrops = npcDrops;
    	}



    Spoiler for NPCHandler.java within handleExamine method:

    Code:
    		if (player.isToggleDrops()) {
    			ViewNPCDrops.sendInterface(player, npc.getId());
    		}


    Spoiler for ButtonHandler.java replace interfaceId == 671 as is also used for Beast of burden:

    Code:
    		} else if (interfaceId == 671) {
    			if (player.getTemporaryAttributtes().get("drops") == Boolean.FALSE) {
    				if (player.getFamiliar() == null || player.getFamiliar().getBob() == null)
    					return;
    			}
    			if (componentId == 27) {
    				if (packetId == WorldPacketsDecoder.ACTION_BUTTON1_PACKET) {
    					
    					if (player.getTemporaryAttributtes().get("drops") != null) {
    						ViewNPCDrops.sendDropRateMessage(player, player.getNpcDrops().get(slotId), (int) player.getTemporaryAttributtes().get("drops"), slotId);
    					} else
    						player.getFamiliar().getBob().removeItem(slotId, 1);
    					
    					
    					
    					
    					
    				} else if (packetId == WorldPacketsDecoder.ACTION_BUTTON2_PACKET) {
    					
    					if (player.getTemporaryAttributtes().get("drops") != null) {
    						ViewNPCDrops.sendPriceCheckMessage(player, player.getNpcDrops().get(slotId));
    					} else
    						player.getFamiliar().getBob().removeItem(slotId, 5);
    					
    					
    					
    					
    					
    					
    				} else if (packetId == WorldPacketsDecoder.ACTION_BUTTON3_PACKET) {
    					
    					if (player.getTemporaryAttributtes().get("drops") != null) {
    						player.sendSimpleDialogue(ItemExamines.getExamine(player.getNpcDrops().get(slotId)));
    					} else 
    						player.getFamiliar().getBob().removeItem(slotId, 10);
    					
    					
    					
    					
    				} else if (packetId == WorldPacketsDecoder.ACTION_BUTTON4_PACKET)
    					player.getFamiliar().getBob().removeItem(slotId, Integer.MAX_VALUE);
    				else if (packetId == WorldPacketsDecoder.ACTION_BUTTON5_PACKET) {
    					player.getTemporaryAttributtes().put("bob_item_X_Slot", slotId);
    					player.getTemporaryAttributtes().put("bob_isRemove", Boolean.TRUE);
    					player.getPackets().sendRunScript(108, new Object[] { "Enter Amount:" });
    				}
    			} else if (componentId == 29) {
    				if (player.getTemporaryAttributtes().get("drops") != null) {
    					ViewNPCDrops.changeSortType(player, (int) player.getTemporaryAttributtes().get("drops"));
    				} else
    					player.getFamiliar().takeBob();
    			}


    Spoiler for Commands.java:
    Code:
    			case "drops":
    				player.setToggleDrops(!player.isToggleDrops());
    				player.out("You have " + (player.isToggleDrops() ? "enabled" : "disabled") + " right click examine to view NPC's drops.");
    				return true;






    The Interface can only display 32 items so this is why the sort function is powerful. Obviously I could have used the bank interface but personal opinion thinks this looks cleaner.

    I also realize things like this have been released, this is just my take on it.


    Attached image

    Attached image



    Reply With Quote  
     


  2. #2  
    Registered Member

    Join Date
    Oct 2011
    Posts
    2,084
    Thanks given
    0
    Thanks received
    1,043
    Rep Power
    3608
    neat snippet.
    Reply With Quote  
     

  3. Thankful user:


  4. #3  
    Howdy

    nMik's Avatar
    Join Date
    Nov 2010
    Posts
    1,060
    Thanks given
    144
    Thanks received
    147
    Rep Power
    107
    Not too bad, however, you can make a cleaner interface and then make it scroll-able based on the number of items that are in the monsters drop table. This route would make it more appealing overall.

    Reply With Quote  
     

  5. #4  
    Extreme Donator

    Unzy's Avatar
    Join Date
    Feb 2017
    Posts
    1,086
    Thanks given
    0
    Thanks received
    2,881
    Rep Power
    5000
    Nice work bro, looks good.
    Attached image
    Reply With Quote  
     

  6. #5  
    Extreme Donator

    Skrew's Avatar
    Join Date
    Jul 2011
    Posts
    894
    Thanks given
    166
    Thanks received
    121
    Rep Power
    122
    Anyone else having this issue?

    Code:
    java.lang.NullPointerException
    	at com.rs.game.entity.character.content.ViewNPCDrops.sendInterface(ViewNPCDrops.java:38)
    	at com.rs.network.decoders.handlers.NPCHandler.handleExamine(NPCHandler.java:64)
    	at com.rs.network.decoders.WorldPacketsDecoder.processPackets(WorldPacketsDecoder.java:1819)
    	at com.rs.network.decoders.WorldPacketsDecoder.decode(WorldPacketsDecoder.java:262)
    	at com.rs.network.ServerChannelHandler.messageReceived(ServerChannelHandler.java:116)
    	at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:100)
    	at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
    	at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
    	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
    	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
    	at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:351)
    	at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282)
    	at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202)
    	at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    	at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:44)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at java.lang.Thread.run(Unknown Source)
    Reply With Quote  
     

  7. #6  
    Discord Johnyblob22#7757


    Join Date
    Mar 2016
    Posts
    1,384
    Thanks given
    365
    Thanks received
    575
    Rep Power
    5000
    wow this is cool! hit me up if u want me to make a custom interface for u with it for free
    Attached image
    Reply With Quote  
     

  8. Thankful user:


  9. #7  
    Banned

    Join Date
    Jul 2011
    Posts
    1,767
    Thanks given
    493
    Thanks received
    425
    Rep Power
    0
    wow the legend Santa Hat, I remember when I started RSPS I always used ur code as an inspiration
    Reply With Quote  
     

  10. Thankful user:


  11. #8  
    Success is the worst teacher

    Santa Hat's Avatar
    Join Date
    Oct 2012
    Age
    27
    Posts
    3,334
    Thanks given
    807
    Thanks received
    1,185
    Rep Power
    190
    Quote Originally Posted by Juul View Post
    wow this is cool! hit me up if u want me to make a custom interface for u with it for free
    Feel free to make one for it and share it with the community


    Reply With Quote  
     

  12. #9  
    Registered Member
    Quavo's Avatar
    Join Date
    Mar 2018
    Posts
    255
    Thanks given
    54
    Thanks received
    156
    Rep Power
    2116
    Nice snippet

    Attached image
    Reply With Quote  
     

  13. Thankful user:


  14. #10  
    Registered Member
    Join Date
    Mar 2013
    Posts
    579
    Thanks given
    684
    Thanks received
    137
    Rep Power
    217
    do u have these btw getItemName and sendSimpleDialogue
    because these only two error i get
    Reply With Quote  
     

Page 1 of 3 123 LastLast

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 Item Drop Ratios...
    By thatsgodzkill in forum Help
    Replies: 3
    Last Post: 08-16-2011, 12:51 PM
  2. Npc doesnt drop item help?
    By BenjaminZz in forum Help
    Replies: 2
    Last Post: 04-26-2011, 03:22 AM
  3. [Emulous] - Npc Item Drops?
    By Guard1an in forum Help
    Replies: 3
    Last Post: 04-14-2009, 01:41 AM
  4. [REQUEST] Npc att and item drops.[REQUEST]
    By t3aowner in forum Requests
    Replies: 2
    Last Post: 10-13-2008, 09:16 PM
  5. Making stackable items drop in stacks from npcs
    By daniel89 in forum Tutorials
    Replies: 6
    Last Post: 10-07-2008, 07:55 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
  •