Thread: RSPS Library

Page 4 of 8 FirstFirst ... 23456 ... LastLast
Results 31 to 40 of 73
  1. #31  
    Registered Member
    Tyluur's Avatar
    Join Date
    Jun 2010
    Age
    26
    Posts
    5,103
    Thanks given
    1,818
    Thanks received
    1,767
    Rep Power
    2438
    Quote Originally Posted by Cjay0091 View Post
    I disagree, the developers should have a revision in mind that they should target. Yes the cache has changed drastically, but more or less almost all the information is the same and relevant to development. The transition from revision to revision shouldn't be as much of a hassle as it is and yet people still want to do things the hard way. I can update my server simply by changing the cache, updating all network related info, and running a tool that updates all widget data for me. Works flawlessly. And that's how it should be. The best part is that it's easy it just requires a bit of digging. I (mostly) don't even use itemIDs anymore (not available for 667-) but you get the gist.
    I believe information like that would be more useful if you didn't keep tools like that private. Developers have a tendency of holding those types of things to themselves (but I don't blame you, the community here doesn't give you much of a reason to share it with anyone else). If there was a bridge between the constant cache changes to a format that would be readable amongst ANY server base it would definitely be used by members of this community who do have the experience to use it.

    The tool I'm speaking about btw is this
    , and running a tool that updates all widget data for me.
    more information about this would be appreciated.
    Quote Originally Posted by blakeman8192 View Post
    Keep trying. Quitting is the only true failure.
    Spoiler for skrrrrr:

    Attached image
    Reply With Quote  
     

  2. Thankful user:


  3. #32  
    Contributor

    clem585's Avatar
    Join Date
    Sep 2013
    Posts
    3,788
    Thanks given
    706
    Thanks received
    702
    Rep Power
    570
    Quote Originally Posted by Tyluur View Post
    I believe information like that would be more useful if you didn't keep tools like that private. Developers have a tendency of holding those types of things to themselves (but I don't blame you, the community here doesn't give you much of a reason to share it with anyone else). If there was a bridge between the constant cache changes to a format that would be readable amongst ANY server base it would definitely be used by members of this community who do have the experience to use it.

    The tool I'm speaking about btw is this


    more information about this would be appreciated.
    From what he's said on discord, I think he's reworking interfaces to load their component ids from enums instead of just writing down the ids manually. He also plans on releasing that info publicly at some point apparently.

    Here's what he posted:

    Quote Originally Posted by Cjay0091 View Post
    Spoiler for Code that uses Cache.:
    Code:
     package com.rs.game.player;
    
    import java.io.Serializable;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.function.Predicate;
    
    import com.rs.fs.defs.EnumDef;
    import com.rs.game.item.Item;
    
    public class ToolBelt implements Serializable {
    
    	private static final long serialVersionUID = 8785635409322322662L;
    
    	public static final int TOOLBELT_INTERFACE = 1178;
    	public static final byte GENERAL = 1, FISHING = 2, CRAFTING = 3, FARMING = 4, SLAYER = 5, INVENTION = 6, DUNGEONEERING = 11, KEYS = 12;
    
    	private static final EnumDef GILDED_PICK_ENUM, REGULAR_PICK_ENUM, HATCHET_ENUM, MACHETE_ENUM, GENERAL_ENUM;
    	private static final EnumDef FISHING_ENUM, CRAFTING_ENUM, FARMING_ENUM, SLAYER_ENUM;
    	private static final EnumDef DUNGEONEERING_PICKAXES, DUNGEONEERING_HATCHETS, DUNGEONEERING_ENUM, KEYS_ENUM;
    	private static final int INVENTION_LENGTH;
    	
    	private static final int CATEGORY_CS_VAR = 1725, SLOT_CS_VAR = 1724;
    	private static final int[] CATEGORY_LENGTHS;
    
    	static {
    		//				General Tools
    		GILDED_PICK_ENUM = EnumDef.get(7505); REGULAR_PICK_ENUM = EnumDef.get(7501);
    		HATCHET_ENUM = EnumDef.get(7503);
    		MACHETE_ENUM = EnumDef.get(10040);
    		GENERAL_ENUM = EnumDef.get(5350);
    
    		// 				Specified Skilling Tools
    		FISHING_ENUM = EnumDef.get(5353);
    		CRAFTING_ENUM = EnumDef.get(5356);
    		FARMING_ENUM = EnumDef.get(5359);
    		SLAYER_ENUM = EnumDef.get(10085);
    		INVENTION_LENGTH = 3;
    
    		//				Dungeoneering Tools
    		DUNGEONEERING_PICKAXES = EnumDef.get(5732);
    		DUNGEONEERING_HATCHETS = EnumDef.get(5733);
    		DUNGEONEERING_ENUM = EnumDef.get(5731);
    		KEYS_ENUM = EnumDef.get(5734);
    		
    		CATEGORY_LENGTHS = new int[] { GENERAL_ENUM.getSize() + 3, FISHING_ENUM.getSize(), CRAFTING_ENUM.getSize(), FARMING_ENUM.getSize(), SLAYER_ENUM.getSize(), INVENTION_LENGTH, DUNGEONEERING_ENUM.getSize() + 2,
    				KEYS_ENUM.getSize() };
    	}
    
    	private transient Player player;
    	private Map<Byte, Integer[]> tools;
    	
    
    	public ToolBelt() {
    		tools = new HashMap<>();
    		
    		for (byte category = INVENTION; category >= GENERAL; category--)
    			tools.put(category, new Integer[CATEGORY_LENGTHS[category]]);
    		tools.put(DUNGEONEERING, new Integer[CATEGORY_LENGTHS[INVENTION]]);
    		tools.put(KEYS, new Integer[CATEGORY_LENGTHS[INVENTION + 1]]);
    		
    		Integer[] belt = tools.get(INVENTION);	
    		belt[1] = 36367; belt[2] = 36368; belt[3] = 36389;
    	}
    
    	public void setPlayer(Player player) {
    		this.player = player;
    	}
    
    	public void init() {
    		refreshAll();
    	}
    
    	public void open(byte category) {
    		setCategory(category);
    		refreshCategory(category);
    		
    		player.getInterfaceManager().sendCentralInterface(TOOLBELT_INTERFACE);
    		/*player.setCloseInterfacesEvent(()-> {
    			setCategory(category);
    			setSlot();
    		});*/
    	}
    
    	private void setCategory(byte category) {
    		player.getPackets().sendCSVarInteger(CATEGORY_CS_VAR, category);
    	}
    	
    	private void setSlot() {
    		player.getPackets().sendCSVarInteger(SLOT_CS_VAR, -1);
    	}
    	
    	private void refreshAll(byte end, byte start) {
    		for (byte category = end; category >= start; category--)
    			refreshCategory(category);
    	}
    	
    	private void refreshCategory(byte category) {
    		Integer[] available = tools.get(category);
    		for (int slot = available.length - 1; slot >= 0; slot--) {
    			Integer entry = available[slot];
    			if (entry == null)
    				continue;
    			refresh(category, entry, slot);
    		}
    	}
    	
    	private void refresh(byte category, int entry, int slot) {
    		EnumDef def = getCategoryEnum(category, slot);
    		boolean multiMap = isMultiDef(def);
    		
    		int value = category == INVENTION ? 1 : multiMap ? (int) (def.getKeyForValue(entry)) : 1;
    		if (category == KEYS) {
    			player.getVarsManager().sendVar(getVar(category, slot), value);
    			return;
    		}
    		player.getVarsManager().sendVarBit(getVarBit(category, slot), value);
    		if (multiMap)
    			player.getVarsManager().sendVarBit(getSecondaryVarBit(category, slot), 1);
    	}
    
    	private static int getSecondaryVarBit(byte category, int slot) {
    		switch(category) {
    			case GENERAL:
    				if (slot == 1)
    					return 2983;
    				else if (slot == 4)
    					return 2985;
    				else if (slot == 9)
    					return 3002;
    				break;
    			case DUNGEONEERING:
    				return -1;
    		}
    		throw new IllegalStateException();
    	}
    
    	private void refreshAll() {
    		refreshAll(INVENTION, GENERAL);
    	}
    
    	public boolean addItem(int slot, Item item) {
    		byte category = getCategory(item.getId());
    		if (category == -1)
    			return false;
    
    		Integer[] belt = tools.get(category);
    		int current = (int) getSlotForId(category, item.getId());
    		
    		Integer entry = belt[current];
    		if (entry != null && entry >= item.getId()) {
    			player.getPackets().sendInterfaceMessage(RealInventory.INVENTORY_INTERFACE, 8, 0, slot, "That is already on your tool belt.");
    			return false;
    		}
    		
    		refresh(category, belt[current] = item.getId(), current);
    		
    		player.getRealInventory().remove(item.getId(), item.getAmount(), slot);
    		player.getPackets().sendGameMessage("You add the " + item.getDefs().getName() + " to your tool belt.");
    		return false;
    	}
    
    	public boolean containsTool(int id) {
    		return search(id, category-> {
    			Integer[] active = tools.get(category);
    			for (int index = active.length - 1; index >= 0; index--) {
    				Integer entry = active[index];
    				if (entry == null || entry != id)
    					continue;
    				return true;
    			}
    			return false;
    		});
    	}
    	
    	public boolean isTool(int id) {
    		return search(id, category-> getSlotForId(category, id) != -1);
    	}
    	
    	private boolean search(int id, Predicate<Byte> predicate) {
    		boolean inDung = player.getDungManager().isInside();
    		for (byte category = inDung ? KEYS : INVENTION; category >= (inDung ? DUNGEONEERING : GENERAL); category--) {
    			if (predicate.test(category))
    				return true;
    		}
    		return false;
    	}
    	
    	private byte getCategory(int id) {
    		boolean inDung = player.getDungManager().isInside();
    		for (byte category = inDung ? KEYS : INVENTION; category >= (inDung ? DUNGEONEERING : GENERAL); category--) {
    			if (getSlotForId(category, id) != -1)
    				return category;
    		}
    		return -1;
    	}
    	
    	private static long getSlotForId(byte category, int id) {
    		switch(category) {
    			case GENERAL:
    				long slot = GENERAL_ENUM.getKeyForValue(id);
    				if (slot == -1) {
    					if (REGULAR_PICK_ENUM.getKeyForValue(id) != -1 || GILDED_PICK_ENUM.getKeyForValue(id) != -1) return 1;
    					else if (HATCHET_ENUM.getKeyForValue(id) != -1) return 4;
    					else if (MACHETE_ENUM.getKeyForValue(id) != -1) 	return 9;
    				}
    				return slot;
    			case CRAFTING:
    				return CRAFTING_ENUM.getKeyForValue(id);
    			case FARMING:
    				return FARMING_ENUM.getKeyForValue(id);
    			case FISHING:
    				return FISHING_ENUM.getKeyForValue(id);
    			case SLAYER:
    				return SLAYER_ENUM.getKeyForValue(id);
    			case INVENTION:
    				if (id == 36367 || id == 36368)
    					return 1;
    				else if (id == 36389)
    					return 2;
    			case DUNGEONEERING:
    				slot = DUNGEONEERING_ENUM.getKeyForValue(id);
    				if (slot == -1) {
    					if (DUNGEONEERING_PICKAXES.getKeyForValue(id) != -1) return 1;
    					else if (DUNGEONEERING_HATCHETS.getKeyForValue(id) != -1) return 2;
    				}
    				return slot;
    			case KEYS:
    				return KEYS_ENUM.getKeyForValue(id);
    		}
    		throw new IllegalArgumentException("Illegal element: " + category);
    	}
    	
    	private static boolean isMultiDef(EnumDef def) {
    		if (def == null)
    			return false;
    		return def.equals(REGULAR_PICK_ENUM) || def.equals(GILDED_PICK_ENUM) || def.equals(HATCHET_ENUM) || def.equals(MACHETE_ENUM) || def.equals(DUNGEONEERING_HATCHETS)
    				|| def.equals(DUNGEONEERING_PICKAXES);
    	}
    
    	private static EnumDef getCategoryEnum(byte category, int slot) {
    		switch (category) {
    			case GENERAL:
    				if (slot == 1) return REGULAR_PICK_ENUM;
    				else if (slot == 4) return HATCHET_ENUM;
    				else if (slot == 9) return MACHETE_ENUM;
    				return GENERAL_ENUM;
    			case CRAFTING:
    				return CRAFTING_ENUM;
    			case FARMING:
    				return FARMING_ENUM;
    			case FISHING:
    				return FISHING_ENUM;
    			case SLAYER:
    				return SLAYER_ENUM;
    			case INVENTION:
    				return null;
    			case DUNGEONEERING:
    				if (slot == 1)return DUNGEONEERING_PICKAXES;
    				else if (slot == 2)
    					return DUNGEONEERING_HATCHETS;
    				return DUNGEONEERING_ENUM;
    			case KEYS:
    				return KEYS_ENUM;
    		}
    		throw new IllegalArgumentException("Illegal element: " + category);
    	}
    
    	private static int getVarBit(byte category, int slot) {
    		if (category == GENERAL) {
    			switch (slot) {
    				case 1: return 18521;
    				case 2: return 2984;
    				case 3: return 2971;
    				case 4:return 18522;
    				case 5:return 2968;
    				case 6:return 2986;
    				case 7:return 2988;
    				case 8:return 2999;
    				case 9:return 4935;
    				case 10:return 3004;
    				case 11:return 3005;
    				case 12:return 2969;
    				case 13:return 3007;
    				case 14:return 685;
    				case 15:return 28410;
    			}
    		} else if (category == FISHING) {
    			switch (slot) {
    				case 1:return 2978;
    				case 2:return 2977;
    				case 3:return 2982;
    				case 4:return 3001;
    				case 5:return 2979;
    				case 6:return 2980;
    				case 7:return 2981;
    				case 8:return 3003;
    			}
    		} else if (category == CRAFTING) {
    			switch (slot) {
    				case 1:return 2974;
    				case 2:return 2992;
    				case 3:return 2970;
    				case 4:return 2991;
    				case 5:return 2973;
    				case 6:return 2975;
    				case 7:return 2976;
    				case 8:return 2989;
    				case 9:return 2990;
    				case 10:return 2972;
    				case 11:return 2994;
    				case 12:return 2993;
    				case 13:return 3006;
    			}
    		} else if (category == FARMING) {
    			switch (slot) {
    				case 1:return 2997;
    				case 2:return 2995;
    				case 3:return 3000;
    				case 4:return 2996;
    
    				case 5:return 27430;
    				case 6:return 27431;
    			}
    		} else if (category == SLAYER) {
    			switch (slot) {
    				case 1:return 28219;
    				case 2:return 28220;
    				case 3:return 28221;
    				case 4:return 28222;
    				case 5:return 28225;
    				case 6:return 28223;
    				case 7:return 28224;
    				case 8:return 28230;
    				case 9:return 28226;
    				case 10:return 28227;
    				case 11:return 28228;
    				case 12:return 28229;
    
    			}
    		} else if (category == INVENTION) {
    			switch(slot) {
    				case 1:
    				case 2:return 30224;
    				case 3:return 30225;
    			}
    		} else if (category == DUNGEONEERING) {
    			switch (slot) {
    				case 1:return 3008;
    				case 2:return 3009;
    				case 3:return 3013;
    				case 4:return 3010;
    				case 5:return 3015;
    				case 6:return 3012;
    				case 7:return 3014;
    				case 8:return 3011;
    			}
    		}
    		throw new IllegalArgumentException("Invalid category-slot combo: " + category + ", " + slot + ".");
    	}
    	
    	private static int getVar(byte category, int slot) {
    		switch (slot) {
    			case 1:return 1812;
    			case 2:return 1813;
    			case 3:return 1814;
    			case 4:return 1815;
    			case 5:return 1816;
    			case 6:return 1817;
    			case 7:return 1818;
    			case 8:return 1819;
    			case 9:return 1820;
    			case 10:return 1821;
    			case 11:return 1822;
    			case 12:return 1823;
    			case 13:return 1824;
    			case 14:return 1825;
    			case 15:return 1826;
    			case 16:return 1827;
    			case 17:return 1828;
    			case 18:return 1829;
    			case 19:return 1830;
    			case 20:return 1831;
    			case 21:return 1832;
    			case 22:return 1833;
    			case 23:return 1834;
    			case 24:return 1835;
    			case 25:return 1836;
    			case 26:return 1837;
    			case 27:return 1838;
    			case 28:return 1839;
    			case 29:return 1840;
    			case 30:return 1841;
    			case 31:return 1842;
    			case 32:return 1843;
    			case 33:return 1844;
    			case 34:return 1845;
    			case 35:return 1846;
    			case 36:return 1847;
    			case 37:return 1848;
    			case 38:return 1849;
    			case 39:return 1850;
    			case 40:return 1851;
    			case 41:return 1852;
    			case 42:return 1853;
    			case 43:return 1854;
    			case 44:return 1855;
    			case 45:return 1856;
    			case 46:return 1857;
    			case 47:return 1858;
    			case 48:return 1859;
    			case 49:return 1860;
    			case 50:return 1861;
    			case 51:return 1862;
    			case 52:return 1863;
    			case 53:return 1864;
    			case 54:return 1865;
    			case 55:return 1866;
    			case 56:return 1867;
    			case 57:return 1868;
    			case 58:return 1869;
    			case 59:return 1870;
    			case 60:return 1871;
    			case 61:return 1872;
    			case 62:return 1873;
    			case 63:return 1874;
    			case 64:return 1875;
    		}
    		throw new IllegalArgumentException("Missing var for slot: "+slot);
    	}
    }
    Project thread
    Reply With Quote  
     

  4. #33  
    Registered Member
    Tyluur's Avatar
    Join Date
    Jun 2010
    Age
    26
    Posts
    5,103
    Thanks given
    1,818
    Thanks received
    1,767
    Rep Power
    2438
    any update on this?
    Quote Originally Posted by blakeman8192 View Post
    Keep trying. Quitting is the only true failure.
    Spoiler for skrrrrr:

    Attached image
    Reply With Quote  
     

  5. #34  
    Registered Member
    Join Date
    May 2017
    Posts
    124
    Thanks given
    41
    Thanks received
    43
    Rep Power
    56
    Quote Originally Posted by Tyluur View Post
    any update on this?
    Well, I've run into some problems relating to networking. I'm trying to thoroughly look through the client to determine what variables are what and how to properly use them. I very much dislike having little knowledge already and don't want to continue without obtaining more.

    I'm very much enjoying this project and I've also got 12 hour shifts 6 days a week, so I'm getting done what I can
    Reply With Quote  
     

  6. #35  
    Registered Member
    Join Date
    May 2017
    Posts
    124
    Thanks given
    41
    Thanks received
    43
    Rep Power
    56
    The configuration implementation has some small changes done to it. Sections within a Configuration class are like different "definitions" (what people here call them). Let's say you have an ItemConfiguration class with different item sections and you want to retrieve the value of an Armadyl Godsword. You would call retrieveData("11694", "value", Integer.class), and it would return the value, if specified.

    Each item SHOULD be stored as a separate section because that was the plan for flexibility with objects, npcs, and items, and any other data you are wanting to store.

    Here is an example of how you should store items within a Configuration:
    Code:
    		Configuration item_config = ConfigurationBuilder
    				.startBuilding()
    				.section("11694")
    					.add("name", "Armadyl Godsword")
    					.add("value", 1250000)
    					.add("high_alch", 120000)
    					.add("examine", "A beautiful godsword")
    				.section("11732")
    					.add("name", "Dragon Boots")
    					.add("value", 100000)
    					.add("high_alch", 20000)
    					.add("examine", "Some dragon boots")
    				.type(ConfigType.YAML)
    				.build();
    Here is an example of how to retrieve all of that information in the Configuration:
    Code:
    		item_config.retrieveData("11694", "name", String.class);
    		item_config.retrieveData("11694", "value", Integer.class);
    		item_config.retrieveData("11694", "high_alch", Integer.class);
    		item_config.retrieveData("11694", "examine", String.class);

    Also, if you would like to save singular classes to sections, then here would be an example:

    Code:
    public class ArmadylGodsword {
    
    	@Configurable
    	public String name = "Armadyl Godsword";
    	@Configurable
    	public int value = 1250000;
    	@Configurable
    	public int high_alch = 120000;
    	@Configurable
    	public String examine = "A beautiful Godsword";
    
    }
    Code:
    		Configuration item_config = ConfigurationBuilder
    				.startBuilding()
    				.configureObjectToSection("11694", new ArmadylGodsword())
    				.type(ConfigType.YAML)
    				.build();
    Reply With Quote  
     

  7. Thankful user:


  8. #36  
    Respected Member


    Polar's Avatar
    Join Date
    Sep 2015
    Age
    28
    Posts
    420
    Thanks given
    0
    Thanks received
    418
    Rep Power
    3098
    Quote Originally Posted by Dragonsevery View Post
    snip
    Any reason you're using a string as the key when it appears they could just be ints?
    Reply With Quote  
     

  9. #37  
    Registered Member
    Join Date
    May 2017
    Posts
    124
    Thanks given
    41
    Thanks received
    43
    Rep Power
    56
    Quote Originally Posted by Polar View Post
    Any reason you're using a string as the key when it appears they could just be ints?
    Well, I could use any object as the key, so you're right and that's what I will do
    Reply With Quote  
     

  10. #38  
    Registered Member
    Tyluur's Avatar
    Join Date
    Jun 2010
    Age
    26
    Posts
    5,103
    Thanks given
    1,818
    Thanks received
    1,767
    Rep Power
    2438
    Quote Originally Posted by Dragonsevery View Post
    The configuration implementation has some small changes done to it. Sections within a Configuration class are like different "definitions" (what people here call them). Let's say you have an ItemConfiguration class with different item sections and you want to retrieve the value of an Armadyl Godsword. You would call retrieveData("11694", "value", Integer.class), and it would return the value, if specified.

    Each item SHOULD be stored as a separate section because that was the plan for flexibility with objects, npcs, and items, and any other data you are wanting to store.

    Here is an example of how you should store items within a Configuration:
    Code:
    		Configuration item_config = ConfigurationBuilder
    				.startBuilding()
    				.section("11694")
    					.add("name", "Armadyl Godsword")
    					.add("value", 1250000)
    					.add("high_alch", 120000)
    					.add("examine", "A beautiful godsword")
    				.section("11732")
    					.add("name", "Dragon Boots")
    					.add("value", 100000)
    					.add("high_alch", 20000)
    					.add("examine", "Some dragon boots")
    				.type(ConfigType.YAML)
    				.build();
    Here is an example of how to retrieve all of that information in the Configuration:
    Code:
    		item_config.retrieveData("11694", "name", String.class);
    		item_config.retrieveData("11694", "value", Integer.class);
    		item_config.retrieveData("11694", "high_alch", Integer.class);
    		item_config.retrieveData("11694", "examine", String.class);

    Also, if you would like to save singular classes to sections, then here would be an example:

    Code:
    public class ArmadylGodsword {
    
    	@Configurable
    	public String name = "Armadyl Godsword";
    	@Configurable
    	public int value = 1250000;
    	@Configurable
    	public int high_alch = 120000;
    	@Configurable
    	public String examine = "A beautiful Godsword";
    
    }
    Code:
    		Configuration item_config = ConfigurationBuilder
    				.startBuilding()
    				.configureObjectToSection("11694", new ArmadylGodsword())
    				.type(ConfigType.YAML)
    				.build();
    lookin gud
    Quote Originally Posted by blakeman8192 View Post
    Keep trying. Quitting is the only true failure.
    Spoiler for skrrrrr:

    Attached image
    Reply With Quote  
     

  11. Thankful user:


  12. #39  
    Registered Member
    Join Date
    May 2017
    Posts
    124
    Thanks given
    41
    Thanks received
    43
    Rep Power
    56
    I'm looking for people to collaborate with to start a server so we can test this library. I am also willing to pay people to write code or give me understanding of the client so I can really write the server's code much easier. I don't have all the time in the world to spend trying to understand what things need to be called and why certain procedures need to be done.

    I have am VERY efficient and meet deadlines with ease. So, when things need done they will be. There is not one struggle with code, I just require the understanding.
    Reply With Quote  
     

  13. #40  
    WVWVWVWVWVWVWVW

    _jordan's Avatar
    Join Date
    Nov 2012
    Posts
    3,046
    Thanks given
    111
    Thanks received
    1,848
    Rep Power
    5000
    updates look great
    Attached image
    Attached image
    Reply With Quote  
     

Page 4 of 8 FirstFirst ... 23456 ... 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. What kind of library would help the current RSPS advance?
    By Nio.. in forum RS 503+ Client & Server
    Replies: 8
    Last Post: 06-24-2010, 09:31 AM
  2. RSPS Banlist Project
    By Nets8 in forum Tools
    Replies: 14
    Last Post: 04-15-2009, 01:46 AM
  3. RSPS Server Library
    By Shiver in forum Downloads
    Replies: 49
    Last Post: 02-15-2009, 03:18 AM
  4. Solumstone RSPS Ready
    By sam0507 in forum Tools
    Replies: 0
    Last Post: 12-17-2007, 03:14 AM
  5. RSPS Fundamentals
    By Rat Dawg in forum Tutorials
    Replies: 5
    Last Post: 12-10-2007, 01:53 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
  •