Any chance Classic can be updated with team-friendly mines?

Hey, guys,

Zodd, I dunno if you're around anymore; or whoever else was involved in that.

Just wanted to ask, since the purpose of this forum is to bring Tribes back to life; maybe we can speak of updates, too?

I just really, really hate the teamkilling, spammed mines.

Thanks :P

Comments

  • No chance.

    Do not ask again and you will be forgiven for this disgraceful error in judgment.
  • Hey, guys,

    Zodd, I dunno if you're around anymore; or whoever else was involved in that.

    Just wanted to ask, since the purpose of this forum is to bring Tribes back to life; maybe we can speak of updates, too?

    I just really, really hate the teamkilling, spammed mines.

    Thanks :P

    That is always nice idea, but I am sorry that it stays only as... nice idea. And you are suggesting a changes to the _classic_ here. Changes what would make offensive more difficult, what causes that classic people does not like the idea at all because they couldn't then rape the base so easily. If you even check out the classics mine script configuration, you notice it is tweaked to help dramatically the offensive actions, not the defense itself. (And when even talking about mines... it really is better not even suggesting to bring any features what would need more skills by the player or team itself because you just get being brick from it. As you know, classic players steps so easily to own teams mines for various reasons.)
  • It makes tk harder

    Thats why we have working "No Teamdamage" settings ;-)
  • This can be scripted I am sure.
  • Of course it can be scripted, there are several mods that implement team-friendly mines (Meltdown2 comes to mind, unless keen changed it)...
    It boils down to the decisions of the mod creator, server hosts, etc...
  • Of course it can be scripted, there are several mods that implement team-friendly mines (Meltdown2 comes to mind, unless keen changed it)...
    It boils down to the decisions of the mod creator, server hosts, etc...

    AVM has a tutorial on that if I recall.
  • It's very possible and easy to do. But the likelihood of it happening unless you do it yourself is near-zero as most eliteists today view classic as the infalliable pope of Tribes 2.
  • edited December 2009
    Changes what would make offensive more difficult, what causes that classic people does not like the idea at all because they couldn't then rape the base so easily. If you even check out the classics mine script configuration, you notice it is tweaked to help dramatically the offensive actions, not the defense itself.

    I suppose you've check classic's "mine script configuration". Can you formulate any argument to support that "it is tweaked to help dramatically the offensive actions"?
  • That is always nice idea, but I am sorry that it stays only as... nice idea. And you are suggesting a changes to the _classic_ here. Changes what would make offensive more difficult, what causes that classic people does not like the idea at all because they couldn't then rape the base so easily. If you even check out the classics mine script configuration, you notice it is tweaked to help dramatically the offensive actions, not the defense itself. (And when even talking about mines... it really is better not even suggesting to bring any features what would need more skills by the player or team itself because you just get being brick from it. As you know, classic players steps so easily to own teams mines for various reasons.)

    This retard is actually trying to say that team-friendly mines would make the game more skillful. That's all anyone needs to take away from his post to see that he should be ignored.
  • Team-friendly mines both remove skill from defense and create a huge liability to the defense.

    They remove skill from defending by making it so mines can be placed absolutely anywhere, even in high traffic areas. There is no reason mines should be able to be placed like this. The need to place them in places where teammates won't run over them is what makes them balanced. If a player could place a retarded number of mines throughout their base with no danger of teammates setting them off, it would be heavily biased towards the defense and become too difficult to actually attack the base. Not to mention that there's a limit on the number of mines that can be placed, which could make it difficult to put just a single mine on your flag.

    They add a liability to defense because mines blow up when hit, and team damage is on. Classic mines can explode other mines placed within range, making a massive chain reaction that will likely result in damaging teammates and team equipment due to the reckless abandon people would set them with if they didn't have to worry about them detonating on teammates.

    Team-friendly mines were known in concept and practice well before classic came out. They were left out for a reason.
  • following that logic missiles should lock/fire at any hot targets, not just the enemy


    am i missing something?
  • a lot, actually
  • the way i look at it is team damage in a scifi shooter like tribes is stupid, this isnt cs or americas army where realism is a goal of sorts, but whatever floats your boat
  • find the word "realism" in my wall of text you skipped

    oh wait, it's not there

    team damage is meant to BALANCE THE GAME, not make it realistic

    otherwise we would have people trying to defend their base by spamming mortars every which-way

    and bombing enemy flag carriers regardless of who's chasing him

    and ramming cappers with shrikes to speed them up

    like ewo did
  • lol yeah balance
    t2 is balanced?
    where is this balance you speak of?
    perhaps turrets should fire at all players and not just enemies?
  • perhaps turrets should fire at all players and not just enemies?
    mortar turrets already do
  • Instead of arguing, let's just integrate team mines as an OPTION in the menus. Make it off by default. Then everyone's happy.

    By the way, Robertom, your avatar is obscene.
  • Well I thought this thread would die off, but it seems it is going to stick around. Let me just say you do not know what you are asking for. It may sound like a simple change that will lower the amount of headaches, but this is not the case. You would open up a whole new can of worms that has the potential to be far more annoying. It really is best in this situation to just learn to spot mines and avoid them.

    Lets look at a couple things that would infact occur. For one because they wouldn't have to worry about friendies stepping on mines the whole enemy base would be mined. Another thing you would see more of is minedisking...without teamdamage they can get right up on you to make sure they don't miss.

    Now you might be thinking those things don't sound so bad, but I promise ya you disable teamdamage people will be in here complaining about those next. When all it took to avoid the domino effect here is to learn to spot a mine.

    Theres also a bit of arrogance that comes with these types of suggestions. You play the game for how long and decide you know exactly how to fix it and make it 1000% times better. Forget what the oldies say...what do they know anyway? Thats another reason for some peoples lack of patience on subjects like this we've been through it a thousand times before.

    I'm not trying to be a jerk here just injecting a little perspective....
  • No chance.

    Do not ask again and you will be forgiven for this disgraceful error in judgment.
    Quoted For Truth (QFT).
  • Classic needs a shark image installed, just a fin that pokes out of the ground or water and randomly travels the map, that has lasers on its head so it will kill players at random. It could be done as a bot.
  • Here is the code to make them team friendly...
    Credit goes to the Havoc2 mod creaters..

    1 add this to your serverDefaults.cs and prefs.cs
    $Host::TeamFriendlyMines = 1;



    2
    replace every function for the mine in the weapTurretCode.cs with this...
    // ----------------------------------------------
    // mine functions
    // ----------------------------------------------
    
    function explodeMine(%mo, %noDamage)
    {
       %mo.noDamage = %noDamage;
       %mo.setDamageState(Destroyed);
    }
    
    function Player::deployMine(%Player, %Surface, %Data)
    {
       %Position = posFromRaycast(%Surface);
    
       // check for other deployed mines in the immediate vicinity
       %Spacing = %Data.spacing;
       InitContainerRadiusSearch(%Position, %Spacing, $TypeMasks::ItemObjectType | $TypeMasks::StaticShapeObjectType);
       while ((%ObjectFound = containerSearchNext()) != 0)
       {
          // If it finds something other than another mine, ignore it.
          %Category =%ObjectFound.getDatablock().category;
          if (%Category !$= "Mine")
             continue;
    
          messageClient(%Player.client, 'MsgCantSitHere', 'Too close to another anti-personnel mine.');
          return;
       }
    
       %SurfaceNormal = normalFromRaycast(%Surface);
    
       %RotationalAxis = vectorNormalize(vectorCross(%SurfaceNormal, "0 0 1"));
       if (getWord(%SurfaceNormal, 0) == 1 || getWord(%SurfaceNormal, 0) == -1)
          %RotationalAxis = vectorNormalize(vectorCross(%SurfaceNormal, "0 1 0"));
    
       %Rotation = %RotationalAxis @ " " @ mACos(vectorDot(%SurfaceNormal, "0 0 1"));
    
       %Client = %Player.client;
    
       %Mine = new StaticShape()
       {
          datablock = %Data;
          position = %Position;
          sourceObject = %Client;
          team = %Client.team;
       };
       MissionCleanUp.Add(%Mine);
    
       %Mine.setTransform(%Position @ " " @ %Rotation);
    
       %Mine.ArmMine = Schedule(1800, 0, "ArmMine", %Mine);
    
       %Mine.playThread(0, "deploy");
       serverPlay3D(MineDeploySound, %Position);
    
       %NewPosition = VectorAdd(%Position, VectorScale(%SurfaceNormal, 0.08));
    
       %Mine.schedule(1600, setTransform, %NewPosition @ " " @ %Rotation);
    
       $TeamDeployedCount[%Team, MineDeployed]++;
       %Player.inv[%Data.Item]--;
       %Player.client.setInventoryHudAmount(%Data.Item, %Player.inv[%Data.Item]);
    }
    
    // This is the initial mine throw it starts several things, including a check for
    // to stabilize the mine.  If a mine was thrown over an edge or slides for a long
    // time we disable the mine.  We give the mine 12 seconds to arm itself or we
    // remove it
    function MineDeployed::onThrow(%this, %Mine)
    {
       %Mine.armed = false;
       %Mine.damaged = 0;
       %Mine.detonated = false;
       %Mine.team = %Mine.sourceObject.team;
       %Mine.MineCheck = schedule(1500, 0, "MineCheck", %Mine);
       %Mine.ArmCheck = schedule(12000, 0, "MineArmingCheck", %Mine);
    }
    
    // This makes the mine purely proximity, not contact.
    function MineDeployed::onCollision(%data, %Mine, %col)
    {
    
    }
    
    // This checks to see if the mine has come to a stop and then does several checks
    // before it will set it active
    function MineCheck(%Mine)
    {
       // If mine is detonated, then stop this looping
       if (%Mine.detonated == true)
          return;
    
       // If the mine is moving, check again in 0.75 seconds to see if it has stopped moving
       if (VectorLen(%Mine.getVelocity()) > 0.1)
       {
          %Mine.MineCheck = schedule(750, 0, "MineCheck", %Mine);
          return(0);
       }
    
       // Record the use of this mine - if blown prematurely or otherwise it will be decremented
       $TeamDeployedCount[%Team, MineDeployed]++;
    
       // Check to make sure that the team does not have too many mines currently deployed
       %Team = %Mine.sourceObject.team;
       if ($TeamDeployedCount[%Team, MineDeployed] > $TeamDeployableMax[MineDeployed])
       {
          // Too many mines of this type in use on that team, repack it
          // Don't apply the full amount of damage.
          messageClient(%Mine.sourceObject, 'MsgCantSitHere', 'Too many anti-personnel mines already deployed.');
          //MineRepack(%Mine);
          %Mine.setDamageState(Destroyed);
          return(0);
       }
    
       // check for other deployed mines in the immediate vicinity
       %Position = %Mine.getWorldBoxCenter();
       %Spacing = %Mine.getDatablock().spacing;
       InitContainerRadiusSearch(%Position, %Spacing, $TypeMasks::ItemObjectType | $TypeMasks::StaticShapeObjectType);
       while ((%ObjectFound = containerSearchNext()) != 0)
       {
    
          // It will find itself so we ignore that
          if (%ObjectFound == %Mine)
             continue;
    
          // If it finds something other than another mine, ignore it.
          %Category =%ObjectFound.getDatablock().category;
          if (%Category !$= "Mine")
             continue;
    
          // Detonate mine because it is too close another mine
          messageClient(%Mine.sourceObject.client, 'MsgCantSitHere', 'Too close to another anti-personnel mine.');
          //MineRepack(%Mine);
          %Mine.setDamageState(Destroyed);
          return(0);
    
       }
    
       // a delay before mine is armed -- let the animation finished first
       %ArmTime = %Mine.getDatablock().armTime;
       %Mine.ArmMine = Schedule(%ArmTime, 0, "ArmMine", %Mine);
    
       // Play the digging into the ground animation and make the proper sound
       %Mine.playThread(0, "deploy");
       serverPlay3D(MineDeploySound, %Mine.getTransform());
    }
    
    // This function arms the mine and lets the bots know it is there
    function ArmMine(%Mine)
    {
       %Mine.armed = true;
    
       %Transform = %Mine.getTransform();
       %Position = posFromTransform(%Transform);
       %Proximity = %Mine.getDataBlock().proximity;
    
       // Start the .5 second loop searching for enemies
       MineCheckVicinity(%Mine, %Position, %Proximity);
    
       //let the AI know it's is there...
       AIDeployMine(%Mine);
    
       // Cancel the MineArmingCheck
       Cancel(%Mine.ArmCheck);
    }
    
    // This function will detonate the mine
    function MineExplode(%Mine)
    {
       %Mine.setDamageState(Destroyed);
    }
    
    // This function will caused the mine to be detonated at 10% power if it is not yet armed.
    function MineArmingCheck(%Mine)
    {
       // If armed, then we leave the mine alone.
       if (%Mine.armed == true)
          return;
    
       // If it doesn't exist, return.
       if (isObject(%Mine) == false)
          return;
    
       %Mine.setDamageState(Destroyed);
       return;
    }
    
    // This function is called after the mine has been deployed. It will check the
    // immediate area around the mine the defined range for players or vehicles
    // passing by, and detonate if any are found. This is to extend the range of the
    // mine so players don't have to collide with them to set them off.
    
    function MineCheckVicinity(%Mine, %Position, %Range)
    {
       // don't keep checking if mine is already detonating
       if(%Mine.detonated == true)
          return;
    
       %Masks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType;
       InitContainerRadiusSearch(%Position, %Range, %Masks);
    
       while((%Target = containerSearchNext()) != 0)
       {
          // Make the mine team friendly for players
          if (%Target.team == %Mine.team && $Host::TeamFriendlyMines == true)
             continue;
    
          // Make the mine team friendly for vehicles piloted by friendlies
          if (%Target.lastPilot.team == %Mine.team && $Host::TeamFriendlyMines == true)
             continue;
    
          // Also if the mine owner is the one it found, then whipe the source as they
          // placed it while on the other team and it should not count as a suicide.
          if (%ObjectFound == %Mine.sourceObject && $Host::TeamFriendlyMines == true)
             %Mine.sourceObject = '';
    
          %Mine.setDamageState(Destroyed);
    
          return;
       }
    
       // If nothing was found, schedule another check in 0.5 seconds
       %Mine.MineCheckVicinity = schedule(650, %Mine, "MineCheckVicinity", %Mine, %Position, %Range);
    }
    
    // This function applied damage to the mine, it can cause it to explode.
    // if the damage is sufficient.  One idea is to make the person who shot
    // the mine responsible for the effect if that is what caused it to explode.
    function MineDeployed::damageObject(%Data, %Mine, %SourceObject, %Position, %Amount, %DamageType)
    {
       if (%Mine.detonated == true)
          return(0);
    
       %Mine.damaged += %Amount;
    
       if (%Mine.damaged >= %Data.maxDamage)
       {
          // If it is not armed, just make a pop
          if (%Mine.armed == true)
          {
             %Mine.setDamageState(Destroyed);
          } else {
             %Position = posFromTransform(%Mine.getTransform());
    
             %Item = new Item()
             {
                datablock = MineFizzle;
                position = %Position;
             };
             MissionCleanUp.add(%Item);
    
             %Mine.schedule(450, delete);
             schedule(500, 0, detonateGrenade, %Item);
          }
       }
    }
    
    // This function does the actual explosion, gives credit to the one shooting it
    function MineDeployed::onDestroyed(%data, %Mine, %lastState)
    {
       if (%Mine.detonated == true)
          return;
    
       // Mark the mine as blown so that all associated functions halt
       %Mine.detonated = true;
    
       // Cancel any potential schedules
       Cancel(%Mine.MineCheck);
       Cancel(%Mine.ArmCheck);
       Cancel(%Mine.MineArm);
       Cancel(%Mine.MineCheckVicinity);
    
       // Allow the mine to be replaced
       $TeamDeployedCount[%Mine.Team, MineDeployed]--;
    
       // Locate the mine and it's properties
       %Transform = %Mine.getTransform();
       %Position = posFromTransform(%Transform);
       %Source = %Mine.sourceObject;
    
       if (%Source $= "")
          %Source = %Mine;
    
       %DataBlock = %Mine.getDataBlock();
       %Radius = %DataBlock.damageRadius;
       %Damage = %DataBlock.indirectDamage;
       %Impulse = %DataBlock.kickBackStrength;
       %Type = %DataBlock.radiusDamageType;
    
       RadiusExplosion(%Mine, %Position, %Radius, %Damage, %Impulse, %Source, %Type);
    
       %Mine.schedule(450, "delete");
    }
    
    function WallMine::damageObject(%Data, %Mine, %SourceObject, %Position, %Amount, %DamageType)
    {
       MineDeployed::damageObject(%Data, %Mine, %SourceObject, %Position, %Amount, %DamageType);
    }
    
    function WallMine::onDestroyed(%data, %Mine, %lastState)
    {
       MineDeployed::onDestroyed(%data, %Mine, %lastState);
    }
    
  • 3
    replace every thing in the mine.cs with this...
    
    // ----------------------------------------------
    // mine script
    // ----------------------------------------------
    
    $TeamDeployableMax[MineDeployed]		= 25; // z0dd - ZOD, 6/10/02. Was 20.
    
    
    // ----------------------------------------------
    // force-feedback datablocks
    // ----------------------------------------------
    
    datablock EffectProfile(MineExplosionEffect)
    {
       effectname = "explosions/mine_detonate";
       minDistance = 10;
       maxDistance = 50;
    };
    
    // ----------------------------------------------
    // audio datablocks
    // ----------------------------------------------
    
    datablock AudioProfile(MineDeploySound)
    {
       filename = "fx/weapons/mine_deploy.wav";
       description = AudioClose3D;
       preload = true;
    };
    
    datablock AudioProfile(MineExplosionSound)
    {
       filename = "fx/weapons/mine_detonate.wav";
       description = AudioBIGExplosion3d;
       preload = true;
       effect = MineExplosionEffect;
    };
    
    datablock AudioProfile(UnderwaterMineExplosionSound)
    {
       filename = "fx/weapons/mine_detonate_UW.wav";
       description = AudioBIGExplosion3d;
       preload = true;
       effect = MineExplosionEffect;
    };
    
    //--------------------------------------------------------------------------
    // Mine Particle effects
    //--------------------------------------------------------------------------
    datablock ParticleData(MineExplosionBubbleParticle)
    {
       dragCoefficient      = 0.0;
       gravityCoefficient   = -0.25;
       inheritedVelFactor   = 0.0;
       constantAcceleration = 0.0;
       lifetimeMS           = 2000;
       lifetimeVarianceMS   = 750;
       useInvAlpha          = false;
       textureName          = "special/bubbles";
    
       spinRandomMin        = -100.0;
       spinRandomMax        =  100.0;
    
       colors[0]     = "0.7 0.8 1.0 0.0";
       colors[1]     = "0.7 0.8 1.0 0.4";
       colors[2]     = "0.7 0.8 1.0 0.0";
       sizes[0]      = 1.0;
       sizes[1]      = 1.0;
       sizes[2]      = 1.0;
       times[0]      = 0.0;
       times[1]      = 0.3;
       times[2]      = 1.0;
    };
    datablock ParticleEmitterData(MineExplosionBubbleEmitter)
    {
       ejectionPeriodMS = 7;
       periodVarianceMS = 0;
       ejectionVelocity = 1.0;
       ejectionOffset   = 2.0;
       velocityVariance = 0.5;
       thetaMin         = 0;
       thetaMax         = 80;
       phiReferenceVel  = 0;
       phiVariance      = 360;
       overrideAdvances = false;
       particles = "MineExplosionBubbleParticle";
    };
    datablock ParticleData( UnderwaterMineCrescentParticle )
    {
       dragCoefficient      = 2;
       gravityCoefficient   = 0.0;
       inheritedVelFactor   = 0.2;
       constantAcceleration = -0.0;
       lifetimeMS           = 600;
       lifetimeVarianceMS   = 000;
       textureName          = "special/crescent3";
       colors[0] = "0.5 0.5 1.0 1.0";
       colors[1] = "0.5 0.5 1.0 1.0";
       colors[2] = "0.5 0.5 1.0 0.0";
       sizes[0]      = 0.5;
       sizes[1]      = 1.0;
       sizes[2]      = 2.0;
       times[0]      = 0.0;
       times[1]      = 0.5;
       times[2]      = 1.0;
    };
    
    datablock ParticleEmitterData( UnderwaterMineCrescentEmitter )
    {
       ejectionPeriodMS = 10;
       periodVarianceMS = 0;
       ejectionVelocity = 10;
       velocityVariance = 5.0;
       ejectionOffset   = 0.0;
       thetaMin         = 0;
       thetaMax         = 80;
       phiReferenceVel  = 0;
       phiVariance      = 360;
       overrideAdvances = false;
       orientParticles  = true;
       lifetimeMS       = 200;
       particles = "UnderwaterMineCrescentParticle";
    };
    
    datablock ParticleData(UnderwaterMineExplosionSmoke)
    {
       dragCoeffiecient     = 105.0;
       gravityCoefficient   = -0.0;
       inheritedVelFactor   = 0.025;
       constantAcceleration = -1.0;
    
       lifetimeMS           = 1200;
       lifetimeVarianceMS   = 00;
    
       textureName          = "particleTest";
    
       useInvAlpha =  false;
       spinRandomMin = -200.0;
       spinRandomMax =  200.0;
    
       textureName = "special/Smoke/smoke_001";
    
       colors[0]     = "0.7 0.7 1.0 1.0";
       colors[1]     = "0.3 0.3 1.0 1.0";
       colors[2]     = "0.0 0.0 1.0 0.0";
       sizes[0]      = 1.0;
       sizes[1]      = 3.0;
       sizes[2]      = 1.0;
       times[0]      = 0.0;
       times[1]      = 0.5;
       times[2]      = 1.0;
    
    };
    
    datablock ParticleEmitterData(UnderwaterMineExplosionSmokeEmitter)
    {
       ejectionPeriodMS = 8;
       periodVarianceMS = 0;
    
       ejectionVelocity = 4.25;
       velocityVariance = 1.25;
    
       thetaMin         = 0.0;
       thetaMax         = 80.0;
    
       lifetimeMS       = 250;
    
       particles = "UnderwaterMineExplosionSmoke";
    };
    
    datablock ExplosionData(UnderwaterMineExplosion)
    {
       explosionShape = "disc_explosion.dts";
       playSpeed      = 1.0;
       sizes[0] = "0.4 0.4 0.4";
       sizes[1] = "0.4 0.4 0.4";
       soundProfile   = UnderwaterMineExplosionSound;
       faceViewer     = true;
    
       emitter[0] = UnderwaterMineExplosionSmokeEmitter;
       emitter[1] = UnderwaterMineCrescentEmitter;
       emitter[2] = MineExplosionBubbleEmitter;
    
       shakeCamera = true;
       camShakeFreq = "8.0 7.0 9.0";
       camShakeAmp = "50.0 50.0 50.0";
       camShakeDuration = 1.0;
       camShakeRadius = 10.0;
    };
    
    //--------------------------------------------------------------------------
    // Mine Particle effects
    //--------------------------------------------------------------------------
    datablock ParticleData( MineCrescentParticle )
    {
       dragCoefficient      = 2;
       gravityCoefficient   = 0.0;
       inheritedVelFactor   = 0.2;
       constantAcceleration = -0.0;
       lifetimeMS           = 600;
       lifetimeVarianceMS   = 000;
       textureName          = "special/crescent3";
       colors[0] = "1.0 0.8 0.2 1.0";
       colors[1] = "1.0 0.4 0.2 1.0";
       colors[2] = "1.0 0.0 0.0 0.0";
       sizes[0]      = 0.5;
       sizes[1]      = 1.0;
       sizes[2]      = 2.0;
       times[0]      = 0.0;
       times[1]      = 0.5;
       times[2]      = 1.0;
    };
    
    datablock ParticleEmitterData( MineCrescentEmitter )
    {
       ejectionPeriodMS = 10;
       periodVarianceMS = 0;
       ejectionVelocity = 10;
       velocityVariance = 5.0;
       ejectionOffset   = 0.0;
       thetaMin         = 0;
       thetaMax         = 80;
       phiReferenceVel  = 0;
       phiVariance      = 360;
       overrideAdvances = false;
       orientParticles  = true;
       lifetimeMS       = 200;
       particles = "MineCrescentParticle";
    };
    
    datablock ParticleData(MineExplosionSmoke)
    {
       dragCoeffiecient     = 105.0;
       gravityCoefficient   = -0.0;
       inheritedVelFactor   = 0.025;
    
       lifetimeMS           = 1200;
       lifetimeVarianceMS   = 00;
    
       textureName          = "particleTest";
    
       useInvAlpha =  true;
       spinRandomMin = -200.0;
       spinRandomMax =  200.0;
    
       textureName = "special/Smoke/smoke_001";
    
       colors[0]     = "1.0 0.7 0.0 1.0";
       colors[1]     = "0.2 0.2 0.2 1.0";
       colors[2]     = "0.0 0.0 0.0 0.0";
       sizes[0]      = 1.0;
       sizes[1]      = 3.0;
       sizes[2]      = 1.0;
       times[0]      = 0.0;
       times[1]      = 0.5;
       times[2]      = 1.0;
    
    };
    
    datablock ParticleEmitterData(MineExplosionSmokeEmitter)
    {
       ejectionPeriodMS = 8;
       periodVarianceMS = 0;
    
       ejectionVelocity = 4.25;
       velocityVariance = 1.25;
    
       thetaMin         = 0.0;
       thetaMax         = 80.0;
    
       lifetimeMS       = 250;
    
       particles = "MineExplosionSmoke";
    };
    
    
    
    datablock ExplosionData(MineExplosion)
    {
       explosionShape = "effect_plasma_explosion.dts";
       playSpeed      = 1.0;
       sizes[0] = "0.5 0.5 0.5";
       sizes[1] = "0.5 0.5 0.5";
       soundProfile   = MineExplosionSound;
       faceViewer     = true;
    
       emitter[0] = MineExplosionSmokeEmitter;
       emitter[1] = MineCrescentEmitter;
    
       shakeCamera = true;
       camShakeFreq = "8.0 7.0 9.0";
       camShakeAmp = "50.0 50.0 50.0";
       camShakeDuration = 1.0;
       camShakeRadius = 10.0;
    };
    
    datablock ExplosionData(DeployablesExplosion)
    {
       explosionShape = "effect_plasma_explosion.dts";
       playSpeed      = 1.0;
       sizes[0] = "0.5 0.5 0.5";
       sizes[1] = "0.5 0.5 0.5";
       soundProfile   = MineExplosionSound;
       faceViewer     = true;
    
       emitter[0] = MineExplosionSmokeEmitter;
       emitter[1] = MineCrescentEmitter;
    
       shakeCamera = true;
       camShakeFreq = "8.0 7.0 9.0";
       camShakeAmp = "50.0 50.0 50.0";
       camShakeDuration = 1.0;
       camShakeRadius = 10.0;
    };
    
    
    // This is a single undeployed mine that can be used if picked up, the same as a regular one.
    datablock ItemData(MineSingle)
    {
       className = HandInventory;
       category = "Dropped";
       item = "Mine";
       shapeFile = "mine.dts";
       mass = 0.75;
    
       elasticity = 0.2;
       friction = 0.7;
       pickupRadius = 1;
    
       isMine = true;
    
       AlternateObject = Mine;
    
       thrownItem = MineDeployed;
       pickUpName = "an anti-personnel mine";
    };
    
    function MineSingle::onPickup(%this, %Mine, %Player, %Amount)
    {
       %Player.incInventoy(%Mine.AlternateObject, 1);
       %Player.decInventoy(%Mine, 1);
    }
    
    function MineRepack(%Mine)
    {
       %Transform = %Mine.getTransform();
       %Position = posFromTransform(%Transform);
    
       %NewItem = new Item()
       {
          dataBlock = %Mine.getDataBlock().packedItem;
          position = %Position;
       };
       MissionCleanup.add(%NewItem);
    
       %Mine.delete();
    }
    
    datablock ItemData(MineDeployed)
    {
       className = Weapon;
       category = "Mine";
       shapeFile = "mine.dts";
       item = "Mine";
       packedItem = "MineSingle";
    
       DeployedItem = WallMine;
    
       mass = 0.75;
    
       elasticity = 0.3;
       friction = 0.6;
    
       axDamage = 0.01; // z0dd - ZOD, 9/27/03. was 0.2
       explosion = MineExplosion;
       underwaterExplosion = UnderwaterMineExplosion;
       indirectDamage = 0.57; // z0dd - ZOD, 7/14/03. Slight increase to dmg. Was 0.55
       damageRadius = 10.0; // z0dd - ZOD, 7/14/03. Slight increase to det range. Was 6.0
       kickBackStrength = 1500;
       aiAvoidThis = true;
       dynamicType = $TypeMasks::DamagableItemObjectType;
       spacing = 6.0;
       proximity = 2.5;
       armTime = 2000;
       rearDamageFactor = 1.2;
    };
    
    datablock StaticShapeData(WallMine) : StaticShapeDamageProfile
    {
       className = Weapon;
       category = "Mine";
    
       shapeFile = "mine.dts";
       item = "Mine";
    
       sticky = true;
    
       mass = 0.0;
       elasticity = 0;
       friction = 1.0;
    
       maxDamage = 0.01; // z0dd - ZOD, 9/27/03. was 0.2
       explosion = MineExplosion;
       underwaterExplosion = UnderwaterMineExplosion;
       indirectDamage = 0.57; // z0dd - ZOD, 7/14/03. Slight increase to dmg. Was 0.55
       damageRadius = 10.0; // z0dd - ZOD, 7/14/03. Slight increase to det range. Was 6.0
       radiusDamageType = $DamageType::Mine;
       kickBackStrength = 1500;
    
       aiAvoidThis = true;
    
       dynamicType = $TypeMasks::DamagableItemObjectType;
       spacing = 6.0;
       proximity = 2.5;
    
       armTime = 2000;
    
       rearDamageFactor    = 1.2;
    };
    
    datablock ItemData(MineFizzle)
    {
       className = Weapon;
       category = "Mine";
       shapeFile = "mine.dts";
       item = "Mine";
       mass = 0.75;
       elasticity = 0.2;
       friction = 0.6;
       explosion      = "DeployablesExplosion";
       maxDamage = 1000;
       hasDamageRadius = false;
       aiAvoidThis = false;
    };
    
    datablock ItemData(Mine)
    {
       className = HandInventory;
       catagory = "Handheld";
    
       shapeFile = "mine.dts";
       mass = 1;
       trueMass = 0.04;
    
       elasticity = 0.2;
       friction = 0.7;
       pickupRadius = 1;
    
       DeployedItem = WallMine;
    
       isMine = true;
    
       thrownItem = MineDeployed;
       pickUpName = "some anti-personnel mines";
    };
    
    
    
  • Get that crap out of here.
  • I believe T1 EliteRen had friendly mines... people didn't go overboard with them, they were just able to actually put them on entry points without blocking their own team.
    Course people seemed more sportsmanlike in T1.
Sign In or Register to comment.