Thread: Slayer using enums crash

Results 1 to 4 of 4
  1. #1 Slayer using enums crash 
    Registered Member derpscape's Avatar
    Join Date
    Jul 2011
    Posts
    212
    Thanks given
    37
    Thanks received
    20
    Rep Power
    43
    I added this slayer system that uses enums and a npc that handles everything, and when one of my players clicks on the npc and chooses a task, the entire server crashes and about 15 seconds later returncode 5.

    This doesn't happen with all of my players, just one of them and it happens on all of his accounts.

    returncode 5: is basically saying the player is still on, which is something that happens AFTER THE CRASH, so if I am not mistaken it is irrelevant to this situation. I am assuming it is either something related to my way of handling this npc, or RSA in my RS2LoginProtocolDecoder.java

    Any help is greatly appreciated.

    Slayer.java
    [spoil]
    Code:
    /**
     * Slayer Class
     * @author Jili X I
     * @date 12/14/11 
     */
    
    package server.model.players.skills;
    
    import server.Config;
    import server.model.npcs.NPCHandler;
    import server.model.players.Client;
    import server.core.PlayerHandler;
    import server.util.Misc;
    
    public class Slayer {
    	
    	public static SlayerTask getEasyTask(Client c){
    		SlayerTask task = null;
    		do {
    			task = EasyTask.values()[(int)(Math.random()*EasyTask.values().length)];
    		} while(task.getReq() >= c.playerLevel[c.playerSlayer]);
    			String description = task.getDesc();
    			c.slayerTask = task.getId();
    			c.taskAmount = Misc.random(50) + 25;
    			c.sendMessage("You have been assigned to kill " + c.taskAmount + " " + description + ".");
    			return task;
    	}
    
    	public static SlayerTask getMediumTask(Client c) {
    		SlayerTask task = null;
    		do {
    			task = MediumTask.values()[(int)(Math.random()*MediumTask.values().length)];
    		} while(task.getReq() >= c.playerLevel[c.playerSlayer]);
    			String description = task.getDesc();
    			c.slayerTask = task.getId();
    			c.taskAmount = Misc.random(70) + 25;
    			c.sendMessage("You have been assigned to kill " + c.taskAmount + " " + description + ".");
    			return task;		
    	}
    	
    	public static SlayerTask getHardTask(Client c) {
    		SlayerTask task = null;
    		do {
    			task = HardTask.values()[(int)(Math.random()*HardTask.values().length)];
    		} while(task.getReq() >= c.playerLevel[c.playerSlayer]);
    			String description = task.getDesc();
    			c.slayerTask = task.getId();
    			c.taskAmount = Misc.random(90) + 25;
    			c.sendMessage("You have been assigned to kill " + c.taskAmount + " " + description + ".");
    			return task;			
    	}
    	
    	public boolean canSlay(Client c, int i) {
    		for(EasyTask e : EasyTask.values()) {
    			if(c.playerLevel[c.playerSlayer] < e.getReq() && NPCHandler.npcs[i].npcType == e.getId())
    				return false;
    		}
    		for(MediumTask m: MediumTask.values()) {
    			if(c.playerLevel[c.playerSlayer] < m.getReq() && NPCHandler.npcs[i].npcType == m.getId())
    				return false;
    		}
    		for(HardTask h: HardTask.values()) {
    			if(c.playerLevel[c.playerSlayer] < h.getReq() && NPCHandler.npcs[i].npcType == h.getId())
    				return false;
    		}
    		for(NonTask n: NonTask.values()) {
    			if(c.playerLevel[c.playerSlayer] < n.getReq() && NPCHandler.npcs[i].npcType == n.getId())
    				return false;
    		}
    		return true;
    	}
    	
    	public void appendSlayerExperience(int i) {
    		Client c = (Client)PlayerHandler.players[NPCHandler.npcs[i].killedBy];
    		if(c != null) {
    			if (c.slayerTask == NPCHandler.npcs[i].npcType){
    				c.taskAmount--;
    				c.getPA().addSkillXP(NPCHandler.npcs[i].MaxHP * Config.SLAYER_EXPERIENCE, c.playerSlayer);
    				if (c.taskAmount <= 0) {
    					c.getPA().addSkillXP((NPCHandler.npcs[i].MaxHP * 8) * Config.SLAYER_EXPERIENCE, c.playerSlayer);
    					c.slayerTask = -1;
    					c.sendMessage("You have completed your slayer task, please see the slayer master to get a new one.");
    				}
    			}
    		}
    	}
    	
    	interface SlayerTask {
    		public int getId();
    		public int getReq();
    		public String getDesc();
    	}
    
    	enum EasyTask implements SlayerTask {
    		YAK(5529, 1, "Yak's"),
    		GOBLIN(101, 1, "Goblin's"),
    		ROCK_CRAB(1265, 1, "Rock Crab's"),
    		AL_KHARID_WARRIOR(18, 1, "Al-Kharid Warrior's"),
    		CHAOS_DRUID(181, 1, "Chaos Druid's"),
    		GHOST(103, 1, "Ghost's"),
    		GIANT_BAT(78, 1, "Giant Bat's"),
    		HILL_GIANT(117, 1, "Hill Giants"),
    		CHAOS_DWARF(119, 1, "Chaos Dwarf's"),
    		CRAWLING_HAND(1648, 5, "Crawling hand's"),
    		BANSHEE(1612, 15, "Banshee's");
    		
    		private int id, req;
    		private String desc;
    		
    		EasyTask(int id, int req, String desc) {
    			this.id = id;
    			this.req = req;
    			this.desc = desc;
    		}
    
    		@Override
    		public int getId() {
    			return id;
    		}
    
    		@Override
    		public int getReq() {
    			return req;
    		}
    
    		@Override
    		public String getDesc() {
    			return desc;
    		}
    		
    		
    
    	}
    	
    	enum MediumTask implements SlayerTask {
    		MOSS_GIANT(112, 1, "Moss Giant's"),
    		ICE_WARRIOR(125, 1, "Ice Warrior's"),
    		BABY_BLUE_DRAGON(48, 1, "Baby Blue Dragon's"),
    		INFERNAL_MAGE(1643, 45, "Infernal Mage's"),
    		BLOODVELD(1618, 50, "Bloodveld's"),
    		GREEN_DRAGON(1610, 1, "Green Dragon's"),
    		LESSER_DEMON(82, 1, "Lesser Demon's"),
    		DAGANNOTH(1341, 1, "Dagannoth's");
    		
    		private int id, req;
    		private String desc;
    		
    		MediumTask(int id, int req, String desc) {
    			this.id = id;
    			this.req = req;
    			this.desc = desc;
    		}
    
    		@Override
    		public int getId() {
    			return id;
    		}
    
    		@Override
    		public int getReq() {
    			return req;
    		}
    
    		@Override
    		public String getDesc() {
    			return desc;
    		}
    	}
    	
    	enum HardTask implements SlayerTask {
    		DUST_DEVIL(1624, 65, "Dust Devil's"),
    		GARGOYLE(1610, 75, "Gargoyle's"),
    		NECHRYAEL(1613, 80, "Nechryael's"),
    		ABYSSAL_DEMON(1615, 85, "Abyssal Demon's"),
    		DARK_BEAST(2783, 90, "Dark Beast's"),
    		BLUE_DRAGON(55, 1, "Blue Dragon's"),
    		BLACK_DEMON(84, 1, "Black Demon's"),
    		HELL_HOUND(49, 1, "Hell Hound's");
    		
    		
    		private int id, req;
    		private String desc;
    		
    		HardTask(int id, int req, String desc) {
    			this.id = id;
    			this.req = req;
    			this.desc = desc;
    		}
    
    		@Override
    		public int getId() {
    			return id;
    		}
    
    		@Override
    		public int getReq() {
    			return req;
    		}
    
    		@Override
    		public String getDesc() {
    			return desc;
    		}
    	}
    	
    	enum NonTask implements SlayerTask {
    		ICE_STRYKEWYRM(9463, 93, "Ice Strykewyrm's"),
    		DESERT_STRYKEWYRM(9465, 77, "Desert Strykewyrm's"),
    		JUNGLE_STRYKEWYRM(9467, 73, "Jungle Strykewyrm's");
    		
    		private int id, req;
    		private String desc;
    		
    		NonTask(int id, int req, String desc) {
    			this.id = id;
    			this.req = req;
    			this.desc = desc;
    		}
    
    		@Override
    		public int getId() {
    			return id;
    		}
    
    		@Override
    		public int getReq() {
    			return req;
    		}
    
    		@Override
    		public String getDesc() {
    			return desc;
    		}
    	}
    	
    }
    [/spoil]

    Actionhandler.java
    [spoil]
    Code:
    case 1597:
    			if (c.slayerTask <= 0) {
    				c.getDH().sendDialogues(11, i);
    			} else {
    				c.getDH().sendDialogues(13, i);
    			}
    			break;
    [/spoil]

    DialogueHandler.java
    [spoil]
    Code:
    case 11:
    			sendNpcChat4(
    					"Hello!",
    					"My name is Vannaka and I am a master of the slayer skill.",
    					"I can assign you different types of slayer tasks.",
    					"If you are interested, please chose a difficulty.", c.talkingNpc, "Vannaka");
    			c.nextChat = 12;
    			break;
    		case 12:
    			sendOption3("Easy task",
    					"Medium task", "Hard task");
    			break;
    		case 13:
    			sendNpcChat4(
    					"Hello!",
    					"My name is Vannaka and I am a master of the slayer skill.",
    					"I see I have already assigned you a task to complete.",
    					"Would you like to cancel this task?",
    					c.talkingNpc, "Vannaka");
    			c.nextChat = 14;
    			break;
    		case 14:
    			sendOption2("Yes I would like to cancel this task.",
    					"No I would like to keep my task.");
    			c.dialogueAction = 33;
    			c.sendMessage("You cancel your slayer task.");
    			c.sendMessage("Talk to Vannaka if you would like a new task.");
    			break;
    [/spoil]

    ClickingButtons.java
    [spoil]
    Code:
    case 9167:
    			Slayer.getEasyTask(c);
    			c.dialogueAction = 0;
    			c.getPA().removeAllWindows();
    			break;
    		case 9168:
    			Slayer.getMediumTask(c);
    			c.dialogueAction = 0;
    			c.getPA().removeAllWindows();
    			break;
    		case 9169:
    			Slayer.getHardTask(c);
    			c.dialogueAction = 0;
    			c.getPA().removeAllWindows();
    			break;
    and
    Code:
    } else if (c.dialogueAction == 33) {
    				c.slayerTask = 0;
    				c.taskAmount = 0;
    under case 9157
    [/spoil]

    RS2LoginProtocolDecoder.java
    [spoil][code]
    package server.net.login;

    import java.math.BigInteger;
    import java.security.SecureRandom;

    import org.jboss.netty.buffer.ChannelBuffer;
    import org.jboss.netty.buffer.ChannelBuffers;
    import org.jboss.netty.channel.Channel;
    import org.jboss.netty.channel.ChannelFuture;
    import org.jboss.netty.channel.ChannelFutureListener;
    import org.jboss.netty.channel.ChannelHandlerContext;
    import org.jboss.netty.handler.codec.frame.FrameDecoder;

    import server.Config;
    import server.Connection;
    import server.Server;
    import server.model.players.Client;
    import server.core.PlayerHandler;
    import server.model.players.PlayerSave;
    import server.net.PacketBuilder;
    import server.util.ISAACCipher;
    import server.util.Misc;

    public class RS2LoginProtocolDecoder extends FrameDecoder {

    //generate your own keys.
    private static final BigInteger RSA_MODULUS = new BigInteger("REMOVED FOR RUNE-SERVER CODE SHOWING");

    private static final BigInteger RSA_EXPONENT = new BigInteger("REMOVED FOR RUNE-SERVER CODE SHOWING");



    private static final int CONNECTED = 0;
    private static final int LOGGING_IN = 1;
    private int state = CONNECTED;

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
    if(!channel.isConnected()) {
    return null;
    }
    switch (state) {
    case CONNECTED:
    if (buffer.readableBytes() < 2)
    return null;
    int request = buffer.readUnsignedByte();
    if (request != 14) {
    System.out.println("Invalid login request: " + request);
    channel.close();
    return null;
    }
    buffer.readUnsignedByte();
    channel.write(new PacketBuilder().putLong(0).put((byte) 0).putLong(new SecureRandom().nextLong()).toPacket());
    state = LOGGING_IN;
    return null;
    case LOGGING_IN:
    @SuppressWarnings("unused")
    int loginType = -1, loginPacketSize = -1, loginEncryptPacketSize = -1;
    if(2 <= buffer.capacity()) {
    loginType = buffer.readByte() & 0xff; //should be 16 or 18
    loginPacketSize = buffer.readByte() & 0xff;
    loginEncryptPacketSize = loginPacketSize-(36+1+1+2);
    if(loginPacketSize <= 0 || loginEncryptPacketSize <= 0) {
    System.out.println("Zero or negative login size.");
    channel.close();
    return false;
    }
    }

    /**
    * Read the magic id.
    */
    if(loginPacketSize <= buffer.capacity()) {
    int magic = buffer.readByte() & 0xff;
    int version = buffer.readUnsignedShort();
    if(magic != 255) {
    System.out.println("Wrong magic id.");
    channel.close();
    return false;
    }
    if(version != 1) {
    //Dont Add Anything
    }
    @SuppressWarnings("unused")
    int lowMem = buffer.readByte() & 0xff;

    /**
    * Pass the CRC keys.
    */
    for(int i = 0; i < 9; i++) {
    buffer.readInt();
    }
    loginEncryptPacketSize--;
    if(loginEncryptPacketSize != (buffer.readByte() & 0xff)) {
    System.out.println("Encrypted size mismatch.");
    channel.close();
    return false;
    }

    /**
    * Our RSA components.
    */
    ChannelBuffer rsaBuffer = buffer.readBytes(loginEncryptPacketSize);

    BigInteger bigInteger = new BigInteger(rsaBuffer.array());
    bigInteger = bigInteger.modPow(RSA_EXPONENT, RSA_MODULUS);
    rsaBuffer = ChannelBuffers.wrappedBuffer(bigInteger.toByteArra y());
    if((rsaBuffer.readByte() & 0xff) != 10) {
    System.out.println("Encrypted id != 10.");
    channel.close();
    return false;
    }
    final long clientHalf = rsaBuffer.readLong();
    final long serverHalf = rsaBuffer.readLong();

    int uid = rsaBuffer.readInt();

    if(uid == 0 || uid == 99735086) {
    channel.close();
    return false;
    }
    final String name = Misc.formatPlayerName(Misc.getRS2String(rsaBuffer) );
    final String pass = Misc.getRS2String(rsaBuffer);

    final int[] isaacSeed = { (int) (clientHalf >> 32), (int) clientHalf, (int) (serverHalf >> 32), (int) serverHalf };
    final ISAACCipher inCipher = new ISAACCipher(isaacSeed);
    for (int i = 0; i < isaacSeed.length; i++)
    isaacSeed[i] += 50;
    final ISAACCipher outCipher = new ISAACCipher(isaacSeed);
    //final int version = buffer.readInt();
    channel.getPipeline().replace("decoder", "decoder", new RS2ProtocolDecoder(inCipher));
    return login(channel, inCipher, outCipher, version, name, pass);
    }
    }
    return null;

    }

    private static Client login(Channel channel, ISAACCipher inCipher, ISAACCipher outCipher, int version, String name, String pass) {
    int returnCode = 2;
    if (!name.matches("[A-Za-z0-9 ]+")) {
    returnCode = 4;
    }
    if (name.length() > 12) {
    returnCode = 8;
    }
    Client cl = new Client(channel, -1);
    cl.playerName = name;
    cl.playerName2 = cl.playerName;
    cl.playerPass = pass;
    cl.outStream.packetEncryption = outCipher;
    cl.saveCharacter = false;
    cl.isActive = true;
    if (Connection.isNamedBanned(cl.playerName)) {
    returnCode = 4;
    }
    if (PlayerHandler.isPlayerOn(name)) {
    returnCode = 5;
    }
    if (PlayerHandler.getPlayerCount() >= Config.MAX_PLAYERS) {
    returnCode = 7;
    }
    if (Server.UpdateServer) {
    returnCode = 14;
    }
    if (returnCode == 2) {
    int load = PlayerSave.loadGame(cl, cl.playerName, cl.playerPass);
    if (load == 0)
    cl.addStarter = true;
    if (load == 3) {
    returnCode = 3;
    cl.saveFile = false;
    } else {
    for (int i = 0; i < cl.playerEquipment.length; i++) {
    if (cl.playerEquipment[i] == 0) {
    cl.playerEquipment[i] = -1;
    cl.playerEquipmentN[i] = 0;
    }
    }
    if (!Server.playerHandler.newPlayerClient(cl)) {
    returnCode = 7;
    cl.saveFile = false;
    } else {
    cl.saveFile = true;
    }
    }
    }
    if(returnCode == 2) {
    cl.saveCharacter = true;
    cl.packetType = -1;
    cl.packetSize = 0;
    final PacketBuilder bldr = new PacketBuilder();
    bldr.put((byte) 2);
    if (cl.playerRights == 3) {
    bldr.put((byte) 2);
    } else {
    bldr.put((byte) cl.playerRights);
    }
    bldr.put((byte) 0);
    channel.write(bldr.toPacket());
    } else {
    System.out.println("returncode:" + returnCode);
    sendReturnCode(channel, returnCode);
    return null;
    }
    synchronized (PlayerHandler.lock) {
    cl.initialize();
    cl.initialized = true;
    }
    return cl;
    }

    public static void sendReturnCode(final Channel channel, final int code) {
    channel.write(new PacketBuilder().put((byte) code).toPacket()).addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(final ChannelFuture arg0) throws Exception {
    arg0.getChannel().close();
    }
    });
    }

    }[code][/spoil]
    Reply With Quote  
     

  2. #2  
    Registered Member derpscape's Avatar
    Join Date
    Jul 2011
    Posts
    212
    Thanks given
    37
    Thanks received
    20
    Rep Power
    43
    bump
    Reply With Quote  
     

  3. #3  
    Registered Member derpscape's Avatar
    Join Date
    Jul 2011
    Posts
    212
    Thanks given
    37
    Thanks received
    20
    Rep Power
    43
    bump
    Reply With Quote  
     

  4. #4  
    Registered Member Emre's Avatar
    Join Date
    Jan 2014
    Posts
    596
    Thanks given
    91
    Thanks received
    61
    Rep Power
    7
    Using enums doesn't mean it's good

    Just make your own slayer
    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. Replies: 0
    Last Post: 03-30-2014, 07:55 AM
  2. Any client I use randomly crashes
    By Noobface128 in forum Help
    Replies: 5
    Last Post: 12-18-2010, 05:57 AM
  3. Teleporting using Enums
    By Ho H0 Ho in forum Configuration
    Replies: 8
    Last Post: 11-11-2010, 01:05 AM
  4. Proper use of enums
    By WH:II:DOW in forum Tutorials
    Replies: 9
    Last Post: 01-22-2010, 11:08 PM
  5. How do I raise max combat level using slayer ?
    By junior rider in forum Help
    Replies: 1
    Last Post: 03-08-2009, 08:33 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
  •