Thread: Teleporting Better[ANY]

Results 1 to 7 of 7
  1. #1 Teleporting Better[ANY] 
    Registered Member
    Join Date
    Apr 2012
    Posts
    83
    Thanks given
    79
    Thanks received
    52
    Rep Power
    30
    Features:
    - Enum based
    - Teleport data(int actionButton, int[][] runes, int levelRequired, int experience, int destX, int destY)
    - Anti-mass and uses cycle event handler
    - Contains all ancients and normal.

    TODO
    init method can be improved. This feature was for PI specifically. This is a bit old...

    Create a new class call it TeleportManager
    Code:
    package com.rs2.game.content.skills.magic;
    
    import com.rs2.game.Config;
    import com.rs2.game.event.CycleEvent;
    import com.rs2.game.event.CycleEventContainer;
    import com.rs2.game.event.CycleEventHandler;
    import com.rs2.game.model.Area;
    import com.rs2.game.model.Client;
    import com.rs2.util.Misc;
    
    
    public class TeleportManager{
    
        /*The teleport data*/
    private enum TeleportData {
    	PAD(50235, new int[][] {{563, 2}, {556, 1}, {554, 1}}, 54,80, 3098 + Misc.random(3), 9882),
    	SANT(50245, new int[][] {{563, 2}, {566, 1}, {-1, -1}}, 60,130, 3320, 3338),
    	KARRYL(50253, new int[][] {{563, 2}, {565, 1}, {-1, -1}}, 66,145, 3493, 3472),
    	LASSAR(51005, new int[][] {{563, 2}, {555, 4}, {-1, -1}}, 72,280, 3003, 3470), //works
    	DARYEEAK(51013, new int[][] {{563, 2}, {553, 3}, {556, 2}}, 78,380, 2966, 3696), //works
    	CARRAL(51023, new int[][] {{563, 2}, {566, 2}, {-1, -1}}, 84,480, 3163, 3664), //works
    	ANNAKARL(51021, new int[][] {{563, 2}, {565, 2}, {-1, -1}}, 90,580, 3287, 3883), //works
    
    	TROLL(29031, new int[][] {{554, 2}, {563, 2}, {-1, -1}}, 61,180, 3243 + Misc.random(4), 3513 + Misc.random(1)),
    	LUMBRIDGE(4143, new int[][] {{563, 1}, {556, 3}, {557, 1}}, 31,30, 3221 + Misc.random(4), 3222 + Misc.random(1)),
    	VARROCK(4140, new int[][] {{563, 1}, {556, 3}, {554, 1}}, 25,60, Config.VARROCK_X, Config.VARROCK_Y),
    	FALLY(4146, new int[][] {{563, 1}, {556, 3}, {555, 1}}, 37,60, Config.FALADOR_X, Config.FALADOR_Y),
    	CAMELOT(4150, new int[][] {{563, 1}, {556, 3}, {-1, -1}}, 45,60, Config.CAMELOT_X, Config.CAMELOT_Y),
    	ARDY(6004, new int[][] {{563, 2}, {555, 2}, {-1, -1}}, 51,60, Config.ARDOUGNE_X, Config.ARDOUGNE_Y),
    	WATCH(6005, new int[][] {{563, 2}, {557, 2}, {-1, -1}}, 58,60, Config.WATCHTOWER_X, Config.WATCHTOWER_Y);
    	private int actionButton, levelRequired, experience, destX, destY;
    	private int[][] runes;
    
    	/**
    	 * @return the actionButton
    	 */
    	public int getActionButton() {
    		return actionButton;
    	}
    
    	/**
    	 * @return the levelRequired
    	 */
    	public int getLevelRequired() {
    		return levelRequired;
    	}
    
    	/**
    	 * @return the experience
    	 */
    	public int getExperience() {
    		return experience;
    	}
    
    	/**
    	 * @return the destX
    	 */
    	public int getDestX() {
    		return destX;
    	}
    
    	/**
    	 * @return the destY
    	 */
    	public int getDestY() {
    		return destY;
    	}
    
    	TeleportData(int actionButton, int[][] runes, int levelRequired,
    	int experience, int destX, int destY) {
    		this.actionButton = actionButton;
    		this.runes = runes;
    		this.levelRequired = levelRequired;
    		this.experience = experience;
    		this.destX = destX;
    		this.destY = destY;
    
    	}
    
    	/**
    	 * @return the runes
    	 */
    	public int[][] getRunes() {
    		return runes;
    	}
    }
    
        
        private static int getDestX(Client c, int actionButton) {
    	int x = -1;
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		    for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[i][0],td.runes[i][1])){
    			    x=td.getDestX();
    			    return x;
    			    
    			}
    		    }
    		}
    	    }
    	}
    	return x;
        }
        
        /**
         * Get position X for teleport.
         * @param c client
         * @param actionButton button clicked
         * @return y
         */
        private static int getDestY(Client c, int actionButton) {
    	int y = -1;
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		    for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[i][0],td.runes[i][1])){
    			    y=td.getDestY();
    			    return y;
    			    
    			}
    		    }
    		}
    	    }
    	}
    	return y;
        }
        
        /**
         * Check if player has correct teleport requirements.
         * @param c client
         * @param actionButton button clicked
         * @return check
         */
        private static boolean hasRequirements(Client c, int actionButton){
    	boolean check=false;
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		   // for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[0][0],td.runes[0][1])
    				&&c.getItemContainer().playerHasItem(td.runes[1][0],td.runes[1][1])
    				&&c.getItemContainer().playerHasItem(td.runes[2][0],td.runes[2][1])){
    			    
    			    check=true;
    			    
    			}
    			else{
    			    c.getActionSender().sendMessage("You need the required runes to cast this spell.");
    			}
    			///else{
    			    
    			//}
    			
    		    //}
    		    c.getItemContainer().deleteItem2(td.runes[0][0],td.runes[0][1]);
    		    c.getItemContainer().deleteItem2(td.runes[1][0],td.runes[1][1]);
    		    c.getItemContainer().deleteItem2(td.runes[2][0],td.runes[2][1]);
    		   // return true;
    		}else if (c.playerLevel[c.playerMagic] < td.getLevelRequired()) {
    		   
    		    c.getActionSender().sendMessage("You need a magic level of "+td.getLevelRequired()+" to cast this spell.");
    		}
    		
    		else{
    		    
    		}
    		return check;
    	    }
    	}
    	return check;
        }
    
        /**
         * Start teleport.
         * @param c client
         * @param actionButton button clicked
         * @return false if NOT satisfying teleport data requirement
         */
        public static boolean init(final Client c, final int actionButton) {
            //check stuff before actually starting teleport...
    	if(c.isBusy() || c.getAttribute("teleporting")!=null){
    	    c.getActionSender().sendMessage("You are teleporting already.");
    	    return true;
    	}
    	if(c.wildLevel>25 && Area.getSingleton(c, c.absX, c.absY).inWild()){
    	    c.getActionSender().sendMessage("You cannot teleport above level 25 wilderness.");
    	    return true;
    	}
    	if(Area.getSingleton(c, c.absX, c.absY).inFightCaves()){
    	    c.getActionSender().sendMessage("Please leave the minigame from the exit.");
    	    return true;
    	}
    	if(!hasRequirements(c, actionButton)){
    	    //c.getActionSender().sendMessage("You do not have the correct requirements.");
    	    return true;
    	}
    	c.setBusy(true);//very simple way of anti-massing 
    	c.setAttribute("teleporting", 0);
    	CycleEventHandler.getSingleton().addEvent(c, new CycleEvent() {
    
    	    @Override
    	    public void execute(CycleEventContainer container) {
    		// TODO Auto-generated method stub
    		MagicTeleport.spellTeleport(c, getDestX(c,actionButton), getDestY(c,actionButton), 0);
    		container.stop();
    	    }
    
    	    @Override
    	    public void stop() {
    		// TODO Auto-generated method stub
    		
    	    }
    	    
    	},1);
    	
    	CycleEventHandler.getSingleton().addEvent(c, new CycleEvent() {
    
    	    @Override
    	    public void execute(CycleEventContainer container) {
    		// TODO Auto-generated method stub
                    //if(Server.debug){
    		//c.getActionSender().sendMessage("SERVER: PLAYER TELEPORTED SUCCESSFULLY.");	
                   // }
                    c.getActionSender().sendMessage("You teleported successfully.");
    		container.stop();
    	    }
    
    	    @Override
    	    public void stop() {
    		// TODO Auto-generated method stub
    		c.removeAttribute("teleporting");
    		c.setBusy(false);
    	    }
    	    
    	},7);
    	
    	return false;
        }
    
    }
    In action button packet, add this above the switch statement
    Code:
    if(TeleportManager.init(c, actionButtonId)){
    		    //hook
    		}
    Enjoyy
    Reply With Quote  
     

  2. Thankful user:


  3. #2  
    Registered Member

    Join Date
    Sep 2011
    Posts
    1,140
    Thanks given
    385
    Thanks received
    398
    Rep Power
    474
    You probably shouldn't do almost the same loops to get both the x and y. Get them at the same time to remove unnecessary code/overhead.
    Reply With Quote  
     

  4. #3  
    Banned
    Join Date
    Jan 2015
    Posts
    198
    Thanks given
    8
    Thanks received
    5
    Rep Power
    0
    Quote Originally Posted by Hybris View Post
    Features:
    - Enum based
    - Teleport data(int actionButton, int[][] runes, int levelRequired, int experience, int destX, int destY)
    - Anti-mass and uses cycle event handler
    - Contains all ancients and normal.

    TODO
    init method can be improved. This feature was for PI specifically. This is a bit old...

    Create a new class call it TeleportManager
    Code:
    package com.rs2.game.content.skills.magic;
    
    import com.rs2.game.Config;
    import com.rs2.game.event.CycleEvent;
    import com.rs2.game.event.CycleEventContainer;
    import com.rs2.game.event.CycleEventHandler;
    import com.rs2.game.model.Area;
    import com.rs2.game.model.Client;
    import com.rs2.util.Misc;
    
    
    public class TeleportManager{
    
        /*The teleport data*/
        private enum TeleportData {
    	PAD(50235, new int[][] { { 563, 2 }, { 556, 1}, { 554, 1 } }, 54,
    		80, 3098+Misc.random(3), 9882),
    		SANT(50245, new int[][] { { 563, 2 }, { 566, 1}, { -1, -1 } }, 60,
    			130, 3320, 3338),
    			KARRYL(50253, new int[][] { { 563, 2 }, { 565, 1}, { -1, -1 } }, 66,
    				145,3493, 3472),
    				LASSAR(51005, new int[][] { { 563, 2 }, { 555, 4}, { -1, -1 } }, 72,
    					280,3003, 3470),//works
    					DARYEEAK(51013, new int[][] { { 563, 2 }, { 553, 3}, { 556, 2 } }, 78,
    						380,2966, 3696),//works
    						CARRAL(51023, new int[][] { { 563, 2 }, { 566, 2}, { -1, -1 } }, 84,
    							480,3163, 3664),//works
    							ANNAKARL(51021, new int[][] { { 563, 2 }, { 565, 2}, { -1, -1 } }, 90,
    								580,3287, 3883),//works
    	
    	TROLL(29031, new int[][] { { 554, 2 }, { 563, 2 }, { -1, -1 } }, 61,
    		180, 3243 + Misc.random(4), 3513 + Misc.random(1)),
    	
    	LUMBRIDGE(4143, new int[][] { { 563, 1 }, { 556, 3 }, { 557, 1 } }, 31,
    		30, 3221 + Misc.random(4), 3222 + Misc.random(1)),
    		VARROCK(4140, new int[][] { { 563, 1 }, { 556, 3 }, { 554, 1 } }, 25,
    			60, Config.VARROCK_X,Config.VARROCK_Y),
    			FALLY(4146, new int[][] { { 563, 1 }, { 556, 3 }, { 555, 1 } }, 37,
    				60, Config.FALADOR_X,Config.FALADOR_Y),
    				CAMELOT(4150, new int[][] { { 563, 1 }, { 556, 3 }, { -1, -1 } }, 45,
    				60, Config.CAMELOT_X,Config.CAMELOT_Y),
    				ARDY(6004, new int[][] { { 563, 2 }, { 555, 2 }, { -1, -1 } }, 51,
    					60, Config.ARDOUGNE_X,Config.ARDOUGNE_Y),
    					WATCH(6005, new int[][] { { 563, 2 }, { 557, 2 }, { -1, -1 } }, 58,
    						60, Config.WATCHTOWER_X,Config.WATCHTOWER_Y);
    	private int actionButton, levelRequired, experience, destX, destY;
    	private int[][] runes;
    
    	/**
    	 * @return the actionButton
    	 */
    	public int getActionButton() {
    	    return actionButton;
    	}
    
    	/**
    	 * @return the levelRequired
    	 */
    	public int getLevelRequired() {
    	    return levelRequired;
    	}
    
    	/**
    	 * @return the experience
    	 */
    	public int getExperience() {
    	    return experience;
    	}
    
    	/**
    	 * @return the destX
    	 */
    	public int getDestX() {
    	    return destX;
    	}
    
    	/**
    	 * @return the destY
    	 */
    	public int getDestY() {
    	    return destY;
    	}
    
    	TeleportData(int actionButton, int[][] runes, int levelRequired,
    		int experience, int destX, int destY) {
    	    this.actionButton = actionButton;
    	    this.runes = runes;
    	    this.levelRequired = levelRequired;
    	    this.experience = experience;
    	    this.destX = destX;
    	    this.destY = destY;
    
    	}
    
    	/**
    	 * @return the runes
    	 */
    	public int[][] getRunes() {
    	    return runes;
    	}
        }
    
        
        private static int getDestX(Client c, int actionButton) {
    	int x = -1;
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		    for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[i][0],td.runes[i][1])){
    			    x=td.getDestX();
    			    return x;
    			    
    			}
    		    }
    		}
    	    }
    	}
    	return x;
        }
        
        /**
         * Get position X for teleport.
         * @param c client
         * @param actionButton button clicked
         * @return y
         */
        private static int getDestY(Client c, int actionButton) {
    	int y = -1;
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		    for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[i][0],td.runes[i][1])){
    			    y=td.getDestY();
    			    return y;
    			    
    			}
    		    }
    		}
    	    }
    	}
    	return y;
        }
        
        /**
         * Check if player has correct teleport requirements.
         * @param c client
         * @param actionButton button clicked
         * @return check
         */
        private static boolean hasRequirements(Client c, int actionButton){
    	boolean check=false;
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		   // for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[0][0],td.runes[0][1])
    				&&c.getItemContainer().playerHasItem(td.runes[1][0],td.runes[1][1])
    				&&c.getItemContainer().playerHasItem(td.runes[2][0],td.runes[2][1])){
    			    
    			    check=true;
    			    
    			}
    			else{
    			    c.getActionSender().sendMessage("You need the required runes to cast this spell.");
    			}
    			///else{
    			    
    			//}
    			
    		    //}
    		    c.getItemContainer().deleteItem2(td.runes[0][0],td.runes[0][1]);
    		    c.getItemContainer().deleteItem2(td.runes[1][0],td.runes[1][1]);
    		    c.getItemContainer().deleteItem2(td.runes[2][0],td.runes[2][1]);
    		   // return true;
    		}else if (c.playerLevel[c.playerMagic] < td.getLevelRequired()) {
    		   
    		    c.getActionSender().sendMessage("You need a magic level of "+td.getLevelRequired()+" to cast this spell.");
    		}
    		
    		else{
    		    
    		}
    		return check;
    	    }
    	}
    	return check;
        }
    
        /**
         * Start teleport.
         * @param c client
         * @param actionButton button clicked
         * @return false if NOT satisfying teleport data requirement
         */
        public static boolean init(final Client c, final int actionButton) {
            //check stuff before actually starting teleport...
    	if(c.isBusy() || c.getAttribute("teleporting")!=null){
    	    c.getActionSender().sendMessage("You are teleporting already.");
    	    return true;
    	}
    	if(c.wildLevel>25 && Area.getSingleton(c, c.absX, c.absY).inWild()){
    	    c.getActionSender().sendMessage("You cannot teleport above level 25 wilderness.");
    	    return true;
    	}
    	if(Area.getSingleton(c, c.absX, c.absY).inFightCaves()){
    	    c.getActionSender().sendMessage("Please leave the minigame from the exit.");
    	    return true;
    	}
    	if(!hasRequirements(c, actionButton)){
    	    //c.getActionSender().sendMessage("You do not have the correct requirements.");
    	    return true;
    	}
    	c.setBusy(true);//very simple way of anti-massing 
    	c.setAttribute("teleporting", 0);
    	CycleEventHandler.getSingleton().addEvent(c, new CycleEvent() {
    
    	    @Override
    	    public void execute(CycleEventContainer container) {
    		// TODO Auto-generated method stub
    		MagicTeleport.spellTeleport(c, getDestX(c,actionButton), getDestY(c,actionButton), 0);
    		container.stop();
    	    }
    
    	    @Override
    	    public void stop() {
    		// TODO Auto-generated method stub
    		
    	    }
    	    
    	},1);
    	
    	CycleEventHandler.getSingleton().addEvent(c, new CycleEvent() {
    
    	    @Override
    	    public void execute(CycleEventContainer container) {
    		// TODO Auto-generated method stub
                    //if(Server.debug){
    		//c.getActionSender().sendMessage("SERVER: PLAYER TELEPORTED SUCCESSFULLY.");	
                   // }
                    c.getActionSender().sendMessage("You teleported successfully.");
    		container.stop();
    	    }
    
    	    @Override
    	    public void stop() {
    		// TODO Auto-generated method stub
    		c.removeAttribute("teleporting");
    		c.setBusy(false);
    	    }
    	    
    	},7);
    	
    	return false;
        }
    
    }
    In action button packet, add this above the switch statement
    Code:
    if(TeleportManager.init(c, actionButtonId)){
    		    //hook
    		}
    Enjoyy
    thanks
    Reply With Quote  
     

  5. #4  
    Banned

    Join Date
    Mar 2010
    Posts
    2,218
    Thanks given
    170
    Thanks received
    262
    Rep Power
    0
    not bad, gj.
    Reply With Quote  
     

  6. #5  
    Donator


    Join Date
    Jul 2011
    Posts
    921
    Thanks given
    199
    Thanks received
    178
    Rep Power
    189
    Definitely better, gj
    Reply With Quote  
     

  7. #6  
    Registered Member

    Join Date
    Sep 2011
    Posts
    812
    Thanks given
    195
    Thanks received
    60
    Rep Power
    129
    should check if player has a staff equiped.

    Ot; looks real nice
    Reply With Quote  
     

  8. #7  
    Registered Member

    Join Date
    Feb 2012
    Posts
    901
    Thanks given
    96
    Thanks received
    480
    Rep Power
    654
    Not bad! As Omoshu points out, it's good practice to try and prevent unnecessary looping over your data (even though the enumeration isn't that large). Consider converting all those separate coordinate integers into a 'Location' or 'Position' class that encapsulates all three (X, Y and height) of them. It'll save you and ultimately the server a lot of work, once you're fully working with it. And it's a good way to practice your insights.

    As an example for your tutorial, your getDestX() and getDestY() methods could be merged into one. Suppose you have a Position class that contains X and Y coordinate variables and also the height level. If we then take your code, we replace the aforementioned methods as such (notice the highlighted parts):
    Code:
    private static Position getDestination(Client c, int actionButton) {
    	for (TeleportData td : TeleportData.values()) {
    	    if (actionButton == td.getActionButton()) {
    		if (c.playerLevel[c.playerMagic] >= td.getLevelRequired()) {
    		    for (int i=0; i < td.runes.length;i++){
    			if(c.getItemContainer().playerHasItem(td.runes[i][0],td.runes[i][1])){
    			    return td.getDestinationPosition(); // directly return position, without setting any variable
    			}
    		    }
    		}
    	    }
    	}
    	return null; // return null if no destination position could be found
        }
    Of course this is all just a tip, do with it as you please. But I hope you can use it to keep on improving your code!
    Chris Fletcher
    Economist & Hobbyist 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. Herblore Identifying (Better) [ANY]
    By Hybris in forum Snippets
    Replies: 3
    Last Post: 01-19-2013, 05:03 AM
  2. [DELTA] Better/new teleports.
    By wannabecoder :) in forum Snippets
    Replies: 12
    Last Post: 12-05-2010, 11:38 AM
  3. 377 - Is it better than 317 in ANY way?
    By Ecstasy in forum Help
    Replies: 7
    Last Post: 11-30-2009, 10:59 PM
  4. Deleting Teleport Ani?
    By Queer in forum Help
    Replies: 0
    Last Post: 10-14-2009, 08:39 PM
  5. Better way for Teleport Names
    By Roger in forum Tutorials
    Replies: 13
    Last Post: 11-14-2008, 08:30 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
  •