1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Two Factor Authentication is now available on BeyondUnreal Forums. To configure it, visit your Profile and look for the "Two Step Verification" option on the left side. We can send codes via email (may be slower) or you can set up any TOTP Authenticator app on your phone (Authy, Google Authenticator, etc) to deliver codes. It is highly recommended that you configure this to keep your account safe.

New mutator idea for coders (easy one i guess)

Discussion in 'Infiltration Development' started by Lemon.fr, Mar 21, 2006.

  1. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    Since WP1.4 been released im looking for a mutator that affect the lights on maps and i found few some:

    MoodLighting
    This one doesn't provide so much things to do on lights (only colors), cannot be used on network games...
    http://www.tinkab3ll.com/files/unrealtournament/Mutators/Unsorted/moodlighting.zip

    LightFX
    Really nice one, but unfortunately it's not made for network games (no replication) and it doesn't store the defaultproperties into an ini, i sent a mail to the coder but i have no answer...
    http://www.tinkab3ll.com/files/unrealtournament/Mutators/Unsorted/lightfx.zip

    So i use EavyDarkmatch3 mutator on Riviera server, but its more a gametype, it only set the lightsradius to zero so the map is pitch black which sucks, plus it spawns a flashlight to players (very powerful one btw...not realistic)

    I would code it myself but im really noob at UTscript, my wish is a mutator which provides same things as LightFX, but with replication for online games and settings into an ini, i think it's not difficult to do (imo...)

    Looking at the LightFX scripts, it looks really easy to alter the lights :

    Code:
    class Light_FX expands Mutator;
    
    var bool Initialized;
    var byte RandomShift;
    
    //Dialog Variables
    var byte ColorEffect;
    var byte HueShift;
    var bool RandomHue;
    var byte SaturationChange;
    var byte Brightness;
    var byte AmbientChange;
    var byte Effect;
    
    function PostBeginPlay()
    {
    	if (Initialized)
    		return;
    	Initialized = True;
    	if (RandomHue)
    		HueShift = 16 + Rand (223);
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
    	if ( Other.IsA('ZoneInfo'))
    	{
    		switch (AmbientChange)
    		{
    			case 0:
    				break;
    			case 1:
    				ZoneInfo(Other).AmbientBrightness = 0;
    				break;
    			case 2:
    				switch (ColorEffect)
    				{
    					//None
    					case 0:
    						break;
    					//Solid Color
    					case 1:
    					case 2:
    						ZoneInfo(Other).AmbientHue = HueShift;
    						break;
    					//Color Shift
    					case 3:
    						ZoneInfo(Other).AmbientHue = (ZoneInfo(Other).AmbientHue + HueShift) % 256;		
    						break;
    					//Rainbow Colors
    					case 4:
    						ZoneInfo(Other).AmbientHue = (ZoneInfo(Other).AmbientHue + Rand(256)) % 256;		
    						break;
    				}
    
    		}
    
    	//	zoneInfo(Other).bFogZone=zoneInfo(Other).bFogZone;
    	}
    	if ( Other.IsA('Light'))
    	{
    
    		switch (ColorEffect)
    		{
    			//None
    			case 0:
    				break;
    			//Solid Color
    			case 1:
    				Other.LightHue = HueShift;
    				break;
    			//Color Range
    			case 2:
    				Other.LightHue = (HueShift + (Other.LightHue / 4)) % 256;
    				break;
    			//Color Shift
    			case 3:
    				Other.LightHue = (Other.LightHue + HueShift) % 256;		
    				break;
    			//Rainbow Colors
    			case 4:
    				Other.LightHue = (Other.LightHue + Rand(256)) % 256;		
    				break;
    		}
    
    		switch (SaturationChange)
    		{
    			
    			case 0:		//Default
    				break;
    			case 1:		//None
    				Other.LightSaturation = 255;
    				break;
    			case 2:		//50%
    				Other.LightSaturation = (Other.LightSaturation * 2) % 256;
    				break;
    			case 3:		//150%
    				Other.LightSaturation = (Other.LightSaturation / 1.5);
    				break;
    			case 4:		//200%
    				Other.LightSaturation = (Other.LightSaturation / 2);
    				break;
    			case 5:		//300%
    				Other.LightSaturation = (Other.LightSaturation / 3);
    				break;
    			case 6:		//MAX
    				Other.LightSaturation = 0;
    				break;
    		}
    		switch (Brightness)
    		{
    			
    			case 0:		//Default
    				break;
    			case 1:		//None
    				Other.LightBrightness = 0;
    				break;
    			case 2:		//50%
    				Other.LightBrightness /= 2;
    				break;
    			case 3:		//150%
    				Other.LightBrightness = (Other.LightBrightness * 1.5) % 256;
    				break;
    			case 4:		//200%
    				Other.LightBrightness = (Other.LightBrightness * 2) % 256;
    				break;
    			case 5:		//300%
    				Other.LightBrightness = (Other.LightBrightness * 3) % 256;
    				break;
    			case 6:		//MAX
    				Other.LightBrightness = 255;
    				break;
    		}
    		if (Effect < 19)
    			Other.LightEffect = GetLightEffect(Effect);
    		else
    			Other.LightEffect = GetLightEffect(Rand(18));
    		//Other.LightEffect = NewEffect;
    		//Other.LightRadius /= 2;
            //Other.LightBrightness = 255;
    		//if (Other.LightBrightness > 255)
            //   		Other.LightBrightness = 255;
    		//Other.LightEffect = LE_Disco;
    		
    	}
    	return true; 
    }
    
    function SetHueShift (byte newval)
    {
    	HueShift = newval;
    }
    
    function byte GetHueShift ()
    {
    	return HueShift;
    }
    
    
    function ELightEffect GetLightEffect (int num)
    {
    	switch (num)
    	{
    		case 0:
    			return LE_NONE;
    		case 1:
    			return LE_TorchWaver;
    		case 2:
    			return LE_FireWaver;
    		case 3:
    			return LE_WateryShimmer;
    		case 4:
    			return LE_SearchLight;
    		case 5:
    			return LE_SlowWave;
    		case 6:
    			return LE_FastWave;
    		case 7:
    			return LE_CloudCast;
    		case 8:
    			return LE_StaticSpot;
    		case 9:
    			return LE_Shock;
    		case 10:
    			return LE_Disco;
    		case 11:
    			return LE_Warp;
    		case 12:
    			return LE_SpotLight;
    		case 13:
    			return LE_NonIncidence;
    		case 14:
    			return LE_Shell;
    		case 15:
    			return LE_OmniBumpMap;
    		case 16:
    			return LE_InterFerence;
    		case 17:
    			return LE_Cylinder;
    		Case 18:
    			return LE_Rotor;
    
    	}
    	return LE_None;
    }
    
    defaultproperties
    {
    }
    Yes, it also affects the ZonesInfos ambient lights (needed i guess)
    In this class i would change the properties possible values, would be better to set the value from 0 to 255 and no predefined values like 100% 200% etc...
    Why not random values for each properties from a range set, like:
    Into INI:
    BrightnessMin=125
    BrightnessMax=255
    Then into class something like :
    Other.LightBrightness = BrightnessMin + Rand(BrightnessMax - BrightnessMin)

    Another thing that would be cool is a "per map settings" into the ini like:

    [INF_LightFX]
    Map[0]=Mostar.unr
    BrightnessMin[0]=190
    BrightnessMax[0]=250

    Map[1]=RealManor.unr
    BrightnessMin[1]=5
    BrightnessMax[1]=30

    I think it could really change the known maps gameplay, just imagine...
    Plus since the IMT Night Vision we won't fear the darkness anymore ;)

    It only needs replication and properties into an ini !

    Crowze ? Geogob ? whoever, what do you think of it ?
     

    Attached Files:

    Last edited: Mar 21, 2006
  2. geogob

    geogob Koohii o nomimasu ka?

    Joined:
    Mar 11, 2000
    Messages:
    4,148
    Likes Received:
    0
    Basically, what you want to do is the same thing my night vision does but the other way around :p

    I'll think about it. If I give you the magical replication solution for light_FX and server_side mutator, would you be fine?
     
  3. UN17

    UN17 Taijutsu Specialist

    Joined:
    Dec 7, 2003
    Messages:
    675
    Likes Received:
    0
    You're still going to run into a lot of uglyness with maps that use the bUnlit flag. But I guess you're not a very picky person :) Since I'm picky, I'd rather edit maps manually and release a proper night map pack instead of hack the lights on the go. :p

    Good luck though!
     
  4. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    If you are ready to help me Geo, i would try to script my first mutator myself :)
    I will post my code here so you could comment it, i know OOP from PHP but for sure i think i will need your help for the magical replication thingy, about the ini read part i will look into some other mutators how they do it, i have all the needed links i think (UnrealWiki, etc..).
     
  5. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
  6. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    Hmm how do i retrieve the current map (name.unr) from my class ?
     
  7. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    oh yea!

    I did it ! :D :D :D

    Im so proud of my first try on Unrealscript, let you test it, consider it stills beta

    PHP:
    /*
    INF_LightFX mutator by Nicolas JULIEN aka Lemon.fr
    Inspired from the LightFX mutator by Shamus Young


    Current Version: 0.1
    */

    class INF_LightFX extends Mutator
        Config
    (INF_LightFX);

    var 
    bool Initialized// seems to be needed, dunno why yet =)

    struct INF_LightFX_myFX {
        var 
    config string Mapname;        // the map on which i will act: "themapname.unr"
        
    var config bool DoFX;            // Do i affect map ? (general muty on/off for each map or 'allOtherMaps'
        
    var config bool AlterHue;        // Do i alter lights colors ? (general On/Off for colors (Hue) alterations
        
    var config bool ShiftHue;        // Define HueMin & HueMax behavior: IF True THEN LightHue = LightHue + (RANDom range min to max) ELSE LightHue=(RANDom range from LighHue-HueMin to LightHue+HueMax)
        
    var config byte HueMin;            // For RANDom range set
        
    var config byte HueMax;            // For RANDom range set
        
    var config bool AlterBrightness;    // Same as Hue but for Brightness...
        
    var config bool ShiftBrightness;
        var 
    config byte BrightnessMin;
        var 
    config byte BrightnessMax;
        var 
    config bool AlterSaturation;    // Same as Hue but for Saturation...
        
    var config bool ShiftSaturation;
        var 
    config byte SaturationMin;
        var 
    config byte SaturationMax;
        var 
    config bool AlterType;        // Do i alter lights Types ? (general On/Off for LightType)
        
    var config enum EmyTypes{
            
    Steady,        // The light is constant; it does not animate. Default setting. Note that the light quickly fades to into the shadow umbra.
            
    Pulse,        // A "heavily" pulsating light.
            
    Blink,        // Randomly turns light off for a split second.
            
    Flicker,    // Randomly turns light on/off at random intervals.
            
    Strobe,        // Fast switching between light on and off.
            
    BackDrop,    // ?
            
    SubtlePulse,    // As Pulse but less "deep".
            
    Random        // ->Random from previous types
            
    Type;        // LightTypes
        
    var config bool AlterEffect;    // Do i alter Effects ? (general On/Off for LightEffect
        
    var config enum EmyEffects{
            
    TorchWaver,    // Makes the light shimmer a little, ideal when used in conjunction with animated flames (such as in the GreatFire texture package).
            
    FireWaver,    // As the TorchWaver but more "drastic". Best when used with large-scale flame animations.
            
    WateryShimmer,    // Also like the TorchWaver but more wave and glimmer feel. Best if used with water animated textures.
            
    SearchLight,    // A rotating spotlight (Adjust speed with LightPeriod).
            
    SlowWave,    // A wave that starts from the middle and flows out.
            
    FastWave,    // As SlowWave but at a faster rate.
            
    CloudCast,    // ?
            
    StaticSpot,    // ?
            
    Shock,        // A small pulsating light, fast up and slowly down.
            
    Disco,        // Think disco ball rotating glittering light specs.
            
    Warp,        // ?
            
    Spotlight,    // Simply a spotlight (set bDirectional).
            
    NonIncidence,    // Makes the light stronger and reduce the amount of shadow umbra.
            
    Shell,        // lights the actual LightRadius (a hollow sphere).
            
    OmniBumpMap,    // This a light that only light up actors (players) and not the geometry.
            
    Interference,    // Light waves that goes from bottom to the top.
            
    Cylinder,    // Creates a light cylinder instead of a standard sphere.
            
    Rotor,        // Like Interference but moves sideways instead, like a fan.
            
    Random,        // -> Random from previous
            
    Effect;    // LightEffect
    };

    var 
    config INF_LightFX_myFX OnAllOtherMaps;
    var 
    config INF_LightFX_myFX OnMap[32];
    var 
    INF_LightFX_myFX OnThis;

    function 
    PostBeginPlay()
    {
        if (
    Initialized)
            return;
        
    Initialized True;
    }

    function 
    bool CheckReplacement(Actor Otherout byte bSuperRelevant) { 
        
    // Assign wanted settings to temp struct OnThis ***************
        /*
        // Still don't know how to retrieve the current map name so i assign for all maps
        for (i=0; i<ArrayCount(OnMap);i++) {
            If (OnMap[i].Mapname==?currentmapname?) {
                OnThis=OnMap[i];
                break;}
            Else { OnThis=OnAllOtherMaps; }
        }
        */
        
    OnThis=OnAllOtherMaps// so...
        
        
    if (OnThis.DoFX) { // Do i alter this map ?
            // Alter ZoneInfos Ambients **************
            
    if ( Other.IsA('ZoneInfo')) { //ZoneInfo(Other).AmbientBrightness
                
    If (OnThis.AlterHue) { // Do i alter Hue
                    
    if (OnThis.ShiftHue) { // Shift from default
                        
    ZoneInfo(Other).AmbientHue = (ZoneInfo(Other).AmbientHue + ( OnThis.HueMin+Rand(OnThis.HueMax-OnThis.HueMin))) % 256;
                    }
                    Else { 
    ZoneInfo(Other).AmbientHue = (OnThis.HueMin+Rand(OnThis.HueMax-OnThis.HueMin)) % 256; }
                }
                If (
    OnThis.AlterBrightness) { // Do i alter Brightness
                    
    if (OnThis.ShiftBrightness) { // Shift from default
                        
    ZoneInfo(Other).AmbientBrightness = (ZoneInfo(Other).AmbientBrightness + ( OnThis.BrightnessMin+Rand(OnThis.BrightnessMax-OnThis.BrightnessMin))) % 256;
                    }
                    Else { 
    ZoneInfo(Other).AmbientBrightness = (OnThis.BrightnessMin+Rand(OnThis.BrightnessMax-OnThis.BrightnessMin)) % 256; }
                }
                If (
    OnThis.AlterSaturation) { // Do i alter Saturation
                    
    if (OnThis.ShiftSaturation) { // Shift from default
                        
    ZoneInfo(Other).AmbientSaturation = (ZoneInfo(Other).AmbientSaturation + ( OnThis.SaturationMin+Rand(OnThis.SaturationMax-OnThis.SaturationMin))) % 256;
                    }
                    Else { 
    ZoneInfo(Other).AmbientSaturation = (OnThis.SaturationMin+Rand(OnThis.SaturationMax-OnThis.SaturationMin)) % 256; }
                }
            }
            
    // Alter Lights **************
            
    if ( Other.IsA('Light')) {
                If (
    OnThis.AlterHue) { // Do i alter Hue
                    
    if (OnThis.ShiftHue) { // Shift from default
                        
    Other.LightHue = (Other.LightHue + ( OnThis.HueMin+Rand(OnThis.HueMax-OnThis.HueMin))) % 256;
                    }
                    Else { 
    Other.LightHue = (OnThis.HueMin+Rand(OnThis.HueMax-OnThis.HueMin)) % 256; }
                }
                If (
    OnThis.AlterBrightness) { // Do i alter Brightness
                    
    if (OnThis.ShiftBrightness) { // Shift from default
                        
    Other.LightBrightness = (Other.LightBrightness + ( OnThis.BrightnessMin+Rand(OnThis.BrightnessMax-OnThis.BrightnessMin))) % 256;
                    }
                    Else { 
    Other.LightBrightness = (OnThis.BrightnessMin+Rand(OnThis.BrightnessMax-OnThis.BrightnessMin)) % 256; }
                }
                If (
    OnThis.AlterSaturation) { // Do i alter Saturation
                    
    if (OnThis.ShiftSaturation) { // Shift from default
                        
    Other.LightSaturation = (Other.LightSaturation + ( OnThis.SaturationMin+Rand(OnThis.SaturationMax-OnThis.SaturationMin))) % 256;
                    }
                    Else { 
    Other.LightSaturation = (OnThis.SaturationMin+Rand(OnThis.SaturationMax-OnThis.SaturationMin)) % 256; }
                }
                if (
    OnThis.AlterType) { // Do i alter LightType
                    
    Other.LightType GetLightType(GetEnum(enum'EmyTypes',OnThis.Type));
                }
                if (
    OnThis.AlterEffect) { // Do i alter LightEffect
                    
    Other.LightEffect GetLightEffect(GetEnum(enum'EmyEffects',OnThis.Effect));
                }
                
                    
            }
        } 
    // end of map alterations
        
    return true// needed for parent classes ?
    }

    function 
    ELightType GetLightType (name type) { // really not sure at all about Enums names used in Switch Case expressions !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        
    switch (type)
        {
            case 
    'Random':
                
    // return GetEnum(enum'ELightType', 1+Rand(6)); //doesn't work !! : Type mismatch in Return.
            
    case 'Steady':
                return 
    LT_Steady;
            case 
    'Pulse':
                return 
    LT_Pulse;
            case 
    'Blink':
                return 
    LT_Blink;
            case 
    'Flicker':
                return 
    LT_Flicker;
            case 
    'Strobe':
                return 
    LT_Strobe;
            case 
    'BackDrop':
                return 
    LT_BackdropLight;
            case 
    'SubtlePulse':
                return 
    LT_SubtlePulse;
        }
        return 
    LT_Steady;
    }

    function 
    ELightEffect GetLightEffect (name effect) {
        switch (
    effect)
        {
            case 
    'Random':
                
    // return GetEnum(enum'ELightEffect', 1+Rand(17)); //doesn't work !! : Type mismatch in Return.
            
    case 'TorchWaver':
                return 
    LE_TorchWaver;
            case 
    'FireWaver':
                return 
    LE_FireWaver;
            case 
    'WateryShimmer':
                return 
    LE_WateryShimmer;
            case 
    'SearchLight':
                return 
    LE_SearchLight;
            case 
    'SlowWave':
                return 
    LE_SlowWave;
            case 
    'FastWave':
                return 
    LE_FastWave;
            case 
    'CloudCast':
                return 
    LE_CloudCast;
            case 
    'StaticSpot':
                return 
    LE_StaticSpot;
            case 
    'Shock':
                return 
    LE_Shock;
            case 
    'Disco':
                return 
    LE_Disco;
            case 
    'Warp':
                return 
    LE_Warp;
            case 
    'SpotLight':
                return 
    LE_SpotLight;
            case 
    'NonIncidence':
                return 
    LE_NonIncidence;
            case 
    'Shell':
                return 
    LE_Shell;
            case 
    'OmniBumpMap':
                return 
    LE_OmniBumpMap;
            case 
    'Interference':
                return 
    LE_InterFerence;
            case 
    'Cylinder':
                return 
    LE_Cylinder;
            Case 
    'Rotor':
                return 
    LE_Rotor;
        }
        return 
    LE_None;
    }

    defaultproperties
    {
    OnAllOtherMaps=(MapName="",DoFX=False,AlterHue=False,ShiftHue=False,HueMin=0,HueMax=0,AlterBrightness=False,ShiftBrightness=False,BrightnessMin=0,BrightnessMax=30,AlterSaturation=False,ShiftSaturation=False,SaturationMin=0,SaturationMax=0,AlterType=False,Type=Steady,AlterEffect=False,Effect=TorchWaver)

    }
    Used structs for easy edit of the ini...

    To do:
    -Replication for online games (i think i know how to do)
    -Per Map settings (i still need to know how to find the map name)
     

    Attached Files:

  8. Crowze

    Crowze Bird Brain

    Joined:
    Feb 6, 2002
    Messages:
    3,556
    Likes Received:
    1
    Code:
    string (Level.Outer.Name)
    :)
     
  9. geogob

    geogob Koohii o nomimasu ka?

    Joined:
    Mar 11, 2000
    Messages:
    4,148
    Likes Received:
    0
    To do:
    -Replication for online games (i think i know how to do)

    A: First, ask yourself what needs to be chanced on the client and want can be changed on the server.
    Make sure that everything that can be changed on the server does not change on the client. You wouldn't want the clients to overide the sever settings with their own ini file.
    To do that, just to the chages in a "if ROLE == ROLE_Authority" or in a "if Level.NetMode == NM_DedicatedServer".

    If someone has to be changed on the client, do not forget the following points:
    Function to run on clients must be Simulated.
    Functions to run on clients must be Called by simulated functions.
    The Role of the class must be ROLE_SimulatedProxy
    Default variable (and config) do no get replicated. You must assign their values to other variable to be replicated.

    If you want, I can send you the code for the Anti-Cheat implemented in the WP. It is a very good (and simple) example of something done client-side with settings server-side.

    -Per Map settings (i still need to know how to find the map name)

    A: First make it work globally for all maps.
     
  10. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    Hmm yes please :)
     
  11. geogob

    geogob Koohii o nomimasu ka?

    Joined:
    Mar 11, 2000
    Messages:
    4,148
    Likes Received:
    0
    ok. tonight then :p

    EDIT. on 2nd thought. since you are in europe and you guys usually sleep when I play an wake up when I go to sleep, I'll take the small effort to send you the code now.
     
    Last edited: Mar 23, 2006
  12. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    As few euros i rarely go bed before 2 or 3am :rolleyes:
    Thanks alot guys.
     
  13. geogob

    geogob Koohii o nomimasu ka?

    Joined:
    Mar 11, 2000
    Messages:
    4,148
    Likes Received:
    0
    which is about 20h-21h for me here. I and usualy go to bed when it's 8h for you :lol:
     
  14. geogob

    geogob Koohii o nomimasu ka?

    Joined:
    Mar 11, 2000
    Messages:
    4,148
    Likes Received:
    0
    Just sent you an huge-ass email. Basically it reveals most of my knowledge of replication... in above all, in French! (well more Frenglish than French... anyway).

    Hope it helps in this project and your future projects.
     
  15. UN17

    UN17 Taijutsu Specialist

    Joined:
    Dec 7, 2003
    Messages:
    675
    Likes Received:
    0
    French! J'aime la beurre!
     
  16. geogob

    geogob Koohii o nomimasu ka?

    Joined:
    Mar 11, 2000
    Messages:
    4,148
    Likes Received:
    0
    You like it. it's my version of Replication for dummies, using one simple working example.
     
  17. Corporal_Lib [BR]

    Corporal_Lib [BR] Brazilian Graphic Designer & Gun Nut {=)

    Joined:
    Oct 14, 2004
    Messages:
    524
    Likes Received:
    0
    INF_DOOM

    OMG, i´ve created a MONSTER!!!! ;-)
    Combining INF_Light FX and Spawner, and some specific maps, you can play INF with a DOOM mood!
    Look at the pics below... }8D

    (does anybody watched the movie flick? The 5 minute FPS scene was fun as hell, but the camera didn´t bobbed like INF... what a frustation ;-) >
     

    Attached Files:

    Last edited: Mar 24, 2006
  18. Corporal_Lib [BR]

    Corporal_Lib [BR] Brazilian Graphic Designer & Gun Nut {=)

    Joined:
    Oct 14, 2004
    Messages:
    524
    Likes Received:
    0
    Three more shots to go... Bizarre..hehehehe
     

    Attached Files:

  19. Lemon.fr

    Lemon.fr SkaarjFruit

    Joined:
    Oct 28, 2003
    Messages:
    247
    Likes Received:
    0
    Yes, i really appreciate your help :)
     

Share This Page