construction-mod/scripts/dEffects.cs
2025-06-05 12:37:16 +02:00

285 lines
8.5 KiB
C#

// Deploy effects
datablock AudioProfile(DrillLinkSound)
{
filename = "fx/misc/mine.deploy.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(SingeLinkSound)
{
filename = "fx/weapons/chaingun_off.wav"; // "fx/weapons/grenade_camera_activate.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(BoltLinkSound)
{
filename = "fx/misc/health_patch.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ClickLinkSound)
{
filename = "fx/misc/health_patch.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(SingeSound)
{
filename = "fx/weapons/ElF_hit.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LargeLinkeSound)
{
filename = "fx/weapons/grenade_explode_UW.wav";
description = AudioClose3d;
preload = true;
};
datablock LinearProjectileData(FastSingeProjectile) {
className = "LinearProjectileData";
projectileShapeName = "turret_muzzlepoint.dts";
emitterDelay = "-1";
velInheritFactor = "0";
directDamage = "0";
hasDamageRadius = "0";
indirectDamage = "0";
damageRadius = "0";
radiusDamageType = "0";
kickBackStrength = "0";
baseEmitter = "ELFSparksEmitter";
hasLight = "0";
lightRadius = "20";
lightColor = "1.000000 1.000000 1.000000 1.000000";
hasLightUnderwaterColor = "0";
underWaterLightColor = "1.000000 1.000000 1.000000 1.000000";
explodeOnWaterImpact = "0";
depthTolerance = "5";
bubbleEmitTime = "0.5";
faceViewer = "0";
scale = "1 1 1";
dryVelocity = "5";
wetVelocity = "5";
fizzleTimeMS = "60000";
lifetimeMS = "60000";
explodeOnDeath = "0";
reflectOnWaterImpactAngle = "0";
deflectionOnWaterImpact = "0";
fizzleUnderwaterMS = "-1";
activateDelayMS = "-1";
doDynamicClientHits = "0";
sound = "ELFHitTargetSound";
explosion = "BlasterExplosion";
};
datablock LinearProjectileData(SlowSingeProjectile) {
className = "LinearProjectileData";
projectileShapeName = "turret_muzzlepoint.dts";
emitterDelay = "-1";
velInheritFactor = "0";
directDamage = "0";
hasDamageRadius = "0";
indirectDamage = "0";
damageRadius = "0";
radiusDamageType = "0";
kickBackStrength = "0";
baseEmitter = "ElfSparksEmitter";
hasLight = "0";
lightRadius = "20";
lightColor = "1.000000 1.000000 1.000000 1.000000";
hasLightUnderwaterColor = "0";
underWaterLightColor = "1.000000 1.000000 1.000000 1.000000";
explodeOnWaterImpact = "0";
depthTolerance = "5";
bubbleEmitTime = "0.5";
faceViewer = "0";
scale = "1 1 1";
dryVelocity = "1";
wetVelocity = "1";
fizzleTimeMS = "60000";
lifetimeMS = "60000";
explodeOnDeath = "0";
reflectOnWaterImpactAngle = "0";
deflectionOnWaterImpact = "0";
fizzleUnderwaterMS = "-1";
activateDelayMS = "-1";
doDynamicClientHits = "0";
sound = "ELFHitTargetSound";
explosion = "BlasterExplosion";
};
function singe(%pos,%dir,%size,%type) {
%p = new LinearProjectile() {
dataBlock = %type @"SingeProjectile";
initialDirection = %dir;
initialPosition = %pos;
};
if (%type $= "fast")
%p.schedule((%size/5)*1000,"delete");
else
%p.schedule((%size)*1000,"delete");
}
function edgesinge(%obj)
{
%objsize = VectorSub(getWords(%obj.getObjectBox(),3,5),getWords(%obj.getObjectBox(),0,2));
%realsize = realSize(%obj);//VectorMultiply(VectorMultiply(%objsize,%obj.getScale()),"1 1 0");
%offset = VectorScale(Realvec(%obj,%realsize),0.49);
%offset2 = VectorScale(VectorCross(VectorNormalize(%offset),realvec(%obj,"0 0 1")),VectorLen(%offset));
%pos1 = VectorAdd(%obj.getWorldBoxCenter(),%offset);
%pos2 = VectorAdd(%obj.getWorldBoxCenter(),VectorScale(%offset,-1));
singe(%pos1,Realvec(%obj,"-1 0 0"),GetWord(%realsize,0),"fast");
singe(%pos1,Realvec(%obj,"0 -1 0"),GetWord(%realsize,1),"fast");
singe(%pos2,Realvec(%obj,"1 0 0"),GetWord(%realsize,0),"fast");
singe(%pos2,Realvec(%obj,"0 1 0"),GetWord(%realsize,1),"fast");
}
function linksinge(%obj,%pt,%nrm)
{
if (%nrm !$= "")
{
%nrm = VectorNormalize(%nrm);
%dir = VectorNormalize(VectorCross(%nrm,Realvec(%obj,"0 0 1")));
%objsize = VectorSub(getWords(%obj.getObjectBox(),3,5),getWords(%obj.getObjectBox(),0,2));
%realsize = VectorScale(VectorMultiply(%objsize,%obj.getScale()),0.49);
%side = VirVec(%obj,%nrm);
%oside = VectorCross("0 0 1",%side);
%forward = Realvec(%obj,VectorMultiply(%realsize,%side));
%left = Realvec(%obj,VectorMultiply(%realsize,%oside));
%len = Vectorlen(%left);
%pos1 = VectorAdd(%obj.getWorldBoxCenter(),VectorAdd(%forward,%left));
%pos2 = VectorAdd(%obj.getWorldBoxCenter(),VectorAdd(%forward,VectorScale(%left,-1)));
singe(%pos1,%dir,%len,"fast");
singe(%pos2,VectorScale(%dir,-1),%len,"fast");
}
}
function floordrill(%obj)
{
%objsize = VectorSub(getWords(%obj.getObjectBox(),3,5),getWords(%obj.getObjectBox(),0,2));
%realsize = VectorMultiply(VectorMultiply(%objsize,%obj.getScale()),"0.5 0.5 0.5");
%forward = VectorScale(realvec(%obj,"1 0 0"),GetWord(%realsize,0));
%left = VectorScale(realvec(%obj,"0 1 0"),GetWord(%realsize,1));
%up = VectorScale(realvec(%obj,"0 0 1"),GetWord(%realsize,2));
%p1 = VectorAdd(VectorAdd(%forward,%left),%up);
%p2 = VectorAdd(VectorAdd(VectorScale(%forward,-1),%left),%up);
%p3 = VectorAdd(VectorAdd(%forward,VectorScale(%left,-1)),%up);
%p4 = VectorAdd(VectorAdd(VectorScale(%forward,-1),VectorScale(%left,-1)),%up);
schedule(0,%obj,"llink",VectorAdd(%p1,%obj.getWorldBoxCenter()));
schedule(500,%obj,"llink",VectorAdd(%p2,%obj.getWorldBoxCenter()));
schedule(1000,%obj,"llink",VectorAdd(%p4,%obj.getWorldBoxCenter()));
schedule(1500,%obj,"llink",VectorAdd(%p3,%obj.getWorldBoxCenter()));
}
function MSinge(%obj)
{
%objsize = VectorSub(getWords(%obj.getObjectBox(),3,5),getWords(%obj.getObjectBox(),0,2));
%realsize = VectorMultiply(VectorMultiply(%objsize,%obj.getScale()),"0.5 0.5 0.5");
%forward = VectorScale(realvec(%obj,"1 0 0"),GetWord(%realsize,0));
%left = VectorScale(realvec(%obj,"0 1 0"),GetWord(%realsize,1));
%up = VectorScale(realvec(%obj,"0 0 -1"),GetWord(%realsize,2));
%p1 = VectorAdd(VectorAdd(%forward,%left),%up);
%p2 = VectorAdd(VectorAdd(VectorScale(%forward,-1),%left),%up);
%p3 = VectorAdd(VectorAdd(%forward,VectorScale(%left,-1)),%up);
%p4 = VectorAdd(VectorAdd(VectorScale(%forward,-1),VectorScale(%left,-1)),%up);
schedule(0,%obj,"mlink",VectorAdd(%p1,%obj.getWorldBoxCenter()));
schedule(250,%obj,"mlink",VectorAdd(%p2,%obj.getWorldBoxCenter()));
schedule(500,%obj,"mlink",VectorAdd(%p4,%obj.getWorldBoxCenter()));
schedule(750,%obj,"mlink",VectorAdd(%p3,%obj.getWorldBoxCenter()));
}
function MSinge2(%obj)
{
%objsize = VectorSub(getWords(%obj.getObjectBox(),3,5),getWords(%obj.getObjectBox(),0,2));
%realsize = VectorMultiply(VectorMultiply(%objsize,%obj.getScale()),"0.5 0.5 0.5");
%forward = VectorScale(realvec(%obj,"1 0 0"),GetWord(%realsize,0));
%left = VectorScale(realvec(%obj,"0 1 0"),GetWord(%realsize,1));
%up = VectorScale(realvec(%obj,"0 0 1"),GetWord(%realsize,2));
%p1 = VectorAdd(VectorAdd(%forward,%left),%up);
%p2 = VectorAdd(VectorAdd(VectorScale(%forward,-1),%left),%up);
%p3 = VectorAdd(VectorAdd(%forward,VectorScale(%left,-1)),%up);
%p4 = VectorAdd(VectorAdd(VectorScale(%forward,-1),VectorScale(%left,-1)),%up);
schedule(0,%obj,"mlink",VectorAdd(%p1,%obj.getWorldBoxCenter()));
schedule(250,%obj,"mlink",VectorAdd(%p2,%obj.getWorldBoxCenter()));
schedule(500,%obj,"mlink",VectorAdd(%p4,%obj.getWorldBoxCenter()));
schedule(750,%obj,"mlink",VectorAdd(%p3,%obj.getWorldBoxCenter()));
}
function floorlink(%obj,%pt,%nrm) {
%fstat = aboveground(%obj.getworldboxcenter(),1,%obj);
%stat = GetWord(%fstat,0);
//warn(%stat);
if(%stat $= "open" || %stat $= "roof" || %stat $= "shadow")
linksinge(%obj,%pt,%nrm);
else
floordrill(%obj);
}
function slink(%pt)
{
createLifeEmitter(%pt, ELFSparksEmitter, 200);
Serverplay3D(SingeLinkSound,%pt);
}
function mlink(%pt)
{
createLifeEmitter(%pt, ELFSparksEmitter, 200);
Serverplay3D(SingeLinkSound,%pt);
}
function llink(%pt)
{
createLifeEmitter(%pt, SmallLightDamageSmoke, 500);
Serverplay3D(LargeLinkeSound,%pt);
}
function deployEffect(%obj,%pt,%nrm,%type)
{
if ($Host::NoDeployEffects)
return "";
if (%type $= "pad")
{
edgesinge(%obj);
}
else if (%type $= "walk")
{
linksinge(%obj,%pt,%nrm);
}
else if (%type $= "spine")
{
slink(%pt);
}
else if (%type $= "spine1")
{
slink(%pt);
%p2 = VectorAdd( pos( %obj ),realvec( %obj,VectorMultiply("0 0 0.5",%obj.getScale()) ) );
schedule(500,%obj,"slink",%p2);
}
else if (%type $= "mspine")
{
msinge(%obj);
}
else if (%type $= "mspine1")
{
msinge(%obj);
schedule(1000,%obj,"msinge2",%obj);
}
else if (%type $= "floor")
{
floorlink(%obj,%pt,%nrm);
}
}