Register
Topics without answer
Topic Replies Last Post
Who's Online
14 user(s) are online (13 user(s) are browsing Forums)

Members: 0
Guests: 14

more...
[WPC] Wolf Pack Clan Forum Index
   Killing Floor Modding
     [Tutorial] Custom Perks
Register To Post

Threaded | Newest First Previous Topic | Next Topic | Bottom
Poster Thread
Whisky
Posted on: 2012/5/11 19:13

Joined: 2011/5/25
From: SouthWest UK
Posts: 2393
[Tutorial] Custom Perks
Ok. Now to try and continue the attempt to limit version miss matching and to help people out who wish to create custom perks or server admins who want to work custom weapons into their perks.

Note: This first post may look like a lot, but it's less than an afternoon's reading.

Part One : Prerequisites

Primers

Forum member Benjamin created some very useful tutorials. I suggest you read the first one at least as it covers the actual set up and compiling of mods/muts/packages.

Creating a Basic Mutator
Mutator Essentials
Multiplayer Mutators
Modifying Existing Weapons

CPlusPlus & UnrealScript

Unreal Script is an object based programming language derived from C++. I'm not going to teach you about C++, I'm no where near qualified (or patient) enough to do so.

http://www.cplusplus.com has all the info you need on C++ including tutorials. Take note of how object based programming works including inheritance and projected properties. In here are all the operators and statements you'll need for the maths and checks.

UnrealScriptReference Has pretty much all the info you need on the unreal script functions and more. You can also use http://wiki.beyondunreal.com/ as a resource.

This should be enough to get you started by the time you've had a skim over and maybe tried some of Benjamin's tutorials I'll have written up the next section of the tutorial.

Note: To the experienced programmers; Marco, ScaryGhost, Benjamin etc. If you spot any mistakes or omissions please do send me a message and I'll correct any mistakes I've made. Also feel free to send any suggestions.


Tutorial One – Setting Up & Testing

So now that we have covered some basics of C++/UnrealScript and compiling we need to set ourselves up to build our new perks. There are other ways of doing this but this is the way I prefer to do things.

First download and install ServerPerks from this thread. -Be sure to thank Marco while you are there. ;)

First create your mod folder; “WhiskyPerks” for this example and within that a folder called “classes”
Click to see original Image in a new window

Next navigate to .../KillingFloor/System and open the killingfloor.ini
In the EditPackages lines I add after ‘KFMutators’ the packages for ServerPerks and then your own.
Click to see original Image in a new window

Now going back to our mod folder we set up I’m going to create a simple perk extension that I will use for following tutorials. This is saved as a .uc file in the classes folder. Don't forget the file name has to be the same as the class name.

class WVetCommando extends SRVetCommando
    
abstract;
defaultproperties
{
    
VeterancyName="Whisky Commando"
}


This is all the code I’m going to use for the time being. What I’m doing here is extending off of the SRVetCommando which is the commando class that comes with ServerPerks. This will inherit all the functions and properties of its parent class with the exception of the Perk’s name, now “Whisky Commando” which overrides the parent class property.

Compile and if you’ve been following along you should have no problems. Next navigate to .../KillingFloor/System and open the ServerPerks.ini file (you can do this in game as well from the mutator window I just prefer doing it here) and add your new perk to the Perks= lines, in this case Perks=WhiskyPerks.WVetCommando.
Click to see original Image in a new window

Run the game and test. (Don’t forget to turn on ServerPerks from the mutator menu!)
Click to see original Image in a new window

And there we have it, our very own ‘custom’ perk in game. Admittedly this is only a name change but it is a start. Next tutorial will show you how to start customising bonuses and discounts.


----------------

Whisky
Posted on: 2012/5/12 6:47

Joined: 2011/5/25
From: SouthWest UK
Posts: 2393
Re: [Tutorial] Custom Perks
Tutorial Two : Extending and Overriding Perks

We will start simply to begin with. Now you can find ALL the functions you need in other files, both in the original perks in the KFMod folder in your .../killingfloor/ directory and in Marco’s ServerPerksV5 source files which are still available on his thread.

Returning to our new Commando class, there is a gun that he’s always enjoyed but finds very expensive. So let’s give him a discount on a weapon.

Now there are two ways we can do this, we can either extend the function or overwrite the function.

Extending a Function

I’m going to opt to extend the function to start with because it’s less coding and I don't need to do it from scratch. Our weapon shall be the G36C by Flux.

First download the mod and install it. You’ll need the files to be able to compile the perk.

This is what we are going to add to our perk to give it a discount for the weapon.

Code:
#exec obj load file="FX-KFG36C.u"
// Change the cost of particular items
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<PickupItem)
{
    if ( 
Item == class'G36CPickup' )
    {
        return 
0.9 fmin(0.10 float(KFPRI.ClientVeteranSkillLevel),0.6f); // Up to 70% discount on Assault Rifles
    
}

    return 
super.GetCostScaling(KFPRIItem);
}


Let us break it down:

Code:
#exec obj load file="FX-KFG36C.u"

This line loads the package we need.

Code:
// Change the cost of particular items

Comment so we know what we are doing here.

Code:
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<PickupItem)

Calling the function to scale the cost of the weapon.

Code:
if ( Item == class'G36CPickup' )

IF statement, if the gun is a G36C then perform this process.

Code:
return 0.9 fmin(0.10 float(KFPRI.ClientVeteranSkillLevel),0.6f); // Up to 70% discount on Assault Rifles

Easy bit of maths to create the discount. With comment so you can see at a glance what is going on.

Code:
return super.GetCostScaling(KFPRIItem);

Return value to the super class which means it returns this value to its parent class so that both work together rather than this function overwriting that of its parent.

Compile and test by adding the weapon to the store and switching between perks to see the effect on the discount.

Overriding a Function

Overriding is ideal if you want replace a function completely, for example removing all damage bonues; like so.

Code:
//Remove Damage Boosts
static function int AddDamage(KFPlayerReplicationInfo KFPRIKFMonster InjuredKFPawn DamageTakerint InDamage, class<DamageTypeDmgType)
{
        return 
InDamage;
}

This simply overrides the parent function so our new commando doesn't have his damage boosts and we have still not touched the base ServerPerk package.

Perk as it stands now:

Code:
class WVetCommando extends SRVetCommando
    
abstract;

#exec obj load file="FX-KFG36C.u"

// Change the cost of particular items
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<PickupItem)
{
    if ( 
Item == class'G36CPickup' )
    {
        return 
0.9 fmin(0.10 float(KFPRI.ClientVeteranSkillLevel),0.6f); // Up to 70% discount on Assault Rifles
    
}

    return 
super.GetCostScaling(KFPRIItem);
}

//Remove Damage Boosts
static function int AddDamage(KFPlayerReplicationInfo KFPRIKFMonster InjuredKFPawn DamageTakerint InDamage, class<DamageTypeDmgType)
{
        return 
InDamage;
}
    
defaultproperties
{
    
VeterancyName="Whisky Commando"
}


----------------

Whisky
Posted on: 2012/5/12 6:50

Joined: 2011/5/25
From: SouthWest UK
Posts: 2393
Re: [Tutorial] Custom Perks
Tutorial Three : Perk From Scratch with Custom Stats

“But Whisky, Gartley or whatever you call yourself” I hear you cry “I don’t want to edit existing perks I want to make my own big shiny new perk!”

Well ok let us start to make our own perk then. Firstly we are going to start by setting up the requirements; scary ghost was kind enough to start this one off. So I’m going to use his as a base and work from there. I’ll also be turning the new commando perk into a standalone perk.

#1: First we need a new damage type. Have the AwardDamage function use the ProgressCustomValue function. You'll want to derive your custom damage type from KFWeaponDamageType.

Code:
class DamTypeG36CNew extends KFWeaponDamageType
    
abstract;

static function 
AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievementsint Amount
{
   if( 
SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
   
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'G36CProgress',Amount);
}
    

defaultproperties 
{
    
DeathString="%o was shot by %k."
    
FemaleSuicide="%o was shot."
    
MaleSuicide="%o was shot again."
    
bArmorStops=False
    bAlwaysGibs
=True
    bLocationalHit
=False
    GibPerterbation
=1.000000
    bCheckForHeadShots
=False
}

#2: Create your custom requirement and name it something sensible.

Code:
class G36CProgress extends SRCustomProgressInt;

static function 
AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievementsint Amount
{
    if( 
SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
    
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'G36CProgress',Amount);
}

defaultproperties 
{
    
ProgressName"G36C Damage"
}


#3a: In your custom perk class, bind your custom requirement to the perk.

Code:
static function AddCustomStatsClientPerkRepLink Other )
{
    
Other.AddCustomValue(Class'G36CProgress');
}


#3b: In this example I also use this stage to replace the G36C’s DamType with the new calss. If you are creating a custom weapon you can use the above DamType in the weapons fire class.

Code:
static function AddCustomStatsClientPerkRepLink Other )
{
    
Other.AddCustomValue(Class'G36CProgress');
    Class
'G36CFire'.Default.DamageType = Class'DamTypeG36CNew';
}


#4: In the perk create your custom perk progression.

Code:
var array<intprogressArray;

//Perk Progression
static function int GetPerkProgressIntClientPerkRepLink StatOtherout int FinalIntbyte CurLevelbyte ReqNum 
{
    if (
CurLevel 7
    {
        
FinalInt= default.progressArray[curLevel];
    } 
    else 
    {
        
FinalInt = default.progressArray[6]+GetDoubleScaling(CurLevel,500000);
    }
    return 
Min(StatOther.GetCustomValueInt(Class'G36CProgress'),FinalInt);
}

defaultproperties
{
    
progressArray(0)=5000
    progressArray
(1)=25000
    progressArray
(2)=100000
    progressArray
(3)=500000
    progressArray
(4)=1500000
    progressArray
(5)=3500000
    progressArray
(6)=5500000
}


#5: Add in all the extra bonuses and features you want.

#6: Set up the default properties including perk descriptions. If you wish the custom info to display past perk 6 you need to know your maths and string replacements.

Code:
static function string GetCustomLevelInfobyte Level )
{
    
local string S;

    
= Default.CustomLevelInfo;
    
ReplaceText(S,"%s",GetPercentStr(0.05 float(Level)));
    return 
S;
}
    
defaultproperties
{
    
progressArray(0)=5000
    progressArray
(1)=25000
    progressArray
(2)=100000
    progressArray
(3)=500000
    progressArray
(4)=1500000
    progressArray
(5)=3500000
    progressArray
(6)=5500000
    
    VeterancyName
="Whisky Commando"
    
    
OnHUDIcon=Texture'WhiskyPerks_T.WCommandoPerk'
    
OnHUDGoldIcon=Texture'WhiskyPerks_T.WCommandoPerk_Gold'
    
    
Requirements(0)="Deal %x G36C damage"

    
SRLevelEffects(0)="5% Perk Bonus"
    
SRLevelEffects(1)="10% Perk Bonus"
    
SRLevelEffects(2)="15% Perk Bonus"
    
SRLevelEffects(3)="20% Perk Bonus"
    
SRLevelEffects(4)="25% Perk Bonus"
    
SRLevelEffects(5)="30% Perk Bonus"
    
SRLevelEffects(6)="35% Perk Bonus"

    
CustomLevelInfo="%s Perk Bonus"
    
    
PerkIndex=7
    
}


Remember to add the texture using the obj load function

Code:
#exec obj load file="WhiskyPerks_T.utx"


Special thanks to Scary for pre-empting this one. His original post (link below) helped me to put this last one together.

Click to see original Image in a new window

Click to see original Image in a new window


The final perk:
class WVetCommando extends SRVeterancyTypes
    
abstract;

#exec obj load file="FX-KFG36C.u"
#exec obj load file="WhiskyPerks_T.utx"

var array<intprogressArray;

static function 
AddCustomStatsClientPerkRepLink Other )
{
    
Other.AddCustomValue(Class'G36CProgress');
    Class
'G36CFire'.Default.DamageType = Class'DamTypeG36CNew';
}

//Perk Progression
static function int GetPerkProgressIntClientPerkRepLink StatOtherout int FinalIntbyte CurLevelbyte ReqNum 
{
    if (
CurLevel 7
    {
        
FinalInt= default.progressArray[curLevel];
    } 
    else 
    {
        
FinalInt = default.progressArray[6]+GetDoubleScaling(CurLevel,500000);
    }
    return 
Min(StatOther.GetCustomValueInt(Class'G36CProgress'),FinalInt);
}

// Change the cost of particular items
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<PickupItem)
{
    if ( 
Item == class'G36CPickup' )
    {
        return 
1.0 fmin(0.05 float(KFPRI.ClientVeteranSkillLevel),0.7f); 
    }

    return 
super.GetCostScaling(KFPRIItem);
}

static function 
string GetCustomLevelInfobyte Level )
{
    
local string S;

    
= Default.CustomLevelInfo;
    
ReplaceText(S,"%s",GetPercentStr(0.05 float(Level)));
    return 
S;
}
    
defaultproperties
{
    
progressArray(0)=5000
    progressArray
(1)=25000
    progressArray
(2)=100000
    progressArray
(3)=500000
    progressArray
(4)=1500000
    progressArray
(5)=3500000
    progressArray
(6)=5500000
    
    VeterancyName
="Whisky Commando"
    
    
OnHUDIcon=Texture'WhiskyPerks_T.WCommandoPerk'
    
OnHUDGoldIcon=Texture'WhiskyPerks_T.WCommandoPerk_Gold'
    
    
Requirements(0)="Deal %x G36C damage"

    
SRLevelEffects(0)="5% Perk Bonus"
    
SRLevelEffects(1)="10% Perk Bonus"
    
SRLevelEffects(2)="15% Perk Bonus"
    
SRLevelEffects(3)="20% Perk Bonus"
    
SRLevelEffects(4)="25% Perk Bonus"
    
SRLevelEffects(5)="30% Perk Bonus"
    
SRLevelEffects(6)="35% Perk Bonus"

    
CustomLevelInfo="%s Perk Bonus"
    
    
PerkIndex=7
    
}


----------------

Anonymous
Posted on: 2012/5/14 15:26
Re: [Tutorial] Custom Perks
Not to be a dib, but would it be possible for you to do a video style tutorial? I only ask because I am by far a more visual learner. All I need is to be able to see it done once and do it myself and I usually get it one the first go around. Following written instructions, however, is a different story. Also if you could put up a step by step making of a gun in video form I would love it. Thanks
EpharGy
Posted on: 2012/7/4 7:40

Joined: 2011/10/25
From:
Posts: 9
Re: [Tutorial] Custom Perks
Cheers Whisky, comes in very handy as its a hands on tutorial!
Whisky
Posted on: 2012/7/4 12:23

Joined: 2011/5/25
From: SouthWest UK
Posts: 2393
Re: [Tutorial] Custom Perks
Glad you find it useful.


----------------

EpharGy
Posted on: 2012/8/19 13:07

Joined: 2011/10/25
From:
Posts: 9
Re: [Tutorial] Custom Perks
Heya Whisky, hoping you can help me out with an array error in requirements.

my perk is to be reliant on other perks, ie to use this perk you need to have unlocked the level requirements for each other perk first.

IE, to use level 0 of this new perk, you will need to have unlocked level 1 of Sharp, Support, etc etc.

My perks go from 0 to 15 levels

All other custom stats are bound in those perks.

the new custom stat (to denote a member, since i havent worked out a different way yet, i know flux has something implemented)

Anyways, I'm currently getting an Out of bounds array error

Error: SykPerks.SYKSykosis: Out of bound array default property (6/6)
Error: SykPerks.SYKSykosis: Out of bound array default property (7/6)
Error: SykPerks.SYKSykosis: Out of bound array default property (8/6)
Error: SykPerks.SYKSykosis: Out of bound array default property (9/6)

static function AddCustomStatsClientPerkRepLink Other )
{
    
Other.AddCustomValue(Class'ProgressSykMember'); 
}    

static function 
int GetPerkProgressIntClientPerkRepLink StatOtherout int FinalIntbyte CurLevelbyte ReqNum 
{
    if (
ReqNum == 0)
    {
        if (
CurLevel 15
            
FinalInt1;
        else 
            
FinalInt 1;

        return 
Min(StatOther.GetCustomValueInt(Class'SykPerks.ProgressSykMember'),FinalInt);
    }
    if (
ReqNum == 1) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayA[curLevel];
        else 
            
FinalInt = default.progressArrayA[9]+((CurLevel-10)*1200);

        return 
Min(StatOther.RSelfHealsStat,FinalInt);
    }
    if (
ReqNum == 2) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayB[curLevel];
        else 
            
FinalInt = default.progressArrayB[9]+((CurLevel-10)*15000);

        return 
Min(StatOther.RDamageHealedStat,FinalInt);
    }
    if (
ReqNum == 3) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayC[curLevel];
        else 
            
FinalInt = default.progressArrayC[9]+((CurLevel-10)*1500000);

        return 
Min(StatOther.RShotgunDamageStat,FinalInt);
    }
    if (
ReqNum == 4) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayD[curLevel];
        else 
            
FinalInt = default.progressArrayD[9]+((CurLevel-10)*1200);

        return 
Min(StatOther.GetCustomValueInt(Class'ProgressHSKSharp'),FinalInt);
    }
    if (
ReqNum == 5) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayC[curLevel];
        else 
            
FinalInt = default.progressArrayC[9]+((CurLevel-10)*1500000);

        return 
Min(StatOther.RBullpupDamageStat,FinalInt);
    }
    if (
ReqNum == 6) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayC[curLevel];
        else 
            
FinalInt = default.progressArrayC[9]+((CurLevel-10)*1500000);

        return 
Min(StatOther.RMeleeDamageStat,FinalInt);
    }
    if (
ReqNum == 7) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayC[curLevel];
        else 
            
FinalInt = default.progressArrayC[9]+((CurLevel-10)*1500000);

        return 
Min(StatOther.RFlameThrowerDamageStat,FinalInt);
    }
    if (
ReqNum == 8) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayC[curLevel];
        else 
            
FinalInt = default.progressArrayC[9]+((CurLevel-10)*1500000);

        return 
Min(StatOther.RExplosivesDamageStat,FinalInt);
    }
    if (
ReqNum == 9) {
        if (
CurLevel 9
            
FinalInt= default.progressArrayC[curLevel];
        else 
            
FinalInt = default.progressArrayC[9]+((CurLevel-10)*1500000);

        return 
Min(StatOther.GetCustomValueInt(Class'ProgressDamDW'),FinalInt);
    }
}

defaultproperties
{
     
PerkIndex=8
     OnHUDIcon
=Texture'KillingFloorHUD.Perks.Perk_Berserker'
     
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Berserker_Gold'
     
VeterancyName="Sykosis Community Member"
     
NumRequirements=10
     Requirements
(0)="Be a Sykosis Community Forum member"
     
Requirements(1)="Heal %x teammates"
     
Requirements(2)="Heal %x HP on your teammates"
     
Requirements(3)="Deal %x damage with Shotguns"
     
Requirements(4)="Get %x headshot kills with Marksman weapons"
     
Requirements(5)="Deal %x damage with Commando Weapons"
     
Requirements(6)="Deal %x damage with melee weapons"
     
Requirements(7)="Deal %x damage with the Flamethrower"
     
Requirements(8)="Deal %x damage with the Explosives"
     
Requirements(9)="Deal %x damage with Dual Wielder Weapons"
     
progressArrayA(0)=2
     progressArrayA
(1)=8
     progressArrayA
(2)=24
     progressArrayA
(3)=64
     progressArrayA
(4)=200
     progressArrayA
(5)=600
     progressArrayA
(6)=1200
     progressArrayA
(7)=2000
     progressArrayA
(8)=2800
     progressArrayA
(9)=3600
     progressArrayB
(0)=25
     progressArrayB
(1)=100
     progressArrayB
(2)=300
     progressArrayB
(3)=800
     progressArrayB
(4)=2500
     progressArrayB
(5)=7500
     progressArrayB
(6)=15000
     progressArrayB
(7)=25000
     progressArrayB
(8)=35000
     progressArrayB
(9)=45000
     progressArrayC
(0)=2500
     progressArrayC
(1)=10000
     progressArrayC
(2)=30000
     progressArrayC
(3)=80000
     progressArrayC
(4)=250000
     progressArrayC
(5)=750000
     progressArrayC
(6)=1500000
     progressArrayC
(7)=2500000
     progressArrayC
(8)=3500000
     progressArrayC
(9)=4500000
     progressArrayD
(0)=2
     progressArrayD
(1)=8
     progressArrayD
(2)=24
     progressArrayD
(3)=64
     progressArrayD
(4)=200
     progressArrayD
(5)=600
     progressArrayD
(6)=1200
     progressArrayD
(7)=2000
     progressArrayD
(8)=2800
     progressArrayD
(9)=3600
}
Whisky
Posted on: 2012/8/19 16:20

Joined: 2011/5/25
From: SouthWest UK
Posts: 2393
Re: [Tutorial] Custom Perks
What you are trying to do would be better implemented before the perk level. Flux uses his own version of ServerPerks that allows him to flag a member as having donated or is a VIP and that allows the perk to be selected. tbh he'd be best to ask about that side of implementation.

Marco did show an example of this in work with what he called ServerPerksX (Now redundant as he has implemented the feature into an update.) He did this by extending off of server perks. imo better then building your own version of serverperks. As it's easier to maintain.

http://forums.tripwireinteractive.com ... p?p=1069437&postcount=704

Let me know if that helps you out.


----------------

EpharGy
Posted on: 2012/8/19 18:48

Joined: 2011/10/25
From:
Posts: 9
Re: [Tutorial] Custom Perks
Cheers heaps,

I remembered seeing something like that a while back, couldn't find it again when i was searching for though.
EpharGy
Posted on: 2012/8/20 19:41

Joined: 2011/10/25
From:
Posts: 9
Re: [Tutorial] Custom Perks
I havent looked into the servperksx yet, but i did do some testing with the arrays, I think there is a limit of 6 requirements for a perk (limited the amount of requirements when using arrays and when not, both hit a 6 requirements before erroring), i haven't started digging around yet, but i'll probably make different requirements rather than having to accomplish all other perks requirements to gain a level in this perk.
Threaded | Newest First Previous Topic | Next Topic |

Register To Post
 
[WPC] Discussions
Forum Topic Replies Views Last Post
[PUBLIC] General Chit Chat I keep seeing WPC and I miss it dearly. 0 8848 2020/4/24 6:52 Blitzkrieg
[PUBLIC] General Chit Chat Just passing by. 0 11827 2020/3/11 23:35 Weeperr
[PUBLIC] General Chit Chat I Miss You Guys 2 14188 2020/1/26 5:06 Webley
[PUBLIC] General Chit Chat Whats up Family 4 24123 2018/7/20 23:37 Helldome
[PUBLIC] General Chit Chat Hello from Solo    [1][2] 13 58515 2018/1/11 23:37 LordDean
[PUBLIC] General Chit Chat WHAT UP YALL    [1][2] 12 71864 2017/7/24 14:57 Zeeky
[PUBLIC] General Chit Chat lets see your gaming setup!    [1][2][3]..................[50] 498 467621 2017/5/7 22:52 Helldome
[PUBLIC] General Chit Chat Post you Art....    [1][2][3]...............[9] 84 134519 2017/5/7 22:51 Helldome
[PUBLIC] General Chit Chat Tribute to all WPC Members old and new!    [1][2][3][4] 32 164734 2017/5/7 22:46 Helldome
[PUBLIC] General Chit Chat HAPPY BIRTHDAY WOODY 4 41535 2016/12/25 21:56 RenownedWolfman
[PUBLIC] General Chit Chat Happy New Year! 5 44633 2016/12/25 21:55 RenownedWolfman
[PUBLIC] General Chit Chat Admin Applications? 3 38623 2016/12/16 5:26 theblade009
[PUBLIC] Applications & Recruitment CorkyT's Application 1 27945 2016/12/16 5:24 theblade009
[PUBLIC] General Chit Chat Happy Birthday Buzz!!!! 2 33385 2016/12/16 5:18 theblade009
[PUBLIC] General Chit Chat Wolf Pack Clan Application 9 52633 2016/12/16 5:17 theblade009
[PUBLIC] Games GTA 5 cars 1 29403 2016/2/20 0:33 Buzz
[PUBLIC] General Chit Chat HAPPY BIRTHDAY WEBLEY!! 1 34799 2016/1/17 15:09 Tic
[PUBLIC] General Chit Chat Merry Christmas !!!!! 1 33940 2015/12/25 22:07 Buzz
[PUBLIC] General Chit Chat HAPPY BELATED BIRTHDAY TO TIC!!!! 2 35021 2015/11/29 18:40 Oaksy
Killing floor Killing Floor 2 servers    [1][2] 11 72381 2015/11/29 17:17 Buzz