Thread: OasisRSPS - An Arkitori Re-Release/Fix

Page 1 of 8 123 ... LastLast
Results 1 to 10 of 72
  1. #1 OasisRSPS - An Arkitori Re-Release/Fix 
    Donator

    Anthony's Avatar
    Join Date
    Dec 2007
    Age
    26
    Posts
    1,345
    Thanks given
    198
    Thanks received
    129
    Rep Power
    355
    Hi everyone,
    Downloaded this source with the idea of creating a server and hosting it myself, but the drive and determination just isn't there anymore, so I can't be bothered.
    There is a player command in the PlayerCommands file called 'acalenrapstrack' which provides players with 10,000 noted whips, a twisted bow and credits. Make sure that you remove that before hosting this.
    All credits to the original owners, and developers. I just took what was already released and fixed a lot of the bugs that were present.

    [Only registered and activated users can see links. ]

    Fixes:
    Code:
    Updates. 
    
    - All players now save and load via MongoDB (GSON Files). If you do not want this, feel free to replace PlayerSave.Java.  
    - Removed the ugly, and annoying hover / press control on an item to see the stats. (Client)
    - Client no longer crashes when teleporting to falador, duel arena etc (Was a cashe error) - cache packed a few missing maps.
    - Resolved an issue that caused you to follow someone when clicking the "X wishes to trade with you" in the chat box.
    - Removed the "You have X PVM Points" spam after killing some monsters. 
    - Tweaked Gambling.java, increased the minimum amount of money required to play, and also set the chance of winning to 60%
    - Removed some useless commands that were mostly adding items to your inv (owner commands)
    - Spacebar now skips dialouge when pressed
    - Added a Memory command that allows us to view the memory usage of the server. 
    - Removed the "Fuck off pleb" on commands done on owners. 
    - Changed the interface that says "Drop and Lose Forever" to Destroy and Lose Forever. 
    - Removed the teleport interface from all teleport spells, and created a text dialogue that states how to access them.
    - Move teleport interface to the world map instead. 
    - Removed the Quick Chat of skills and stats
    - Removed the ability to claim Rigour or Augry twice - It now provides an interface when claiming it that will not allow you to claim it twice. 
    - Removed the weird @ symbol when using the Yell as an Admin
    - Made Cannon a member/extreme member only item
    - Fixed an issue that caused the Gnome Stronghold Agility Course not work, as well as countless other objects that were used for Agility.
    - Fixed an issue with the Mystery Box acting like a cannon. This will no longer happen, and you will not search for an empty 3 tiles around you.
    - Fixed an issue with the Dragon Chain body not equipping - It not equips and has stats.
    - Fixed the bank chests not opening when clicked on in duel area. 
    - Fixed Yanille Banks not opening upon click
    - Also.. removed the annoying "Welcome Home +username+ when teleporting home.
    - Removed the ability to use the Money Pouch if you haven't entered your bank pin at a bank booth(edited)
    - Fixed an issue that caused you to be able to use auto-cast without actually having the runes.
    - Made all imps half the xp they were previously. 
    - Made the imp jar required to catch imps - before it was not required.
    - Fixed not getting XP when adding logs to the bonfire.
    - Fixed an issue with logs sometimes showing up as items on the ground but not being clickable or able to be picked up.
    - Previously, if you had a slayer helm on, the bonus was always active. This has been changed to only work when on task instead.
    - Resolved an issue that caused you to be able to duplicate your Slayer Helms. 
    - Also resolved an issue that allowed you to right click dismantle your slayer helm and it turn into a Slayer Helm (i).
    - Adjusted the Void modifiers for Magic, Range and Melee, 
    - Adjusted the Slayer Helm modifiers for Magic, Range and Melee.
    - Fixed an issue that caused the server to crash fully.
    - Cannon has been disabled for now. Will update this once cannon has been rewritten. Has been removed server wide. 
    - Removed the extra icon in the bottom left of the game-frame as it was un-needed and not used.
    - Removed and changed that ugly NPC for the Donator's. It is now the Town Crier.
    - No more needing to pass through two dialogues to open the donator shop - you can just right click trade him now.
    - Removed the old, clunky quest tab and replaced it with a new one, easier to read and more robust.
    - Added points for in-game and skills to the new Points interface found on the quest tab.
    - Pest Control now fully works, and provides you with points upon compleation 
    - Added a command that allows you to begin a pest control game instantly. 
    - Resolved the inability to "make 10" on some leather items.
    - Made it so you can only get two starters per IP rather than the way it use to be, which was unlimited.
    - Moved the fishing spot 
    - Fixed the click object / walk to for fishing spots as well.
    - Fixed the crystal chest so you no longer need to be standing on top of it for it to work, also, I renamed the chest to "Crystal Chest". 
    - Fixed an issue that caused Extreme members to lose their Extreme status when logging out.
    - Fixed an issue that caused you to lose the "Extreme" player title when logging out.
    - Changed the way you cancel a slayer task. You now need slayer points to cancel tasks, rather than 250k.
    - Made Boss slayer require 90+ slayer to do. As some bosses - such as Cerb require 90+ slayer to actually attack.
    - Warriors guild no longer removes 100 tokens when entering.
    - Fixed one of the clue scrolls not working
    - Made it so that you can use Pure Ess on the RuneCrafting Pouch, removed normal ESS out of the game completely.
    - Added the Box Trap to the ironman general store.
    - The shadow sword has been removed from the game
    - Moved around the home to make it a lot more user friendly.
    - Removed the Max Cape Racks as they were buggy as hell, and I didn't care to fix them.
    Links:

    [Only registered and activated users can see links. ]
    [Only registered and activated users can see links. ]
    [Only registered and activated users can see links. ]

    Quote Originally Posted by joshuaab94 View Post
    Scans for all 3 files:

    Spoiler for Images:
    Cache:

    Client:

    Source:
    Errors when trying to log in?

    Spoiler for Errors:

    Replace the PlayerSave.java with the original. The one that is currently in the server, is using a GSON, MongoDB connection, rather than saving locally.


    Fixing the error when opening your bank.

    Spoiler for Bank Error:

    [code]
    To fix the stack trace, replace your Bank.java with this one (server side).

    Code:
    package com.mayhem.rs2.content.bank;
    
    import java.util.Arrays;
    
    import com.mayhem.rs2.content.dialogue.DialogueManager;
    import com.mayhem.rs2.content.minigames.weapongame.WeaponGame;
    import com.mayhem.rs2.entity.item.Item;
    import com.mayhem.rs2.entity.item.ItemContainer;
    import com.mayhem.rs2.entity.player.Player;
    import com.mayhem.rs2.entity.player.PlayerConstants;
    import com.mayhem.rs2.entity.player.net.Client;
    import com.mayhem.rs2.entity.player.net.out.OutgoingPacket;
    import com.mayhem.rs2.entity.player.net.out.impl.SendConfig;
    import com.mayhem.rs2.entity.player.net.out.impl.SendEnterString;
    import com.mayhem.rs2.entity.player.net.out.impl.SendInterface;
    import com.mayhem.rs2.entity.player.net.out.impl.SendInventory;
    import com.mayhem.rs2.entity.player.net.out.impl.SendInventoryInterface;
    import com.mayhem.rs2.entity.player.net.out.impl.SendMessage;
    import com.mayhem.rs2.entity.player.net.out.impl.SendString;
    import com.mayhem.rs2.entity.player.net.out.impl.SendUpdateItems;
    
    public class Bank extends ItemContainer {
    
    	public static enum RearrangeTypes {
    		SWAP,
    		INSERT;
    	}
    
    	public static enum WithdrawTypes {
    		ITEM,
    		NOTE;
    	}
    
    	public static final int SIZE = 750;
    	private final Player player;
    	private boolean searching = false;
    
    	private int bankTab = 0;
    
    	private int[] tabAmounts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    
    	public RearrangeTypes rearrangeType = RearrangeTypes.SWAP;
    
    	public WithdrawTypes withdrawType = WithdrawTypes.ITEM;
    
    	public Bank(Player player) {
    		super(SIZE, ItemContainer.ContainerTypes.ALWAYS_STACK, true, false);
    		this.player = player;
    	}
    
    	@Override
    	public boolean allowZero(int id) {
    		return false;
    	}
    
    	public boolean clickButton(int buttonId) {
    		if (!player.getInterfaceManager().hasBankOpen()) {
    			return false;
    		}
    		if (buttonId >= 195093 && buttonId <= 195130) {
    			player.getBank().setSearching(false);
    			if (buttonId % 2 == 0) {
    				player.getBank().setBankTab(9 - (195130 - buttonId) / 4);
    			} else {
    				player.getBank().collapse(9 - (195130 - (buttonId - 1)) / 4, 0);
    			}
    			return true;
    		}
    		switch (buttonId) {
    		case 195084: // search
    			setSearching(!isSearching());
    			break;
    		case 195087: // option
    			setSearching(false);
    			if (player.getInterfaceManager().main == 32500) {
    				player.send(new SendInterface(5292));
    			} else {
    				player.send(new SendInterface(32500));
    			}
    			break;
    		case 195085:
    			Item[] k = player.getInventory().getItems();
    			for (int i = 0; i < k.length; i++) {
    				if (k[i] != null) {
    					if (!hasSpaceFor(new Item(k[i])))
    						break;
    					deposit(k[i], i);
    				}
    
    			}
    			if (k.length > 1) {
    				player.getClient().queueOutgoingPacket(new SendMessage("You have deposited some of the items in your inventory."));
    			}
    			return true;
    		case 195086:
    			Item[] e = player.getEquipment().getItems();
    			for (int i = 0; i < e.length; i++) {
    				if (e[i] != null) {
    					int deposited = depositFromNoting(e[i].getId(), e[i].getAmount(), bankTab, false);
    
    					if (deposited != 0) {
    						if (e[i].getAmount() == deposited)
    							player.getEquipment().getItems()[i] = null;
    						else if (e[i].getAmount() > deposited) {
    							e[i].remove(deposited);
    						}
    					}
    				}
    			}
    			update();
    			if (e.length > 1) {
    				player.getClient().queueOutgoingPacket(new SendMessage("You have deposited some of your worn-items."));
    			}
    			player.getEquipment().onLogin();
    			player.setAppearanceUpdateRequired(true);
    			return true;
    		case 31194:
    			rearrangeType = RearrangeTypes.SWAP;
    			return true;
    		case 31195:
    			rearrangeType = RearrangeTypes.INSERT;
    			return true;
    		case 21011:
    			withdrawType = WithdrawTypes.ITEM;
    			return true;
    		case 21010:
    			withdrawType = WithdrawTypes.NOTE;
    			return true;
    		}
    		return false;
    	}
    
    	public void deposit(int id, int amount, int slot) {
    		if (!player.getInterfaceManager().hasBankOpen() || WeaponGame.gamePlayers.contains(player)) {
    			return;
    		}
    
    		if (!player.getInventory().slotContainsItem(slot, id)) {
    			return;
    		}
    
    		int invAmount = player.getInventory().getItemAmount(id);
    
    		if (invAmount < amount) {
    			amount = invAmount;
    		}
    		
    		Item item = new Item(id, amount);
    		
    		if (item.getDefinition().isNote()) {
    			item.unNote();
    		}
    
    		boolean contains = hasItemId(item.getId());
    		
    		int added = 0;
    		
    		added = add(item, true);
    
    		if (added > 0) {
    			if (!contains) {
    				changeTabAmount(bankTab, 1, false);
    				RearrangeTypes temp = rearrangeType;
    				rearrangeType = RearrangeTypes.INSERT;
    				swap(bankTab == 0 ? tabAmounts[bankTab] - 1 : getData(bankTab, 1), getItemSlot(item.getId()));
    				rearrangeType = temp;
    			}
    
    			if (amount == 1 && !Item.getDefinition(id).isStackable()) {
    				player.getInventory().setSlot(null, slot);
    			} else {
    				player.getInventory().remove(id, added);
    			}
    		} else {
    			added = add(new Item(id, amount), true);
    
    			if (added > 0) {
    				if (!contains) {
    					changeTabAmount(bankTab, 1, false);
    					RearrangeTypes temp = rearrangeType;
    					rearrangeType = RearrangeTypes.INSERT;
    					swap(bankTab == 0 ? tabAmounts[bankTab] - 1 : getData(bankTab, 1), getItemSlot(item.getId()));
    					rearrangeType = temp;
    				}
    
    				if (amount == 1 && !Item.getDefinition(id).isStackable()) {
    					player.getInventory().setSlot(null, slot);
    				} else {
    					player.getInventory().remove(id, added);
    				}
    			}
    		}
    	}
    
    	public void deposit(Item i, int slot) {
    		deposit(i.getId(), i.getAmount(), slot);
    	}
    	
    	public int depositFromNoting(Item item, int tab, boolean update) {
    		boolean contains = getItemAmount(item.getId()) != 0;
    		int added = add(new Item(item.getId(), item.getAmount()), update);
    	
    		if (!contains && added > 0) {
    			changeTabAmount(tab, 1, false);
    			RearrangeTypes temp = rearrangeType;
    			rearrangeType = RearrangeTypes.INSERT;
    			swap(tab == 0 ? tabAmounts[tab] - 1 : getData(tab, 1), getItemSlot(item.getId()));
    			rearrangeType = temp;
    		}
    	
    		return added;
    	}
    
    	public int depositFromNoting(int id, int amount, int tab, boolean update) {
    		boolean contains = getItemAmount(id) != 0;
    		int added = add(new Item(id, amount), update);
    
    		if (!contains && added > 0) {
    			changeTabAmount(tab, 1, false);
    			RearrangeTypes temp = rearrangeType;
    			rearrangeType = RearrangeTypes.INSERT;
    			swap(tab == 0 ? tabAmounts[tab] - 1 : getData(tab, 1), getItemSlot(id));
    			rearrangeType = temp;
    		}
    
    		return added;
    	}
    
    	@Override
    	public void onAdd(Item item) {
    	}
    
    	@Override
    	public void onFillContainer() {
    		player.getClient().queueOutgoingPacket(new SendMessage("Your bank is now full."));
    	}
    
    	@Override
    	public void onMaxStack() {
    		player.getClient().queueOutgoingPacket(new SendMessage("Your bank won't be able to hold all that!"));
    	}
    
    	@Override
    	public void onRemove(Item item) {
    	}
    
    	public void openBank() {
    		if (player.isUltimateIron()) {
    			DialogueManager.sendStatement(player, "<img=13>@[email protected] [email protected]@'s do not have access to a bank!");
    			return;
    		}
    		
    		if (player.inWGGame()) {
    			return;
    		}
    		
    		if (player.isBusy() && !PlayerConstants.isOwner(player)) {
    			return;
    		}
    		
    		if (player.getPin() == null || player.enteredPin == true) {
    			shift();
    			update();
    			player.getClient().queueOutgoingPacket(new SendInventoryInterface(5292, 5063));
    		} else {
    			player.send(new SendInterface(48750));
    		}
    		
    	}
    
    	@Override
    	public void swap(int to, int from) {
    		if (from == to) {
    			return;
    		}
    		
    		if (rearrangeType == RearrangeTypes.SWAP) {
    			Item item = getItems()[to];
    			getItems()[to] = getItems()[from];
    			getItems()[from] = item;
    		} else if (rearrangeType == RearrangeTypes.INSERT) {
    			int index = from;
    
    			if (from > to) {
    				while (index != to) {
    					Item item = getItems()[index - 1];
    					getItems()[index - 1] = getItems()[index];
    					getItems()[index] = item;
    					index--;
    				}
    			} else if (from < to) {
    				while (index != to) {
    					Item item = getItems()[index + 1];
    					getItems()[index + 1] = getItems()[index];
    					getItems()[index] = item;
    					index++;
    				}
    			}
    		}
    	}
    
    	@Override
    	public void update() {
    		player.getClient().queueOutgoingPacket(new SendUpdateItems(5064, player.getInventory().getItems()));
    		player.getClient().queueOutgoingPacket(new SendUpdateItems(5382, player.getBank().getItems(), player.getBank().getTabAmounts()));
    		player.getClient().queueOutgoingPacket(new SendInventory(player.getInventory().getItems()));
    		player.send(new SendString("" + player.getBank().getTakenSlots(), 22033));
    	}
    
    	@Override
    	public void clear() {
    		Arrays.fill(tabAmounts, 0);
    		bankTab = 0;
    		setSearching(false);
    		super.clear();
    	}
    
    	public void withdraw(int item, int amount) {
    		if (!player.getInterfaceManager().hasBankOpen()) {
    			return;
    		}
    
    		if (!hasItemId(item)) {
    			return;
    		}
    
    		int bankAmount = getItemAmount(item);
    		int bankSlot = getItemSlot(item);
    
    		if (bankAmount < amount) {
    			amount = bankAmount;
    		}
    		int old = item;
    		if (withdrawType == WithdrawTypes.NOTE) {
    			if (!Item.getDefinition(item).canNote())
    				player.getClient().queueOutgoingPacket(new SendMessage("This item cannot be withdrawn as a note."));
    			else {
    				item = Item.getDefinition(item).getNoteId();
    			}
    		}
    
    		int added = player.getInventory().add(item, amount, false);
    
    		if (added > 0) {
    			if (remove(new Item(old, added), true) > 0) {
    				if (added == bankAmount) {
    					int tab = getData(bankSlot, 0);
    					changeTabAmount(tab, -1, tabAmounts[tab] == 1);
    				}
    			}
    		}
    	}
    
    	public void collapse(int tab, int toTab) {
    		if (tab == 0) {
    			Arrays.fill(tabAmounts, 0);
    			tabAmounts[0] = getTakenSlots();
    			shift();
    			update();
    			return;
    		}
    
    		if (toTab == 0) {
    			player.send(new SendConfig(1000, 0));
    			bankTab = 0;
    		}
    
    		if (toTab == tab || tab > 9) {
    			shift();
    			update();
    			return;
    		}
    
    		int itemSlot = getData(tab, 1);
    		int initialTabAmount = tabAmounts[tab];
    
    		for (int fromSlot = 0; fromSlot < initialTabAmount; fromSlot++) {
    			itemToTab(itemSlot, toTab, false);
    		}
    
    		collapse(tab + 1, tab);
    	}
    
    	public int getData(int input, int type) {
    		int totalSlots = 0;
    		for (int tab = 0; tab < (type == 1 ? input + 1 : 10); tab++) {
    			if (type == 0 && input <= totalSlots + tabAmounts[tab] - 1 && input >= totalSlots) {
    				return tab;
    			}
    			totalSlots += tabAmounts[tab];
    		}
    		return totalSlots - 1;
    	}
    
    	public void itemToTab(int slot, int toTab, boolean refresh) {
    		int fromTab = getData(slot, 0);
    
    		if (fromTab == toTab || (toTab > 1 && tabAmounts[toTab - 1] == 0 && tabAmounts[toTab] == 0)) {
    			return;
    		}
    
    		changeTabAmount(fromTab, -1, refresh);
    		changeTabAmount(toTab, 1, false);
    		RearrangeTypes temp = rearrangeType;
    		rearrangeType = RearrangeTypes.INSERT;
    		swap(getData(toTab, 1), slot);
    		rearrangeType = temp;
    
    		if (refresh) {
    			update();
    		}
    	}
    
    	public void changeTabAmount(int tab, int amount, boolean collapse) {
    		tabAmounts[tab] += amount;
    		if (tabAmounts[tab] <= 0 && collapse) {
    			collapse(tab, 0);
    		}
    	}
    
    	public int getTabAmount(int tab) {
    		return tabAmounts[tab];
    	}
    
    	public int[] getTabAmounts() {
    		return tabAmounts;
    	}
    
    	public void setTabAmounts(int[] tabAmounts) {
    		this.tabAmounts = tabAmounts;
    	}
    
    	public void setBankTab(int bankTab) {
    		this.bankTab = bankTab;
    	}
    
    	public boolean isSearching() {
    		return searching;
    	}
    
    	public void setSearching(boolean searching) {
    		this.searching = searching;
    		if (!isSearching()) {
    			player.send(new SendConfig(1012, 0));
    		} else {
    			player.send(new SendEnterString());
    		}
    		player.send(new OutgoingPacket() {
    			@Override
    			public void execute(Client paramClient) {
    			}
    
    			@Override
    			public int getOpcode() {
    				return 187;
    			}
    		});
    	}
    }


    Hate the teleport interface? Replace it.

    Spoiler for New Teleport Interface:

    [Only registered and activated users can see links. ]


    Last edited by Anthony; 11-23-2018 at 09:57 PM.
    Reply With Quote  
     


  2. #2  
    Registered Member
    Join Date
    Oct 2018
    Posts
    4
    Thanks given
    0
    Thanks received
    0
    Rep Power
    0
    Hey thanks for this
    Reply With Quote  
     

  3. #3  
    Registered Member Rema's Avatar
    Join Date
    Sep 2018
    Posts
    44
    Thanks given
    6
    Thanks received
    7
    Rep Power
    16
    Thanks
    Reply With Quote  
     

  4. #4  
    Registered Member
    Join Date
    Mar 2010
    Posts
    5
    Thanks given
    0
    Thanks received
    0
    Rep Power
    0
    Scans for all 3 files:

    Spoiler for Images:
    Cache:

    Client:

    Source:
    Reply With Quote  
     

  5. #5  
    Registered Member
    Join Date
    Sep 2016
    Posts
    13
    Thanks given
    2
    Thanks received
    1
    Rep Power
    11
    Nice contribution, its nice to see some forward progress on something even if its minimal
    Reply With Quote  
     

  6. #6  
    Extreme Donator

    Join Date
    Jul 2016
    Posts
    68
    Thanks given
    172
    Thanks received
    18
    Rep Power
    67
    Did you change anything with sprites? I fixed sprites for Linux and added md5 password hashing (I know it's bad but it's better than nothing), I'd like to add my changes to a local copy of Oasis so I'd like to overwrite the sprites as long as you didn't change anything with them that I'd end up losing. I'm of course talking about hard-coded sprites, not cache-packed sprites.
    Reply With Quote  
     

  7. #7  
    Donator

    Anthony's Avatar
    Join Date
    Dec 2007
    Age
    26
    Posts
    1,345
    Thanks given
    198
    Thanks received
    129
    Rep Power
    355
    Quote Originally Posted by wtfmate View Post
    Did you change anything with sprites? I fixed sprites for Linux and added md5 password hashing (I know it's bad but it's better than nothing), I'd like to add my changes to a local copy of Oasis so I'd like to overwrite the sprites as long as you didn't change anything with them that I'd end up losing. I'm of course talking about hard-coded sprites, not cache-packed sprites.
    Nope, you can use your cache and be fine.
    Reply With Quote  
     

  8. Thankful user:


  9. #8  
    Registered Member

    Join Date
    Oct 2017
    Posts
    643
    Thanks given
    6
    Thanks received
    116
    Rep Power
    161
    thanks.
    Reply With Quote  
     

  10. #9  
    Registered Member
    Join Date
    Feb 2018
    Posts
    1
    Thanks given
    0
    Thanks received
    1
    Rep Power
    0
    Appreciate it OP!

    Could anyone maybe make a quick youtube video on how to get it running? I've gotten other servers running and obviously I'm a noob to this stuff but I'm sure a lot of other leeches would appreciate the help.
    Reply With Quote  
     

  11. #10  
    Official
    RaddTech LLC's Avatar
    Join Date
    Sep 2010
    Age
    24
    Posts
    418
    Thanks given
    39
    Thanks received
    48
    Rep Power
    36
    Quote Originally Posted by Poorboy View Post
    Appreciate it OP!

    Could anyone maybe make a quick youtube video on how to get it running? I've gotten other servers running and obviously I'm a noob to this stuff but I'm sure a lot of other leeches would appreciate the help.
    java server
    Rise, a MMORPG where you can wager REAL MONEY $$$$

    Coming soon, January 1st, 2019
    [Only registered and activated users can see links. ]

    [Only registered and activated users can see links. ]

    Spoiler for Dark Rage:
    Reply With Quote  
     

Page 1 of 8 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. Enigma re-release with fixes.
    By 'Varbit in forum Downloads
    Replies: 24
    Last Post: 02-27-2014, 03:42 PM
  2. Replies: 2
    Last Post: 08-27-2013, 02:35 AM
  3. Azure 3.5 re-release + fix
    By averykey in forum Downloads
    Replies: 2
    Last Post: 06-07-2013, 02:39 AM
  4. Eleclion's Client-2-JAR [Updated Re-Release]
    By Eleclion in forum Downloads
    Replies: 13
    Last Post: 01-31-2009, 10:32 PM
  5. My barrows minigame re-release.
    By Raid in forum Tutorials
    Replies: 15
    Last Post: 01-07-2008, 12:16 AM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •