| RuneStorm http://www.runestorm.com/forums/ |
|
| BW Idea Requests http://www.runestorm.com/forums/viewtopic.php?f=63&t=75609 |
Page 1 of 2 |
| Author: | Unreaity [ Wed Jan 13, 2010 8:41 pm ] |
| Post subject: | BW Idea Requests |
This Forum has moved to BWC Projects Link: Ballistic Reality Weapon Pack For BW packs 1. Crossbow (you can pickup the arrows like with the X3 knife) 2. AK-47 3. Dragunov Sniper Rifle 4. Remote Toxic Grenade 5. Skirth Minigun 6. Range-finder (binoculars with displays in the sight telling you how far away something is) 7. Golden Rifle 8. AW50 Anti Matériel Rifle (if you don't know what it is here is a link: http://www.accuracyinternational.com/AW50.php ) 9. Stoner 63 10. VSS Vintorez 11. FN Minimi 12. G36 13. Bor Rifle 14. CheyTac Intervention 15. MG42 16. M60 17. FN MAG 18. FN FNC Options 1. For some of the sniper rifles in BW, could someone make something so you can get (pickup) different sights for rifles, like a wider view, or a stronger zoom. 2. Weapons can be damaged by being shot, causing it to be less accurate, or jam and cease to work all together. 3. When a player is hit somewhere like in the leg, that player won't be able to move with as much agility as before, and limp slightly, or for an arm-shot his/her aim might be slightly off. 4. Grenades explode when shot. (this one would be simple, just add a TakeDamage state to the grenade projectile) 5. When a gun shoots long distance(Like with a sniper), then the farther away the target is the more the bullet will fall, so the shooter must adjust his aim for the distance. 6. Other types of ammunition for some weapons, like for shotguns you can find incendiary rounds. 7. You can find add-ons for some weapons like the M50 you could find a laser sight, or for some guns you could get things like drum-clips. 8. Bullets can take damage and be thrown off by being hit by other bullets. 9. Bullets are affected by wind. 10. Karma, say you shoot someone on your team and kill him, and then suddenly your gun jams, or your sight for your rifle breaks. 11. Bullets can ricochet and still cause damage. Other since the developers of BW are good with animations, is there anyway of building replicas of the UT3 weapons for UT2004 with similar animations made by Runestorm developers, with similar rates of fire and damage per hit? The Ones That Are In Progress: 1. AK47 2. Crossbow 3. CheyTac Intervention |
|
| Author: | Sgt. Kelly [ Wed Jan 13, 2010 9:51 pm ] |
| Post subject: | Re: BW Idea Requests |
If you can supply me with animated models I can get these ingame. |
|
| Author: | ChaosMarine [ Thu Jan 14, 2010 6:58 am ] |
| Post subject: | Re: BW Idea Requests |
The Dragunov has some really bad recoil. |
|
| Author: | Unreaity [ Fri Jan 15, 2010 6:20 pm ] |
| Post subject: | Re: BW Idea Requests |
i am on a Mac, it would take me several months to make animations for them, but i could make the Unrealscript source code in maybe a month. the program that i made to do this is one that i made myself and it won't do animations, only .ini .int .u .uc .ucl and thats it. |
|
| Author: | TurdDrive [ Sat Jan 16, 2010 5:08 am ] |
| Post subject: | Re: BW Idea Requests |
I could have a go at modelling some of then (not including Skinning Animation) |
|
| Author: | Unreaity [ Sat Jan 16, 2010 11:16 am ] |
| Post subject: | Re: BW Idea Requests |
TurdDrive wrote: I could have a go at modelling some of then (not including Skinning Animation) Please do which ones would you do though, please tell me so I can start on the Unrealscript files. |
|
| Author: | TurdDrive [ Sat Jan 16, 2010 11:28 am ] |
| Post subject: | Re: BW Idea Requests |
The cross bow seems to be the one I could give an unique touch to so The crossbow |
|
| Author: | Unreaity [ Sat Jan 16, 2010 11:46 am ] |
| Post subject: | Re: BW Idea Requests |
TurdDrive wrote: The cross bow seems to be the one I could give an unique touch to so The crossbow okay I'll start with the code I'll add something so you can pickup the arrow you shot as ammo please post to tell me what to put in for the animation name |
|
| Author: | Unreaity [ Sat Jan 16, 2010 1:37 pm ] |
| Post subject: | Re: BW Idea Requests |
here is the start of the Unrealscript file, there are some blank spots because i still need to get some more info on the animation but here is some of it if there are any errors please tell me Code: //============================================================================= // Crossbow Weapon //============================================================================= class BWCross extends BallisticWeapon; #exec OBL LOAD File=*** var bool bShootingArrow; var() name ArrowBackAnim; var() name ArrowShotAnim; var float NextShotTime; simulated event AnimEnd (int Channel) { local name anim; local float frame, rate; GetAnimParams(0, anim, frame, rate); if (anim == 'PrepShoot' && bShootingArrow) return; super.AnimEnd(Channel); } //simulated function DoWeaponSpecial(optional byte i) exec simulated function WeaponSpecial(optional byte i) { if (AmmoAmount(0) < 1 || Level.TimeSeconds < NextShootTime || bShootingArrow) return; PlayAnim('PrepThrow'); bShootingArrow=true; ServerWeaponSpecial(i); } function ServerWeaponSpecial(optional byte i) { bShootingArrow=true; } //simulated function DoWeaponSpecialRelease(optional byte i) exec simulated function WeaponSpecialRelease(optional byte i) { if (!bShootingArrow || AmmoAmount(0) < 1 || Level.TimeSeconds < NextShotTime) return; PlaySound(Sound'{*********}',,1.0,,32,,); if (level.NetMode == NM_Client) PlayAnim('Shoot', 1.5); ServerWeaponSpecialRelease(i); } function ServerWeaponSpecialRelease(optional byte i) { PlayAnim('Shoot'); } simulated function Notify_BWCrossShoot() { ShootArrow(); SetBoneScale(0, 0.0, 'Knife'); } simulated function ShootArrow() { bShootingArrow=false; NextShotTime = Level.TimeSeconds + 0.15; if (Role == ROLE_Authority) { super.ConsumeAmmo(0, 1); DoFireEffect(); } } // Get aim then spawn projectile function DoFireEffect() { local Vector StartTrace, X, Y, Z, Start, End, HitLocation, HitNormal; local Rotator RAim; local actor Other; local Projectile Proj; GetViewAxes(X,Y,Z); // the to-hit trace always starts right in front of the eye Start = Instigator.Location + Instigator.EyePosition(); StartTrace = Start + X*10; if (!WeaponCentered()) StartTrace = StartTrace + Hand * Y*10 + Z*0; RAim = BFireMode[0].GetFireAim(StartTrace); RAim = Rotator(BFireMode[0].GetFireSpread() >> RAim); End = Start + (Vector(RAim)*2000); Other = Trace (HitLocation, HitNormal, End, Start, true); if (Other != None) RAim = Rotator(HitLocation-StartTrace); Proj = Spawn (class'BWArrowProjectile',,, StartTrace, RAim); Proj.Instigator = Instigator; } simulated function Notify_ArrowOutOfSight() { SetBoneScale(0, 1.0, 'Arrow'); } simulated function bool HasAmmo() { return true; } //simulated function bool ConsumeAmmo(int Mode, float Load, optional bool bAmountNeededIsMax) { return true; } //function ConsumeAmmo(int Mode, float Load) { } // AI Interface ===== function bool CanAttack(Actor Other) { return true; } // choose between regular or alt-fire function byte BestMode() { local Bot B; local float Result; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return 0; if (VSize(B.Enemy.Location - Instigator.Location) > FireMode[0].MaxRange()*1.5) return 1; Result = FRand(); if (vector(B.Enemy.Rotation) dot Normal(Instigator.Location - B.Enemy.Location) < 0.0) Result += 0.3; else Result -= 0.3; if (Result > 0.5) return 1; return 0; } function float GetAIRating() { local Bot B; local float Result, Dist; local vector Dir; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return AIRating; Dir = B.Enemy.Location - Instigator.Location; Dist = VSize(Dir); Result = AIRating; // Enemy too far away if (Dist > 1500) return 0.1; // Enemy too far away // Better if we can get him in the back if (vector(B.Enemy.Rotation) dot Normal(Dir) < 0.0) Result += 0.08 * B.Skill; // If the enemy has a knife too, a gun looks better if (B.Enemy.Weapon != None && B.Enemy.Weapon.bMeleeWeapon) Result = FMax(0.0, Result *= 0.7 - (Dist/1000)); // The further we are, the worse it is else Result = FMax(0.0, Result *= 1 - (Dist/1000)); return Result; } // tells bot whether to charge or back off while using this weapon function float SuggestAttackStyle() { if (AIController(Instigator.Controller) == None) return 0.5; return AIController(Instigator.Controller).Skill / 4; } // tells bot whether to charge or back off while defending against this weapon function float SuggestDefenseStyle() { local Bot B; local float Result, Dist; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return -0.5; Dist = VSize(B.Enemy.Location - Instigator.Location); Result = -1 * (B.Skill / 6); Result *= (1 - (Dist/1500)); return FClamp(Result, -1.0, -0.3); } // End AI Stuff ===== defaultproperties { PlayerSpeedFactor=1.150000 TeamSkins(0)=(RedTex=Shader'',BlueTex=Shader'') BigIconMaterial=Texture'BallisticUI2.Icons.BigIcon_X3' BCRepClass=Class'' InventorySize=10 SpecialInfo(0)=(Info="0.0;-999.0;-999.0;-1.0;-999.0;-999.0;-999.0") BringUpSound=(Sound=Sound'') PutDownSound=(Sound=Sound'') MagAmmo=1 bNoMag=True WeaponModes(0)=(bUnavailable=True,ModeID="WM_None") WeaponModes(1)=(bUnavailable=True) WeaponModes(2)=(bUnavailable=True) CurrentWeaponMode=0 bUseSights=True CrosshairCfg=(Pic1=Texture'BallisticUI2.Crosshairs.X3OutA',Pic2=Texture'BallisticUI2.Crosshairs.X3InA',USize1=256,VSize1=256,USize2=256,VSize2=256,Color1=(R=0,A=192),Color2=(B=255,A=192),StartSize1=103,StartSize2=87) CrosshairInfo=(SpreadRatios=(X1=0.250000,Y1=0.375000,X2=1.000000,Y2=1.000000),MaxScale=8.000000) GunLength=0.000000 bAimDisabled=True FireModeClass(0)=Class'' FireModeClass(1)=Class'' PutDownTime=0.500000 BringUpTime=0.500000 SelectForce="SwitchToAssaultRifle" AIRating=0.200000 CurrentRating=0.200000 bMeleeWeapon=False Description="" Priority=36 CenteredOffsetY=7.000000 CenteredRoll=0 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross1" PickupClass=Class'' PlayerViewOffset=(X=5.000000,Y=7.000000,Z=-8.000000) PlayerViewPivot=(Yaw=32768) BobDamping=1.700000 AttachmentClass=Class'' IconMaterial=Texture'' IconCoords=(X2=127,Y2=31) ItemName="Crossbow" Mesh=SkeletalMesh'' DrawScale=0.300000 } //============================================================================= // Crossbow Attatchment //============================================================================= class BWCrossAttachment extends BallisticAttachment; defaultproperties { ImpactManager=Class'' BrassMode=MU_None InstantMode=MU_Both FlashMode=MU_None LightMode=MU_None TrackAnimMode=MU_Both WaterTracerClass=Class'' bHeavy=True Mesh=SkeletalMesh'' DrawScale=0.110000 } //============================================================================= // BWCrossPickup. //============================================================================= class BWCrossPickup extends BallisticWeaponPickup placeable; #exec OBJ LOAD FILE= #exec OBJ LOAD FILE= #exec OBJ LOAD FILE= simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Texture''); Level.AddPrecacheMaterial(Texture''); Level.AddPrecacheMaterial(Texture''); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh''); Level.AddPrecacheStaticMesh(StaticMesh''); } defaultproperties { LowPolyStaticMesh=StaticMesh'' PickupDrawScale=0.250000 InventoryType=Class'' RespawnTime=10.000000 PickupMessage="You picked up a Crossbow" PickupSound=Sound'' StaticMesh=StaticMesh'' Physics=PHYS_None DrawScale=0.450000 CollisionHeight=4.000000 } //============================================================================= // BWCrossProjectile. //============================================================================= class BWCrossProjectile extends BallisticProjectile; var bool bStuckInWall; var bool bHitPlayer; simulated function InitProjectile () { SetTimer(0.1, false); super.InitProjectile(); } simulated event Timer() { super.Timer(); bFixedRotationDir = True; RotationRate.Pitch = -100000; } simulated function ProcessTouch (Actor Other, vector HitLocation) { if (Other == None) return; if (bStuckInWall) { if (Pawn(Other) != None) TakeBack(Pawn(Other)); return; } else if (Other == Instigator || Other == Owner) return; if (bHitPlayer) return; if (Role == ROLE_Authority) DoDamage(Other, HitLocation); bHitPlayer = true; // SetLocation(HitLocation + (HitLocation-Other.Location) * 2) SetLocation(HitLocation); Velocity = Normal(HitLocation-Other.Location)*100; } function TakeBack(Pawn Other) { local Ammunition Ammo; local Weapon newWeapon; local int AmmoAmount; if (!bStuckInWall || !Other.bCanPickupInventory) return; Ammo = Ammunition(Other.FindInventoryType(class'Ammo_Knife')); if(Ammo == None) { Ammo = Spawn(class'Ammo_Knife'); Other.AddInventory(Ammo); } AmmoAmount = Ammo.AmmoAmount; Ammo.UseAmmo(9999, true); if(Other.FindInventoryType(class'BWCross')==None) { newWeapon = Spawn(class'BWCross',,,Other.Location); if( newWeapon != None ) { newWeapon.GiveTo(Other); newWeapon.ConsumeAmmo(0, 9999, true); } } /* Ammo = Ammunition(Other.FindInventoryType(class'Ammo_Knife')); if(Ammo == None) { Ammo = Spawn(class'Ammo_Knife'); Other.AddInventory(Ammo); } */ Ammo.AddAmmo(AmmoAmount + 1); Ammo.GotoState(''); if (PlayerController(Other.Controller) != None) PlayerController(Other.Controller).ClientPlaySound(class'BWCrossPickup'.default.PickupSound); Destroy(); } simulated event Landed( vector HitNormal ) { HitWall( HitNormal, None ); } simulated singular function HitWall(vector HitNormal, actor Wall) { local int Surf; if (bStuckInWall) return; if (Wall != None && !Wall.bWorldGeometry && !Wall.bStatic) { if (Role == ROLE_Authority && !bHitPlayer) DoDamage(Wall, Location); if (Mover(Wall) == None) { bHitPlayer = true; Velocity = HitNormal*100; return; } } SetRotation(Rotator(Velocity)/*+rot(32768,0,0)*/); OnlyAffectPawns(true); SetCollisionSize(40, 40); SetPhysics(PHYS_None); bFixedRotationDir=false; bStuckInWall=true; bHardAttach=true; CheckSurface(Location, HitNormal, Surf, Wall); LifeSpan=20.0; if (Wall != None) SetBase(Wall); if (Level.NetMode != NM_DedicatedServer && ImpactManager != None && /*(!Level.bDropDetail) && (Level.DetailMode != DM_Low) && */EffectIsRelevant(Location,false)) ImpactManager.static.StartSpawn(Location, HitNormal, Surf, self); } function UsedBy(Pawn User) { TakeBack(User); } defaultproperties { ImpactManager=Class'BallisticV21.IM_KnifeThrown' bRandomStartRotaion=False bUsePositionalDamage=True DamageRange=(Min=50.000000,Max=1000.000000) DamageRangeHead=(Min=100.000000,Max=100000.000000) DamageRangeLimb=(Min=30.000000,Max=45.000000) DamageTypeHead=Class'' bWarnEnemy=False Speed=30000.000000 Damage=50.000000 MyDamageType=Class'' StaticMesh=StaticMesh'' bNetTemporary=False Physics=PHYS_Falling LifeSpan=0.000000 DrawScale=0.150000 bUnlit=False } //============================================================================= // BWCross Second Fire // i might not use this at all... //============================================================================= class BWCrossSecondaryFire extends BallisticMeleeFire; simulated function bool AllowFire() { if (level.TimeSeconds > X3Knife(Weapon).NextThrowTime) return super.AllowFire(); return false; } event ModeDoFire() { if (FRand() > 0.5) { PreFireAnim = 'BigBack1'; FireAnim = 'BigStab1'; } else { PreFireAnim = 'BigBack2'; FireAnim = 'BigSlash1'; } Super.ModeDoFire(); } simulated function bool HasAmmo() { return true; } defaultproperties { SwipePoints(0)=(offset=(Pitch=4000,Yaw=2000)) SwipePoints(1)=(offset=(Yaw=1000)) SwipePoints(2)=(offset=(Pitch=0,Yaw=0)) SwipePoints(3)=(Weight=4,offset=(Pitch=-2000,Yaw=-1000)) SwipePoints(4)=(Weight=2,offset=(Pitch=-4000)) SwipePoints(5)=(Weight=-1,offset=(Pitch=0,Yaw=0)) SwipePoints(6)=(Weight=-1,offset=(Pitch=0,Yaw=0)) WallHitPoint=2 TraceRange=(Min=96.000000,Max=96.000000) Damage=(Min=50.000000,Max=100.000000) DamageHead=(Min=100.000000,Max=120.000000) DamageLimb=(Min=20.000000,Max=50.000000) DamageType=Class'' DamageTypeHead=Class'' DamageTypeArm=Class'' KickForce=100 HookStopFactor=1.700000 HookPullForce=100.000000 bReleaseFireOnDie=False BallisticFireSound=(Sound=SoundGroup'',Radius=32.000000,bAtten=True) bAISilent=True bFireOnRelease=True PreFireAnim="BigBack1" FireAnim="BigStab1" FireRate=0.300000 AmmoClass=Class'' AmmoPerFire=0 ShakeRotMag=(X=64.000000,Y=128.000000) ShakeRotRate=(X=2500.000000,Y=2500.000000,Z=2500.000000) ShakeRotTime=2.500000 BotRefireRate=0.800000 WarnTargetPct=0.050000 } it is similar to the X3 code because of how it works |
|
| Author: | TurdDrive [ Sun Jan 17, 2010 5:19 am ] |
| Post subject: | Re: BW Idea Requests |
Unreaity wrote: TurdDrive wrote: The cross bow seems to be the one I could give an unique touch to so The crossbow okay I'll start with the code I'll add something so you can pickup the arrow you shot as ammo please post to tell me what to put in for the animation name Animation? I'm not doing that. just the moddel >:oo:< also Scoped or non - scoped also what can ut2k4 have as poly count goes? |
|
| Author: | Unreaity [ Sun Jan 17, 2010 11:05 am ] |
| Post subject: | Re: BW Idea Requests |
TurdDrive wrote: Unreaity wrote: TurdDrive wrote: The cross bow seems to be the one I could give an unique touch to so The crossbow okay I'll start with the code I'll add something so you can pickup the arrow you shot as ammo please post to tell me what to put in for the animation name Animation? I'm not doing that. just the moddel >:oo:< also Scoped or non - scoped also what can ut2k4 have as poly count goes? do non-scoped, ?poly count? never heard of it... |
|
| Author: | TurdDrive [ Sun Jan 17, 2010 2:55 pm ] |
| Post subject: | Re: BW Idea Requests |
Poly count it the number of Verticals. and ut2k4 cant handle allot . i think? |
|
| Author: | Unreaity [ Sun Jan 17, 2010 4:15 pm ] |
| Post subject: | Re: BW Idea Requests |
TurdDrive wrote: Poly count it the number of Verticals. and ut2k4 cant handle allot . i think? i'm not sure |
|
| Author: | Captain Xavious [ Mon Jan 18, 2010 1:50 pm ] |
| Post subject: | Re: BW Idea Requests |
I'd say keep the polycount under 10,000 and you should be safe. |
|
| Author: | TurdDrive [ Mon Jan 18, 2010 1:59 pm ] |
| Post subject: | Re: BW Idea Requests |
Lol ok. I was thinking that maybe the Bow and the 'twangy thing' is going to be hard to animate and i don't know how to model that for an animator? |
|
| Author: | Captain Xavious [ Mon Jan 18, 2010 2:33 pm ] |
| Post subject: | Re: BW Idea Requests |
I have been wondering that myself as well. My guess would be to make a cylinder and have it sectioned off in regular intervals, about 5 or so sections should be about right, but I'm kinda guessing here. |
|
| Author: | TurdDrive [ Mon Jan 18, 2010 2:39 pm ] |
| Post subject: | Re: BW Idea Requests |
Same here. |
|
| Author: | Unreaity [ Fri Jan 29, 2010 7:31 pm ] |
| Post subject: | Re: BW Idea Requests |
so is it possible that one of the RuneStorm Developers could do the animation for the crossbow? |
|
| Author: | ChaosMarine [ Fri Jan 29, 2010 7:45 pm ] |
| Post subject: | Re: BW Idea Requests |
Wouldn't it be easier to ask to use the animation for the ChaosUT crossbow? |
|
| Author: | Captain Xavious [ Fri Jan 29, 2010 10:53 pm ] |
| Post subject: | Re: BW Idea Requests |
No, the RS developers won't make animations for us, they're busy working on their own stuff. And why bother trying to use the Chaos UT anims? We could do way better. By the way, I'll probably try animating a crossbow if someone models it. |
|
| Author: | TurdDrive [ Sat Jan 30, 2010 2:44 am ] |
| Post subject: | Re: BW Idea Requests |
I'm Modelling it but i have hit a wall. I want to make it easier for the next person to animathard to do.e/texture/watever but is looking quite |
|
| Author: | Captain Xavious [ Sat Jan 30, 2010 5:51 pm ] |
| Post subject: | Re: BW Idea Requests |
hmm... I'm not quite sure what you said there, but don't worry on my account for the crossbow, I've ran through enough problems to know how to fix them already. I can handle it. |
|
| Author: | TurdDrive [ Sat Jan 30, 2010 6:18 pm ] |
| Post subject: | Re: BW Idea Requests |
TurdDrive wrote: I'm Modelling it but i have hit a wall. I want to make it easier for the next person to animathar/texture/watever but is looking quite hard to do i meant to say animator not animathard tehe |
|
| Author: | Unreaity [ Fri Feb 05, 2010 6:58 pm ] |
| Post subject: | Re: BW Idea Requests |
I am going to start working on some of the other weapons UnrealScript codes and I will post either a link to download the .uc files (which will be in .zip format) or the actual code. I will start with the CheyTac and the AK47 |
|
| Author: | Unreaity [ Fri Feb 05, 2010 11:06 pm ] |
| Post subject: | Re: BW Idea Requests |
what do you think would be an accurate recoil factor for the VSS RecoilYawFactor=? RecoilXFactor=? RecoilYFactor=? |
|
| Author: | Sgt. Kelly [ Sat Feb 06, 2010 1:38 am ] |
| Post subject: | Re: BW Idea Requests |
RecoilYawFactor=0.400000 RecoilXFactor=0.300000 RecoilYFactor=0.200000 Those are my pack's VSK values. |
|
| Author: | Unreaity [ Sat Feb 06, 2010 9:53 am ] |
| Post subject: | Re: BW Idea Requests |
Sgt. Kelly wrote: RecoilYawFactor=0.400000 RecoilXFactor=0.300000 RecoilYFactor=0.200000 Those are my pack's VSK values. thank you
|
|
| Author: | Unreaity [ Sat Feb 06, 2010 5:12 pm ] |
| Post subject: | Re: BW Idea Requests |
Hey I'm going to make a post in the BW Projects area about this, and when its finished I'll post it as a weapon pack in UT2k4 Ballistic Mods. in the projects area it will be as Ballistic Reality Weapon Pack |
|
| Author: | ChaosMarine [ Sat Feb 06, 2010 5:18 pm ] |
| Post subject: | Re: BW Idea Requests |
I found out earlier today that the FN MAG is based off of the BAR. |
|
| Author: | Sgt. Kelly [ Sat Feb 06, 2010 5:20 pm ] |
| Post subject: | Re: BW Idea Requests |
Yep, though it has parts from the other older guns (MG42) as well. The US calls that one the M240, I believe. |
|
| Page 1 of 2 | All times are UTC - 6 hours |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|