Author Topic: Help getting a laser-style projectile  (Read 1948 times)

I'm working on a laser-type weapon hopefully to be released later today, and everything is in place except for the bullet trail... i want to make it have a red trail behind the bullet which acts much like a laser pointer, staying in the air until the projectile reaches its destination, then disappearing completely. i looked through the code for ladios' laser weapon set, and couldn't find which bit of code actually made the bullet trail show up... right now i have nothing, my bullet trail is completely invisible. any help would be appreciated.

I don't know if getting the laser trail to vanish as soon as the laser hits something is possible, but you could always make the laser muzzlevelocity fast and decrease the time between each particle emitted (ejectionperiodMS found in the EmitterTrail datablock) and then expand the lifetime the lifetime of the particles, so the particles will vanish "simultaneously" but still with a tad of delay.

As for your invisible particle problem, could you post the script so we could have a look at it?

making the trail vanish instantaneously is not really that big of a deal, but i currently can't even get the bullet trail to even work. i should clarify, the trail is not so much invisible as nonexistant.

sure.
Code: [Select]
//Phaser.cs
//phaser from startrek
//by CaffeineBoy

//audio
datablock AudioProfile(PhaserShot1Sound)
{
   filename    = "./sound/PhaserFire.wav";
   description = AudioClose3d;
   preload = true;
};
datablock AudioProfile(bulletHitSound)
{
   filename    = "";
   description = AudioClose3d;
   preload = true;
};


//shell
datablock DebrisData(PhaserShellDebris)
{
shapeFile = "";
lifetime = 0.0;
minSpinSpeed = -400.0;
maxSpinSpeed = 200.0;
elasticity = 0.5;
friction = 0.2;
numBounces = 3;
staticOnMaxBounce = true;
snapOnMaxBounce = false;
fade = true;

gravModifier = 2;
};


//muzzle flash effects
datablock ParticleData(PhaserFlashParticle)
{
dragCoefficient      = 3;
gravityCoefficient   = -0.0;
inheritedVelFactor   = 1.0;
constantAcceleration = 0.0;
lifetimeMS           = 1000;
lifetimeVarianceMS   = 25;
textureName          =

"base/data/particles/dot";
spinSpeed = 10.0;
spinRandomMin = -500.0;
spinRandomMax = 500.0;
colors[0]     = "0.8 0.0 0.0 0.4";
colors[1]     = "0.9 0.0 0.0 0.0";
sizes[0]      = 0.15;
sizes[1]      = 0.25;

useInvAlpha = false;
};
datablock ParticleEmitterData(PhaserEmitter)
{
   ejectionPeriodMS = 0.01;
   periodVarianceMS = 0;
   ejectionVelocity = 0.0;
   velocityVariance = 0.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "PhaserParticle";
};


//bullet trail effects
datablock ParticleData(bulletTrailParticle)
{
dragCoefficient      = 3;
gravityCoefficient   = -0.0;
inheritedVelFactor   = 1.0;
constantAcceleration = 0.0;
lifetimeMS           = 1000;
lifetimeVarianceMS   = 25;
textureName          =

"base/data/particles/dot";
spinSpeed = 10.0;
spinRandomMin = -500.0;
spinRandomMax = 500.0;
colors[0]     = "0.8 0.0 0.0 0.4";
colors[1]     = "0.9 0.0 0.0 0.0";
sizes[0]      = 0.15;
sizes[1]      = 0.25;

useInvAlpha = false;
};
datablock ParticleEmitterData(phaserTrailEmitter)
{
 ejectionPeriodMS = 0.01;
   periodVarianceMS = 0;
   ejectionVelocity = 0.0;
   velocityVariance = 0.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "phaserTrailParticle";
};


datablock ParticleData(PhaserExplosionParticle)
{
dragCoefficient      = 8;
gravityCoefficient   = -0.5;
inheritedVelFactor   = 0.2;
constantAcceleration = 0.0;
lifetimeMS           = 0;
lifetimeVarianceMS   = 0;
textureName          = "";
spinSpeed = 0.0;
spinRandomMin = 0.0;
spinRandomMax = 50.0;
colors[0]     = "0.9 0.9 0.6 0.9";
colors[1]     = "0.9 0.5 0.6 0.0";
sizes[0]      = 0.25;
sizes[1]      = 1.0;

useInvAlpha = true;
};
datablock

ParticleEmitterData(PhaserExplosionEmitter)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   ejectionVelocity = 5;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 89;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "";
};


datablock

ParticleData(PhaserExplosionRingParticle)
{
dragCoefficient      = 8;
gravityCoefficient   = -0.5;
inheritedVelFactor   = 0.2;
constantAcceleration = 0.0;
lifetimeMS           = 500;
lifetimeVarianceMS   = 0;
textureName          = "";
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
colors[0]     = "1 0 0.0 0.0";
colors[1]     = "0.9 0.0 0.0 0.0";
sizes[0]      = 0.2;
sizes[1]      = 0.2;

useInvAlpha = false;
};
datablock

ParticleEmitterData(PhaserExplosionRingEmitter)
{
lifeTimeMS = 50;

   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   ejectionVelocity = 5;
   velocityVariance = 0.0;
   ejectionOffset   = 0.0;
   thetaMin         = 89;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "PhaserExplosionRingParticle";
};

datablock ExplosionData(PhaserExplosion)
{
   //explosionShape = "";
soundProfile = bulletHitSound;

   lifeTimeMS = 150;

   particleEmitter = PhaserExplosionEmitter;
   particleDensity = 0;
   particleRadius = 0.2;

   emitter[0] = PhaserExplosionRingEmitter;

   faceViewer     = true;
   explosionScale = "1 1 1";

   shakeCamera = false;
   camShakeFreq = "10.0 11.0 10.0";
   camShakeAmp = "1.0 1.0 1.0";
   camShakeDuration = 0.5;
   camShakeRadius = 10.0;

   // Dynamic light
   lightStartRadius = 0;
   lightEndRadius = 3;
   lightStartColor = "0.5 0.0 0.0";
   lightEndColor = "0.5 0 0";
};


AddDamageType("Phaser",   

'<bitmap:add-ons/ci/phaser> %1',    '%2

<bitmap:add-ons/ci/phaser> %1',0.5,1);
datablock ProjectileData(PhaserProjectile)
{
   projectileShapeName = "./shapes/blank.dts";
   directDamage        = 50;
   directDamageType    = $DamageType::Phaser;
   radiusDamageType    = $DamageType::Phaser;

   brickExplosionRadius = 0;
   brickExplosionImpact = true;          //destroy

a brick if we hit it directly?
   brickExplosionForce  = 20;
   brickExplosionMaxVolume = 4;          //max

volume of bricks that we can destroy
   brickExplosionMaxVolumeFloating = 2;  //max

volume of bricks that we can destroy if they

aren't connected to the ground

   impactImpulse      = 10;
   verticalImpulse   = 5;
   explosion           = PhaserExplosion;
   particleEmitter  = PhaserTrailEmitter;

   muzzleVelocity      = 300;
   velInheritFactor    = 1;

   armingDelay         = 00;
   lifetime            = 10000;
   fadeDelay           = 8000;
   bounceElasticity    = 0.5;
   bounceFriction      = 0.20;
   isBallistic         = false;
   gravityMod = 0.0;

   hasLight    = true;
   lightRadius = 5.0;
   lightColor  = "0.5 0 0";
};

//////////
// item //
//////////
datablock ItemData(PhaserItem)
{
category = "Weapon";  // Mission editor

category
className = "Weapon"; // For inventory

system

// Basic Item Properties
shapeFile = "./shapes/Phaser.dts";
rotate = false;
mass = 1;
density = 0.2;
elasticity = 0.2;
friction = 0.6;
emap = true;

//gui stuff
uiName = "Phaser";
iconName = "./ItemIcons/Phaser";
doColorShift = false;
colorShiftColor = "0 0 0 1.000";

// Dynamic properties defined by the

scripts
image = PhaserImage;
canDrop = true;
};

//function BowItem::onUse(%this, %player,

%InvPosition)
//{
// //check for quiver
// //if you dont have it, regular bow
// //if you do, super bow
//
// %client = %player.client;
//
// %mountPoint = %this.image.mountPoint;
// %mountedImage =

%player.getMountedImage(%mountPoint);
//
//
// if(%mountedImage)
// {
// if(%mountedImage ==

bowImage.getId() || %mountedImage ==

superbowImage.getId())
// {
// //some kind of bow mounted

so, unmount it
//

%player.unMountImage(%mountPoint);
// messageClient(%client,

'MsgHilightInv', '', -1);
// %player.currWeaponSlot =

-1;
// }
// else
// {
// //something other than bow

mounted, so do bow selection and mount
//

if(%player.getMountedImage($BackSlot))
// {
//

if(%player.getMountedImage($BackSlot) ==

quiverImage.getId())
// {
//

%player.mountimage(superBowImage, $RightHandSlot,

1, %skin);
//

messageClient(%client, 'MsgHilightInv', '',

%InvPosition);
//

%player.currWeaponSlot = %invPosition;
// }
// else
// {
//

%player.mountimage(bowImage, $RightHandSlot, 1,

%skin);
//

messageClient(%client, 'MsgHilightInv', '',

%InvPosition);
//

%player.currWeaponSlot = %invPosition;
// }
// }
// else
// {
//

%player.mountimage(bowImage, $RightHandSlot, 1,

%skin);
//

messageClient(%client, 'MsgHilightInv', '',

%InvPosition);
//

%player.currWeaponSlot = %invPosition;
// }
// }
//
// }
// else
// {
// //nothing mounted so do bow

selection and mount
// //something other than bow

mounted, so do bow selection and mount
//

if(%player.getMountedImage($BackSlot))
// {
//

if(%player.getMountedImage($BackSlot) ==

quiverImage.getId())
// {
//

%player.mountimage(superBowImage, $RightHandSlot,

1, %skin);
//

messageClient(%client, 'MsgHilightInv', '',

%InvPosition);
//

%player.currWeaponSlot = %invPosition;
// }
// else
// {
//

%player.mountimage(bowImage, $RightHandSlot, 1,

%skin);
//

messageClient(%client, 'MsgHilightInv', '',

%InvPosition);
//

%player.currWeaponSlot = %invPosition;
// }
// }
// else
// {
//

%player.mountimage(bowImage, $RightHandSlot, 1,

%skin);
// messageClient(%client,

'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot =

%invPosition;
// }
// }
//}

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(PhaserImage)
{
   // Basic Item properties
   shapeFile = "./shapes/Phaser.dts";
   emap = true;

   // Specify mount point & offset for 3rd person,

and eye offset
   // for first person rendering.
   mountPoint = 0;
   offset = "0 0 0";
   eyeOffset = 0; //"0.7 1.2 -0.5";
   rotation = eulerToMatrix( "0 0 0" );

   // When firing from a point offset from the

eye, muzzle correction
   // will adjust the muzzle vector to point to

the eye LOS point.
   // Since this weapon doesn't actually fire from

the muzzle point,
   // we need to turn this off. 
   correctMuzzleVector = true;

   // Add the WeaponImage namespace as a parent,

WeaponImage namespace
   // provides some hooks into the inventory

system.
   className = "WeaponImage";

   // Projectile && Ammo.
   item = BowItem;
   ammo = " ";
   projectile = PhaserProjectile;
   projectileType = Projectile;

casing = PhaserShellDebris;
shellExitDir        = "1.0 -1.3 1.0";
shellExitOffset     = "0 0 0";
shellExitVariance   = 15.0;
shellVelocity       = 7.0;

   //melee particles shoot from eye node for

consistancy
   melee = false;
   //raise your arm up or not
   armReady = true;

   doColorShift = false;
   colorShiftColor =

PhaserItem.colorShiftColor;//"0.400 0.196 0

1.000";

   //casing = " ";

   // Images have a state system which controls

how the animations
   // are run, which sounds are played, script

callbacks, etc. This
   // state system is downloaded to the client so

that clients can
   // predict state changes and animate

accordingly.  The following
   // system supports basic ready->fire->reload

transitions as
   // well as a no-ammo->dryfire idle state.

   // Initial start up state
stateName[0]                     =

"Activate";
stateTimeoutValue[0]             = 0.15;
stateTransitionOnTimeout[0]       =

"Ready";
stateSound[0]

= weaponSwitchSound;

stateName[1]                     =

"Ready";
stateTransitionOnTriggerDown[1]  = "Fire";
stateAllowImageChange[1]         = true;
stateSequence[1] = "Ready";

stateName[2]                    = "Fire";
stateTransitionOnTimeout[2]     = "Smoke";
stateTimeoutValue[2]            = 0.14;
stateFire[2]                    = true;
stateAllowImageChange[2]        = false;
stateSequence[2]                = "Fire";
stateScript[2]                  =

"onFire";
stateWaitForTimeout[2] =

true;
stateEmitter[2]

= PhaserFlashEmitter;
stateEmitterTime[2]

= 0.05;
stateEmitterNode[2]

= "muzzleNode";
stateSound[2]

= PhaserShot1Sound;
stateEjectShell[2]       = true;

stateName[3] = "Smoke";
stateEmitter[3]

= PhaserSmokeEmitter;
stateEmitterTime[3]

= 0.05;
stateEmitterNode[3]

= "muzzleNode";
stateTimeoutValue[3]            = 0.01;
stateTransitionOnTimeout[3]     =

"Reload";

stateName[4] =

"Reload";
stateSequence[4]                =

"Reload";
stateTransitionOnTriggerUp[4]     =

"Ready";
stateSequence[4] = "Ready";

};

function PhaserImage::onFire(%this,%obj,%slot)
{
if(%obj.getDamagePercent() < 1.0)
%obj.playThread(2, shiftAway);
Parent::onFire(%this,%obj,%slot);
}

Saw a problem right here.

Code: [Select]
   projectileShapeName = "./shapes/blank.dts";
The engine looks for blank.dts in your Add-ons, and it's simply not present there. You need to replace this with:

Code: [Select]
   projectileShapeName = "base/data/shapes/empty.dts";
Try that and I'll test it in the meantime to see if there's anything else.

hmmm, that didnt work. blank.dts is actually in my shapes folder. the projectile does work, i am not having any trouble with the projectile itself, just with the emitter which trails behind it.

Found

Quote
datablock ParticleData(bulletTrailParticle)
The particle name is bulletTrailParticle, you need to change that to phaser

Quote
datablock ParticleData(phaserTrailParticle)

Sorry it took a while to reply.

ahh, thanks. i'll try that and see if it works.

Edit: OMG! it works! thank you so much!
Edit2: phaser is done! DL it here: http://www.blockland.us/smf/index.php?topic=24887
« Last Edit: November 11, 2007, 12:57:33 PM by CaffeineBoy »