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

107 lines
3.2 KiB
C#

function LightningStrike(%client,%delay) {
if (%client.player)
%pos = %client.player.getTransform();
%one = getword(%pos, 0) SPC getword(%pos, 1) SPC getword(%pos, 2);
%player = %client.player;
%b = new StaticShape() {
position = %pos;
datablock = "LightningTarget";
};
schedule(%delay, 0, "actualstrike", %b);
}
function actualstrike(%obj) {
%posr = %obj.getTransform();
%pos = VectorAdd(%posr, "0 0 -20");
%pos2 = VectorAdd(%posr, "0 0 -20");
for (%i=0;%i<10;%i++) {
%pos = VectorAdd(%pos, "0 0 20");
%p[%i] = new Lightning() {
scale = "1 1 1";
position = %pos;
rotation = "1 0 0 0";
dataBlock = "DefaultStorm";
strikesPerMinute = "120";
strikeWidth = "1.0";
chanceToHitTarget = "1.0";
strikeRadius = "1";
boltStartRadius = "10";
color = "1.000000 1.000000 1.000000 1.000000";
fadeColor = "0.300000 0.300000 1.000000 1.000000";
useFog = "1";
};
%p[%i].schedule(1500, "delete");
%p[%i].strikeObject(%player);
}
schedule(1000, 0, "LightningApplyDamage", %p, %pos, %pos2);
if (%obj)
%obj.schedule(1500, "delete");
}
function LightningWeaponImage::onFire(%data, %obj, %slot) {
%range = 1000;
%rot = getWords(%obj.getTransform(), 3, 6);
%muzzlePos = %obj.getMuzzlePoint(%slot);
%muzzleVec = %obj.getMuzzleVector(%slot);
%endPos = VectorAdd(%muzzlePos, VectorScale(%muzzleVec, %range));
%damageMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType |
$TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType |
$TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType |
$TypeMasks::TerrainObjectType; //|$TypeMasks::InteriorObjectType;
%hit = ContainerRayCast(%muzzlePos, %endPos, %damageMasks, %obj);
if (%hit) {
%posr = getWords(%hit, 1, 3);
%pos = VectorAdd(%posr, "0 0 300");
%pos2 = VectorAdd(%posr, "0 0 -20");
%b = new StaticShape() {
position = %pos2;
datablock = "LightningTarget";
};
%p = new Lightning() {
scale = "1 1 1";
position = %pos;
rotation = "1 0 0 0";
dataBlock = "DefaultStorm";
strikesPerMinute = "120";
strikeWidth = "10.0";
chanceToHitTarget = "1";
strikeRadius = "10";
boltStartRadius = "15";
color = "1.000000 1.000000 1.000000 1.000000";
fadeColor = "0.300000 0.300000 1.000000 1.000000";
useFog = "1";
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = 0;
};
%p.strikeObject(%b);
schedule(1000, 0, "LightningApplyDamage", %p, %pos, %pos2);
%p.schedule(1500, "delete");
%b.schedule(1500, "delete");
}
}
function LightningApplyDamage(%p, %pos, %pos2) {
%damageMasks = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType;
%hit = ContainerRayCast(%pos, %pos2, %damageMasks, 1);
if (%hit)
%pos2 = getWords(%hit, 1, 3);
%xy = getWords(%pos, 0, 1);
%z1 = getWord(%pos, 2) - 5;
%z2 = getWord(%pos2, 2) + 5;
while (%z1 > %z2) {
%pos = %xy SPC %z1;
RadiusExplosion(%p, %pos, 40, 0.4, 0, %p.sourceObject, $DamageType::Lightning);
%z1 -= 19;
}
%pos = %xy SPC %z1;
RadiusExplosion(%p, %pos, 40, 0.4, 0, %p.sourceObject, $DamageType::Lightning);
}
datablock StaticShapeData(LightningTarget) {
shapeFile = "turret_muzzlepoint.dts";
targetNameTag = 'beacon';
isInvincible = true;
dynamicType = $TypeMasks::StaticObjectType;
};