Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Release Mad Vending Machines and Other objects
#1
Hello

This is something I previewed sometime ago and forgot to release, Nyan Cat . This contains a mad vending machine, a mad metal detector, mad fans and lights.

Save this in your mod: in your mod folder, create a new folder called common_scripts and inside paste this file with the name of _dynamic_world.gsc



Code:
#include common_scripts\utility;

/*QUAKED trigger_multiple_dyn_metal_detector (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Comments to be added.*/

/*QUAKED trigger_multiple_dyn_creaky_board (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Comments to be added.*/

/*QUAKED trigger_multiple_dyn_photo_copier (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Comments to be added.*/

/*QUAKED trigger_multiple_dyn_copier_no_light (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Comments to be added.*/

/*QUAKED trigger_radius_dyn_motion_light (0.12 0.23 1.0) (-16 -16 -16) (16 16 16)
Comments to be added.*/

/*QUAKED trigger_radius_dyn_motion_dlight (0.12 0.23 1.0) (-16 -16 -16) (16 16 16)
Comments to be added.*/

/*QUAKED trigger_multiple_dog_bark (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
Comments to be added.*/

/*QUAKED trigger_radius_bird_startle (0.12 0.23 1.0) (-16 -16 -16) (16 16 16)
Comments to be added.*/

/*QUAKED trigger_multiple_dyn_motion_light (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Comments to be added.*/

/*QUAKED trigger_multiple_dyn_door (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Comments to be added.*/

/*QUAKED trigger_multiple_freefall (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
defaulttexture="flag"
Player free falling with animation and screaming of doom.*/

// Crouch Speed 5.7-6.0
// Run Speed 8.7-9.2
// Sprint Speed 13.0-14.0


// ========================= Constants ==========================

// Vending Machine
CONST_vending_machine_health     = 400;
CONST_soda_pop_time                 = 0.1;        // seconds
CONST_soda_count                  = 200;        // number of soda per machine
CONST_soda_launch_force             = 5000;        // soda shoot out force
CONST_soda_random_factor         = 0.15;        // in percentage 0.2 = 20%
CONST_soda_splash_dmg_scaler     = 30;        // splash damage multiplier

// Metal Detector
CONST_alarm_tolerance              = 10;        // number of alarm sounds before silenced, 0 disables silencing
CONST_alarm_interval             = 20;        // alarm interval time in seconds
CONST_alarm_interval_sp             = 20;        // alarm interval time in seconds for single player

// Civilian Jet
CONST_jet_speed                     = 2000;        // jet while landing is 130 - 160mph( 2292inch / sec - 2820inch / sec ), emergency landing is 110mph
CONST_jet_extend                 = 20000;    // units, each jet and flyto origin will extend from each other by

init()
{

    //rotate fan blades in mp_highrise
    array_thread( getEntArray( "com_wall_fan_blade_rotate", "targetname" ), ::fan_blade_rotate, "slow" );
    array_thread( getEntArray( "com_wall_fan_blade_rotate_fast", "targetname" ), ::fan_blade_rotate, "fast" );

    trigger_classes = [];
    trigger_classes[ "trigger_multiple_dyn_metal_detector" ] = ::metal_detector;
    trigger_classes[ "trigger_multiple_dyn_creaky_board" ] = ::creaky_board;
    trigger_classes[ "trigger_multiple_dyn_photo_copier" ] = ::photo_copier;
    trigger_classes[ "trigger_multiple_dyn_copier_no_light" ] = ::photo_copier_no_light;
    trigger_classes[ "trigger_radius_motion_light" ] = ::motion_light;
    trigger_classes[ "trigger_radius_dyn_motion_dlight" ] = ::outdoor_motion_dlight;
    trigger_classes[ "trigger_multiple_dog_bark" ] = ::dog_bark;
    trigger_classes[ "trigger_radius_bird_startle" ] = ::bird_startle;
    trigger_classes[ "trigger_multiple_dyn_motion_light" ] = ::motion_light;
    trigger_classes[ "trigger_multiple_dyn_door" ] = ::trigger_door;
    //trigger_classes[ "trigger_multiple_freefall" ] = ::freefall;

    player_init();

    foreach ( classname, function in trigger_classes )
    {
        triggers = getEntArray( classname, "classname" );
        array_thread( triggers, ::triggerTouchThink );
        array_thread( triggers, function );
    }

    array_thread( getEntArray( "vending_machine", "targetname" ), ::vending_machine );
    array_thread( getEntArray( "toggle", "targetname" ), ::use_toggle );

    level thread onPlayerConnect();

    civilian_jet = getEnt( "civilian_jet_origin", "targetname" );
    if ( isDefined( civilian_jet ) )
        civilian_jet thread civilian_jet_flyby();
}

onPlayerConnect()
{
    for ( ;; )
    {
        level waittill( "connecting", player );
        player thread movementTracker();
    }
}

player_init()
{
    if ( isSP() )
    {
        foreach ( player in level.players )
        {
            player.touchTriggers = [];
            player thread movementTracker();
        }
    }
}

ai_init()
{
    /*if ( !isdefined( level.registeredAI ) )
        level.registeredAI = [];
        
    level.registeredAI[ level.registeredAI.size ] = self;
    */

    // self is AI
    self.touchTriggers = [];
    self thread movementTracker();
}


// ================================================================================ //
//                                     Civilian Jet                                     //
// ================================================================================ //

civilian_jet_flyby()
{
    level endon( "game_ended" );

    self jet_init();

    level waittill( "prematch_over" );

    while ( 1 )
    {
        self thread jet_timer();
        self waittill( "start_flyby" );

        self thread jet_flyby();
        self waittill( "flyby_done" );

        self jet_reset();
    }
}


jet_init()
{
    // move jet plane and flyto origin out of the map and hide on level load
    self.jet_parts              = getentarray( self.target, "targetname" );
    self.jet_flyto              = getent( "civilian_jet_flyto", "targetname" );
    self.engine_fxs          = getentarray( "engine_fx", "targetname" );
    self.flash_fxs             = getentarray( "flash_fx", "targetname" );

    self.jet_engine_fx         = loadfx( "fire/jet_afterburner" );
    self.jet_flash_fx_red     = loadfx( "misc/aircraft_light_wingtip_red" );
    self.jet_flash_fx_green     = loadfx( "misc/aircraft_light_wingtip_green" );
    self.jet_flash_fx_blink     = loadfx( "misc/aircraft_light_red_blink" );

    level.civilianJetFlyBy      = undefined;        // priority with air supremacies

    assertex( isdefined( self.jet_parts ),         "Missing cilivian jet model" );
    assertex( isdefined( self.jet_flyto ),         "Missing cilivian jet flyto script_origin: civilian_jet_flyto" );
    assertex( isdefined( self.engine_fxs ),     "Missing cilivian jet engine fxs script_origins: engine_fx" );
    assertex( isdefined( self.flash_fxs ),         "Missing cilivian jet signal light script_origins: flash_fxs" );

    // extending vector to place jet and flyto origin outside sky box
    negative_vec = Vector_multiply( VectorNormalize( self.origin - self.jet_flyto.origin ), CONST_jet_extend );

    // extend flyto origin
    self.jet_flyto.origin -= negative_vec;

    // extend jet
    self.origin += negative_vec;
    foreach ( part in self.jet_parts )
    {
        part.origin += negative_vec;
        part.old_origin = part.origin;
        part hide();
    }

    // extend jet's engine fx origins
    foreach ( engine_fx in self.engine_fxs )
        engine_fx.origin += negative_vec;

    foreach ( flash_fx in self.flash_fxs )
        flash_fx.origin += negative_vec;

    // -------------- flight time and vector calculation -------------
    jet_origin                  = self.origin;// origin is the nose of the jet
    jet_flyto_pos              = self.jet_flyto.origin;
    self.jet_fly_vec          = jet_flyto_pos - jet_origin;

    jet_speed                  = CONST_jet_speed;
    jet_flight_dist          = abs( distance( jet_origin, jet_flyto_pos ) );
    self.jet_flight_time      = jet_flight_dist / jet_speed;
}


jet_reset()
{
    foreach ( part in self.jet_parts )
    {
        part.origin = part.old_origin;
        part hide();
    }
}


jet_timer()
{
    level endon( "game_ended" );

    match_timelimit     = getTimeInterval();
    assert( isdefined( match_timelimit ) );
    timelimit = max( 10, match_timelimit );
    timelimit = min( timelimit, 100 );

    if ( getdvar( "jet_flyby_timer" ) != "" )
        level.civilianJetFlyBy_timer = 5 + getdvarint( "jet_flyby_timer" );
    else
        level.civilianJetFlyBy_timer = ( 0.25 + randomFloatRange( 0.3, 0.7 ) ) * 60 * timeLimit;     // seconds into the match when jet flys by

    wait level.civilianJetFlyBy_timer;

    // wait till all the airborne kill streaks are done
    while ( isDefined( level.airstrikeInProgress ) || isDefined( level.ac130player ) || isDefined( level.chopper ) || isDefined( level.remoteMissileInProgress ) )
        wait 0.05;

    // start flyby
    self notify( "start_flyby" );

    // blocks out all airborne kill streaks
    level.civilianJetFlyBy = true;
    self waittill( "flyby_done" );
    level.civilianJetFlyBy = undefined;
}

getTimeInterval()
{
    if ( isSP() )
        return 10.0;

    if ( isDefined( game[ "status" ] ) && game[ "status" ] == "overtime" )
        return 1.0;
    else
        return getWatchedDvar( "timelimit" );
}

getWatchedDvar( dvarString )
{
    dvarString = "scr_" + level.gameType + "_" + dvarString;
    return( level.watchDvars[ dvarString ].value );
}


jet_flyby()
{
    // show plane
    foreach ( part in self.jet_parts )
        part show();

    engine_fx_array = [];
    flash_fx_array = [];

    foreach ( engine_fx in self.engine_fxs )
    {
        engine_fx_ent = spawn( "script_model", engine_fx.origin );
        engine_fx_ent setModel( "tag_origin" );
        engine_fx_ent.angles = engine_fx.angles;
        engine_fx_array [ engine_fx_array.size ] = engine_fx_ent;
    }

    foreach ( flash_fx in self.flash_fxs )
    {
        flash_fx_ent = spawn( "script_model", flash_fx.origin );
        flash_fx_ent setModel( "tag_origin" );
        flash_fx_ent.color = flash_fx.script_noteworthy;
        flash_fx_ent.angles = flash_fx.angles;
        flash_fx_array [ flash_fx_array.size ] = flash_fx_ent;
    }

    assertex( isdefined( level.mapcenter ), "Calling for civilian jet flyby when level.mapcenter is not yet defined." );
    self thread jet_planeSound( self.jet_parts[ 0 ], level.mapcenter );

    wait 0.05;

    // play engine fx on fx ents
    foreach ( engine_fx_ent in engine_fx_array )
        playfxontag( self.jet_engine_fx, engine_fx_ent, "tag_origin" );

    // play flash fx on fx ents
    foreach ( flash_fx_ent in flash_fx_array )
    {
        if ( isdefined( flash_fx_ent.color ) && flash_fx_ent.color == "blink" )
            playfxontag( self.jet_flash_fx_blink, flash_fx_ent, "tag_origin" );
        else if ( isdefined( flash_fx_ent.color ) && flash_fx_ent.color == "red" )
            playfxontag( self.jet_flash_fx_red, flash_fx_ent, "tag_origin" );
        else
            playfxontag( self.jet_flash_fx_green, flash_fx_ent, "tag_origin" );
    }

    // move plane
    foreach ( part in self.jet_parts )
        part moveTo( part.origin + self.jet_fly_vec, self.jet_flight_time );

    // move fx ents
    foreach ( engine_fx_ent in engine_fx_array )
        engine_fx_ent moveTo( engine_fx_ent.origin + self.jet_fly_vec, self.jet_flight_time );
    foreach ( flash_fx_ent in flash_fx_array )
        flash_fx_ent moveTo( flash_fx_ent.origin + self.jet_fly_vec, self.jet_flight_time );

    wait( self.jet_flight_time + 1 );

    // delete fxs
    foreach ( engine_fx_ent in engine_fx_array )
        engine_fx_ent delete();
    foreach ( flash_fx_ent in flash_fx_array )
        flash_fx_ent delete();

    self notify( "flyby_done" );
}


jet_planeSound( plane, bombsite )
{
    plane thread playsound_loop_on_ent( "veh_mig29_dist_loop" );
    while ( !targetisclose( plane, bombsite ) )
        wait .05;

    plane thread playsound_loop_on_ent( "veh_mig29_close_loop" );
    while ( targetisinfront( plane, bombsite ) )
        wait .05;
    wait .5;

    plane thread playsound_float( "veh_mig29_sonic_boom" );
    while ( targetisclose( plane, bombsite ) )
        wait .05;

    plane notify( "stop sound" + "veh_mig29_close_loop" );
    self waittill( "flyby_done" );

    plane notify( "stop sound" + "veh_mig29_dist_loop" );
}


playsound_float( alias, origin, master )
{
    org = spawn( "script_origin", ( 0, 0, 1 ) );
    org hide();
    if ( !isdefined( origin ) )
        origin = self.origin;
    org.origin = origin;
    if ( isdefined( master ) && master )
        org playsoundasmaster( alias );
    else
        org playsound( alias );
    wait( 10.0 );
    org delete();
}


playsound_loop_on_ent( alias, offset )
{
    org = spawn( "script_origin", ( 0, 0, 0 ) );
    org hide();
    org endon( "death" );
    thread delete_on_death( org );
    if ( isdefined( offset ) )
    {
        org.origin = self.origin + offset;
        org.angles = self.angles;
        org linkto( self );
    }
    else
    {
        org.origin = self.origin;
        org.angles = self.angles;
        org linkto( self );
    }
//    org endon ("death");
    org playloopsound( alias );
//    println ("playing loop sound ", alias," on entity at origin ", self.origin, " at ORIGIN ", org.origin);
    self waittill( "stop sound" + alias );
    org stoploopsound( alias );
    org delete();
}

targetisinfront( other, target )
{
    forwardvec      = anglestoforward( flat_angle( other.angles ) );
    normalvec      = vectorNormalize( flat_origin( target ) - other.origin );
    dot          = vectordot( forwardvec, normalvec );

    if ( dot > 0 )
        return true;
    else
        return false;
}

targetisclose( other, target )
{
    infront = targetisinfront( other, target );

    if ( infront )
        dir = 1;
    else
        dir = -1;

    a          = flat_origin( other.origin );
    b          = a + Vector_Multiply( anglestoforward( flat_angle( other.angles ) ), ( dir * 100000 ) );
    point      = pointOnSegmentNearestToPoint( a, b, target );
    dist      = distance( a, point );

    if ( dist < 3000 )
        return true;
    else
        return false;
}

// ================================================================================ //
//                                     Vending Machine                                    //
// ================================================================================ //

vending_machine()
{
    level endon( "game_ended" );
    self endon( "death" );

    // self is use trigger
    self SetCursorHint( "HINT_ACTIVATE" );

    self.vm_normal          = getent( self.target, "targetname" );
    assertex( isdefined( self.vm_normal ), "Vending machine use trigger is missing target to the normal vending machine script_model" );
    vm_soda_start          = getent( self.vm_normal.target, "targetname" );
    assertex( isdefined( vm_soda_start ), "Vending machine normal script_model is missing target to the start-soda can script_model" );
    vm_soda_stop          = getent( vm_soda_start.target, "targetname" );
    assertex( isdefined( vm_soda_start ), "Start-soda can script_model is missing target to the end-soda can script_model" );
    self.vm_launch_from     = getent( vm_soda_stop.target, "targetname" );
    assertex( isdefined( self.vm_launch_from ), "End-soda can script_model is missing target to the physics launch-from script_origin" );
    self.vm_launch_to      = getent( self.vm_launch_from.target, "targetname" );
    assertex( isdefined( self.vm_launch_to ), "launch-from can script_origin is missing target to the physics launch-to script_origin" );
    
    if ( isdefined( self.vm_launch_to.target ) )
        self.vm_fx_loc     = getent( self.vm_launch_to.target, "targetname" );
        
    //assertex( isdefined( self.vm_launch_to ), "launch-to can script_origin is missing target to the fx location script_origin" );

    self.vm_normal setCanDamage( true );

    self.vm_normal_model          = self.vm_normal.model;
    self.vm_damaged_model          = self.vm_normal.script_noteworthy;
    self.vm_soda_model              = vm_soda_start.model;

    self.vm_soda_start_pos          = vm_soda_start.origin;
    self.vm_soda_start_angle      = vm_soda_start.angles;
    self.vm_soda_stop_pos          = vm_soda_stop.origin;
    self.vm_soda_stop_angle      = vm_soda_stop.angles;

    // precache damage model
    precacheModel( self.vm_damaged_model );

    // ride the no longer needed models
    vm_soda_start delete();
    vm_soda_stop delete();

    self.soda_array = [];
    self.soda_count = CONST_soda_count;
    self.soda_slot      = undefined;// the soda can thats resting in the slot
    self.hp = CONST_vending_machine_health;

    self thread vending_machine_damage_monitor( self.vm_normal );
    self playloopsound( "vending_machine_hum" );

    while ( 1 )
    {
        self waittill( "trigger", player );
        //level.players[0] iprintln( "used" );

        self playsound( "vending_machine_button_press" );
        if ( !self.soda_count )
            continue;

        // drop a can, and shoot out the previous one if in slot
        if ( isdefined( self.soda_slot ) )
            self soda_can_eject();
        soda_can_drop( spawn_soda() );
        wait 0.05;
    }
}

vending_machine_damage_monitor( vending_machine )
{
    level endon( "game_ended" );

    exp_dmg = "mod_grenade mod_projectile mod_explosive mod_grenade_splash mod_projectile_splash splash";
    sparks_fx = loadfx( "explosions/tv_explosion" );

    while ( 1 )
    {
        vending_machine waittill( "damage", damage, other, direction_vec, P, type );

        if ( isdefined( type ) )
        {
            if ( isSubStr( exp_dmg, ToLower( type ) ) )
                damage *= CONST_soda_splash_dmg_scaler;    // multiply explosive dmg

            self.hp -= damage;
            if ( self.hp > 0 )
                continue;
            
            // vending machine is now dead, button usage is disabled
            self notify( "death" );
            
            // disable use trigger
            self.origin += ( 0, 0, 10000 );

            if( !isdefined( self.vm_fx_loc ) )
                playfx_loc = self.vm_normal.origin + ( ( 17, -13, 52 ) - ( -20, 18, 0 ) );
            else
                playfx_loc = self.vm_fx_loc.origin;
                
            playfx( sparks_fx, playfx_loc );

            // when vending machine is explosively damaged, shoots out soda cans
            self.vm_normal setmodel( self.vm_damaged_model );

            while ( self.soda_count > 0 )
            {
                // drop a can, and shoot out the previous one if in slot
                if ( isdefined( self.soda_slot ) )
                    self soda_can_eject();
                soda_can_drop( spawn_soda() );
                wait 0.05;
            }

            self stoploopsound( "vending_machine_hum" );
            return;
        }
    }
}

spawn_soda()
{
    soda = spawn( "script_model", self.vm_soda_start_pos );
    soda setmodel( self.vm_soda_model );
    soda.origin = self.vm_soda_start_pos;
    soda.angles = self.vm_soda_start_angle;
    return soda;
}

soda_can_drop( soda )
{
    soda MoveTo( self.vm_soda_stop_pos, CONST_soda_pop_time );
    soda playsound( "vending_machine_soda_drop" );    // soda can drop sound
    wait CONST_soda_pop_time;

    self.soda_slot = soda;
    self.soda_count -- ;
}

soda_can_eject()
{
    self endon( "death" );

    if( isdefined( self.soda_slot.ejected ) && self.soda_slot.ejected == true )
        return;
    
    // physics launch
    force_max = CONST_soda_launch_force * ( 1 + CONST_soda_random_factor );
    force_min = force_max * 0.75 * ( 1 + CONST_soda_random_factor );

    launch_vec              = vectorNormalize( self.vm_launch_to.origin - self.vm_launch_from.origin );
    force_vec              = vector_multiply( launch_vec, randomfloatrange( force_min, force_max ) );
    launch_force_vec     = ( force_vec[ 0 ] * randomfloatrange( 1, 1 + CONST_soda_random_factor ), force_vec[ 1 ] * randomfloatrange( 1, 1 + CONST_soda_random_factor ), force_vec[ 2 ] * randomfloatrange( 1, 1 + CONST_soda_random_factor ) );

    self.soda_slot PhysicsLaunchClient( self.vm_launch_from.origin, launch_force_vec );
    self.soda_slot.ejected = true;
}

// ================================================================================ //
//                                     Free Fall                                        //
// ================================================================================ //

freefall()
{
    level endon( "game_ended" );

    freefall_weapon = "briefcase_bomb_mp";
    precacheItem( freefall_weapon );

    while ( 1 )
    {
        self waittill( "trigger_enter", player );

        if ( !( player hasWeapon( freefall_weapon ) ) )
        {
            player playsound( "freefall_death" );

            player giveweapon( freefall_weapon );
            player setWeaponAmmoStock( freefall_weapon, 0 );
            player setWeaponAmmoClip( freefall_weapon, 0 );
            player switchToWeapon( freefall_weapon );
        }
    }
}

// ================================================================================ //
//                                     Metal Detector                                     //
// ================================================================================ //

metal_detector()
{
    // self is trigger: trigger_multiple_dyn_metal_detector

    level endon( "game_ended" );
    assertex( isdefined( self.target ), "trigger_multiple_dyn_metal_detector is missing target damage trigger used for detecting entities other than players" );

    damage_trig = getent( self.target, "targetname" );
    damage_trig EnableGrenadeTouchDamage();

    bound_org_1 = getent( damage_trig.target, "targetname" );
    bound_org_2 = getent( bound_org_1.target, "targetname" );

    assertex( isdefined( bound_org_1 ) && isdefined( bound_org_2 ), "Metal detector missing bound origins for claymore test" );

    detector_1 = getent( bound_org_2.target, "targetname" );
    detector_2 = getent( detector_1.target, "targetname" );

    assertex( isdefined( detector_1 ) && isdefined( detector_2 ), "Recompile the bsp to fix this, metal detector prefab changed." );

    bounds = [];
    bound_x_min = min( bound_org_1.origin[ 0 ], bound_org_2.origin[ 0 ] );    bounds[ 0 ] = bound_x_min;
    bound_x_max = max( bound_org_1.origin[ 0 ], bound_org_2.origin[ 0 ] );    bounds[ 1 ] = bound_x_max;
    bound_y_min = min( bound_org_1.origin[ 1 ], bound_org_2.origin[ 1 ] );    bounds[ 2 ] = bound_y_min;
    bound_y_max = max( bound_org_1.origin[ 1 ], bound_org_2.origin[ 1 ] );    bounds[ 3 ] = bound_y_max;
    bound_z_min = min( bound_org_1.origin[ 2 ], bound_org_2.origin[ 2 ] );    bounds[ 4 ] = bound_z_min;
    bound_z_max = max( bound_org_1.origin[ 2 ], bound_org_2.origin[ 2 ] );    bounds[ 5 ] = bound_z_max;

    bound_org_1 delete();
    bound_org_2 delete();

    if ( !isSP() )
        self.alarm_interval = CONST_alarm_interval;
    else
        self.alarm_interval = CONST_alarm_interval_sp;

    self.alarm_playing = 0;
    self.alarm_annoyance = 0;
    self.tolerance = CONST_alarm_tolerance;

    self thread metal_detector_dmg_monitor( damage_trig );
    self thread metal_detector_touch_monitor();
    self thread metal_detector_weapons( bounds, "weapon_claymore", "weapon_c4" );

    light_pos1 = ( detector_1.origin[ 0 ], detector_1.origin[ 1 ], bound_z_max );
    light_pos2 = ( detector_2.origin[ 0 ], detector_2.origin[ 1 ], bound_z_max );

    //light_pos1 = ( bound_x_min,  bound_y_min, bound_z_max );
    //light_pos2 = ( bound_x_max,  bound_y_max, bound_z_max );    
    md_light = loadfx( "props/metal_detector_light" );

    while ( 1 )
    {
        self waittill_any( "dmg_triggered", "touch_triggered", "weapon_triggered" );
        self thread playsound_and_light( "alarm_metal_detector", md_light, light_pos1, light_pos2 );
    }
}

playsound_and_light( sound, light, light_pos1, light_pos2 )
{
    level endon( "game_ended" );

    if ( !self.alarm_playing )
    {
        self.alarm_playing = 1;
        self thread annoyance_tracker();

        if ( !self.alarm_annoyance )
            self playsound( sound );
                      playfx( light, light_pos1 );
                                           wait 0.6;
            self playsound( sound );
                      playfx( light, light_pos1 );
                                          wait 0.6;
            self playsound( sound );
                      playfx( light, light_pos1 );
                                           wait 0.6;
            self playsound( sound );
                      playfx( light, light_pos1 );
                                          wait 0.6;
            self playsound( sound );


        // 1000ms red light fx
        playfx( light, light_pos1 );
        playfx( light, light_pos2 );

        wait self.alarm_interval;
        self.alarm_playing = 0;
    }
}

annoyance_tracker()
{
    level endon( "game_ended" );

    if ( !self.tolerance )
        return;

    interval = self.alarm_interval + 0.15;
    if ( self.tolerance )
        self.tolerance -- ;
    else
        self.alarm_annoyance = 1;

    current_time = gettime();// ms

    alarm_timeout = CONST_alarm_interval;
    if ( isSP() )
        alarm_timeout = CONST_alarm_interval_sp;

    self waittill_any_or_timeout( "dmg_triggered", "touch_triggered", "weapon_triggered", ( alarm_timeout + 2 ) );

    time_delta = ( gettime() - current_time );
    if ( time_delta > ( ( alarm_timeout * 1000 ) + 1150 ) )
    {
        self.alarm_annoyance = 0;
        self.tolerance = CONST_alarm_tolerance;
    }
}

waittill_any_or_timeout( msg1, msg2, msg3, timer )
{
    level endon( "game_ended" );

    self endon( msg1 );
    self endon( msg2 );
    self endon( msg3 );
    wait timer;
}

metal_detector_weapons( bounds, weapon_1, weapon_2 )
{
    level endon( "game_ended" );
    while ( 1 )
    {
        self waittill_weapon_placed();

        all_grenades = getentarray( "grenade", "classname" );
        foreach ( grenade in all_grenades )
        {
            if ( isdefined( grenade.model ) && ( grenade.model == weapon_1 || grenade.model == weapon_2 ) )
            {
                if ( isInBound( grenade, bounds ) )
                    self thread weapon_notify_loop( grenade, bounds );
            }
        }
    }
}

waittill_weapon_placed()
{
    level endon( "game_ended" );
    self endon( "dmg_triggered" );
    self waittill( "touch_triggered" );
}

weapon_notify_loop( grenade, bounds )
{
    grenade endon( "death" );

    while ( isInBound( grenade, bounds ) )
    {
        self notify( "weapon_triggered" );
        wait self.alarm_interval;
    }
}


isInBound( ent, bounds )
{
    bound_x_min = bounds[ 0 ]; bound_x_max = bounds[ 1 ];
    bound_y_min = bounds[ 2 ]; bound_y_max = bounds[ 3 ];
    bound_z_min = bounds[ 4 ]; bound_z_max = bounds[ 5 ];

    ent_x = ent.origin[ 0 ];
    ent_y = ent.origin[ 1 ];
    ent_z = ent.origin[ 2 ];

    if ( isInBound_single( ent_x, bound_x_min, bound_x_max ) )
    {
        if ( isInBound_single( ent_y, bound_y_min, bound_y_max ) )
        {
            if ( isInBound_single( ent_z, bound_z_min, bound_z_max ) )
                return true;
        }
    }
    return false;
}

isInBound_single( var, v_min, v_max )
{
    if ( var > v_min && var < v_max )
        return true;
    return false;
}


metal_detector_dmg_monitor( damage_trig )
{
    level endon( "game_ended" );
    while ( 1 )
    {
        damage_trig waittill( "damage", damage, other, direction_vec, P, type );
        if ( isdefined( type ) && alarm_validate_damage( type ) )
            self notify( "dmg_triggered" );
    }
}

metal_detector_touch_monitor()
{
    level endon( "game_ended" );
    while ( 1 )
    {
        self waittill( "trigger_enter" );
        while ( anythingTouchingTrigger( self ) )
        {
            self notify( "touch_triggered" );
            wait self.alarm_interval;
        }
    }
}

alarm_validate_damage( damageType )
{
    //disallowed_dmg = "mod_pistol_bullet mod_rifle_bullet bullet mod_crush mod_grenade_splash mod_projectile_splash splash unknown";
    //disallowed_dmg_array = strtok( disallowed_damage, " " );    

    allowed_dmg = "mod_melee melee mod_grenade mod_projectile mod_explosive mod_impact";
    allowed_dmg_array = strtok( allowed_dmg, " " );

    foreach ( dmg in allowed_dmg_array )
    {
        if ( ToLower( dmg ) == ToLower( damageType ) )
            return true;
    }
    return false;
}


// ================================================================================ //


creaky_board()
{
    level endon( "game_ended" );

    for ( ;; )
    {
        self waittill( "trigger_enter", player );
        player thread do_creak( self );
    }
}


do_creak( trigger )
{
    self endon( "disconnect" );
    self endon( "death" );

    self playSound( "step_walk_plr_woodcreak_on" );

    for ( ;; )
    {
        self waittill( "trigger_leave", leftTrigger );
        if ( trigger != leftTrigger )
            continue;

        self playSound( "step_walk_plr_woodcreak_off" );
        return;
    }
}


motion_light()
{
    level endon( "game_ended" );
    self.moveTracker = true;

    self.lightsOn = false;
    lights = getEntArray( self.target, "targetname" );
    assertEx( lights.size, "ERROR: trigger_ * _motion_light with no targets at " + self.origin );

    precacheModel( "com_two_light_fixture_off" );
    precacheModel( "com_two_light_fixture_on" );

    foreach ( light in lights )
    {
        light.lightRigs = [];
        infoNull = getEnt( light.target, "targetname" );
        if ( !isDefined( infoNull.target ) )
            continue;

        light.lightRigs = getEntArray( infoNull.target, "targetname" );
    }


    for ( ;; )
    {
        self waittill( "trigger_enter" );

        while ( anythingTouchingTrigger( self ) )
        {
            objectMoved = false;
            foreach ( object in self.touchList )
            {
                if ( isDefined( object.distMoved ) && object.distMoved > 5.0 )
                    objectMoved = true;
            }

            if ( objectMoved )
            {
                if ( !self.lightsOn )
                {
                    self.lightsOn = true;
                    lights[ 0 ] playSound( "switch_auto_lights_on" );

                    foreach ( light in lights )
                    {
                        light setLightIntensity( 1.0 );

                        if ( isdefined( light.lightRigs ) )
                        {
                            foreach ( rig in light.lightRigs )
                                rig setModel( "com_two_light_fixture_on" );
                        }
                    }
                }
                self thread motion_light_timeout( lights, 10.0 );
            }

            wait( 0.05 );
        }
    }
}


motion_light_timeout( lights, timeOut )
{
    self notify( "motion_light_timeout" );
    self endon( "motion_light_timeout" );

    wait( timeOut );

    foreach ( light in lights )
    {
        light setLightIntensity( 0 );
        if ( isdefined( light.lightRigs ) )
        {
            foreach ( rig in light.lightRigs )
                rig setModel( "com_two_light_fixture_off" );
        }
    }

    lights[ 0 ] playSound( "switch_auto_lights_off" );

    self.lightsOn = false;
}


outdoor_motion_dlight()
{

    if( !isdefined( level.outdoor_motion_light ) )
    {
            level.outdoor_motion_light = loadFx( "misc/outdoor_motion_light" );
    }
    
    level endon( "game_ended" );
    self.moveTracker = true;

    self.lightsOn = false;
    lightRig = getEnt( self.target, "targetname" );
    assertEx( lightRig.size, "ERROR: trigger_ * _motion_light with no targets at " + self.origin );
    lights = getEntArray( lightRig.target, "targetname" );
    assertEx( lights.size, "ERROR: trigger_ * _motion_light model target with no light targets at " + lightRig.origin );

    precacheModel( "com_two_light_fixture_off" );
    precacheModel( "com_two_light_fixture_on" );

    for ( ;; )
    {
        self waittill( "trigger_enter" );

        while ( anythingTouchingTrigger( self ) )
        {
            objectMoved = false;
            foreach ( object in self.touchList )
            {
                if ( isDefined( object.distMoved ) && object.distMoved > 5.0 )
                    objectMoved = true;
            }

            if ( objectMoved )
            {
                if ( !self.lightsOn )
                {
                    self.lightsOn = true;
                    lightRig playSound( "switch_auto_lights_on" );
                    lightRig setModel( "com_two_light_fixture_on" );

                    foreach ( light in lights )
                    {
                        assert( !isDefined( light.lightEnt ) );
                        light.lightEnt = spawn( "script_model", light.origin );
                        light.lightEnt setModel( "tag_origin" );
                        playFxOnTag( level.outdoor_motion_light, light.lightEnt, "tag_origin" );
                    }
                }
                self thread outdoor_motion_dlight_timeout( lightRig, lights, 10.0 );
            }

            wait( 0.05 );
        }
    }
}


outdoor_motion_dlight_timeout( lightRig, lights, timeOut )
{
    self notify( "motion_light_timeout" );
    self endon( "motion_light_timeout" );

    wait( timeOut );

    foreach ( light in lights )
    {
        assert( isDefined( light.lightEnt ) );
        light.lightEnt delete();
    }

    lightRig playSound( "switch_auto_lights_off" );
    lightRig setModel( "com_two_light_fixture_off" );

    self.lightsOn = false;
}

dog_bark()
{
    level endon( "game_ended" );
    self.moveTracker = true;

    dogOrigin = getEnt( self.target, "targetname" );
    assertEx( isDefined( dogOrigin ), "ERROR: trigger_multiple_dog_bark with no target at " + self.origin );

    for ( ;; )
    {
        self waittill( "trigger_enter", player );

        while ( anythingTouchingTrigger( self ) )
        {
            maxDistMoved = 0;
            foreach ( object in self.touchList )
            {
                if ( isDefined( object.distMoved ) && object.distMoved > maxDistMoved )
                    maxDistMoved = object.distMoved;
            }

            if ( maxDistMoved > 6.0 )
            {
                dogOrigin playSound( "dyn_anml_dog_bark" );
                wait( randomFloatRange( 16 / maxDistMoved, 16 / maxDistMoved + randomFloat( 1.0 ) ) );
            }
            else
            {
                wait( 0.05 );
            }
        }
    }
}


trigger_door()
{
    doorEnt = getEnt( self.target, "targetname" );
    assertEx( isDefined( doorEnt ), "ERROR: trigger_multiple_dyn_door with no door brush at " + self.origin );

    self.doorEnt = doorEnt;
    self.doorAngle = getVectorRightAngle( vectorNormalize( self getOrigin() - doorEnt getOrigin() ) );
    doorEnt.baseYaw = doorEnt.angles[ 1 ];
    openTime = 1.0;

    for ( ;; )
    {
        self waittill( "trigger_enter", player );

        doorEnt thread doorOpen( openTime, self getDoorSide( player ) );

        if ( anythingTouchingTrigger( self ) )
            self waittill( "trigger_empty" );

        wait( 3.0 );

        if ( anythingTouchingTrigger( self ) )
            self waittill( "trigger_empty" );

        doorEnt thread doorClose( openTime );
    }
}


doorOpen( openTime, doorSide )
{
    if ( doorSide )
        self rotateTo( ( 0, self.baseYaw + 90, 1 ), openTime, 0.1, 0.75 );
    else
        self rotateTo( ( 0, self.baseYaw - 90, 1 ), openTime, 0.1, 0.75 );

    self playSound( "door_generic_house_open" );

    wait( openTime + 0.05 );
}


doorClose( openTime )
{
    self rotateTo( ( 0, self.baseYaw, 1 ), openTime );
    self playSound( "door_generic_house_close" );

    wait( openTime + 0.05 );
}

getDoorSide( player )
{
    return( vectorDot( self.doorAngle, vectornormalize( player.origin - self.doorEnt getOrigin() ) ) > 0 );
}


getVectorRightAngle( vDir )
{
    return( vDir[ 1 ], 0 - vDir[ 0 ], vDir[ 2 ] );
}

use_toggle()
{
    if ( self.classname != "trigger_use_touch" )
        return;

    lights = getEntArray( self.target, "targetname" );
    assert( lights.size );

    self.lightsOn = 1;
    foreach ( light in lights )
        light setLightIntensity( 1.5 * self.lightsOn );


    for ( ;; )
    {
        self waittill( "trigger" );

        self.lightsOn = !self.lightsOn;
        if ( self.lightsOn )
        {
            foreach ( light in lights )
                light setLightIntensity( 1.5 );

            self playSound( "switch_auto_lights_on" );
        }
        else
        {
            foreach ( light in lights )
                light setLightIntensity( 0 );

            self playSound( "switch_auto_lights_off" );
        }
    }
}


bird_startle()
{
}


photo_copier_init( trigger )
{
    // self is trigger
    
    self.copier = get_photo_copier( trigger );
    assertex( self.copier.classname == "script_model", "Photocopier at " + trigger.origin + " doesn't target a photo copier" );

    copy_bar = getent( self.copier.target, "targetname" );
    assertex( copy_bar.classname == "script_brushmodel", "Photocopier at " + trigger.origin + " doesn't target a photo copier" );

    light = getent( copy_bar.target, "targetname" );
    assertex( light.classname == "light_spot" || light.classname == "light", "Photocopier at " + trigger.origin + " doesn't have a light" );

    light.intensity = light getlightintensity();
    light setlightintensity( 0 );
    trigger.copy_bar = copy_bar;
    trigger.start_pos = copy_bar.origin;
    trigger.light = light;

    angles = self.copier.angles + ( 0, 90, 0 );
    forward = anglestoforward( angles );
    trigger.end_pos = trigger.start_pos + vector_multiply( forward, 30 );
}

get_photo_copier( trigger )
{
    if ( !isdefined( trigger.target ) )
    {
        //cant target directly to a destructible toy, so we are grabing the nearest one, since primary light requires them to be far anyway
        toys = getentarray( "destructible_toy", "targetname" );
        copier = toys[ 0 ];
        foreach ( toy in toys )
        {
            if ( isdefined( toy.destructible_type ) && toy.destructible_type == "toy_copier" )
            {
                if ( distance( trigger.origin, copier.origin ) > distance( trigger.origin, toy.origin ) )
                    copier = toy;
            }
        }
        assertex( distance( trigger.origin, copier.origin ) < 128, "Photocopier at " + trigger.origin + " doesn't contain a photo copier" );
    }
    else
    {
        copier = getent( trigger.target, "targetname" );
        assertex( isdefined( copier ), "Photocopier at " + trigger.origin + " doesn't target a photo copier" );
        copier setcandamage( true );
    }    
    
    return copier;
}

waittill_copier_copies()
{
    self.copier endon( "FX_State_Change0" );
    self.copier endon( "death" );

    self waittill( "trigger_enter" );
}

photo_copier()
{
    level endon( "game_ended" );
    photo_copier_init( self );

    self.copier endon( "FX_State_Change0" );    // this is when copier breaks
    self thread photo_copier_stop();            // monitor copier for quick stop

    for ( ;; )
    {
        waittill_copier_copies();

        self playSound( "mach_copier_run" );

        if ( isdefined( self.copy_bar ) )
        {
            reset_copier( self );
            thread photo_copier_copy_bar_goes();
            thread photo_copier_light_on();
        }
        wait( 3 );
    }
}

photo_copier_no_light()
{
    level endon( "game_ended" );

    self.copier  = get_photo_copier( self );
    assertex( self.copier.classname == "script_model", "Photocopier at " + self.origin + " doesn't target or contain a photo copier" );
    self.copier endon( "FX_State_Change0" );    // this is when copier breaks

    for ( ;; )
    {
        waittill_copier_copies();
        self playSound( "mach_copier_run" );
        wait( 3 );
    }
}

// reset light and copy bar position, interruptes previous copy in progress
reset_copier( trigger )
{
    trigger.copy_bar moveto( trigger.start_pos, 0.2 );    // reset position
    trigger.light setlightintensity( 0 );
}

photo_copier_copy_bar_goes()
{
    self.copier notify( "bar_goes" );
    self.copier endon( "bar_goes" );
    self.copier endon( "FX_State_Change0" );
    self.copier endon( "death" );

    copy_bar = self.copy_bar;
    wait( 2.0 );
    copy_bar moveto( self.end_pos, 1.6 );
    wait( 1.8 );
    copy_bar moveto( self.start_pos, 1.6 );
    wait( 1.6 );    // wait( 13.35 );

    light = self.light;
    timer = 0.2;
    steps = timer / 0.05;

    for ( i = 0; i < steps; i++ )
    {
        intensity = i * 0.05;
        intensity /= timer;
        intensity = 1 - ( intensity * light.intensity );
        if ( intensity > 0 )
            light setlightintensity( intensity );
        wait( 0.05 );
    }
}

photo_copier_light_on()
{
    self.copier notify( "light_on" );
    self.copier endon( "light_on" );
    self.copier endon( "FX_State_Change0" );
    self.copier endon( "death" );

    light = self.light;
    timer = 0.2;
    steps = timer / 0.05;

    for ( i = 0; i < steps; i++ )
    {
        intensity = i * 0.05;
        intensity /= timer;
        light setlightintensity( intensity * light.intensity );
        wait( 0.05 );
    }

    photo_light_flicker( light );
}

// stopping light and bar move on death
photo_copier_stop()
{
    self.copier waittill( "FX_State_Change0" );
    self.copier endon( "death" );

    reset_copier( self );
}

photo_light_flicker( light )
{
    // flicker
    light setlightintensity( 1 );
    wait( 0.05 );
    light setlightintensity( 0 );
    wait( 0.10 );
    light setlightintensity( 1 );
    wait( 0.05 );
    light setlightintensity( 0 );
    wait( 0.10 );
    light setlightintensity( 1 );
}


fan_blade_rotate( type )
{
    assert( isdefined( type ) );

    speed = 0;
    time = 20000;

    speed_multiplier = 1.0;
    if( isdefined( self.speed ) )
    {
        speed_multiplier = self.speed;
    }
    
    if ( type == "slow" )
        speed = randomfloatrange( 150*speed_multiplier, 360*speed_multiplier );
    else if ( type == "fast" )
        speed = randomfloatrange( 780*speed_multiplier, 1000*speed_multiplier );
    else
        assertmsg( "Type must be fast or slow" );

    wait randomfloatrange( 0, 1 );

    fan_angles      = self.angles;
    fan_vec      = Vector_multiply( AnglesToRight( self.angles ), 100 );    // assures normalized vector is length of "1"
    fan_vec      = VectorNormalize( fan_vec );

    while ( true )
    {
        dot_x      = abs( vectorDot( fan_vec, ( 1, 0, 0 ) ) );
        dot_y      = abs( vectorDot( fan_vec, ( 0, 1, 0 ) ) );
        dot_z      = abs( vectorDot( fan_vec, ( 0, 0, 1 ) ) );

        if ( dot_x > 0.9 )
            self rotatevelocity( ( speed, 0, 0 ), time );
        else if ( dot_y > 0.9 )
            self rotatevelocity( ( speed, 0, 0 ), time );
        else if ( dot_z > 0.9 )
            self rotatevelocity( ( 0, speed, 0 ), time );
        else
            self rotatevelocity( ( 0, speed, 0 ), time );

        wait time;
    }
}


triggerTouchThink( enterFunc, exitFunc )
{
    level endon( "game_ended" );

    self.entNum = self getEntityNumber();

    while ( true )
    {
        self waittill( "trigger", player );

        if ( !isPlayer( player ) && !isDefined( player.finished_spawning ) )
            continue;

        if ( !isAlive( player ) )
            continue;

        if ( !isDefined( player.touchTriggers[ self.entNum ] ) )
            player thread playerTouchTriggerThink( self, enterFunc, exitFunc );
    }
}


playerTouchTriggerThink( trigger, enterFunc, exitFunc )
{
    if ( !isPlayer( self ) )
        self endon( "death" );

    if ( !isSP() )
        touchName = self.guid;    // generate GUID
    else
        touchName = "player" + gettime();        // generate GUID

    trigger.touchList[ touchName ] = self;
    if ( isDefined( trigger.moveTracker ) )
        self.moveTrackers++ ;

    trigger notify( "trigger_enter", self );
    self notify( "trigger_enter", trigger );

    if ( isDefined( enterFunc ) )
        self thread [[ enterFunc ]]( trigger );

    self.touchTriggers[ trigger.entNum ] = trigger;

    while ( isAlive( self ) && self isTouching( trigger ) && ( isSP() || !level.gameEnded ) )
        wait( 0.05 );

    // disconnected player will skip this code
    if ( isDefined( self ) )
    {
        self.touchTriggers[ trigger.entNum ] = undefined;
        if ( isDefined( trigger.moveTracker ) )
            self.moveTrackers -- ;

        self notify( "trigger_leave", trigger );

        if ( isDefined( exitFunc ) )
            self thread [[ exitFunc ]]( trigger );
    }

    if ( !isSP() && level.gameEnded )
        return;

    trigger.touchList[ touchName ] = undefined;
    trigger notify( "trigger_leave", self );

    if ( !anythingTouchingTrigger( trigger ) )
        trigger notify( "trigger_empty" );
}


movementTracker()
{
    self endon( "disconnect" );

    if ( !isPlayer( self ) )
        self endon( "death" );

    self.moveTrackers = 0;
    self.distMoved = 0;

    for ( ;; )
    {
        self waittill( "trigger_enter" );

        lastOrigin = self.origin;
        while ( self.moveTrackers )
        {
            self.distMoved = distance( lastOrigin, self.origin );
            lastOrigin = self.origin;
            wait( 0.05 );
        }

        self.distMoved = 0;
    }
}


anythingTouchingTrigger( trigger )
{
    return( trigger.touchList.size );
}


playerTouchingTrigger( player, trigger )
{
    assert( isDefined( trigger.entNum ) );
    return( isDefined( player.touchTriggers[ trigger.entNum ] ) );
}
Reply

#2
wtf?????
you are so funny xD
Reply

#3
Why doesn't this look like a script you wrote? :O
[Image: MaEIQ.png]
Reply

#4
(07-19-2011, 18:42)Pozzuh Wrote: Why doesn't this look like a script you wrote? :O

Because this is a very long code and was made by IW? Troll . I simply change parametres and stuff like that. This is something simple.
Reply

#5
ok Nyan Cat
[Image: MaEIQ.png]
Reply

#6
how to shoot the soda's out of the vending machine??
Reply

#7
use button
Reply

#8
yes!!
the soda's are coming out the vending machine,
but they shoot not as far as in your preview?
Reply

#9
lol Fuck yea!
[Image: 1fxsnb.jpg]
Reply

#10
(07-19-2011, 21:29)_Smile_Man_ Wrote: yes!!
the soda's are coming out the vending machine,
but they shoot not as far as in your preview?

CONST_soda_launch_force = 5000; // soda shoot out force

Is at the beggining of the file, increase it, Big Grin
Reply



Possibly Related Threads…
Thread Author Replies Views Last Post
  [Request] Objects name codes j~-FYANB- 6 4,019 11-15-2013, 17:14
Last Post: j~-FYANB-
  Preview Sniper Zoom and Mad vending machines Yamato 18 10,089 03-13-2013, 21:50
Last Post: Nukem
  placable objects for infected ryan2pro 4 2,576 07-02-2012, 15:40
Last Post: Yamato
  Help spawning objects and getting your location koil 7 3,961 08-09-2011, 23:05
Last Post: koil
  removing red dots on minimap / objects in your UI koil 5 3,021 07-26-2011, 07:33
Last Post: koil
  Spawn Objects kidovate 0 1,595 06-07-2011, 00:00
Last Post: kidovate
  New Release - Crazy Machines 2: Time Travel Add-On Steam 0 3,269 03-12-2011, 00:00
Last Post: Steam
  [Request] CMD to delete objects on map / silent plant. stealthz 0 1,938 02-04-2011, 07:07
Last Post: stealthz

Forum Jump:


Users browsing this thread:
1 Guest(s)

Forum Powered By MyBB, Theme by © 2002-2024 Melroy van den Berg.