Announcement

Collapse
No announcement yet.

WAR-TiberianSun_UTVehicles[final beta released 8-21-09]

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    #16
    Well, I think we should encourage the author of the map, not keep bashing him.
    It's always good to see some new maps, even they are not as detailed or have good gameplays.
    Personally I like C&C a lot so I am looking forward to this.
    Maybe the author can find some advice at the mod request/sharing fourm?
    And people should give new comers some patient.

    Comment


      #17
      Originally posted by joe74509 View Post
      Well, I think we should encourage the author of the map, not keep bashing him.
      OK. I start with a quote from the rules of this forum:

      "Forum Rules and Guidelines/Read Before Posting

      * Screenshots cannot be larger then 640x480. If you want to link to a larger photo that is fine, you are welcome to use the [screenshot] tag to resize on the fly."



      SO, the rules clearly state that he must not post such huge screenshots and even tell how to resize them

      Comment


        #18
        thank you for posting the info Northrawn now can we get back to bashing my map because it has no world objects other than the building meshes and turret tracks?

        Originally posted by sgtmay View Post
        lol ya dont think i didnt look for it in the posting tools

        would be nice to know how to do it since i dont know how to.

        i would fix that post if someone could clue me in on how its done
        thank you.

        Comment


          #19
          Originally posted by sgtmay View Post
          thank you for posting the info Northrawn now can we get back to bashing my map because it has no world objects other than the building meshes and turret tracks?



          thank you.
          Don't worry youll find alot of idiots bashing your barebone maps around here just don't mind them they lack vision and inteligente to spot a wip\barebone map from a near final product....

          Keep working on it, it looks like it can become something rather fun to play.

          Comment


            #20
            Looking forward to the finished product, hopefully it'll surpass Renegade.

            Comment


              #21
              i do not seem to be able to find the proper way to trigger damage to an object from a static mesh through kismet so now i will take the barricade child code and adapt it to the power nodes..... heres what i have got so far.

              Code:
              /**
               * Copyright 1998-2008 Epic Games, Inc. All Rights Reserved.
               */
              class CnCWarfareChildPowerNode extends Actor
              	abstract
              	placeable;
              
              var()		CnCWarfarePowerNode ParentPowerNode;
              var			CnCWarfareChildPowerNode NextPowerNode;
              
              simulated event PostBeginPlay()
              {
              	local CnCWarfarePowerNode B;
              	local float NewDist, BestDist;
              
              	Super.PostBeginPlay();
              
              	if ( ParentPowerNode == None )
              	{
              		// find a barricade
              		LogInternal(self$" does not have parent PowerNode set!");
              		ForEach WorldInfo.AllNavigationPoints(class'CnCWarfareChildPowerNode', B)
              		{
              			NewDist = VSize(Location - B.Location);
              			if ( (ParentPowerNode == None) || (NewDist < BestDist) )
              			{
              				ParentPowerNode = B;
              				BestDist = NewDist;
              			}
              		}
              	}
              	if ( ParentPowerNode != None )
              	{
              		ParentPowerNode.RegisterChild(self);
              	}
              }
              
              event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
              {
              	if ( ParentPowerNode != None )
              	{
              		ParentPowerNode.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser);
              	}
              }
              
              //simulated function DisableBarricade()
              //{
              //	SetCollision(false, false);
              //	SetHidden(true);
              //	CollisionComponent.SetBlockRigidBody(false);
              //}
              
              //simulated function EnableBarricade()
              //{
              //	SetCollision(true, true);
              //	SetHidden(false);
              //	CollisionComponent.SetBlockRigidBody(true);
              //}
              
              defaultproperties
              {
                 bNoDelete=True
                 bMovable=False
                 bCollideActors=True
                 bBlockActors=True
                 bProjTarget=True
                 CollisionType=COLLIDE_CustomDefault
                 Name="Default__CnCWarfareChildPowerNode"
                 ObjectArchetype=Actor'Engine.Default__Actor'
              }
              i still need to modify my adapted power node script to fit this better but i can see this making it easier to set up damageable structures than just relying on just the power node script to handle the whole building.

              I have already proven you can replace the power node base mesh with a building mesh but then you have to climb all the way on top of the building to enable the power node which is not going to work but if i made the building foundation the power node base and then made all the separate static meshes that make the building children of that..... i think you see where i am going with this.

              Another way i have experimented with a little is making each piece of the building be able to be knocked off until you reduce the building to a 'pile' but that would require a complete rework of every building and triple the amount of static meshes needed for each building.

              im going to have to experiment with this as it is an abstract class so if i can comment that out and get it to work..... i just have a bad feeling about how the script will compile every time i see that "abstract" XD

              Comment


                #22
                Abstract classes will compile normally but you cannot use them to spawn objects. You'll get a log error if you try anyway.

                Comment


                  #23
                  Hi i am ZixXer and i am a mapper for the Renegade-X team.
                  your doing almost the same as we do, you never heart of renegade-x?
                  www.renegade-x.com

                  if you did know, why are you making the same thing?

                  any way good luck with the project.

                  Comment


                    #24
                    Originally posted by Xyx View Post
                    Abstract classes will compile normally but you cannot use them to spawn objects. You'll get a log error if you try anyway.
                    thanks for the tip XyX good to see you are still kickin around here


                    and yes ZixXer i know all about Renagade-X

                    they started working on their version of a CnC mode a few months after i had already established that i was working on a CnC mod for UT2004...... but now we have this new engine to play with and i really never seen eye to eye with their vision of how CnC should play out in Unreal.

                    I actually have a working Renegade style map using my scripts in UT2004 Assault that has damageable buildings and either team could win the round.... let me go get my scripts..... im sure some people might still be interested in those for UT2004 since i never published them but did test them among a few of my closest beta testers.

                    My CnC mod will encompass all factors that i can possibly do on my own.... including building structures and economic tactics.

                    Ive been working on it slowly over the past 2 or 3 years.

                    Comment


                      #25
                      The first piece of code here is my ugliest hack ever and i was surprized that i actually pulled it off with no errors or crashieness.

                      Code:
                      // my code modifications that make buildings damageable by either team depending on set flags
                      // note that assigned team numbers switch between rounds
                      
                      class CnCDestroyableObjective extends GameObjective;
                      
                      // Trigger type.
                      var() enum EConstraintInstigator
                      {
                      	CI_All,				// Anything can deal damage to objective
                      	CI_PawnClass,		// Only Forced Pawn class can deal damage to objective
                      } ConstraintInstigator;
                      
                      var()	class<Pawn>	ConstraintPawnClass;
                      
                      var()	int		DamageCapacity;			// amount of damage that can be taken before destroyed
                      var()	name	TakeDamageEvent;
                      var()	int		DamageEventThreshold;	// trigger damage event whenever this amount of damage is taken
                      var		int		AccumulatedDamage;
                      var		int		Health;
                      var		float	LinkHealMult;			// If > 0, Link Gun secondary heals an amount equal to its damage times this
                      var()	float	VehicleDamageScaling;
                      var()   vector  AIShootOffset; //adjust where AI should try to shoot this objective
                      var ShootTarget ShootTarget;
                      
                      var()	bool	bCanDefenderDamage;		// can defender damage objective ?
                      var()	bool	bCanAttackerDamage;             // can attacker damage objective ?
                      
                      //var		byte		CurrentAttackingTeam;
                      //var		byte		FirstAttackingTeam;
                      
                      var     bool    bReplicateHealth;
                      var bool		bMonitorUnderAttack;
                      var	bool		bIsUnderAttack;
                      var	VolumeTimer	UnderAttackTimer;
                      var float		LastDamageTime;
                      var float		LastWarnTime;
                      
                      replication
                      {
                          reliable if ( bReplicateHealth && (Role == ROLE_Authority) )
                              Health;
                      
                      	unreliable if ( bMonitorUnderAttack && (Role==ROLE_Authority) && bReplicateObjective && bNetDirty )
                      		bIsUnderAttack;
                      }
                      
                      function PostBeginPlay()
                      {
                      	super.PostBeginPlay();
                      	if (AIShootOffset != vect(0,0,0))
                      	{
                      		ShootTarget = spawn(class'ShootTarget', self,, Location + AIShootOffset);
                      		ShootTarget.SetBase(self);
                      	}
                      	Reset();
                      }
                      
                      event int SpecialCost(Pawn Other, ReachSpec Path)
                      {
                      	return 0;
                      }
                      
                      function SetDelayedDamageInstigatorController(Controller C)
                      {
                      	DelayedDamageInstigatorController = C;
                      }
                      
                      function Destroyed()
                      {
                      	if ( UnderAttackTimer != None )
                      	{
                      		UnderAttackTimer.Destroy();
                      		UnderAttackTimer = None;
                      	}
                      
                      	super.Destroyed();
                      }
                      
                      simulated function bool TeamLink(int TeamNum)
                      {
                      	return ( LinkHealMult > 0 && (DefenderTeamIndex == TeamNum) );
                      }
                      
                      
                      function Actor GetShootTarget()
                      {
                      	if (ShootTarget != None)
                      		return ShootTarget;
                      
                      	return self;
                      }
                      
                      function bool KillEnemyFirst(Bot B)
                      {
                      	return false;
                      }
                      
                      function bool LegitimateTargetOf(Bot B)
                      {
                      	if ( ConstraintInstigator == CI_PawnClass && !ClassIsChildOf(B.Pawn.Class, ConstraintPawnClass) )
                      		return false;
                      
                      	if ( (DamageCapacity > 0) && bActive && !bDisabled )
                      		return true;
                      	return false;
                      }
                      
                      /* TellBotHowToDisable()
                      tell bot what to do to disable me.
                      return true if valid/useable instructions were given
                      */
                      function bool TellBotHowToDisable(Bot B)
                      {
                      	local int i;
                      	local float Best, Next;
                      	local vector Dir;
                      	local NavigationPoint BestPath;
                      	local bool bResult;
                      
                      	// Only a specific Pawn can deal damage to objective ?
                      	if ( ConstraintInstigator == CI_PawnClass && !ClassIsChildOf(B.Pawn.Class, ConstraintPawnClass) )
                      		return false;
                      
                      	if ( (B.Pawn.Physics == PHYS_Flying) && (B.Pawn.MinFlySpeed > 0) )
                      	{
                      		if ( (VehiclePath != None) && B.Pawn.ReachedDestination(VehiclePath) )
                      		{
                      			B.Pawn.AirSpeed = FMin(B.Pawn.AirSpeed, 1.05 * B.Pawn.MinFlySpeed);
                      			B.Pawn.bThumped = true;
                      			Dir = Normal(B.Pawn.Velocity);
                      			// go on to next pathnode past VehiclePath
                      			for ( i=0; i<VehiclePath.PathList.Length; i++ )
                      			{
                      				if ( BestPath == None )
                      				{
                      					BestPath = VehiclePath.PathList[i].End;
                      					Best = Dir Dot Normal(BestPath.Location - VehiclePath.Location);
                      				}
                      				else
                      				{
                      					Next = Dir Dot Normal(VehiclePath.PathList[i].End.Location - VehiclePath.Location);
                      					if ( Next > Best )
                      					{
                      						Best = Next;
                      						BestPath = VehiclePath.PathList[i].End;
                      					}
                      				}
                      			}
                      			if ( BestPath != None )
                      			{
                      				B.MoveTarget = BestPath;
                      				B.SetAttractionState();
                      				return true;
                      			}
                      		}
                      		if ( B.CanAttack(GetShootTarget()) )
                      		{
                      			B.Pawn.AirSpeed = FMin(B.Pawn.AirSpeed, 1.05 * B.Pawn.MinFlySpeed);
                      			B.Focus = self;
                      			B.FireWeaponAt(self);
                      			B.GoalString = "Attack Objective";
                      			if ( !B.Squad.FindPathToObjective(B,self) )
                      			{
                      				B.DoRangedAttackOn(GetShootTarget());
                      				B.Pawn.Acceleration = B.Pawn.AccelRate * Normal(Location - B.Pawn.Location);
                      			}
                      			else
                      				return true;
                      		}
                      		bResult = Super.TellBotHowToDisable(B);
                      		if ( bResult && (FlyingPathNode(B.MoveTarget) != None) && (B.MoveTarget.CollisionRadius < 1000) )
                      			B.Pawn.AirSpeed = FMin(B.Pawn.AirSpeed, 1.05 * B.Pawn.MinFlySpeed);
                      		else
                      			B.Pawn.AirSpeed = B.Pawn.Default.AirSpeed;
                      		return bResult;
                      	}
                      	else if ( !B.Pawn.bStationary && B.Pawn.TooCloseToAttack(GetShootTarget()) )
                      	{
                      		B.GoalString = "Back off from objective";
                      		B.RouteGoal = B.FindRandomDest();
                      		B.MoveTarget = B.RouteCache[0];
                      		B.SetAttractionState();
                      		return true;
                      	}
                      	else if ( B.CanAttack(GetShootTarget()) )
                      	{
                      		if (KillEnemyFirst(B))
                      			return false;
                      
                      		B.GoalString = "Attack Objective";
                      		B.DoRangedAttackOn(GetShootTarget());
                      		return true;
                      	}
                      
                      	return Super.TellBotHowToDisable(B);
                      }
                      
                      function bool NearObjective(Pawn P)
                      {
                      	if ( P.CanAttack(GetShootTarget()) )
                      		return true;
                      	return Super.NearObjective(P);
                      }
                      
                      /* TellBotHowToHeal()
                      tell bot what to do to heal me
                      return true if valid/useable instructions were given
                      */
                      function bool TellBotHowToHeal(Bot B)
                      {
                      	local Vehicle OldVehicle;
                      
                      	if (!TeamLink(B.GetTeamNum()) || Health >= DamageCapacity)
                      		return false;
                      
                      	if (B.Squad.SquadObjective == None)
                      	{
                      		if (Vehicle(B.Pawn) != None)
                      			return false;
                      		//hack - if bot has no squadobjective, need this for SwitchToBestWeapon() so bot's weapons' GetAIRating()
                      		//has some way of figuring out bot is trying to heal me
                      		B.DoRangedAttackOn(self);
                      	}
                      
                      	if (Vehicle(B.Pawn) != None && !Vehicle(B.Pawn).bKeyVehicle && (B.Enemy == None || (!B.EnemyVisible() && Level.TimeSeconds - B.LastSeenTime > 3)))
                      	{
                      		OldVehicle = Vehicle(B.Pawn);
                      		Vehicle(B.Pawn).KDriverLeave(false);
                      	}
                      
                      	if (B.Pawn.Weapon != None && B.Pawn.Weapon.CanHeal(self))
                      	{
                      		if (!B.Pawn.CanAttack(GetShootTarget()))
                      		{
                      			//need to move to somewhere else near objective
                      			B.GoalString = "Can't shoot"@self@"(obstructed)";
                      			B.RouteGoal = B.FindRandomDest();
                      			B.MoveTarget = B.RouteCache[0];
                      			B.SetAttractionState();
                      			return true;
                      		}
                      		B.GoalString = "Heal "$self;
                      		B.DoRangedAttackOn(GetShootTarget());
                      		return true;
                      	}
                      	else
                      	{
                      		B.SwitchToBestWeapon();
                      		if (B.Pawn.PendingWeapon != None && B.Pawn.PendingWeapon.CanHeal(self))
                      		{
                      			if (!B.Pawn.CanAttack(GetShootTarget()))
                      			{
                      				//need to move to somewhere else near objective
                      				B.GoalString = "Can't shoot"@self@"(obstructed)";
                      				B.RouteGoal = B.FindRandomDest();
                      				B.MoveTarget = B.RouteCache[0];
                      				B.SetAttractionState();
                      				return true;
                      			}
                      			B.GoalString = "Heal "$self;
                      			B.DoRangedAttackOn(GetShootTarget());
                      			return true;
                      		}
                      		if (B.FindInventoryGoal(0.0005)) //try to find a weapon to heal the objective
                      		{
                      			B.GoalString = "Find weapon or ammo to heal "$self;
                      			B.SetAttractionState();
                      			return true;
                      		}
                      	}
                      
                      	if (OldVehicle != None)
                      		OldVehicle.UsedBy(B.Pawn);
                      
                      	return false;
                      }
                      
                      /* Reset()
                      reset actor to initial state - used when restarting level without reloading.
                      */
                      function Reset()
                      {
                      	Health				= DamageCapacity;
                      	AccumulatedDamage	= 0;
                      	bProjTarget			= true;
                      	bIsUnderAttack		= false;
                      
                      	SetCollision(true, bBlockActors);
                      
                      	if ( UnderAttackTimer != None )
                      	{
                      		UnderAttackTimer.Destroy();
                      		UnderAttackTimer = None;
                      	}
                      
                      	super.Reset();
                      }
                      
                      
                      function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
                      						Vector momentum, class<DamageType> damageType)
                      {
                      	//local bool        bIsLinkGun;
                              local float			DamagePct, HealthTaken;
                      	local Controller	InstigatorController;
                      	local Pawn CurrentInstigator;
                      
                       if ( !bActive || bDisabled || (Damage <= 0) || !UnrealMPGameInfo(Level.Game).CanDisableObjective( Self ) )
                      		return;
                      
                      	CurrentInstigator = InstigatedBy;
                      	if ( Vehicle(instigatedBy) != None )
                      		Damage *= VehicleDamageScaling;
                      
                      	if ( damageType != None)
                      		Damage *= damageType.default.VehicleDamageScaling;
                      
                      	if ( (instigatedBy == None || instigatedBy.Controller == None) && (DelayedDamageInstigatorController != None) )
                      	{
                      		instigatedBy			= DelayedDamageInstigatorController.Pawn;
                      		InstigatorController	= DelayedDamageInstigatorController;
                      	}
                      
                      	if ( instigatedBy != None )
                      	{
                      		if ( InstigatedBy.Controller != None )
                      			InstigatorController = InstigatedBy.Controller;
                      		if ( instigatedBy.HasUDamage() )
                      			Damage *= 2;
                      		Damage *= instigatedBy.DamageScaling;
                      	}
                      
                      	// Only a specific Pawn can deal damage to objective ?
                      	if ( ConstraintInstigator == CI_PawnClass
                      		&& ((InstigatedBy == None) || !ClassIsChildOf(instigatedBy.Class, ConstraintPawnClass)) )
                      		return;
                              
                              // fix for current round team assignment number
                              If  ( DefenderTeamIndex != 1 )
                              goto AttackersRd2;
                      
                      DefendersRd1:
                      	// Can defenders damage Objective ?
                      	if ( !bCanDefenderDamage
                      		&& ( (InstigatedBy != None && InstigatedBy.GetTeamNum() == 1)
                      		|| (InstigatorController != None && InstigatorController.GetTeamNum() == 1) ) )
                      		return;
                      
                               // Can Attackers damage Objective ?
                      	if ( !bCanAttackerDamage
                      		&& ( (InstigatedBy != None && InstigatedBy.GetTeamNum() == 0)
                      		|| (InstigatorController != None && InstigatorController.GetTeamNum() == 0) ) )
                      		return;
                      
                              // fix for current round team assignment number
                              If  ( DefenderTeamIndex == 1 )
                              goto DivertRd2;
                      
                      AttackersRd2:
                              // Can defenders damage Objective ?
                      	if ( !bCanDefenderDamage
                      		&& ( (InstigatedBy != None && InstigatedBy.GetTeamNum() == 0)
                      		|| (InstigatorController != None && InstigatorController.GetTeamNum() == 0) ) )
                      		return;
                              
                              // Can Attackers damage Objective ?
                      	if ( !bCanAttackerDamage
                      		&& ( (InstigatedBy != None && InstigatedBy.GetTeamNum() == 1)
                      		|| (InstigatorController != None && InstigatorController.GetTeamNum() == 1) ) )
                      		return;
                      
                      DivertRd2:
                      
                      	Damage = UnrealMPGameInfo(Level.Game).AdjustDestroyObjectiveDamage( Damage, InstigatorController, Self );
                      	NetUpdateTime = Level.TimeSeconds - 1;
                      	AccumulatedDamage += Damage;
                      	if ( (DamageEventThreshold > 0) && (AccumulatedDamage >= DamageEventThreshold) )
                      	{
                      		TriggerEvent(TakeDamageEvent, Self, InstigatedBy);
                      		AccumulatedDamage = 0;
                      	}
                      
                      	HealthTaken = Min(Damage, Health);
                      	Health	-= Damage;
                      	if ((DefenseSquad != None) && (CurrentInstigator != None) && (CurrentInstigator.Controller != None) && (Level.TimeSeconds - LastWarnTime > 0.5) )
                      	{
                      		LastWarnTime = Level.TimeSeconds;
                      		DefenseSquad.Team.AI.CriticalObjectiveWarning(self, CurrentInstigator);
                      	}
                      
                      	// monitor percentage of damage done for score sharing
                      	DamagePct = HealthTaken / float(DamageCapacity);
                      	if ( InstigatedBy != None && InstigatedBy.Controller != None )
                      		AddScorer( InstigatedBy.Controller, DamagePct );
                      	else if ( DelayedDamageInstigatorController != None )
                      		AddScorer( DelayedDamageInstigatorController, DamagePct );
                      
                      	if ( Health < 1 )
                      		DisableObjective( instigatedBy );
                      	else if ( bMonitorUnderAttack )
                      	{
                      		bIsUnderAttack	 = true;
                      		LastDamageTime	 = Level.TimeSeconds;
                      		CheckPlayCriticalAlarm();
                      
                      		if ( UnderAttackTimer == None )
                      			UnderAttackTimer = Spawn(class'VolumeTimer', Self);
                      	}
                      }
                      
                      /* Award Assault score to player(s) who completed the objective */
                      function AwardAssaultScore( int Score )
                      {
                      	ShareScore( Score, "Objective_Completed" );
                      }
                      
                      function bool HealDamage(int Amount, Controller Healer, class<DamageType> DamageType)
                      {
                      	if ( !bActive || bDisabled || Health <= 0 || Health >= DamageCapacity || Amount <= 0
                      	     || Healer == None || !TeamLink(Healer.GetTeamNum()) )
                      		return false;
                      
                      	Health = Min(Health + (Amount * LinkHealMult), DamageCapacity);
                      	NetUpdateTime = Level.TimeSeconds - 1;
                      	return true;
                      }
                      
                      function DisableObjective(Pawn Instigator)
                      {
                      	if ( !bActive || bDisabled || !UnrealMPGameInfo(Level.Game).CanDisableObjective( Self ) )
                      		return;
                      
                      	SetCollision(false, bBlockActors);
                      	bProjTarget		= false;
                      	bIsUnderAttack	= false;
                      
                      	if ( UnderAttackTimer != None )
                      	{
                      		UnderAttackTimer.Destroy();
                      		UnderAttackTimer = None;
                      	}
                      
                      	super.DisableObjective(Instigator);
                      }
                      
                      function TimerPop(VolumeTimer T)
                      {
                      	if ( bIsUnderAttack && Level.TimeSeconds > LastDamageTime + 4 )
                      	{
                      		bIsUnderAttack	= false;
                      		CheckPlayCriticalAlarm();
                      
                      		if ( UnderAttackTimer != None )
                      		{
                      			UnderAttackTimer.Destroy();
                      			UnderAttackTimer = None;
                      		}
                      	}
                      }
                      
                      /* DestroyableObjectives are in danger when CriticalVolume is breached or Objective is damaged
                      	(In case Objective can be damaged from a great distance */
                      simulated function bool IsCritical()
                      {
                      	return (IsActive() && (bIsCritical || bIsUnderAttack));
                      }
                      
                      /* returns objective's progress status 1->0 (=disabled) */
                      simulated function float GetObjectiveProgress()
                      {
                      	if ( bDisabled )
                      		return 0;
                      	return (float(Health) / float(DamageCapacity));
                      }
                      
                      defaultproperties
                      {
                           bCanDefenderDamage=False
                           bCanAttackerDamage=True
                           HighlightOverlay(0)=FadeColor'myLevel.Skins.NoFlash'
                           HighlightOverlay(1)=FadeColor'myLevel.Skins.NoFlash'
                      
                           LinkHealMult=0.35
                      
                           ConstraintPawnClass=Class'Engine.Pawn'
                           DamageCapacity=100
                           VehicleDamageScaling=1.000000
                           bReplicateHealth=True
                           bMonitorUnderAttack=True
                           bReplicateObjective=True
                           bPlayCriticalAssaultAlarm=True
                           ObjectiveName="Destroyable Objective"
                           ObjectiveTypeIcon=FinalBlend'AS_FX_TX.Icons.OBJ_Destroy_FB'
                           ObjectiveDescription="Destroy Objective to disable it."
                           Objective_Info_Attacker="Destroy Objective"
                           Objective_Info_Defender="Protect Objective"
                           Announcer_DisabledObjective=Sound'AnnouncerAssault.Generic.Objective_destroyed'
                           bNotBased=True
                           bDestinationOnly=True
                           bSpecialForced=False
                           bStatic=False
                           bAlwaysRelevant=True
                           bCanBeDamaged=True
                           bCollideActors=True
                           bProjTarget=True
                      }
                      then the one you use to place it in a map with the editor.
                      Code:
                      //==============================================================================
                      // DestroyableObjective_SM
                      //==============================================================================
                      // Created by Laurent Delayen
                      // © 2003, Epic Games, Inc.  All Rights Reserved
                      //==============================================================================
                      // Specific subclass using staticmesh collision instead of cylinder collision.
                      // also provides an optional "destroyed version" staticmesh
                      //==============================================================================
                      // a clone of the original code parented to Destroyable objective
                      
                      class CnCDestroyableObjective_SM extends CnCDestroyableObjective;
                      
                      var()	StaticMesh	DestroyedStaticMesh;
                      var		StaticMesh	OriginalMesh, OldStaticMesh;
                      
                      // Used for controlling antiportals
                      var array<AntiPortalActor>	AntiPortals;	
                      var() name					AntiPortalTag;
                      
                      
                      simulated function PostBeginPlay()
                      {
                      	local AntiPortalActor AntiPortalA;
                      
                      	OriginalMesh	= StaticMesh;
                      	OldStaticMesh	= StaticMesh;
                      	
                      	if ( AntiPortalTag != '' )
                      	{
                      		foreach AllActors(class'AntiPortalActor', AntiPortalA, AntiPortalTag)
                      			AntiPortals[AntiPortals.Length] = AntiPortalA;
                      	}
                      
                      	super.PostBeginPlay();
                      }
                      
                      simulated function AdjustAntiPortals()
                      {
                      	local int i;
                      
                      	if ( AntiPortals.Length > 0 )
                      	{
                      		if ( StaticMesh == OriginalMesh )
                      		{
                      			for (i=0; i<AntiPortals.Length; i++)
                      				if ( AntiPortals[i].DrawType != DT_AntiPortal )
                      					AntiPortals[i].SetDrawType( DT_AntiPortal );
                      		}
                      		else
                      		{
                      			for (i=0; i<AntiPortals.Length; i++)
                      				if ( AntiPortals[i].DrawType != DT_None )
                      					AntiPortals[i].SetDrawType( DT_None );
                      		}
                      	}
                      }
                      
                      simulated function PostNetReceive()
                      {
                      	super.PostNetReceive();
                      
                      	if ( OldStaticMesh != StaticMesh )
                      	{
                      		KSetBlockKarma( false );
                      		KSetBlockKarma( true );				// Update karma collision
                      		OldStaticMesh = StaticMesh;
                      		AdjustAntiPortals();
                      	}
                      }
                      
                      /* Reset()
                      reset actor to initial state - used when restarting level without reloading.
                      */
                      function Reset()
                      {
                      	if ( DestroyedStaticMesh != None )
                      	{
                      		KSetBlockKarma( false );
                      		SetStaticMesh( OriginalMesh );
                      		KSetBlockKarma( true );
                      		AdjustAntiPortals();
                      	}
                      	else
                      		bHidden = false;
                      	
                      	super.Reset();
                      }
                      
                      function DisableObjective(Pawn Instigator)
                      {
                      	if ( !bActive || bDisabled || !UnrealMPGameInfo(Level.Game).CanDisableObjective( Self ) )
                      		return;
                      
                      	super.DisableObjective(Instigator);
                      
                      	if ( DestroyedStaticMesh != None )
                      	{
                      		KSetBlockKarma( false );
                      		SetStaticMesh( DestroyedStaticMesh );
                      		SetCollision(true, bBlockActors);
                      		KSetBlockKarma( true );				// Update karma collision
                      		AdjustAntiPortals();
                      	}
                      	else
                      		bHidden = true;
                      }
                      
                      simulated function UpdatePrecacheStaticMeshes()
                      {
                      	super.UpdatePrecacheStaticMeshes();
                      
                      	if ( DestroyedStaticMesh != None )
                      		Level.AddPrecacheStaticMesh( DestroyedStaticMesh );
                      }
                      
                      defaultproperties
                      {
                           DrawType=DT_StaticMesh
                           StaticMesh=StaticMesh'Editor.TexPropCube'
                           bHidden=False
                           bStaticLighting=True
                           bBlockActors=True
                           bBlockKarma=True
                           bBlocksTeleport=True
                           bEdShouldSnap=True
                      }
                      you can assign any static mesh just like the original code but this one allows you to flag which team can damage the objective.

                      and then the code to end the round for either team depending on which team scored the objectives first.
                      Code:
                      //=============================================================================
                      // Trigger_ASRoundEnd
                      // modified to trigger a defender win
                      //=============================================================================
                      
                      class Trigger_CnCRoundEnd_Defenders extends Triggers;
                      
                      event Trigger( Actor Other, Pawn EventInstigator )
                      {
                      	if ( Role < Role_Authority )
                      		return;
                      
                      	if ( !Level.Game.IsA('ASGameInfo') )
                      		return;
                      
                      	ASGameInfo(Level.Game).EndRound(ERER_AttackersLose, EventInstigator, "Defenders Win!");
                      }
                      
                      defaultproperties
                      {
                           bCollideActors=False
                      }
                      Code:
                      //=============================================================================
                      // Trigger_ASRoundEnd
                      // Cloned to branch off for naming convention reasons
                      //=============================================================================
                      
                      class Trigger_CnCRoundEnd_Attackers extends Triggers;
                      
                      event Trigger( Actor Other, Pawn EventInstigator )
                      {
                      	if ( Role < Role_Authority )
                      		return;
                      
                      	if ( !Level.Game.IsA('ASGameInfo') )
                      		return;
                      
                      	ASGameInfo(Level.Game).EndRound(ERER_AttackersWin, EventInstigator, "Attackers Win!");
                      }
                      
                      defaultproperties
                      {
                           bCollideActors=False
                      so.... yeah.... been at this for a while and those are the only ones im willing to show right now since they are out dated now that UT3 is here.
                      LOL i even had the war factory set up so that you just walked up to a picture of the vehicle you wanted to have and pressed the use key and it would spawn you in that vehicle....bah.... thats old stuff now.....Unreal 3 has a lot of improvements over its predecessor and the longer i use it the harder it is to go back and work on the old stuff.

                      i can do so much more with this engine that was only a possibility if i had a degree in programming with Unreal2x

                      Comment


                        #26
                        damageable building beta code done and working but i don't like how much coding this is going to require.
                        i would need 3 scripts for each object with this method.
                        The GDI war factory alone is over 26 objects so that's like 78 scripts for just 1 building....... not too efficient

                        here's a code drop for working damageable power node children that transfer damage to the associated power node.

                        Code:
                        /**
                         * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved.
                         */
                        class CnCWarPowerNodeGDIWF extends UTOnslaughtPowernode
                        	PerObjectLocalized;
                        
                        // cut and paste from utwarfarebarricade
                        var		CnCWarChildPowerNodeGDIWF NextPowerNode;
                        
                        simulated event PreBeginPlay()
                        {
                        	Super.PreBeginPlay();
                        
                        	MITV_NecrisCapturePipesLarge = NecrisCapturePipesLarge.CreateAndSetMaterialInstanceTimeVarying(0);
                        	MITV_NecrisCapturePipesLarge.SetScalarCurveParameterValue( 'Nec_TubeFadeOut', NecrisCapturePipes_FadeOut_Fast );
                        	MITV_NecrisCapturePipesLarge.SetScalarStartTime( 'Nec_TubeFadeOut', 0.0f );
                        
                        	MITV_NecrisCapturePipesSmall = NecrisCapturePipesSmall.CreateAndSetMaterialInstanceTimeVarying(0);
                        	MITV_NecrisCapturePipesSmall.SetScalarCurveParameterValue( 'Nec_TubeFadeOut', NecrisCapturePipes_FadeOut_Fast );
                        	MITV_NecrisCapturePipesSmall.SetScalarStartTime( 'Nec_TubeFadeOut', 0.0f );
                        
                        	MITV_NecrisCaptureGoo = new(Outer) class'MaterialInstanceTimeVarying';
                        	MITV_NecrisCaptureGoo.SetParent( MaterialInstance'GP_Onslaught.Materials.M_GP_Ons_NecrisNode_GooAnimate' );
                        	PSC_NecrisGooPuddle.SetMaterialParameter( 'Nec_PuddleOpacity', MITV_NecrisCaptureGoo );
                        }
                        
                        simulated function RegisterChild(CnCWarChildPowerNodeGDIWF B)
                        {
                        	local CnCWarChildPowerNodeGDIWF Next;
                        
                        	if ( NextPowerNode == None )
                        	{
                        		NextPowerNode = B;
                        	}
                        	else
                        	{
                        		Next = NextPowerNode;
                        		while ( Next.NextPowerNode != None )
                        		{
                        			Next = Next.NextPowerNode;
                        		}
                        		Next.NextPowerNode = B;
                        	}
                        //	if ( bDisabled )
                        //	{
                        //		B.DisablePowerNode();
                        //	}
                        }
                        // slight modification of a default property
                        defaultproperties
                        {
                           Begin Object Class=StaticMeshComponent Name=StaticMeshComponent0 ObjName=StaticMeshComponent0 Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                              StaticMesh=StaticMesh'TsumetaiCnCAssets.StaticMeshes.GDIWFBib'
                              //LightEnvironment=DynamicLightEnvironmentComponent'UTGameContent.Default__UTOnslaughtPowernode_Content:PowerNodeLightEnvironment'
                              bUseAsOccluder=False
                              bCastDynamicShadow=False
                              Translation=(X=0.000000,Y=0.000000,Z=250.000000)
                              Name="StaticMeshComponent0"
                              ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                           End Object
                           NodeBase=StaticMeshComponent0
                           Begin Object Class=StaticMeshComponent Name=StaticMeshSpinner ObjName=StaticMeshSpinner Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                              StaticMesh=StaticMesh'GP_Onslaught.Mesh.S_GP_Ons_Power_Node_spinners'
                              //LightEnvironment=DynamicLightEnvironmentComponent'UTGameContent.Default__UTOnslaughtPowernode_Content:PowerNodeLightEnvironment'
                              bUseAsOccluder=False
                              CastShadow=False
                              bCastDynamicShadow=False
                              CollideActors=False
                              BlockActors=False
                              Translation=(X=0.000000,Y=0.000000,Z=-34.000000)
                              Name="StaticMeshSpinner"
                              ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                           End Object
                           NodeBaseSpinner=StaticMeshSpinner
                           TeamGlowColors(0)=(R=30.000000,G=2.250000,B=0.950000,A=1.000000)
                           TeamGlowColors(1)=(R=0.900000,G=3.750000,B=40.000000,A=1.000000)
                           NeutralGlowColor=(R=7.000000,G=7.000000,B=4.500000,A=1.000000)
                           Begin Object Class=CylinderComponent Name=CollisionCylinder2 ObjName=CollisionCylinder2 Archetype=CylinderComponent'Engine.Default__CylinderComponent'
                              CollisionHeight=70.000000
                              CollisionRadius=90.000000
                              CollideActors=True
                              BlockActors=True
                              Translation=(X=0.000000,Y=0.000000,Z=400.000000)
                              Name="CollisionCylinder2"
                              ObjectArchetype=CylinderComponent'Engine.Default__CylinderComponent'
                           End Object
                           EnergySphereCollision=CollisionCylinder2
                           YawRotationRate=20000.000000
                           NeutralEffectTemplate=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Neutral'
                           ConstructingEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Constructing_Red'
                           ConstructingEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Constructing_Blue'
                           ActiveEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Center_Red'
                           ActiveEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Center_Blue'
                           ShieldedActiveEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Center_Red_Shielded'
                           ShieldedActiveEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Center_Blue_Shielded'
                           Begin Object Class=ParticleSystemComponent Name=CaptureSystem ObjName=CaptureSystem Archetype=ParticleSystemComponent'Engine.Default__ParticleSystemComponent'
                              bAutoActivate=False
                              SecondsBeforeInactive=1.000000
                              Name="CaptureSystem"
                              ObjectArchetype=ParticleSystemComponent'Engine.Default__ParticleSystemComponent'
                           End Object
                           OrbCaptureComponent=CaptureSystem
                           OrbCaptureTemplate(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Orb_Capture_Red'
                           OrbCaptureTemplate(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Orb_Capture_Blue'
                           ShieldedEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Shielded_Red'
                           ShieldedEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Shielded_Blue'
                           VulnerableEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Vulnerable_Red'
                           VulnerableEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Vulnerable_Blue'
                           Begin Object Class=ParticleSystemComponent Name=InvulnerableSystem ObjName=InvulnerableSystem Archetype=ParticleSystemComponent'Engine.Default__ParticleSystemComponent'
                              bAutoActivate=False
                              HiddenGame=True
                              Name="InvulnerableSystem"
                              ObjectArchetype=ParticleSystemComponent'Engine.Default__ParticleSystemComponent'
                           End Object
                           InvulnerableToOrbEffect=InvulnerableSystem
                           InvulnerableToOrbTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_GP_Ons_Powernode_OrbShield_Red'
                           InvulnerableToOrbTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_GP_Ons_Powernode_OrbShield_Blue'
                           DamagedEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Damaged_Red'
                           DamagedEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Damaged_Blue'
                           DestroyedEffectTemplate=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Destroyed'
                           PanelTravelTime=4.000000
                           InvulnerableRadius=1000.000000
                           FlagLinkEffectTemplates(0)=ParticleSystem'PICKUPS.PowerCell.Effects.P_LinkOrbAndNode_Red'
                           FlagLinkEffectTemplates(1)=ParticleSystem'PICKUPS.PowerCell.Effects.P_LinkOrbAndNode_Blue'
                           CaptureReturnRadius=500.000000
                           Begin Object Class=AudioComponent Name=OrbNearbySoundComponent ObjName=OrbNearbySoundComponent Archetype=AudioComponent'Engine.Default__AudioComponent'
                              SoundCue=SoundCue'A_Gameplay.ONS.OrbNearConduitCue'
                              bStopWhenOwnerDestroyed=True
                              bShouldRemainActiveIfDropped=True
                              Name="OrbNearbySoundComponent"
                              ObjectArchetype=AudioComponent'Engine.Default__AudioComponent'
                           End Object
                           OrbNearbySound=OrbNearbySoundComponent
                           InvEffectZOffset=16.000000
                           OrbHealingPerSecond=100
                           OrbCaptureInvulnerabilityDuration=12.000000
                           Begin Object Class=StaticMeshComponent Name=NecrisCapturePipesLargeComp ObjName=NecrisCapturePipesLargeComp Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                              StaticMesh=StaticMesh'GP_Onslaught.Mesh.S_GP_Ons_Power_Node_PipeTightLarge'
                              //LightEnvironment=DynamicLightEnvironmentComponent'UTGameContent.Default__UTOnslaughtPowernode_Content:PowerNodeLightEnvironment'
                              bUseAsOccluder=False
                              CastShadow=False
                              bCastDynamicShadow=False
                              CollideActors=False
                              BlockActors=False
                              Translation=(X=0.000000,Y=0.000000,Z=-34.000000)
                              Name="NecrisCapturePipesLargeComp"
                              ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                           End Object
                           NecrisCapturePipesLarge=NecrisCapturePipesLargeComp
                           MITV_NecrisCapturePipes_FadeIn=(Points=(,(InVal=4.000000,OutVal=6.000000)))
                           MITV_NecrisCapturePipes_FadeIn2=(Points=(,(InVal=0.010000,OutVal=1.000000)))
                           NecrisCapturePipes_FadeOut_Fast=(Points=(,(InVal=0.100000)))
                           NecrisCapturePuddle_FadeIn50=(Points=(,(InVal=5.000000,OutVal=0.750000)))
                           NecrisCapturePuddle_FadeIn100=(Points=((OutVal=0.750000),(InVal=4.000000,OutVal=1.000000)))
                           NecrisCapturePuddle_FadeOut=(Points=((OutVal=1.000000),(InVal=4.000000)))
                           Begin Object Class=StaticMeshComponent Name=NecrisCapturePipesSmallComp ObjName=NecrisCapturePipesSmallComp Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                              StaticMesh=StaticMesh'GP_Onslaught.Mesh.S_GP_Ons_Power_Node_PipeTightSmall'
                              //LightEnvironment=DynamicLightEnvironmentComponent'UTGameContent.Default__UTOnslaughtPowernode_Content:PowerNodeLightEnvironment'
                              bUseAsOccluder=False
                              CastShadow=False
                              bCastDynamicShadow=False
                              CollideActors=False
                              BlockActors=False
                              Translation=(X=0.000000,Y=0.000000,Z=-34.000000)
                              Name="NecrisCapturePipesSmallComp"
                              ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                           End Object
                           NecrisCapturePipesSmall=NecrisCapturePipesSmallComp
                           Begin Object Class=UTParticleSystemComponent Name=NecrisCaptureComp ObjName=NecrisCaptureComp Archetype=UTParticleSystemComponent'UTGame.Default__UTParticleSystemComponent'
                              Template=ParticleSystem'GP_Onslaught.Effects.P_GP_Ons_NecrisNode_Wispy'
                              bAutoActivate=False
                              Translation=(X=0.000000,Y=0.000000,Z=-34.000000)
                              Name="NecrisCaptureComp"
                              ObjectArchetype=UTParticleSystemComponent'UTGame.Default__UTParticleSystemComponent'
                           End Object
                           PSC_NecrisCapture=NecrisCaptureComp
                           Begin Object Class=UTParticleSystemComponent Name=NecrisGoodPuddleComp ObjName=NecrisGoodPuddleComp Archetype=UTParticleSystemComponent'UTGame.Default__UTParticleSystemComponent'
                              Template=ParticleSystem'GP_Onslaught.Effects.P_GP_Ons_PowerNode_NecrisPuddle'
                              bAutoActivate=False
                              Translation=(X=0.000000,Y=0.000000,Z=-34.000000)
                              Scale=2.500000
                              Name="NecrisGoodPuddleComp"
                              ObjectArchetype=UTParticleSystemComponent'UTGame.Default__UTParticleSystemComponent'
                           End Object
                           PSC_NecrisGooPuddle=NecrisGoodPuddleComp
                           LinkToSockets(0)="Link01"
                           LinkToSockets(1)="Link02"
                           PrimeAttackAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_AttackThePrimeNode',AnnouncementText="Attack the Prime Node!")
                           PrimeDefendAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_DefendThePrimeNode',AnnouncementText="Defend the Prime Node!")
                           EnemyPrimeAttackAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_AttackTheEnemyPrimeNode',AnnouncementText="Attack Enemy Prime Node!")
                           EnemyPrimeDefendAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_DefendThePrimeNode',AnnouncementText="Defend the Prime Node!")
                           PanelExplosionTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Core_Expl_Red01'
                           PanelExplosionTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Core_Expl_Blue01'
                           PanelHealthMax=60
                           PanelBonePrefix="NodePanel"
                           Begin Object Class=SkeletalMeshComponent Name=SkeletalMeshComponent1 ObjName=SkeletalMeshComponent1 Archetype=SkeletalMeshComponent'Engine.Default__SkeletalMeshComponent'
                              SkeletalMesh=SkeletalMesh'GP_Onslaught.Mesh.SK_GP_Ons_Power_Node_Panels'
                              AnimTreeTemplate=AnimTree'GP_Onslaught.Anims.AT_GP_Ons_Power_Node_Panels'
                              bUpdateSkelWhenNotRendered=False
                              bIgnoreControllersWhenNotRendered=True
                              //LightEnvironment=DynamicLightEnvironmentComponent'UTGameContent.Default__UTOnslaughtPowernode_Content:PowerNodeLightEnvironment'
                              bUseAsOccluder=False
                              CastShadow=False
                              bCastDynamicShadow=False
                              Translation=(X=0.000000,Y=0.000000,Z=240.000000)
                              Scale3D=(X=1.500000,Y=1.500000,Z=1.250000)
                              Name="SkeletalMeshComponent1"
                              ObjectArchetype=SkeletalMeshComponent'Engine.Default__SkeletalMeshComponent'
                           End Object
                           PanelMesh=SkeletalMeshComponent1
                           PanelHealEffectTemplates(0)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Panel_Red'
                           PanelHealEffectTemplates(1)=ParticleSystem'GP_Onslaught.Effects.P_Ons_Power_Node_Panel_Blue'
                           PanelGibClass=Class'UTGameContent.UTPowerNodePanel'
                           DestroyedSound=SoundCue'A_Gameplay.A_Gameplay_Onslaught_PowerCoreExplode01Cue'
                           ConstructedSound=SoundCue'A_Gameplay.A_Gameplay_Onslaught_PowerNodeBuilt01Cue'
                           StartConstructionSound=SoundCue'A_Gameplay.A_Gameplay_Onslaught_PowerNodeBuild01Cue'
                           ActiveSound=SoundCue'A_Gameplay.A_Gameplay_Onslaught_PowerNodeNotActive01Cue'
                           HealingSound=SoundCue'A_Gameplay.ONS.A_Gameplay_ONS_ConduitAmbient'
                           HealedSound=SoundCue'A_Gameplay.A_Gameplay_Onslaught_PowerNodeBuilt01Cue'
                           DestructionMessageIndex=16
                           DestroyedEvent(0)="red_powernode_destroyed"
                           DestroyedEvent(1)="blue_powernode_destroyed"
                           DestroyedEvent(2)="red_constructing_powernode_destroyed"
                           DestroyedEvent(3)="blue_constructing_powernode_destroyed"
                           ConstructedEvent(0)="red_powernode_constructed"
                           ConstructedEvent(1)="blue_powernode_constructed"
                           //Begin Object Class=AudioComponent Name=AmbientComponent ObjName=AmbientComponent Archetype=AudioComponent'UTGame.Default__UTOnslaughtPowernode:AmbientComponent'
                           //   ObjectArchetype=AudioComponent'UTGame.Default__UTOnslaughtPowernode:AmbientComponent'
                           //End Object
                           AmbientSoundComponent=AmbientComponent
                           Begin Object Class=StaticMeshComponent Name=StaticMeshComponent9 ObjName=StaticMeshComponent9 Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                              StaticMesh=StaticMesh'Onslaught_Effects.Meshes.S_Onslaught_FX_GodBeam'
                           //   LightEnvironment=DynamicLightEnvironmentComponent'UTGameContent.Default__UTOnslaughtPowernode_Content:PowerNodeLightEnvironment'
                              bUseAsOccluder=False
                              CastShadow=False
                              bAcceptsLights=False
                              CollideActors=False
                              BlockActors=False
                              BlockRigidBody=False
                              Translation=(X=0.000000,Y=0.000000,Z=-1166.000000)
                              Scale3D=(X=0.939400,Y=0.939400,Z=3.317000)
                              Name="StaticMeshComponent9"
                              ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                           End Object
                           NodeBeamEffect=StaticMeshComponent9
                           ShieldHitSound=SoundCue'A_Gameplay.ONS.A_GamePlay_ONS_CoreImpactShieldedCue'
                           HealEffectClasses(0)=Class'UTGameContent.UTOnslaughtNodeHealEffectRed'
                           HealEffectClasses(1)=Class'UTGameContent.UTOnslaughtNodeHealEffectBlue'
                           CapturedPrimeSpeech(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_PrimeNodeCaptured'
                           CapturedPrimeSpeech(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_PrimeNodeCaptured'
                           CapturedPrimeSpeech(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_PrimeNodeCaptured'
                           CapturedEnemyPrimeSpeech(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_EnemyPrimeNodeCaptured'
                           CapturedEnemyPrimeSpeech(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_EnemyPrimeNodeCaptured'
                           CapturedEnemyPrimeSpeech(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_EnemyPrimeNodeCaptured'
                           AttackingPrimeSpeech(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_AttackingPrimeNode'
                           AttackingPrimeSpeech(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_AttackingPrimeNode'
                           AttackingPrimeSpeech(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_AttackingPrimeNode'
                           AttackingEnemyPrimeSpeech(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_AttackingEnemyPrimeNode'
                           AttackingEnemyPrimeSpeech(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_AttackingEnemyPrimeNode'
                           AttackingEnemyPrimeSpeech(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_AttackingEnemyPrimeNode'
                           HeadingPrimeSpeech(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_HeadingTowardPrimeNode'
                           HeadingPrimeSpeech(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_HeadingTowardPrimeNode'
                           HeadingPrimeSpeech(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_HeadingTowardPrimeNode'
                           HeadingEnemyPrimeSpeech(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_HeadingTowardEnemyPrimeNode'
                           HeadingEnemyPrimeSpeech(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_HeadingTowardEnemyPrimeNode'
                           HeadingEnemyPrimeSpeech(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_HeadingTowardEnemyPrimeNode'
                           DamageCapacity=2000.000000
                           LinkHealMult=1.000000
                           bHasLocationSpeech=True
                           Score=5
                           AttackAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_AttackTheNode')
                           DefendAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_DefendTheNode')
                           bDestinationOnly=False
                           //Begin Object Class=CylinderComponent Name=CollisionCylinder ObjName=CollisionCylinder Archetype=CylinderComponent'UTGame.Default__UTOnslaughtPowernode:CollisionCylinder'
                           //   CollisionHeight=30.000000
                           //   CollisionRadius=160.000000
                           //   ObjectArchetype=CylinderComponent'UTGame.Default__UTOnslaughtPowernode:CollisionCylinder'
                           //End Object
                           CylinderComponent=CollisionCylinder
                           //Begin Object Class=ArrowComponent Name=Arrow ObjName=Arrow Archetype=ArrowComponent'UTGame.Default__UTOnslaughtPowernode:Arrow'
                           //   ObjectArchetype=ArrowComponent'UTGame.Default__UTOnslaughtPowernode:Arrow'
                           //End Object
                           Components(0)=Arrow
                           Components(1)=CollisionCylinder
                           //Begin Object Class=PathRenderingComponent Name=PathRenderer ObjName=PathRenderer Archetype=PathRenderingComponent'UTGame.Default__UTOnslaughtPowernode:PathRenderer'
                           //   ObjectArchetype=PathRenderingComponent'UTGame.Default__UTOnslaughtPowernode:PathRenderer'
                           //End Object
                           Components(2)=PathRenderer
                           //Begin Object Class=LinkRenderingComponent Name=LinkRenderer ObjName=LinkRenderer Archetype=LinkRenderingComponent'UTGame.Default__UTOnslaughtPowernode:LinkRenderer'
                           //   ObjectArchetype=LinkRenderingComponent'UTGame.Default__UTOnslaughtPowernode:LinkRenderer'
                           //End Object
                           Components(3)=LinkRenderer
                           Components(4)=AmbientComponent
                           //Begin Object Class=DynamicLightEnvironmentComponent Name=PowerNodeLightEnvironment ObjName=PowerNodeLightEnvironment Archetype=DynamicLightEnvironmentComponent'Engine.Default__DynamicLightEnvironmentComponent'
                           //   bCastShadows=False
                           //   bDynamic=False
                           //   Name="PowerNodeLightEnvironment"
                           //   ObjectArchetype=DynamicLightEnvironmentComponent'Engine.Default__DynamicLightEnvironmentComponent'
                           //End Object
                           //Components(5)=PowerNodeLightEnvironment
                           Components(6)=StaticMeshComponent0
                           Components(7)=StaticMeshSpinner
                           Components(8)=SkeletalMeshComponent1
                           Components(9)=CollisionCylinder2
                           //Begin Object Class=UTParticleSystemComponent Name=AmbientEffectComponent ObjName=AmbientEffectComponent Archetype=UTParticleSystemComponent'UTGame.Default__UTParticleSystemComponent'
                           //   Translation=(X=0.000000,Y=0.000000,Z=128.000000)
                           //   Name="AmbientEffectComponent"
                           //   ObjectArchetype=UTParticleSystemComponent'UTGame.Default__UTParticleSystemComponent'
                           //End Object
                           //Components(10)=AmbientEffectComponent
                           //Begin Object Class=ParticleSystemComponent Name=ParticleSystemComponent1 ObjName=ParticleSystemComponent1 Archetype=ParticleSystemComponent'Engine.Default__ParticleSystemComponent'
                           //   bAutoActivate=False
                           //   bOverrideLODMethod=True
                           //   SecondsBeforeInactive=1.000000
                           //   LODMethod=PARTICLESYSTEMLODMETHOD_DirectSet
                           //   Translation=(X=0.000000,Y=0.000000,Z=370.000000)
                           //  Name="ParticleSystemComponent1"
                           //   ObjectArchetype=ParticleSystemComponent'Engine.Default__ParticleSystemComponent'
                           //End Object
                           //Components(11)=ParticleSystemComponent1
                           Components(12)=StaticMeshComponent9
                           Components(13)=OrbNearbySoundComponent
                           Components(14)=CaptureSystem
                           Components(15)=InvulnerableSystem
                           Components(16)=NecrisGoodPuddleComp
                           Components(17)=NecrisCaptureComp
                           Components(18)=NecrisCapturePipesLargeComp
                           Components(19)=NecrisCapturePipesSmallComp
                           bPathColliding=False
                           CollisionComponent=CollisionCylinder
                           MessageClass=Class'UTGameContent.UTOnslaughtMessage'
                           Name="Default__UTOnslaughtPowernode_Content"
                           ObjectArchetype=UTOnslaughtPowernode'UTGame.Default__UTOnslaughtPowernode'
                        }
                        Code:
                        /**
                         * Copyright 1998-2008 Epic Games, Inc. All Rights Reserved.
                         */
                        class CnCWarChildPowerNodeGDIWF extends Actor
                        	abstract
                        	placeable;
                        
                        var()		CnCWarPowerNodeGDIWF ParentPowerNode;
                        var			CnCWarChildPowerNodeGDIWF NextPowerNode;
                        
                        simulated event PostBeginPlay()
                        {
                        	local CnCWarPowerNodeGDIWF B;
                        	local float NewDist, BestDist;
                        
                        	Super.PostBeginPlay();
                        
                        	if ( ParentPowerNode == None )
                        	{
                        		// find a barricade
                        		LogInternal(self$" does not have parent PowerNode set!");
                        		ForEach WorldInfo.AllNavigationPoints(class'CnCWarPowerNodeGDIWF', B)
                        		{
                        			NewDist = VSize(Location - B.Location);
                        			if ( (ParentPowerNode == None) || (NewDist < BestDist) )
                        			{
                        				ParentPowerNode = B;
                        				BestDist = NewDist;
                        			}
                        		}
                        	}
                        	if ( ParentPowerNode != None )
                        	{
                        		ParentPowerNode.RegisterChild(self);
                        	}
                        }
                        
                        event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
                        {
                        	if ( ParentPowerNode != None )
                        	{
                        		ParentPowerNode.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser);
                        	}
                        }
                        
                        //simulated function DisableBarricade()
                        //{
                        //	SetCollision(false, false);
                        //	SetHidden(true);
                        //	CollisionComponent.SetBlockRigidBody(false);
                        //}
                        
                        //simulated function EnableBarricade()
                        //{
                        //	SetCollision(true, true);
                        //	SetHidden(false);
                        //	CollisionComponent.SetBlockRigidBody(true);
                        //}
                        
                        defaultproperties
                        {
                           bNoDelete=True
                           bMovable=False
                           bCollideActors=True
                           bBlockActors=True
                           bProjTarget=True
                           CollisionType=COLLIDE_CustomDefault
                           Name="Default__CnCWarChildPowerNodeGDIWF"
                           ObjectArchetype=Actor'Engine.Default__Actor'
                        }
                        Code:
                        /**
                         * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved.
                         */
                        class CnCWarChildPowerNodeGDIWF_GDIWFObj21 extends CnCWarChildPowerNodeGDIWF;
                        
                        defaultproperties
                        {
                           Begin Object Class=StaticMeshComponent Name=Mesh0 ObjName=Mesh0 Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                              StaticMesh=StaticMesh'TsumetaiCnCAssets.StaticMeshes.GDIWFObj21'
                              bForceDirectLightMap=True
                              LightingChannels=(BSP=True,Static=True)
                              Scale=2.000000
                              Name="Mesh0"
                              ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                           End Object
                           Components(0)=Mesh0
                           CollisionComponent=Mesh0
                           Name="Default__CnCWarChildPowerNodeGDIWF_GDIWFObj21"
                        //   ObjectArchetype=UTWarfareChildBarricade'UTGame.Default__UTWarfareChildBarricade'
                        }
                        as you can see from this horribly hacked code..... its going to be an inefficient way to go at best.

                        Ideally i would assign a programmable variable to the script so that i could assign the proper mesh to it within the editor but i am not too sure how much UT3 likes the using variables to define a variable in default properties...... so far it isnt looking promising.

                        Comment


                          #27
                          after a few hours of working with modifying the original power node i have decided it would be best if i just got away from modifying that script and just make mine a child of it.

                          the power node child class works perfectly and my modified power node is functional but you lose the health meter and it skews away the link gun heal fire at weird angles and looks horrible.

                          so if i just make them all children of the power node i can pare that down to 1 main script and a small script for each child object.

                          just compiled it now going back in to test more.

                          Comment


                            #28
                            Unfortunately, I can't currently play the map so I can't really say anything about the gameplay, but I can give a few pointers just looking at the screens...

                            Layout looks enormous, almost too enormous with all the barren terrain surrounding it. I can see core attacks taking forever since the base's team can simply camp behind their buildings and take out all incoming enemies well before they are in range to do any major damage.

                            There needs to be some sort of cover, strategic points of interest, like a rock just big enough to hide a tank, but short enough to shoot over, a stack of crates that a hellbender gunner could shoot from behind, a pallet or broken beam stuck against a rock at an odd angle that permits long distance manta jumping, etc. Lots of possibilities just looking at the layout, and more will come as you start adding things.

                            Just bear in mind that for every advantage one side gets, you have to make at least a modest advantage for the opposing side somewhere within that same area, otherwise you risk a lot of overtime matches and a lot of near-stalemates due to imbalance issues.

                            The lighting is way too flat and a bit on the dark side (the dark is not a bad thing unless it's all you can see), you need some contrasting light sources, brighter areas, shadowed areas, etc.

                            Needs some foliage, even if all you use is grass and weeds, but a few trees spotting the map would bring a lot of life, you could add a bunch of burnt trees too to make it look like a wartorn landscape... Which is what this map looks like it should be. If you do go with the wartorn landscape thing, a few bomb and artillery craters would go a long way, especially if one or two of them were still aflame or smoking (a good candidate for the Invulnerability if you put it in a flaming crater, so the person has to take a little damage to get the massive powerup)...

                            Your cliffs need definition. Use some rock meshes to make them really pop. Typically if you use a material similar to the one you use on the terrain also on the rocks, when the lighting is built, they more or less blend seamlessly and even just a couple rock meshes can make a so=so cliffside on a terrain look like a more natural occurance...

                            Hopefully some of that helps, look forward to seeing the next Beta and hopefully by then I can actually play it.

                            Comment


                              #29
                              i can shrink it when the time comes.... i can pretty the whole world up with static meshes until your video card smokes if you would like.

                              Thank you for the suggestions and im sure some of them will be implimented when i get to that stage.

                              right now i am more concerned with completing the damageable building code which i am very happy with the progress at the moment

                              ok here's the game plan for building damage.

                              i can make the whole building vulnerable to enemy fire with ease now although i still need to create a small script for each object.... you have a new power node class that can be used in combination with child static mesh objects that will cause damage to the parent power node..... although the power node is the only thing that displays health and can be healed.... i think it is a good trade off and makes it a challenge to capture the building.

                              killing it will be easy..... (2 direct hits any where with a spma will kill a building)taking it and holding it will be the hard part.

                              code drop shortly

                              Comment


                                #30
                                the script that splits me off from the default power node class
                                Code:
                                /**
                                 * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved.
                                 */
                                class  CnCPowerNode extends UTOnslaughtPowernode_Content
                                	PerObjectLocalized;
                                
                                
                                // cut and paste from utwarfarebarricade
                                var		CnCWarChildPowerNode NextPowerNode;
                                
                                simulated function RegisterChild(CnCWarChildPowerNode B)
                                {
                                	local CnCWarChildPowerNode Next;
                                
                                	if ( NextPowerNode == None )
                                	{
                                		NextPowerNode = B;
                                	}
                                	else
                                	{
                                		Next = NextPowerNode;
                                		while ( Next.NextPowerNode != None )
                                		{
                                			Next = Next.NextPowerNode;
                                		}
                                		Next.NextPowerNode = B;
                                	}
                                //	if ( bDisabled )
                                //	{
                                //		B.DisablePowerNode();
                                //	}
                                }
                                defaultproperties
                                {
                                   Name="Default__CnCPowerNode"
                                //   ObjectArchetype=UTOnslaughtPowernode'UTGame.Default__UTOnslaughtPowernode'
                                }
                                the script that monitors the static mesh and reports damage by instigator...damage type...etc.

                                Code:
                                /**
                                 * Copyright 1998-2008 Epic Games, Inc. All Rights Reserved.
                                 */
                                class CnCWarChildPowerNode extends Actor
                                	abstract
                                	placeable;
                                
                                var()		CnCPowerNode ParentPowerNode;
                                var			CnCWarChildPowerNode NextPowerNode;
                                
                                simulated event PostBeginPlay()
                                {
                                	local CnCPowerNode B;
                                	local float NewDist, BestDist;
                                
                                	Super.PostBeginPlay();
                                
                                	if ( ParentPowerNode == None )
                                	{
                                		// find a PowerNode
                                		LogInternal(self$" does not have parent PowerNode set!");
                                		ForEach WorldInfo.AllNavigationPoints(class'CnCPowerNode', B)
                                		{
                                			NewDist = VSize(Location - B.Location);
                                			if ( (ParentPowerNode == None) || (NewDist < BestDist) )
                                			{
                                				ParentPowerNode = B;
                                				BestDist = NewDist;
                                			}
                                		}
                                	}
                                	if ( ParentPowerNode != None )
                                	{
                                		ParentPowerNode.RegisterChild(self);
                                	}
                                }
                                
                                event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
                                {
                                	if ( ParentPowerNode != None )
                                	{
                                		ParentPowerNode.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser);
                                	}
                                }
                                
                                //simulated function DisableBarricade()
                                //{
                                //	SetCollision(false, false);
                                //	SetHidden(true);
                                //	CollisionComponent.SetBlockRigidBody(false);
                                //}
                                
                                //simulated function EnableBarricade()
                                //{
                                //	SetCollision(true, true);
                                //	SetHidden(false);
                                //	CollisionComponent.SetBlockRigidBody(true);
                                //}
                                
                                defaultproperties
                                {
                                   bNoDelete=True
                                   bMovable=False
                                   bCollideActors=True
                                   bBlockActors=True
                                   bProjTarget=True
                                   CollisionType=COLLIDE_CustomDefault
                                   Name="Default__CnCWarChildPowerNode"
                                   ObjectArchetype=Actor'Engine.Default__Actor'
                                }
                                Example script of a scripted placeable child object that you can bind to my power node hack.

                                Code:
                                /**
                                 * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved.
                                 */
                                class CnCWarChildPowerNode_GDIWFBib extends CnCWarChildPowerNode;
                                
                                defaultproperties
                                {
                                   Begin Object Class=StaticMeshComponent Name=Mesh0 ObjName=Mesh0 Archetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                                      StaticMesh=StaticMesh'TsumetaiCnCAssets.StaticMeshes.GDIWFBib'
                                      bForceDirectLightMap=True
                                      LightingChannels=(BSP=True,Static=True)
                                      Scale=1.000000
                                      Name="Mesh0"
                                      ObjectArchetype=StaticMeshComponent'Engine.Default__StaticMeshComponent'
                                   End Object
                                   Components(0)=Mesh0
                                   CollisionComponent=Mesh0
                                   Name="Default__CnCWarChildPowerNode_GDIWFBib"
                                //   ObjectArchetype=UTWarfareChildBarricade'UTGame.Default__UTWarfareChildBarricade'
                                this works much better and i consider doable..... its short does what its supposed to do with out any side effects... and doesn't make the UT3 gods start yelling at me in red and yellow.

                                the last thing to test is the commented out disappear me part of the script and see how it looks.... might have to split a class with that commented out for the building foundations.

                                the more i think about that the worse of an idea it sounds like.....the code removes collision which would make the power node disappear as well as the children of it......buildings will have to stay up for now until i can come up with what i would need for that.perhaps the code from damageable building UT2

                                It will probably be a week or so before i am ready to release a beta with damageable buildings..... i have 180 individual objects to script and replace in the map.

                                I would actually like to see that version tested on a server to make sure the code is sound before i start adding in scenery stuff and more objects to load down the system and kill every ones frame rates..... but will probably shorten the gap between the bases by a few hundred yards

                                the TsumetaiCnCAssets package will be getting one more update when the ut vehicle version of the map goes final and then i will be moving on to creating a whole new package set for the Tiberian Sun vehicle set as well as my base code for creating CnC Tiberian Sun style warfare maps.
                                i will be abandoning the CnCScripts.u file for a new name so that i can let Tsumetais assets stay with that map.... and not have naming problems later down the road.

                                Comment

                                Working...
                                X