diff --git a/scripts/TWM2/Bosses/ColonelWindshear.cs b/scripts/TWM2/Bosses/ColonelWindshear.cs index f3572ed..26719bc 100644 --- a/scripts/TWM2/Bosses/ColonelWindshear.cs +++ b/scripts/TWM2/Bosses/ColonelWindshear.cs @@ -109,6 +109,50 @@ function DroneFindNearestPilot(%radius, %drone) { return %closestClient; } + +datablock SeekerProjectileData(BossMissiles) +{ + casingShapeName = "weapon_missile_casement.dts"; + projectileShapeName = "weapon_missile_projectile.dts"; + hasDamageRadius = true; + indirectDamage = 0.1; + damageRadius = 6.0; + radiusDamageType = $DamageType::MissileTurret; + kickBackStrength = 500; + + flareDistance = 200; + flareAngle = 30; + minSeekHeat = 0.0; + + explosion = "MissileExplosion"; + velInheritFactor = 1.0; + + splash = MissileSplash; + baseEmitter = MortarSmokeEmitter; + delayEmitter = MissileFireEmitter; + puffEmitter = MissilePuffEmitter; + + lifetimeMS = 15000; // z0dd - ZOD, 4/14/02. Was 6000 + muzzleVelocity = 12.0; + maxVelocity = 225.0; // z0dd - ZOD, 4/14/02. Was 80.0 + turningSpeed = 50.0; + acceleration = 100.0; + + proximityRadius = 4; + + terrainAvoidanceSpeed = 100; + terrainScanAhead = 50; + terrainHeightFail = 50; + terrainAvoidanceRadius = 150; + + useFlechette = true; + flechetteDelayMs = 225; + casingDeb = FlechetteDebris; +}; + + + + function WindshearAttacks(%drone) { if(!isObject(%drone)) { return; @@ -216,7 +260,6 @@ function WindshearAttack_FUNC(%att, %args) { FlareSet.add(%p2); MissionCleanup.add(%p1); MissionCleanup.add(%p2); - case "HeatLoop": %t = getWord(%args, 0); %v = getWord(%args, 1); @@ -230,7 +273,6 @@ function WindshearAttack_FUNC(%att, %args) { %v++; %t.setHeat(100); schedule(100, 0, "WindshearAttack_FUNC", "HeatLoop", %t SPC %v); - case "MissileDrop": %t = getWord(%args, 0); %m = getWord(%args, 1); @@ -239,7 +281,6 @@ function WindshearAttack_FUNC(%att, %args) { %m.setObjectTarget(%t); //HeatLoop(%t,0); WindshearAttack_FUNC("HeatLoop", %t SPC 0); - case "SidewinderLaunch": %d = getWord(%args, 0); %t = getWord(%args, 1); diff --git a/scripts/TWM2/Bosses/GeneralVegenor.cs b/scripts/TWM2/Bosses/GeneralVegenor.cs index c41ed39..fc29bb4 100644 --- a/scripts/TWM2/Bosses/GeneralVegenor.cs +++ b/scripts/TWM2/Bosses/GeneralVegenor.cs @@ -1,3 +1,162 @@ +datablock SeekerProjectileData(VegenorFireMissile) : YvexZombieMakerMissile { + indirectDamage = 0.5; + damageRadius = 5.0; + radiusDamageType = $DamageType::Fire; +}; + +datablock GrenadeProjectileData(VegenorFireMeteor) : JTLMeteorStormFireball { + projectileShapeName = "plasmabolt.dts"; + scale = "40.0 40.0 40.0"; + emitterDelay = -1; + directDamage = 0; + directDamageType = $DamageType::Fire; + hasDamageRadius = true; // true; + indirectDamage = 0.5; // 0.5; + damageRadius = 150.0; + radiusDamageType = $DamageType::Fire; +}; + +datablock PlayerData(VegenorZombieArmor) : HeavyMaleBiodermArmor { + maxDamage = 600.0; + minImpactSpeed = 50; + speedDamageScale = 0.015; + + damageScale[$DamageType::M1700] = 2.0; + damageScale[$DamageType::Fire] = 0.1; + damageScale[$DamageType::Burn] = 0.1; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; + max[SmokeGrenade] = 0; + max[BeaconSmokeGrenade] = 0; + max[Blaster] = 0; + max[Plasma] = 0; + max[PlasmaAmmo] = 0; + max[Disc] = 0; + max[DiscAmmo] = 0; + max[SniperRifle] = 0; + max[GrenadeLauncher] = 0; + max[GrenadeLauncherAmmo] = 0; + max[Mortar] = 0; + max[MortarAmmo] = 0; + max[MissileLauncher] = 0; + max[MissileLauncherAmmo] = 0; + max[Chaingun] = 0; + max[ChaingunAmmo] = 0; + max[RepairGun] = 0; + max[CloakingPack] = 0; + max[SensorJammerPack] = 0; + max[EnergyPack] = 0; + max[RepairPack] = 0; + max[ShieldPack] = 0; + max[AmmoPack] = 0; + max[SatchelCharge] = 0; + max[MortarBarrelPack] = 0; + max[MissileBarrelPack] = 0; + max[AABarrelPack] = 0; + max[PlasmaBarrelPack] = 0; + max[ELFBarrelPack] = 0; + max[artillerybarrelpack] = 0; + max[InventoryDeployable] = 0; + max[MotionSensorDeployable] = 0; + max[PulseSensorDeployable] = 0; + max[TurretOutdoorDeployable] = 0; + max[TurretIndoorDeployable] = 0; + max[FlashGrenade] = 0; + max[ConcussionGrenade] = 0; + max[FlareGrenade] = 0; + max[TargetingLaser] = 0; + max[ELFGun] = 0; + max[ShockLance] = 0; + max[CameraGrenade] = 0; + max[Beacon] = 0; + max[flamerAmmoPack] = 0; + max[ParachutePack] = 0; + max[MedPack] = 0; + //Guns + max[ConstructionTool] = 0; + max[MergeTool] = 0; + max[NerfGun] = 0; + max[NerfBallLauncher] = 0; + max[NerfBallLauncherAmmo] = 0; + max[SuperChaingun] = 0; + max[SuperChaingunAmmo] = 0; + max[RPChaingun] = 0; + max[RPChaingunAmmo] = 0; + max[MGClip] = 0; + max[LSMG] = 0; + max[LSMGAmmo] = 0; + max[LSMGClip] = 0; + max[snipergun] = 0; + max[snipergunAmmo] = 0; + max[Bazooka] = 0; + max[BazookaAmmo] = 0; + max[nukeme] = 0; + max[nukemeAmmo] = 0; + max[MG42] = 0; + max[MG42Ammo] = 0; + max[SPistol] = 0; + max[Pistol] = 0; + max[PistolAmmo] = 0; + max[Pistolclip] = 0; + max[flamer] = 0; + max[flamerAmmo] = 0; + max[AALauncher] = 0; + max[AALauncherAmmo] = 0; + max[melee] = 0; + max[SOmelee] = 0; + max[KriegRifle] = 0; + max[KriegAmmo] = 0; + max[Rifleclip] = 0; + max[Shotgun] = 0; + max[ShotgunAmmo] = 0; + max[ShotgunClip] = 0; + max[RShotgun] = 0; + max[RShotgunAmmo] = 0; + max[RShotgunClip] = 0; + max[LMissileLauncher] = 0; + max[LMissileLauncherAmmo] = 0; + max[HRPChaingun] = 0; + max[RPGAmmo] = 0; + max[RPGItem] = 0; + //Building parts + max[spineDeployable] = 0; + max[mspineDeployable] = 0; + max[wWallDeployable] = 0; + max[floorDeployable] = 0; + max[WallDeployable] = 0; + max[DoorDeployable] = 0; + //Turrets + max[TurretLaserDeployable] = 0; + max[TurretMissileRackDeployable]= 0; + max[DiscTurretDeployable] = 0; + //Largepacks + max[EnergizerDeployable] = 0; + max[TreeDeployable] = 0; + max[CrateDeployable] = 0; + max[DecorationDeployable] = 0; + max[LogoProjectorDeployable] = 0; + max[LightDeployable] = 0; + max[TripwireDeployable] = 0; + max[TelePadPack] = 0; + max[TurretBasePack] = 0; + max[LargeInventoryDeployable] = 0; + max[GeneratorDeployable] = 0; + max[SolarPanelDeployable] = 0; + max[SwitchDeployable] = 0; + max[MediumSensorDeployable] = 0; + max[LargeSensorDeployable] = 0; + max[SpySatelliteDeployable] = 0; + //Misc + max[JumpadDeployable] = 0; + max[EscapePodDeployable] = 0; + max[ForceFieldDeployable] = 0; + max[GravityFieldDeployable] = 0; + max[VehiclePadPack] = 0; +}; + function SpawnVegenor(%position) { %Zombie = new player(){ Datablock = "VegenorZombieArmor"; diff --git a/scripts/TWM2/Bosses/GhostOfFire.cs b/scripts/TWM2/Bosses/GhostOfFire.cs index 30477df..73a5fae 100644 --- a/scripts/TWM2/Bosses/GhostOfFire.cs +++ b/scripts/TWM2/Bosses/GhostOfFire.cs @@ -1,6 +1,411 @@ -//Ghost of Fire -//Phantom139 -//Ported From TWM1 +//DBs +datablock ParticleData(GhostflameParticle) +{ + dragCoeffiecient = 0.0; + gravityCoefficient = -0.1; + inheritedVelFactor = 0.1; + + lifetimeMS = 500; + lifetimeVarianceMS = 50; + + textureName = "particleTest"; + + spinRandomMin = -10.0; + spinRandomMax = 10.0; + + colors[0] = "0 1 0 0.4"; + colors[1] = "0 1 0 0.3"; + colors[2] = "0 1 0 0.0"; + sizes[0] = 2.0; + sizes[1] = 1.0; + sizes[2] = 0.8; + times[0] = 0.0; + times[1] = 0.6; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(GhostflameEmitter) +{ + ejectionPeriodMS = 3; + periodVarianceMS = 0; + + ejectionOffset = 0.2; + ejectionVelocity = 10.0; + velocityVariance = 0.0; + + thetaMin = 0.0; + thetaMax = 10.0; + + particles = "GhostflameParticle"; +}; + +datablock LinearFlareProjectileData(GhostFlameboltMain) +{ + projectileShapeName = "turret_muzzlepoint.dts"; + scale = "1.0 1.0 1.0"; + faceViewer = true; + directDamage = 0.05; + hasDamageRadius = true; + indirectDamage = 0.1; + damageRadius = 4.0; + kickBackStrength = 0.0; + radiusDamageType = $DamageType::Plasma; + + explosion = "ThrowerExplosion"; + splash = PlasmaSplash; + + baseEmitter = GhostflameEmitter; + + dryVelocity = 50.0; // z0dd - ZOD, 7/20/02. Faster plasma projectile. was 55 + wetVelocity = -1; + velInheritFactor = 0.3; + fizzleTimeMS = 250; + lifetimeMS = 30000; + explodeOnDeath = false; + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = true; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = -1; + + //activateDelayMS = 100; + activateDelayMS = -1; + + size[0] = 0.2; + size[1] = 0.5; + size[2] = 0.1; + + + numFlares = 35; + flareColor = "1 0.18 0.03"; + flareModTexture = "flaremod"; + flareBaseTexture = "flarebase"; + + sound = PlasmaProjectileSound; + fireSound = FlamethrowerFireSound; + wetFireSound = PlasmaFireWetSound; + + hasLight = true; + lightRadius = 10.0; + lightColor = "0.94 0.03 0.12"; +}; + +datablock ParticleData(NapalmExplosionParticle) +{ + dragCoefficient = 2; + gravityCoefficient = 0.2; + inheritedVelFactor = 0.2; + constantAcceleration = 0.0; + lifetimeMS = 450; + lifetimeVarianceMS = 150; + textureName = "particleTest"; + colors[0] = "1 0 0"; + colors[1] = "1 0 0"; + sizes[0] = 0.5; + sizes[1] = 2; +}; + +datablock ParticleEmitterData(NapalmExplosionEmitter) +{ + ejectionPeriodMS = 7; + periodVarianceMS = 0; + ejectionVelocity = 5; + velocityVariance = 1.0; + ejectionOffset = 0.0; + thetaMin = 0; + thetaMax = 60; + phiReferenceVel = 0; + phiVariance = 360; + overrideAdvances = false; + particles = "NapalmExplosionParticle"; +}; + +datablock ExplosionData(NapalmExplosion) +{ + explosionShape = "effect_plasma_explosion.dts"; + soundProfile = plasmaExpSound; + particleEmitter = NapalmExplosionEmitter; + particleDensity = 150; + particleRadius = 1.25; + faceViewer = true; + + sizes[0] = "3.0 3.0 3.0"; + sizes[1] = "3.0 3.0 3.0"; + times[0] = 0.0; + times[1] = 1.5; +}; + +//-------------------------------------- +//Napalm projectile +//-------------------------------------- +datablock LinearProjectileData(NapalmShot) +{ + projectileShapeName = "mortar_projectile.dts"; + emitterDelay = -1; + directDamage = 0.0; + hasDamageRadius = true; + indirectDamage = 0.5; + damageRadius = 20.0; + radiusDamageType = $DamageType::Plasma; + kickBackStrength = 3000; + + explosion = "NapalmExplosion"; +// underwaterExplosion = "UnderwaterNapalmExplosion"; + velInheritFactor = 0.5; +// splash = NapalmSplash; + depthTolerance = 10.0; // depth at which it uses underwater explosion + + baseEmitter = MissileFireEmitter; + bubbleEmitter = GrenadeBubbleEmitter; + + grenadeElasticity = 0.15; + grenadeFriction = 0.4; + armingDelayMS = 2000; + muzzleVelocity = 63.7; + drag = 0.1; + + sound = MortarProjectileSound; + + hasLight = true; + lightRadius = 4; + lightColor = "1.00 0.9 1.00"; + + hasLightUnderwaterColor = true; + underWaterLightColor = "0.05 0.075 0.2"; + + dryVelocity = 90; + wetVelocity = 50; + velInheritFactor = 0.5; + fizzleTimeMS = 5000; + lifetimeMS = 2700; + explodeOnDeath = true; + reflectOnWaterImpactAngle = 15.0; + explodeOnWaterImpact = true; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = 5000; + +}; + +datablock PlayerData(GhostFireArmor) : MediumPlayerDamageProfile +{ + emap = true; + + className = Armor; + shapeFile = "medium_male.dts"; + cameraMaxDist = 3; + computeCRC = true; + + debrisShapeName = "debris_player.dts"; + debris = HumanRedPlayerDebris; + + canObserve = true; + cmdCategory = "Clients"; + cmdIcon = CMDPlayerIcon; + cmdMiniIconName = "commander/MiniIcons/com_player_grey"; + + hudImageNameFriendly[0] = "gui/hud_playertriangle"; + hudImageNameEnemy[0] = "gui/hud_playertriangle_enemy"; + hudRenderModulated[0] = true; + + hudImageNameFriendly[1] = "commander/MiniIcons/com_flag_grey"; + hudImageNameEnemy[1] = "commander/MiniIcons/com_flag_grey"; + hudRenderModulated[1] = true; + hudRenderAlways[1] = true; + hudRenderCenter[1] = true; + hudRenderDistance[1] = true; + + hudImageNameFriendly[2] = "commander/MiniIcons/com_flag_grey"; + hudImageNameEnemy[2] = "commander/MiniIcons/com_flag_grey"; + hudRenderModulated[2] = true; + hudRenderAlways[2] = true; + hudRenderCenter[2] = true; + hudRenderDistance[2] = true; + + aiAvoidThis = true; + + minLookAngle = -1.5; + maxLookAngle = 1.5; + maxFreelookAngle = 3.0; + + mass = 70; + drag = 0.3; + maxdrag = 0.5; + density = 10; + maxDamage = 500.0; + maxEnergy = 400; + repairRate = 0.0053; + energyPerDamagePoint = 75.0; // shield energy required to block one point of damage + + rechargeRate = 0.456; + jetForce = 21.22 * 230; + underwaterJetForce = 25.22 * 130 * 1.5; + underwaterVertJetFactor = 1.5; + jetEnergyDrain = 4.0; + underwaterJetEnergyDrain = 1.0; + minJetEnergy = 10; + maxJetHorizontalPercentage = 0.8; + + runForce = 60 * 150; + runEnergyDrain = 0; + minRunEnergy = 0; + maxForwardSpeed = 18; + maxBackwardSpeed = 18; + maxSideSpeed = 18; + + maxUnderwaterForwardSpeed = 10.5; + maxUnderwaterBackwardSpeed = 9.5; + maxUnderwaterSideSpeed = 9.5; + + recoverDelay = 4; + recoverRunForceScale = 0.7; + + // heat inc'ers and dec'ers + heatDecayPerSec = 1.0 / 5.0; // takes 4 seconds to clear heat sig. + heatIncreasePerSec = 1.0 / 2.0; // takes 3.0 seconds of constant jet to get full heat sig. + + jumpForce = 8.3 * 130; + jumpEnergyDrain = 0; + minJumpEnergy = 0; + jumpSurfaceAngle = 75; + jumpDelay = 0; + + // Controls over slope of runnable/jumpable surfaces + runSurfaceAngle = 85; + jumpSurfaceAngle = 85; + + minJumpSpeed = 25; + maxJumpSpeed = 35; + + horizMaxSpeed = 70; + horizResistSpeed = 28; + horizResistFactor = 0.32; + maxJetForwardSpeed = 18; + + upMaxSpeed = 80; + upResistSpeed = 30; + upResistFactor = 0.23; + + minImpactSpeed = 45; + speedDamageScale = 0.006; + + jetSound = ArmorJetSound; + wetJetSound = ArmorWetJetSound; + + jetEmitter = FlammerArmorJetEmitter; //Pyro jets + jetEffect = HumanMediumArmorJetEffect; + + boundingBox = "1.45 1.45 2.4"; + pickupRadius = 0.75; + + // damage location details + boxNormalHeadPercentage = 0.83; + boxNormalTorsoPercentage = 0.49; + boxHeadLeftPercentage = 0; + boxHeadRightPercentage = 1; + boxHeadBackPercentage = 0; + boxHeadFrontPercentage = 1; + + //Foot Prints + decalData = MediumMaleFootprint; + decalOffset = 0.35; + + footPuffEmitter = LightPuffEmitter; + footPuffNumParts = 15; + footPuffRadius = 0.25; + + dustEmitter = LiftoffDustEmitter; + + splash = PlayerSplash; + splashVelocity = 4.0; + splashAngle = 67.0; + splashFreqMod = 300.0; + splashVelEpsilon = 0.60; + bubbleEmitTime = 0.4; + splashEmitter[0] = PlayerFoamDropletsEmitter; + splashEmitter[1] = PlayerFoamEmitter; + splashEmitter[2] = PlayerBubbleEmitter; + mediumSplashSoundVelocity = 10.0; + hardSplashSoundVelocity = 20.0; + exitSplashSoundVelocity = 5.0; + + footstepSplashHeight = 0.35; + //Footstep Sounds + LFootSoftSound = LFootMediumSoftSound; + RFootSoftSound = RFootMediumSoftSound; + LFootHardSound = LFootMediumHardSound; + RFootHardSound = RFootMediumHardSound; + LFootMetalSound = LFootMediumMetalSound; + RFootMetalSound = RFootMediumMetalSound; + LFootSnowSound = LFootMediumSnowSound; + RFootSnowSound = RFootMediumSnowSound; + LFootShallowSound = LFootMediumShallowSplashSound; + RFootShallowSound = RFootMediumShallowSplashSound; + LFootWadingSound = LFootMediumWadingSound; + RFootWadingSound = RFootMediumWadingSound; + LFootUnderwaterSound = LFootMediumUnderwaterSound; + RFootUnderwaterSound = RFootMediumUnderwaterSound; + LFootBubblesSound = LFootMediumBubblesSound; + RFootBubblesSound = RFootMediumBubblesSound; + movingBubblesSound = ArmorMoveBubblesSound; + waterBreathSound = WaterBreathMaleSound; + + impactSoftSound = ImpactMediumSoftSound; + impactHardSound = ImpactMediumHardSound; + impactMetalSound = ImpactMediumMetalSound; + impactSnowSound = ImpactMediumSnowSound; + + skiSoftSound = SkiAllSoftSound; + skiHardSound = SkiAllHardSound; + skiMetalSound = SkiAllMetalSound; + skiSnowSound = SkiAllSnowSound; + + impactWaterEasy = ImpactMediumWaterEasySound; + impactWaterMedium = ImpactMediumWaterMediumSound; + impactWaterHard = ImpactMediumWaterHardSound; + + groundImpactMinSpeed = 10.0; + groundImpactShakeFreq = "4.0 4.0 4.0"; + groundImpactShakeAmp = "1.0 1.0 1.0"; + groundImpactShakeDuration = 0.8; + groundImpactShakeFalloff = 10.0; + + exitingWater = ExitingWaterMediumSound; + + maxWeapons = 2; // Max number of different weapons the player can have + maxGrenades = 1; // Max number of different grenades the player can have + maxMines = 1; // Max number of different mines the player can have + + damageScale[$DamageType::plasma] = 0.05; + damageScale[$DamageType::Burn] = 0.05; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + // Inventory restrictions + max[RepairKit] = 4; + max[Mine] = 0; + max[ZapMine] = 0; + max[CrispMine] = 5; + max[flamerAmmoPack] = 1; + max[Deagle] = 1; + max[SPistol] = 1; + max[Pistol] = 1; + max[PistolAmmo] = 10; + max[Pistolclip] = 8; + max[PulsePhaser] = 1; + max[flamer] = 1; + max[flamerAmmo] = 0; + max[Napalm] = 1; + max[NapalmAmmo] = 20; + max[melee] = 1; + max[BOV] = 1; + max[SOmelee] = 1; + max[IncindinaryGrenade] = 7; + max[Beacon] = 3; + // -END + + observeParameters = "0.5 4.5 4.5"; + + shieldEffectScale = "0.7 0.7 1.0"; +}; +// function StartGhostFire(%pos) { %Ghost = new player(){ diff --git a/scripts/TWM2/Bosses/GhostOfLightning.cs b/scripts/TWM2/Bosses/GhostOfLightning.cs index 37d1008..1c8eea4 100644 --- a/scripts/TWM2/Bosses/GhostOfLightning.cs +++ b/scripts/TWM2/Bosses/GhostOfLightning.cs @@ -1,5 +1,145 @@ //DBS +datablock PlayerData(LightningGhostArmor) : MediumMaleHumanArmor /// ooooo scary +{ + boundingBox = "1.63 1.63 2.6"; + maxDamage = 550.0; + minImpactSpeed = 35; + shapeFile = "medium_male.dts"; + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = HeavyBiodermFootprint; + decalOffset = 0.4; + + waterBreathSound = WaterBreathBiodermSound; + + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; + max[SmokeGrenade] = 0; + max[BeaconSmokeGrenade] = 0; + max[Blaster] = 0; + max[Plasma] = 0; + max[PlasmaAmmo] = 0; + max[Disc] = 0; + max[DiscAmmo] = 0; + max[SniperRifle] = 0; + max[GrenadeLauncher] = 0; + max[GrenadeLauncherAmmo] = 0; + max[Mortar] = 0; + max[MortarAmmo] = 0; + max[MissileLauncher] = 0; + max[MissileLauncherAmmo] = 0; + max[Chaingun] = 0; + max[ChaingunAmmo] = 0; + max[RepairGun] = 0; + max[CloakingPack] = 0; + max[SensorJammerPack] = 0; + max[EnergyPack] = 0; + max[RepairPack] = 0; + max[ShieldPack] = 0; + max[AmmoPack] = 0; + max[SatchelCharge] = 0; + max[MortarBarrelPack] = 0; + max[MissileBarrelPack] = 0; + max[AABarrelPack] = 0; + max[PlasmaBarrelPack] = 0; + max[ELFBarrelPack] = 0; + max[artillerybarrelpack] = 0; + max[MedPack] = 0; + max[InventoryDeployable] = 0; + max[MotionSensorDeployable] = 0; + max[PulseSensorDeployable] = 0; + max[TurretOutdoorDeployable] = 0; + max[TurretIndoorDeployable] = 0; + max[FlashGrenade] = 0; + max[ConcussionGrenade] = 0; + max[FlareGrenade] = 0; + max[TargetingLaser] = 0; + max[ELFGun] = 0; + max[ShockLance] = 0; + max[CameraGrenade] = 0; + max[Beacon] = 0; + max[flamerAmmoPack] = 0; + max[ParachutePack] = 0; + max[ConstructionTool] = 0; + max[MergeTool] = 0; + max[NerfGun] = 0; + max[NerfBallLauncher] = 0; + max[NerfBallLauncherAmmo] = 0; + max[SuperChaingun] = 0; + max[SuperChaingunAmmo] = 0; + max[RPChaingun] = 0; + max[RPChaingunAmmo] = 0; + max[MGClip] = 0; + max[LSMG] = 0; + max[LSMGAmmo] = 0; + max[LSMGClip] = 0; + max[snipergun] = 0; + max[snipergunAmmo] = 0; + max[Bazooka] = 0; + max[BazookaAmmo] = 0; + max[BunkerBuster] = 0; + max[MG42] = 0; + max[MG42Ammo] = 0; + max[SPistol] = 0; + max[Pistol] = 0; + max[PistolAmmo] = 0; + max[Pistolclip] = 0; + max[flamer] = 0; + max[flamerAmmo] = 0; + max[AALauncher] = 0; + max[AALauncherAmmo] = 0; + max[melee] = 0; + max[SOmelee] = 0; + max[KriegRifle] = 0; + max[KriegAmmo] = 0; + max[Rifleclip] = 0; + max[Shotgun] = 0; + max[ShotgunAmmo] = 0; + max[ShotgunClip] = 0; + max[RShotgun] = 0; + max[RShotgunAmmo] = 0; + max[RShotgunClip] = 0; + max[LMissileLauncher] = 0; + max[LMissileLauncherAmmo] = 0; + max[HRPChaingun] = 0; + max[RPGAmmo] = 0; + max[RPGItem] = 0; + max[spineDeployable] = 0; + max[mspineDeployable] = 0; + max[wWallDeployable] = 0; + max[floorDeployable] = 0; + max[WallDeployable] = 0; + max[DoorDeployable] = 0; + max[TurretLaserDeployable] = 0; + max[TurretMissileRackDeployable]= 0; + max[DiscTurretDeployable] = 0; + max[EnergizerDeployable] = 0; + max[TreeDeployable] = 0; + max[CrateDeployable] = 0; + max[DecorationDeployable] = 0; + max[LogoProjectorDeployable] = 0; + max[LightDeployable] = 0; + max[TripwireDeployable] = 0; + max[TelePadPack] = 0; + max[TurretBasePack] = 0; + max[LargeInventoryDeployable] = 0; + max[GeneratorDeployable] = 0; + max[SolarPanelDeployable] = 0; + max[SwitchDeployable] = 0; + max[MediumSensorDeployable] = 0; + max[LargeSensorDeployable] = 0; + max[SpySatelliteDeployable] = 0; + max[JumpadDeployable] = 0; + max[EscapePodDeployable] = 0; + max[ForceFieldDeployable] = 0; + max[GravityFieldDeployable] = 0; + max[VehiclePadPack] = 0; +}; //CREATION diff --git a/scripts/TWM2/Bosses/LordRog.cs b/scripts/TWM2/Bosses/LordRog.cs index a1ad5e7..3c10036 100644 --- a/scripts/TWM2/Bosses/LordRog.cs +++ b/scripts/TWM2/Bosses/LordRog.cs @@ -1,3 +1,245 @@ +datablock ParticleData(PBCParticle) { + dragCoefficient = 0.5; + WindCoefficient = 0; + gravityCoefficient = 0.0; + inheritedVelFactor = 1; + constantAcceleration = 0; + lifetimeMS = 3000; + lifetimeVarianceMS = 0; + textureName = "special/lightning1frame2"; + useInvAlpha = 0; + + spinRandomMin = -800; + spinRandomMax = 800; + + spinspeed = 50; + colors[0] = "0.1 1.0 0.1 1.0"; + colors[1] = "0.6 0.9 0.6 1.0"; + colors[2] = "0.8 0.8 1.0 1.0"; + colors[3] = "0.8 0.8 1.0 0.0"; + sizes[0] = 0.5; + sizes[1] = 1; + sizes[2] = 1.5; + sizes[3] = 1.5; + times[0] = 0.0; + times[1] = 0.1; + times[2] = 0.3; + times[3] = 1.0; +}; + +datablock ParticleEmitterData(PBCExpEmitter) { + ejectionPeriodMS = 2; + periodVarianceMS = 0; + + ejectionVelocity = 2.5; + velocityVariance = 2.5; + + thetaMin = 0.0; + thetaMax = 180.0; + + lifetimeMS = 200; + + particles = "PBCParticle"; +}; + +datablock SeekerProjectileData(LordRogStiloutte) { + casingShapeName = "weapon_missile_casement.dts"; + projectileShapeName = "weapon_missile_projectile.dts"; + hasDamageRadius = true; + indirectDamage = 0.5; + damageRadius = 5.0; + radiusDamageType = $DamageType::Zombie; + kickBackStrength = 2000; + + explosion = "MissileExplosion"; + splash = MissileSplash; + velInheritFactor = 1.0; // to compensate for slow starting velocity, this value + // is cranked up to full so the missile doesn't start + // out behind the player when the player is moving + // very quickly - bramage + + baseEmitter = MortarSmokeEmitter; + delayEmitter = MissileFireEmitter; + puffEmitter = MissilePuffEmitter; + bubbleEmitter = GrenadeBubbleEmitter; + bubbleEmitTime = 1.0; + + exhaustEmitter = MissileLauncherExhaustEmitter; + exhaustTimeMs = 300; + exhaustNodeName = "muzzlePoint1"; + + lifetimeMS = 20000; // z0dd - ZOD, 4/14/02. Was 6000 + muzzleVelocity = 10.0; + maxVelocity = 80.0; // z0dd - ZOD, 4/14/02. Was 80.0 + turningSpeed = 23.0; + acceleration = 15.0; + + proximityRadius = 2.5; + + terrainAvoidanceSpeed = 10; + terrainScanAhead = 7; + terrainHeightFail = 1; + terrainAvoidanceRadius = 3; + + flareDistance = 40; + flareAngle = 20; + minSeekHeat = 0.0; + + sound = MissileProjectileSound; + + hasLight = true; + lightRadius = 5.0; + lightColor = "0.2 0.05 0"; + + useFlechette = true; + flechetteDelayMs = 250; + casingDeb = FlechetteDebris; + + explodeOnWaterImpact = false; +}; + +datablock PlayerData(LordRogZombieArmor) : LightMaleHumanArmor { + boundingBox = "1.63 1.63 2.6"; + maxDamage = 650.0; + minImpactSpeed = 35; + shapeFile = "bioderm_heavy.dts"; + + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = HeavyBiodermFootprint; + decalOffset = 0.4; + + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + waterBreathSound = WaterBreathBiodermSound; + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; + max[SmokeGrenade] = 0; + max[BeaconSmokeGrenade] = 0; + max[Blaster] = 0; + max[Plasma] = 0; + max[PlasmaAmmo] = 0; + max[Disc] = 0; + max[DiscAmmo] = 0; + max[SniperRifle] = 0; + max[GrenadeLauncher] = 0; + max[GrenadeLauncherAmmo] = 0; + max[Mortar] = 0; + max[MortarAmmo] = 0; + max[MissileLauncher] = 0; + max[MissileLauncherAmmo] = 0; + max[Chaingun] = 0; + max[ChaingunAmmo] = 0; + max[RepairGun] = 0; + max[CloakingPack] = 0; + max[SensorJammerPack] = 0; + max[EnergyPack] = 0; + max[RepairPack] = 0; + max[ShieldPack] = 0; + max[AmmoPack] = 0; + max[SatchelCharge] = 0; + max[MortarBarrelPack] = 0; + max[MissileBarrelPack] = 0; + max[AABarrelPack] = 0; + max[PlasmaBarrelPack] = 0; + max[ELFBarrelPack] = 0; + max[artillerybarrelpack] = 0; + max[MedPack] = 0; + max[InventoryDeployable] = 0; + max[MotionSensorDeployable] = 0; + max[PulseSensorDeployable] = 0; + max[TurretOutdoorDeployable] = 0; + max[TurretIndoorDeployable] = 0; + max[FlashGrenade] = 0; + max[ConcussionGrenade] = 0; + max[FlareGrenade] = 0; + max[TargetingLaser] = 0; + max[ELFGun] = 0; + max[ShockLance] = 0; + max[CameraGrenade] = 0; + max[Beacon] = 0; + max[flamerAmmoPack] = 0; + max[ParachutePack] = 0; + max[ConstructionTool] = 0; + max[MergeTool] = 0; + max[NerfGun] = 0; + max[NerfBallLauncher] = 0; + max[NerfBallLauncherAmmo] = 0; + max[SuperChaingun] = 0; + max[SuperChaingunAmmo] = 0; + max[RPChaingun] = 0; + max[RPChaingunAmmo] = 0; + max[MGClip] = 0; + max[LSMG] = 0; + max[LSMGAmmo] = 0; + max[LSMGClip] = 0; + max[snipergun] = 0; + max[snipergunAmmo] = 0; + max[Bazooka] = 0; + max[BazookaAmmo] = 0; + max[BunkerBuster] = 0; + max[MG42] = 0; + max[MG42Ammo] = 0; + max[SPistol] = 0; + max[Pistol] = 0; + max[PistolAmmo] = 0; + max[Pistolclip] = 0; + max[flamer] = 0; + max[flamerAmmo] = 0; + max[AALauncher] = 0; + max[AALauncherAmmo] = 0; + max[melee] = 0; + max[SOmelee] = 0; + max[KriegRifle] = 0; + max[KriegAmmo] = 0; + max[Rifleclip] = 0; + max[Shotgun] = 0; + max[ShotgunAmmo] = 0; + max[ShotgunClip] = 0; + max[RShotgun] = 0; + max[RShotgunAmmo] = 0; + max[RShotgunClip] = 0; + max[LMissileLauncher] = 0; + max[LMissileLauncherAmmo] = 0; + max[HRPChaingun] = 0; + max[RPGAmmo] = 0; + max[RPGItem] = 0; + max[spineDeployable] = 0; + max[mspineDeployable] = 0; + max[wWallDeployable] = 0; + max[floorDeployable] = 0; + max[WallDeployable] = 0; + max[DoorDeployable] = 0; + max[TurretLaserDeployable] = 0; + max[TurretMissileRackDeployable]= 0; + max[DiscTurretDeployable] = 0; + max[EnergizerDeployable] = 0; + max[TreeDeployable] = 0; + max[CrateDeployable] = 0; + max[DecorationDeployable] = 0; + max[LogoProjectorDeployable] = 0; + max[LightDeployable] = 0; + max[TripwireDeployable] = 0; + max[TelePadPack] = 0; + max[TurretBasePack] = 0; + max[LargeInventoryDeployable] = 0; + max[GeneratorDeployable] = 0; + max[SolarPanelDeployable] = 0; + max[SwitchDeployable] = 0; + max[MediumSensorDeployable] = 0; + max[LargeSensorDeployable] = 0; + max[SpySatelliteDeployable] = 0; + max[JumpadDeployable] = 0; + max[EscapePodDeployable] = 0; + max[ForceFieldDeployable] = 0; + max[GravityFieldDeployable] = 0; + max[VehiclePadPack] = 0; +}; + + function SpawnLordRog(%position) { %Zombie = new player(){ Datablock = "LordRogZombieArmor"; diff --git a/scripts/TWM2/Bosses/LordVardison.cs b/scripts/TWM2/Bosses/LordVardison.cs index 2a7a8e2..d60a120 100644 --- a/scripts/TWM2/Bosses/LordVardison.cs +++ b/scripts/TWM2/Bosses/LordVardison.cs @@ -1,6 +1,254 @@ //LORD \/ARDISON & Dark Archmage Vardison //THIS BOSS WILL MURDER OCCULTBADBOY //Yeah, he really will +datablock LinearFlareProjectileData(SuperlaserProjectile) { + scale = "15.0 15.0 15.0"; + faceViewer = false; + directDamage = 1.0; + hasDamageRadius = true; + indirectDamage = 0.9; + damageRadius = 30.0; + kickBackStrength = 1000.0; + radiusDamageType = $DamageType::Explosion; + + explosion[0] = "HyperDevCannonExplosion2"; + explosion[1] = "SatchelMainExplosion"; + splash = PlasmaSplash; + baseEmitter = HyperDevCannonBaseEmitter; + + + dryVelocity = 200.0; + wetVelocity = 200; + velInheritFactor = 0.5; + fizzleTimeMS = 10000; + lifetimeMS = 10000; + explodeOnDeath = false; + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = true; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = -1; + + //activateDelayMS = 100; + activateDelayMS = -1; + + size[0] = 9; + size[1] = 10; + size[2] = 11; + + + numFlares = 400; + flareColor = "0.0 1.0 0"; + flareModTexture = "flaremod"; + flareBaseTexture = "flarebase"; + + sound = MissileProjectileSound; + fireSound = PlasmaFireSound; + wetFireSound = PlasmaFireWetSound; + + hasLight = true; + lightRadius = 3.0; + lightColor = "0 0.75 0.25"; + +}; + +// +datablock ParticleData(ShadowBaseParticle) { + dragCoeffiecient = 0.0; + gravityCoefficient = -0.2; + inheritedVelFactor = 0.0; + + lifetimeMS = 800; + lifetimeVarianceMS = 500; + + useInvAlpha = true; + spinRandomMin = -160.0; + spinRandomMax = 160.0; + + animateTexture = true; + framesPerSec = 15; + + textureName = "special/cloudflash"; + + colors[0] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[1] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[2] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + + sizes[0] = 2.5; + sizes[1] = 2.7; + sizes[2] = 3.0; + + times[0] = 0.0; + times[1] = 0.7; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(ShadowBaseEmitter) { + ejectionPeriodMS = 10; + periodVarianceMS = 0; + + ejectionVelocity = 1.5; + velocityVariance = 0.3; + + thetaMin = 0.0; + thetaMax = 30.0; + + particles = "ShadowBaseParticle"; +}; + +datablock ParticleData(SmallShadowBaseParticle) { + dragCoeffiecient = 0.0; + gravityCoefficient = -0.2; + inheritedVelFactor = 0.0; + + lifetimeMS = 9999999999999; + lifetimeVarianceMS = 9999999999999; + + useInvAlpha = true; + spinRandomMin = -160.0; + spinRandomMax = 160.0; + + animateTexture = true; + framesPerSec = 15; + + textureName = "special/cloudflash"; + + colors[0] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[1] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[2] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + + sizes[0] = 0.5; + sizes[1] = 0.7; + sizes[2] = 1.0; + + times[0] = 0.0; + times[1] = 0.7; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SmallShadowBaseEmitter) { + ejectionPeriodMS = 10; + periodVarianceMS = 0; + + ejectionVelocity = 1.5; + velocityVariance = 0.3; + + thetaMin = 0.0; + thetaMax = 30.0; + + particles = "SmallShadowBaseParticle"; +}; + +datablock ParticleData(JetShadowParticle) { + dragCoeffiecient = 0.0; + gravityCoefficient = 0; + inheritedVelFactor = 0.0; + + lifetimeMS = 2500; + lifetimeVarianceMS = 0; + + textureName = "particleTest"; + + useInvAlpha = true; + spinRandomMin = -160.0; + spinRandomMax = 160.0; + + animateTexture = true; + framesPerSec = 15; + + animTexName[0] = "special/Explosion/exp_0016"; + animTexName[1] = "special/Explosion/exp_0018"; + animTexName[2] = "special/Explosion/exp_0020"; + animTexName[3] = "special/Explosion/exp_0022"; + animTexName[4] = "special/Explosion/exp_0024"; + animTexName[5] = "special/Explosion/exp_0026"; + animTexName[6] = "special/Explosion/exp_0028"; + animTexName[7] = "special/Explosion/exp_0030"; + animTexName[8] = "special/Explosion/exp_0032"; + + colors[0] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[1] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[2] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + sizes[0] = 2.5; + sizes[1] = 1.25; + sizes[2] = 0.625; + times[0] = 0.0; + times[1] = 0.7; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(JetShadowEmitter) { + ejectionPeriodMS = 2; + periodVarianceMS = 0; + + ejectionVelocity = 0; + velocityVariance = 0; + ejectionOffset = 5; + thetaMin = 22.5; + thetaMax = 45; + phiReferenceVel = 0; + phiVariance = 360; + spinRandomMin = "200"; + spinRandomMax = "-200"; + overrideAdvances = false; + particles = "JetShadowParticle"; +}; + +datablock ParticleData(LaserBallGlobeSmoke) { + dragCoefficient = 50;/////////----------------------- + gravityCoefficient = 0.0; + inheritedVelFactor = 1.0; + constantAcceleration = 0.0; + lifetimeMS = 1000; + lifetimeVarianceMS = 0; + useInvAlpha = true; + spinRandomMin = -360.0; + spinRandomMax = 360.0; + textureName = "particleTest"; + colors[0] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[1] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[2] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + colors[3] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + sizes[0] = 1.0; + sizes[1] = 1.0; + sizes[2] = 1.0; + sizes[3] = 1.0; + times[0] = 0.0; + times[1] = 0.33; + times[2] = 0.66; + times[3] = 1.0; + mass = 0.7; + elasticity = 0.2; + friction = 1; + computeCRC = true; + haslight = true; + lightType = "PulsingLight"; + lightColor = "0.2 0.0 0.5 1.0"; + lightTime = "200"; + lightRadius = "2.0"; +}; + +datablock ParticleEmitterData(MiniShadowBallEmitter) { + ejectionPeriodMS = 0.3; + periodVarianceMS = 0; + ejectionVelocity = 0.0; + velocityVariance = 0.0; + ejectionOffset = 2; + thetaMin = 0; + thetaMax = 180; + overrideAdvances = false; + particles = "LaserBallGlobeSmoke"; +}; + +datablock LinearFlareProjectileData(ShadowBomb) : FlamethrowerBolt { + baseEmitter = ShadowBaseEmitter; + fizzleTimeMS = 14000; + lifetimeMS = 10000; // z0dd - ZOD, 4/25/02. Was 6000 +}; + +datablock SeekerProjectileData(VardisonLaserBallMissile) : YvexNightmareMissile { + baseEmitter = ShadowBaseEmitter; +}; + function VardisonLaserBallMissile::OnExplode(%data, %proj, %pos, %mod) { //LaserBall %ball = CreateEmitter(%pos, "MiniShadowBallEmitter", "0 0 0 0"); @@ -30,6 +278,262 @@ function LaserBallStrike(%position, %count) { schedule(100, 0, "LaserBallStrike", %position, %count); } +datablock LinearFlareProjectileData(VardisonSubShadowBomb) : DMPlasma { + explosion = MortarExplosion; + dryVelocity = 500.0; // z0dd - ZOD, 4/25/02. Was 50. Velocity of projectile out of water + wetVelocity = -1; + velInheritFactor = 1.0; + fizzleTimeMS = 14000; + lifetimeMS = 10000; // z0dd - ZOD, 4/25/02. Was 6000 +}; + +//ARMOR DBs +datablock PlayerData(VardisonStage1Armor) : LightMaleHumanArmor { + runForce = 60.20 * 90; + runEnergyDrain = 0.0; + minRunEnergy = 10; + maxForwardSpeed = 9; + maxBackwardSpeed = 7; + maxSideSpeed = 7; + + jumpForce = 14.0 * 90; + + maxDamage = 300.0; + minImpactSpeed = 35; + shapeFile = "light_male.dts"; + jetEmitter = BiodermArmorJetEmitter; + jetEffect = BiodermArmorJetEffect; + + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = LightBiodermFootprint; + decalOffset = 0.3; + + waterBreathSound = WaterBreathBiodermSound; + + damageScale[$DamageType::M1700] = 3.0; + damageScale[$DamageType::Missile] = 0.0000000000000001; + damageScale[$DamageType::Nuclear] = 0.0000000000000001; + damageScale[$DamageType::EMP] = 0.0000000000000001; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; +}; + +datablock PlayerData(DarkArchmageVardisonArmor) : VardisonStage1Armor { + maxDamage = 1000.0; + minImpactSpeed = 35; + shapeFile = "light_male.dts"; + jetEmitter = BiodermArmorJetEmitter; + jetEffect = BiodermArmorJetEffect; + + damageScale[$DamageType::M1700] = 3.0; + damageScale[$DamageType::Missile] = 0.0000000000000001; + damageScale[$DamageType::Nuclear] = 0.0000000000000001; + damageScale[$DamageType::EMP] = 0.0000000000000001; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; +}; + +datablock FlyingVehicleData(VardisonStage2Flyer) : ShrikeDamageProfile { + spawnOffset = "0 0 2"; + canControl = false; + catagory = "Vehicles"; + shapeFile = "vehicle_air_bomber.dts"; + multipassenger = false; + computeCRC = true; + + debrisShapeName = "vehicle_air_bomber.dts"; + debris = MeShapeDebris; + renderWhenDestroyed = false; + + drag = 0.15; + density = 1.0; + + mountPose[0] = sitting; + numMountPoints = 1; + isProtectedMountPoint[0] = false; + cameraMaxDist = 15; + cameraOffset = 2.5; + cameraLag = 0.9; + explosion = MeVehicleExplosion; + explosionDamage = 1.0; + explosionRadius = 10.0; + + maxDamage = 50.0; + destroyedLevel = 50.0; + + HDAddMassLevel = 49.9; + HDMassImage = LflyerHDMassImage; + + isShielded = false; + energyPerDamagePoint = 0; + maxEnergy = 5000; // Afterburner and any energy weapon pool + rechargeRate = 4; + + minDrag = 22; // Linear Drag (eventually slows you down when not thrusting...constant drag) + rotationalDrag = 900; // Anguler Drag (dampens the drift after you stop moving the mouse...also tumble drag) + + maxAutoSpeed = 50; // Autostabilizer kicks in when less than this speed. (meters/second) + autoAngularForce = 400; // Angular stabilizer force (this force levels you out when autostabilizer kicks in) + autoLinearForce = 1; // Linear stabilzer force (this slows you down when autostabilizer kicks in) + autoInputDamping = 0.8; // Dampen control input so you don't` whack out at very slow speeds + + + // Maneuvering + maxSteeringAngle = 4.5; // Max radiens you can rotate the wheel. Smaller number is more maneuverable. + horizontalSurfaceForce = 6; // Horizontal center "wing" (provides "bite" into the wind for climbing/diving and turning) + verticalSurfaceForce = 4; // Vertical center "wing" (controls side slip. lower numbers make MORE slide.) + maneuveringForce = 5250; // Horizontal jets (W,S,D,A key thrust) + steeringForce = 675; // Steering jets (force applied when you move the mouse) + steeringRollForce = 3000; // Steering jets (how much you heel over when you turn) + rollForce = 1; // Auto-roll (self-correction to right you after you roll/invert) + hoverHeight = 2.5; // Height off the ground at rest + createHoverHeight = 1; // Height off the ground when created + maxForwardSpeed = 165; // speed in which forward thrust force is no longer applied (meters/second) + + // Turbo Jet + jetForce = 2500; // Afterburner thrust (this is in addition to normal thrust) + minJetEnergy = 40; // Afterburner can't be used if below this threshhold. + jetEnergyDrain = 10; // Energy use of the afterburners (low number is less drain...can be fractional) // Auto stabilize speed + vertThrustMultiple = 1.25; + + // Rigid body + mass = 150; // Mass of the vehicle + bodyFriction = 0; // Don't mess with this. + bodyRestitution = 0.5; // When you hit the ground, how much you rebound. (between 0 and 1) + minRollSpeed = 0; // Don't mess with this. + softImpactSpeed = 14; // Sound hooks. This is the soft hit. + hardImpactSpeed = 25; // Sound hooks. This is the hard hit. + + // Ground Impact Damage (uses DamageType::Ground) + minImpactSpeed = 20; // If hit ground at speed above this then it's an impact. Meters/second + speedDamageScale = 0.06; + + // Object Impact Damage (uses DamageType::Impact) + collDamageThresholdVel = 23.0; + collDamageMultiplier = 0.02; + + // + minTrailSpeed = 70; // The speed your contrail shows up at. + trailEmitter = JetShadowEmitter; + forwardJetEmitter = JetShadowEmitter; + downJetEmitter = JetShadowEmitter; + + // + jetSound = ScoutFlyerThrustSound; + engineSound = ScoutFlyerEngineSound; + softImpactSound = SoftImpactSound; + hardImpactSound = HardImpactSound; + //wheelImpactSound = WheelImpactSound; + + // + softSplashSoundVelocity = 10.0; + mediumSplashSoundVelocity = 15.0; + hardSplashSoundVelocity = 20.0; + exitSplashSoundVelocity = 10.0; + + exitingWater = VehicleExitWaterMediumSound; + impactWaterEasy = VehicleImpactWaterSoftSound; + impactWaterMedium = VehicleImpactWaterMediumSound; + impactWaterHard = VehicleImpactWaterMediumSound; + waterWakeSound = VehicleWakeMediumSplashSound; + + dustEmitter = VehicleLiftoffDustEmitter; + triggerDustHeight = 4.0; + dustHeight = 1.0; + + damageEmitter[0] = MeLightDamageSmoke; + damageEmitter[1] = MeHeavyDamageSmoke; + damageEmitter[2] = MeDamageBubbles; + damageEmitterOffset[0] = "0.0 -3.0 0.0 "; + damageLevelTolerance[0] = 0.4; + damageLevelTolerance[1] = 0.75; + numDmgEmitterAreas = 1; + + // + max[chaingunAmmo] = 2000; + max[MissileLauncherAmmo] = 200; + max[MortarAmmo] = 200; + + damageScale[$DamageType::Nuclear] = 0.0000000000000001; + damageScale[$DamageType::EMP] = 0.0000000000000001; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + ShieldDamageScale[$DamageType::Bullet] = 0.01; //I deny you shrike n0bs + + minMountDist = 7; + + splashEmitter[0] = VehicleFoamDropletsEmitter; + splashEmitter[1] = VehicleFoamEmitter; + + shieldImpact = VehicleShieldImpact; + + cmdCategory = "Tactical"; + cmdIcon = CMDFlyingScoutIcon; + cmdMiniIconName = "commander/MiniIcons/com_scout_grey"; + targetNameTag = 'Lord Vardison'; + targetTypeTag = ''; + sensorData = SSTurretBaseSensorObj; + sensorRadius = SSTurretBaseSensorObj.detectRadius; + sensorColor = "9 9 255"; + + checkRadius = 5.5; + observeParameters = "1 10 10"; + + runningLight[0] = ShrikeLight1; +// runningLight[1] = ShrikeLight2; + + shieldEffectScale = "0.937 1.125 0.60"; + + numWeapons = 3; + + replaceTime = 90; +}; + +datablock PlayerData(VardisonStage3Armor) : LightMaleHumanArmor { + runForce = 60.20 * 90; + runEnergyDrain = 0.0; + minRunEnergy = 10; + maxForwardSpeed = 9; + maxBackwardSpeed = 7; + maxSideSpeed = 7; + + jumpForce = 14.0 * 90; + + maxDamage = 500.0; + minImpactSpeed = 35; + shapeFile = "TR2Heavy_Male.dts"; + jetEmitter = BiodermArmorJetEmitter; + jetEffect = BiodermArmorJetEffect; + + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = LightBiodermFootprint; + decalOffset = 0.3; + + boundingBox = "5 5 10"; + + waterBreathSound = WaterBreathBiodermSound; + + damageScale[$DamageType::M1700] = 3.0; + damageScale[$DamageType::PlasmaCannon] = 0.001; + damageScale[$DamageType::Missile] = 0.0000000000000001; + damageScale[$DamageType::Nuclear] = 0.0000000000000001; + damageScale[$DamageType::EMP] = 0.0000000000000001; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; +}; + function StartDAVardison(%pos) { %Vardison = new player() { Datablock = "DarkArchmageVardisonArmor"; @@ -334,6 +838,137 @@ function DoVardisonSuperCloseKill(%source, %target, %count) { schedule(100, 0, "DoVardisonSuperCloseKill", %source, %target, %count); } +function ShadowBomb::onExplode(%data, %proj, %pos, %mod) { + %vec = %proj.spdvec; + %vec = getword(%vec, 0)@" "@getword(%vec, 1)@" 0"; + %vec = vectorNormalize(%vec); + %vec = vectorscale(%vec, 30); + %result = containerRayCast(vectoradd(%pos,"0 0 10"), vectoradd(%pos,%vec), $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType, %proj); + for(%i = 0; %i < 3; %i++) { + if(%result) + schedule((5 * %i), 0, "Napalm2FindNewDir", %pos, %vec, %proj.sourceobject, 0, 0); + else { + %rndvec = (getRandom(1, 15) - 7.5)@" "@(getRandom(1, 15) - 7.5)@" "@((getRandom() * 5) + 5); + %newvec = vectoradd(%vec,%rndvec); + %newvec = vectoradd(%pos,%newvec); + %p = new LinearFlareProjectile() { + dataBlock = VardisonSubShadowBomb; + initialDirection = "0 0 -1"; + initialPosition = %newvec; + sourceObject = %proj.sourceobject; + SourceSlot = 5; + }; + %p.sourceobject = %proj.sourceobject; + %p.vector = %vec; + %p.count = 1; + if(%proj.maxExplode $= "") { + %p.maxExplode = 15; + } + else { + %p.maxExplode = %proj.maxExplode; + } + } + } + if (%data.hasDamageRadius) + RadiusExplosion(%proj, %pos, %data.damageRadius, %data.indirectDamage, %data.kickBackStrength, %proj.sourceObject, %data.radiusDamageType); +} + +function VardisonSubShadowBomb::onExplode(%data, %proj, %pos, %mod) { + if(%proj.count < %proj.maxExplode) { //holy... christ + %vec = vectorscale(vectornormalize(%proj.vector), 24); + %result = containerRayCast(vectoradd(%pos,"0 0 10"), vectoradd(%pos,%vec), $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType, %proj); + if(%result) + schedule(5, 0, "Napalm2FindNewDir", %pos, %vec, %proj.sourceobject, %proj.count, 0); + else { + %rndvec = (getRandom(1, 10) - 5)@" "@(getRandom(1, 10) - 5)@" "@((getRandom() * 5) + 5); + %newvec = vectoradd(%vec,%rndvec); + %newvec = vectoradd(%pos,%newvec); + %p = new LinearFlareProjectile() { + dataBlock = VardisonSubShadowBomb; + initialDirection = "0 0 -1"; + initialPosition = %newvec; + sourceObject = %proj.sourceobject; + sourceSlot = 5; + }; + %p.sourceobject = %proj.sourceobject; + %p.vector = %vec; + %p.count = %proj.count + 1; + } + } + if (%data.hasDamageRadius) + RadiusExplosion(%proj, %pos, %data.damageRadius, %data.indirectDamage, %data.kickBackStrength, %proj.sourceObject, %data.radiusDamageType); +} + +function Napalm2FindNewDir(%pos, %vec, %source, %count, %count2) { + if(%count2 == 2) { + %rndvec = getRandom(1, 10)@" "@getRandom(1, 10)@" "@((getRandom() * 5) + 4); + %newvec = vectoradd(%pos,%rndvec); + %p = new LinearFlareProjectile() { + dataBlock = VardisonSubShadowBomb; + initialDirection = "0 0 -1"; + initialPosition = %newvec; + sourceObject = %source; + sourceSlot = 5; + }; + %p.sourceobject = %source; + %p.vector = %vec; + %p.count = %count+1; + return; + } + if(%count2 == 1) { + %vec = vectorscale(%vec,-1); + %result = containerRayCast(vectoradd(%pos,"0 0 10"), vectoradd(%pos,%vec), $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType, 0); + if(!(%result)){ + %rndvec = getRandom(1, 10)@" "@getRandom(1, 10)@" "@((getRandom() * 5) + 4); + %newvec = vectoradd(%vec,%rndvec); + %newvec = vectoradd(%pos,%newvec); + %p = new LinearFlareProjectile() { + dataBlock = VardisonSubShadowBomb; + initialDirection = "0 0 -1"; + initialPosition = %newvec; + sourceObject = %source; + sourceSlot = 5; + }; + %p.sourceobject = %source; + %p.vector = %vec; + %p.count = %count+1; + return; + } + } + else { + %chance = getrandom(1,4); + if(%chance <= 2){ + %nv2 = (getword(%vec, 0) * -1); + %nv1 = getword(%vec, 1); + %vec = %nv1@" "@%nv2@" 0"; + } + else { + %nv2 = getword(%vec, 0); + %nv1 = (getword(%vec, 1) * -1); + %vec = %nv1@" "@%nv2@" 0"; + } + %result = containerRayCast(vectoradd(%pos,"0 0 10"), vectoradd(%pos,%vec), $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType, 0); + if(!(%result)){ + %rndvec = getRandom(1, 10)@" "@getRandom(1, 10)@" "@((getRandom() * 5) + 4); + %newvec = vectoradd(%vec,%rndvec); + %newvec = vectoradd(%pos,%newvec); + %p = new LinearFlareProjectile() { + dataBlock = VardisonSubShadowBomb; + initialDirection = "0 0 -1"; + initialPosition = %newvec; + sourceObject = %source; + sourceSlot = 5; + }; + %p.sourceobject = %source; + %p.vector = %vec; + %p.count = %count+1; + return; + } + } + %count2++; + schedule(2, 0, "Napalm2FindNewDir", %pos, %vec, %source, %count, %count2); +} + function GOVDoFlameCano(%g, %target) { if(!isObject(%g) || %g.getState() $= "dead") { return; @@ -695,7 +1330,7 @@ function VardisonAttack(%boss, %att, %arg) { sourceObject = %boss; sourceSlot = 4; }; - //%p.maxExplode = %detCt; + %p.maxExplode = %detCt; MissionCleanup.add(%p); case "ShadowBombLaunchAbove": @@ -838,7 +1473,18 @@ function InvokeStillwallLoop(%boss) { %boss.InvokeLoop = schedule(100, 0, "InvokeStillwallLoop", %boss); } + + + + + + + //============================================================================== +datablock SeekerProjectileData(VardisonMiniDemonSpawner) : VardisonNightmareMissile { + baseEmitter = ShadowBaseEmitter; +}; + function VardisonMiniDemonSpawner::OnExplode(%data, %proj, %pos, %mod) { //LaserBall %ball = CreateEmitter(%pos, "MiniShadowBallEmitter", "0 0 0 0"); @@ -848,6 +1494,77 @@ function VardisonMiniDemonSpawner::OnExplode(%data, %proj, %pos, %mod) { CreateDemonAT(vectorAdd(%pos, "0 0 3")); } +datablock PlayerData(MiniDemonArmor) : LightMaleHumanArmor { + runForce = 60.20 * 90; + runEnergyDrain = 0.0; + minRunEnergy = 10; + maxForwardSpeed = 9; + maxBackwardSpeed = 7; + maxSideSpeed = 7; + + jumpForce = 14.0 * 90; + + maxDamage = 2.8; + minImpactSpeed = 1000; + shapeFile = "bioderm_medium.dts"; + jetEmitter = BiodermArmorJetEmitter; + jetEffect = BiodermArmorJetEffect; + + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = LightBiodermFootprint; + decalOffset = 0.3; + + waterBreathSound = WaterBreathBiodermSound; + + damageScale[$DamageType::M1700] = 3.0; + damageScale[$DamageType::PlasmaCannon] = 0.001; + damageScale[$DamageType::Missile] = 0.0000000000000001; + damageScale[$DamageType::Nuclear] = 0.0000000000000001; + damageScale[$DamageType::EMP] = 0.0000000000000001; + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; +}; + +datablock GrenadeProjectileData(MiniDemonBlaster) { + projectileShapeName = "plasmabolt.dts"; + emitterDelay = -1; + directDamage = 0.0; + hasDamageRadius = true; + indirectDamage = 0.45; + damageRadius = 5.0; // z0dd - ZOD, 8/13/02. Was 20.0 + radiusDamageType = $DamageType::Demon; + kickBackStrength = 1500; + + explosion = "MortarExplosion"; + underwaterExplosion = "MortarExplosion"; + velInheritFactor = 0; + splash = PlasmaSplash; + depthTolerance = 100.0; + + baseEmitter = DemonFBSmokeEmitter; + bubbleEmitter = DemonFBSmokeEmitter; + + grenadeElasticity = 0; + grenadeFriction = 0.4; + armingDelayMS = -1; // z0dd - ZOD, 4/14/02. Was 2000 + + gravityMod = 0.4; // z0dd - ZOD, 5/18/02. Make mortar projectile heavier, less floaty + muzzleVelocity = 125.0; // z0dd - ZOD, 8/13/02. More velocity to compensate for higher gravity. Was 63.7 + drag = 0; + sound = PlasmaProjectileSound; + + hasLight = true; + lightRadius = 10; + lightColor = "1 0.75 0.25"; + + hasLightUnderwaterColor = true; + underWaterLightColor = "1 0.75 0.25"; +}; + function CreateDemon(%pos) { %p = new SeekerProjectile() { dataBlock = VardisonMiniDemonSpawner; diff --git a/scripts/TWM2/Bosses/LordYvex.cs b/scripts/TWM2/Bosses/LordYvex.cs index be63622..f111135 100644 --- a/scripts/TWM2/Bosses/LordYvex.cs +++ b/scripts/TWM2/Bosses/LordYvex.cs @@ -1,4 +1,198 @@ -//BLOCK FUNCTIONS +//DATABLOCKS +datablock ParticleData(InflictionNightmareGlobeSmoke) { + dragCoefficient = 50;/////////----------------------- + gravityCoefficient = 0.0; + inheritedVelFactor = 1.0; + constantAcceleration = 0.0; + lifetimeMS = 5050; + lifetimeVarianceMS = 0; + useInvAlpha = true; + spinRandomMin = -360.0; + spinRandomMax = 360.0; + textureName = "particleTest"; + colors[0] = "0.5 0.1 0.9 1.0"; + colors[1] = "0.5 0.1 0.9 1.0"; + colors[2] = "0.5 0.1 0.9 1.0"; + colors[3] = "0.5 0.1 0.9"; + sizes[0] = 1.0; + sizes[1] = 1.0; + sizes[2] = 1.0; + sizes[3] = 1.0; + times[0] = 0.0; + times[1] = 0.33; + times[2] = 0.66; + times[3] = 1.0; + mass = 0.7; + elasticity = 0.2; + friction = 1; + computeCRC = true; + haslight = true; + lightType = "PulsingLight"; + lightColor = "0.2 0.0 0.5 1.0"; + lightTime = "200"; + lightRadius = "2.0"; +}; + +datablock ParticleEmitterData(InfNightmareGlobeEmitter) { + ejectionPeriodMS = 0.1; + periodVarianceMS = 0; + ejectionVelocity = 0.0; + velocityVariance = 0.0; + ejectionOffset = 5; + thetaMin = 0; + thetaMax = 180; + overrideAdvances = false; + particles = "InflictionNightmareGlobeSmoke"; +}; + + +datablock ParticleData(NightmareGlobeSmoke) { + dragCoefficient = 50;/////////----------------------- + gravityCoefficient = 0.0; + inheritedVelFactor = 1.0; + constantAcceleration = 0.0; + lifetimeMS = 5050; + lifetimeVarianceMS = 0; + useInvAlpha = true; + spinRandomMin = -360.0; + spinRandomMax = 360.0; + textureName = "particleTest"; + colors[0] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[1] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[2] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + colors[3] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + sizes[0] = 1.0; + sizes[1] = 1.0; + sizes[2] = 1.0; + sizes[3] = 1.0; + times[0] = 0.0; + times[1] = 0.33; + times[2] = 0.66; + times[3] = 1.0; + mass = 0.7; + elasticity = 0.2; + friction = 1; + computeCRC = true; + haslight = true; + lightType = "PulsingLight"; + lightColor = "0.2 0.0 0.5 1.0"; + lightTime = "200"; + lightRadius = "2.0"; +}; + +datablock ParticleEmitterData(NightmareGlobeEmitter) { + ejectionPeriodMS = 0.1; + periodVarianceMS = 0; + ejectionVelocity = 0.0; + velocityVariance = 0.0; + ejectionOffset = 5; + thetaMin = 0; + thetaMax = 180; + overrideAdvances = false; + particles = "NightmareGlobeSmoke"; +}; + +//Yvex STUFF.. MORE +datablock ParticleData(GreenEmitParticle) { + dragCoeffiecient = 1; + gravityCoefficient = -0.3; // rises slowly + inheritedVelFactor = 0; + + lifetimeMS = 300; + lifetimeVarianceMS = 0; + useInvAlpha = false; + spinRandomMin = 0.0; + spinRandomMax = 0.0; + + animateTexture = false; + + textureName = "flareBase"; // "special/Smoke/bigSmoke" + + colors[0] = "0 1 0"; + colors[1] = "0 1 0"; + colors[2] = "0 1 0"; + + sizes[0] = 0.8; + sizes[1] = 0.8; + sizes[2] = 0.8; + + times[0] = 0.0; + times[1] = 1.0; + times[2] = 5.0; + +}; + +datablock ParticleEmitterData(PulseGreenEmitter) { + ejectionPeriodMS = 2; + periodVarianceMS = 1; + + ejectionVelocity = 10; + velocityVariance = 0; + + thetaMin = 89.0; + thetaMax = 90.0; + + orientParticles = false; + + particles = "GreenEmitParticle"; +}; + +datablock SeekerProjectileData(YvexNightmareMissile){ + casingShapeName = "weapon_missile_casement.dts"; + projectileShapeName = "weapon_missile_projectile.dts"; + hasDamageRadius = true; + indirectDamage = 0.8; + damageRadius = 8.0; + radiusDamageType = $DamageType::Missile; + kickBackStrength = 2000; + + explosion = "MissileExplosion"; + splash = MissileSplash; + velInheritFactor = 1.0; // to compensate for slow starting velocity, this value + // is cranked up to full so the missile doesn't start + // out behind the player when the player is moving + // very quickly - bramage + + delayEmitter = MissileFireEmitter; + puffEmitter = MissilePuffEmitter; + bubbleEmitter = GrenadeBubbleEmitter; + bubbleEmitTime = 1.0; + + exhaustEmitter = MissileLauncherExhaustEmitter; + exhaustTimeMs = 300; + exhaustNodeName = "muzzlePoint1"; + + lifetimeMS = 30000; + muzzleVelocity = 10.0; + maxVelocity = 150.0; + turningSpeed = 110.0; + acceleration = 350.0; + + proximityRadius = 3; + + terrainAvoidanceSpeed = 180; + terrainScanAhead = 25; + terrainHeightFail = 12; + terrainAvoidanceRadius = 100; + + flareDistance = 200; + flareAngle = 30; + + sound = MissileProjectileSound; + + hasLight = true; + lightRadius = 5.0; + lightColor = "0.2 0.05 0"; + + useFlechette = true; + flechetteDelayMs = 550; + casingDeb = FlechetteDebris; + + explodeOnWaterImpact = false; + + baseEmitter = NMMissileBaseEmitter; +}; + function YvexNightmareMissile::OnExplode(%data, %proj, %pos, %mod) { %source = %proj.SourceObject; InitContainerRadiusSearch(%proj.getPosition(), 6, $TypeMasks::PlayerObjectType); @@ -9,46 +203,344 @@ function YvexNightmareMissile::OnExplode(%data, %proj, %pos, %mod) { } } -function KillerPulse::onCollision(%data,%projectile,%targetObject,%modifier,%position,%normal) { - if (%targetObject.getClassName() $= "Player" && %targetObject.isBoss) { - messageall('msgkillcurse', "\c5"@getTaggedString(%targetObject.client.name)@" Took a fatal Hit from "@$TWM2::ZombieName[7]@"'s Dark Energy"); - %targetObject.throwWeapon(); - %targetObject.clearinventory(); - YvexAttack_FUNC("KillLoop", %targetObject); - } -} +datablock LinearFlareProjectileData(KillerPulse) { + scale = "1.0 1.0 1.0"; + faceViewer = false; + directDamage = 0.00001; + hasDamageRadius = false; + indirectDamage = 0.6; + damageRadius = 10.0; + kickBackStrength = 100.0; + directDamageType = $DamageType::Admin; + indirectDamageType = $DamageType::Admin; -function YvexZombieMakerMissile::OnExplode(%data, %proj, %pos, %mod) { - %c = CreateEmitter(%pos, NightmareGlobeEmitter, "0 0 1"); - %rand = getRandom(1, 6); - %c.schedule(%rand * 750, "delete"); - for(%i = 0; %i < %rand; %i++) { - %time = %i * 750; - %type = getRandomZombieType("1 2 3 4 5 9 12 13"); - schedule(%time, 0, "StartAZombie", vectoradd(%pos, "0 0 1"), %type); - } -} + explosion = "BlasterExplosion"; + splash = PlasmaSplash; -function YvexSniperShot::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) { - if(!isplayer(%targetObject)) { - return; - } - %targ = %targetObject.client; - %Zombie = %projectile.sourceObject; - %targ.nightmareticks = 0; - Yvexnightmareloop(%zombie,%targ); - %randMessage = getrandom(3)+1; - switch(%randMessage) { - case 1: - MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Let the revenge begin, "@getTaggedString(%targ.name)@"."); - case 2: - MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Taste my vengance... "@getTaggedString(%targ.name)@"."); - case 3: - MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Sleep Forever... "@getTaggedString(%targ.name)@"."); - default: - MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": This Nightmare will lock you forever "@getTaggedString(%targ.name)@"!"); - } -} + dryVelocity = 200.0; + wetVelocity = 10; + velInheritFactor = 0.5; + fizzleTimeMS = 30000; + lifetimeMS = 30000; + explodeOnDeath = false; + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = true; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = -1; + + baseEmitter = PulseGreenEmitter; + delayEmitter = PulseGreenEmitter; + bubbleEmitter = PulseGreenEmitter; + + //activateDelayMS = 100; + activateDelayMS = -1; + + size[0] = 0.2; + size[1] = 0.2; + size[2] = 0.2; + + + numFlares = 15; + flareColor = "0 1 0"; + flareModTexture = "flaremod"; + flareBaseTexture = "flarebase"; + + sound = MissileProjectileSound; + fireSound = PlasmaFireSound; + wetFireSound = PlasmaFireWetSound; + + hasLight = true; + lightRadius = 3.0; + lightColor = "0 1 0"; + +}; + +datablock ParticleData(PurpleNightmareEmitParticle) { + dragCoeffiecient = 1; + gravityCoefficient = -0.3; // rises slowly + inheritedVelFactor = 0; + + lifetimeMS = 300; + lifetimeVarianceMS = 0; + useInvAlpha = false; + spinRandomMin = 0.0; + spinRandomMax = 0.0; + + animateTexture = false; + + textureName = "flareBase"; // "special/Smoke/bigSmoke" + + colors[0] = "0.5 0.1 0.9 1.0"; + colors[1] = "0.5 0.1 0.9 1.0"; + colors[2] = "0.5 0.1 0.9"; + + sizes[0] = 0.4; + sizes[1] = 0.4; + sizes[2] = 0.4; + + times[0] = 0.0; + times[1] = 1.0; + times[2] = 5.0; + +}; + +datablock ParticleEmitterData(YvexSniperEmitter) { + ejectionPeriodMS = 2; + periodVarianceMS = 1; + + ejectionVelocity = 10; + velocityVariance = 0; + + thetaMin = 89.0; + thetaMax = 90.0; + + orientParticles = false; + + particles = "PurpleNightmareEmitParticle"; +}; + +datablock LinearFlareProjectileData(YvexSniperShot) { + projectileShapeName = "weapon_missile_projectile.dts"; + scale = "3.0 5.0 3.0"; + faceViewer = true; + directDamage = 0.01; + kickBackStrength = 4000.0; + DirectDamageType = $DamageType::Zombie; + + explosion = "BlasterExplosion"; + + dryVelocity = 150.0; + wetVelocity = -1; + velInheritFactor = 0.3; + fizzleTimeMS = 10000; + lifetimeMS = 10000; + explodeOnDeath = true; + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = true; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = -1; + + activateDelayMS = 100; + activateDelayMS = -1; + + baseEmitter = YvexSniperEmitter; + + size[0] = 0.0; + size[1] = 0.0; + size[2] = 0.0; + + + numFlares = 0; + flareColor = "0.0 0.0 0.0"; + flareModTexture = "flaremod"; + flareBaseTexture = "flarebase"; + + sound = PlasmaProjectileSound; + fireSound = PlasmaFireSound; + wetFireSound = PlasmaFireWetSound; + + hasLight = true; + lightRadius = 3.0; + lightColor = "1 0.75 0.25"; +}; + +datablock SeekerProjectileData(YvexZombieMakerMissile) { + casingShapeName = "weapon_missile_casement.dts"; + projectileShapeName = "weapon_missile_projectile.dts"; + hasDamageRadius = true; + indirectDamage = 0.5; + damageRadius = 5.0; + radiusDamageType = $DamageType::Zombie; + kickBackStrength = 2000; + + explosion = "MissileExplosion"; + splash = MissileSplash; + velInheritFactor = 1.0; // to compensate for slow starting velocity, this value + // is cranked up to full so the missile doesn't start + // out behind the player when the player is moving + // very quickly - bramage + + baseEmitter = MortarSmokeEmitter; + delayEmitter = MissileFireEmitter; + puffEmitter = MissilePuffEmitter; + bubbleEmitter = GrenadeBubbleEmitter; + bubbleEmitTime = 1.0; + + exhaustEmitter = MissileLauncherExhaustEmitter; + exhaustTimeMs = 300; + exhaustNodeName = "muzzlePoint1"; + + lifetimeMS = 30000; // z0dd - ZOD, 4/14/02. Was 6000 + muzzleVelocity = 30.0; + maxVelocity = 35.0; // z0dd - ZOD, 4/14/02. Was 80.0 + turningSpeed = 23.0; + acceleration = 15.0; + + proximityRadius = 2.5; + + terrainAvoidanceSpeed = 10; + terrainScanAhead = 7; + terrainHeightFail = 1; + terrainAvoidanceRadius = 3; + + flareDistance = 40; + flareAngle = 20; + minSeekHeat = 0.0; + + sound = MissileProjectileSound; + + hasLight = true; + lightRadius = 5.0; + lightColor = "0.2 0.05 0"; + + useFlechette = true; + flechetteDelayMs = 250; + casingDeb = FlechetteDebris; + + explodeOnWaterImpact = false; +}; + +datablock PlayerData(YvexZombieArmor) : LightMaleHumanArmor { + boundingBox = "1.63 1.63 2.6"; + maxDamage = 500.0; + minImpactSpeed = 35; + shapeFile = "medium_male.dts"; + + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = HeavyBiodermFootprint; + decalOffset = 0.4; + + waterBreathSound = WaterBreathBiodermSound; + + damageScale[$DamageType::W1700] = 3.0; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; + max[SmokeGrenade] = 0; + max[BeaconSmokeGrenade] = 0; + max[Blaster] = 0; + max[Plasma] = 0; + max[PlasmaAmmo] = 0; + max[Disc] = 0; + max[DiscAmmo] = 0; + max[SniperRifle] = 0; + max[GrenadeLauncher] = 0; + max[GrenadeLauncherAmmo] = 0; + max[Mortar] = 0; + max[MortarAmmo] = 0; + max[MissileLauncher] = 0; + max[MissileLauncherAmmo] = 0; + max[Chaingun] = 0; + max[ChaingunAmmo] = 0; + max[RepairGun] = 0; + max[CloakingPack] = 0; + max[SensorJammerPack] = 0; + max[EnergyPack] = 0; + max[RepairPack] = 0; + max[ShieldPack] = 0; + max[AmmoPack] = 0; + max[SatchelCharge] = 0; + max[MortarBarrelPack] = 0; + max[MissileBarrelPack] = 0; + max[AABarrelPack] = 0; + max[PlasmaBarrelPack] = 0; + max[ELFBarrelPack] = 0; + max[artillerybarrelpack] = 0; + max[MedPack] = 0; + max[InventoryDeployable] = 0; + max[MotionSensorDeployable] = 0; + max[PulseSensorDeployable] = 0; + max[TurretOutdoorDeployable] = 0; + max[TurretIndoorDeployable] = 0; + max[FlashGrenade] = 0; + max[ConcussionGrenade] = 0; + max[FlareGrenade] = 0; + max[TargetingLaser] = 0; + max[ELFGun] = 0; + max[ShockLance] = 0; + max[CameraGrenade] = 0; + max[Beacon] = 0; + max[flamerAmmoPack] = 0; + max[ParachutePack] = 0; + max[ConstructionTool] = 0; + max[MergeTool] = 0; + max[NerfGun] = 0; + max[NerfBallLauncher] = 0; + max[NerfBallLauncherAmmo] = 0; + max[SuperChaingun] = 0; + max[SuperChaingunAmmo] = 0; + max[RPChaingun] = 0; + max[RPChaingunAmmo] = 0; + max[MGClip] = 0; + max[LSMG] = 0; + max[LSMGAmmo] = 0; + max[LSMGClip] = 0; + max[snipergun] = 0; + max[snipergunAmmo] = 0; + max[Bazooka] = 0; + max[BazookaAmmo] = 0; + max[BunkerBuster] = 0; + max[MG42] = 0; + max[MG42Ammo] = 0; + max[SPistol] = 0; + max[Pistol] = 0; + max[PistolAmmo] = 0; + max[Pistolclip] = 0; + max[flamer] = 0; + max[flamerAmmo] = 0; + max[AALauncher] = 0; + max[AALauncherAmmo] = 0; + max[melee] = 0; + max[SOmelee] = 0; + max[KriegRifle] = 0; + max[KriegAmmo] = 0; + max[Rifleclip] = 0; + max[Shotgun] = 0; + max[ShotgunAmmo] = 0; + max[ShotgunClip] = 0; + max[RShotgun] = 0; + max[RShotgunAmmo] = 0; + max[RShotgunClip] = 0; + max[LMissileLauncher] = 0; + max[LMissileLauncherAmmo] = 0; + max[HRPChaingun] = 0; + max[RPGAmmo] = 0; + max[RPGItem] = 0; + max[spineDeployable] = 0; + max[mspineDeployable] = 0; + max[wWallDeployable] = 0; + max[floorDeployable] = 0; + max[WallDeployable] = 0; + max[DoorDeployable] = 0; + max[TurretLaserDeployable] = 0; + max[TurretMissileRackDeployable]= 0; + max[DiscTurretDeployable] = 0; + max[EnergizerDeployable] = 0; + max[TreeDeployable] = 0; + max[CrateDeployable] = 0; + max[DecorationDeployable] = 0; + max[LogoProjectorDeployable] = 0; + max[LightDeployable] = 0; + max[TripwireDeployable] = 0; + max[TelePadPack] = 0; + max[TurretBasePack] = 0; + max[LargeInventoryDeployable] = 0; + max[GeneratorDeployable] = 0; + max[SolarPanelDeployable] = 0; + max[SwitchDeployable] = 0; + max[MediumSensorDeployable] = 0; + max[LargeSensorDeployable] = 0; + max[SpySatelliteDeployable] = 0; + max[JumpadDeployable] = 0; + max[EscapePodDeployable] = 0; + max[ForceFieldDeployable] = 0; + max[GravityFieldDeployable] = 0; + max[VehiclePadPack] = 0; +}; //CREATION function SpawnYvex(%position) { @@ -310,6 +802,27 @@ function YvexAttack_FUNC(%att, %args) { } } +function YvexSniperShot::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) { + if(!isplayer(%targetObject)) { + return; + } + %targ = %targetObject.client; + %Zombie = %projectile.sourceObject; + %targ.nightmareticks = 0; + Yvexnightmareloop(%zombie,%targ); + %randMessage = getrandom(3)+1; + switch(%randMessage) { + case 1: + MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Let the revenge begin, "@getTaggedString(%targ.name)@"."); + case 2: + MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Taste my vengance... "@getTaggedString(%targ.name)@"."); + case 3: + MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Sleep Forever... "@getTaggedString(%targ.name)@"."); + default: + MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": This Nightmare will lock you forever "@getTaggedString(%targ.name)@"!"); + } +} + function Yvexnightmareloop(%zombie,%viewer) { %enum = getRandom(1,5); switch(%enum) { @@ -370,3 +883,23 @@ function Yvexnightmareloop(%zombie,%viewer) { schedule(55, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/derm2/avo.deathcry_02.wav"); schedule(60, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/derm3/avo.deathcry_02.wav"); } + +function KillerPulse::onCollision(%data,%projectile,%targetObject,%modifier,%position,%normal) { + if (%targetObject.getClassName() $= "Player" && %targetObject.isBoss) { + messageall('msgkillcurse', "\c5"@getTaggedString(%targetObject.client.name)@" Took a fatal Hit from "@$TWM2::ZombieName[7]@"'s Dark Energy"); + %targetObject.throwWeapon(); + %targetObject.clearinventory(); + YvexAttack_FUNC("KillLoop", %targetObject); + } +} + +function YvexZombieMakerMissile::OnExplode(%data, %proj, %pos, %mod) { + %c = CreateEmitter(%pos, NightmareGlobeEmitter, "0 0 1"); + %rand = getRandom(1, 6); + %c.schedule(%rand * 750, "delete"); + for(%i = 0; %i < %rand; %i++) { + %time = %i * 750; + %type = getRandomZombieType("1 2 3 4 5 9 12 13"); + schedule(%time, 0, "StartAZombie", vectoradd(%pos, "0 0 1"), %type); + } +} diff --git a/scripts/TWM2/Bosses/LordraniusTrebor.cs b/scripts/TWM2/Bosses/LordraniusTrebor.cs index e042f4c..d79919b 100644 --- a/scripts/TWM2/Bosses/LordraniusTrebor.cs +++ b/scripts/TWM2/Bosses/LordraniusTrebor.cs @@ -1,3 +1,35 @@ +datablock HoverVehicleData(TreborTank) : CentaurVehicle { + spawnOffset = "0 0 4"; + canControl = true; + floatingGravMag = 4.5; + + catagory = "Vehicles"; + shapeFile = "vehicle_grav_tank.dts"; + multipassenger = false; + computeCRC = true; + renderWhenDestroyed = false; + + mountPose[0] = sitting; + numMountPoints = 0; // <-- Ignore this + isProtectedMountPoint[0] = true; + + maxDamage = 100.15; + destroyedLevel = 100.15; + + isShielded = true; + rechargeRate = 1.0; + energyPerDamagePoint = 135; + maxEnergy = 400; + minJetEnergy = 15; + jetEnergyDrain = 2.0; + + targetNameTag = 'Centaur'; + targetTypeTag = 'MK III'; + + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + ShieldDamageScale[$DamageType::Bullet] = 0.01; //I deny you shrike n0bs +}; + function StartTrebor(%pos){ %team = 6; %rotation = "1 0 0 0"; diff --git a/scripts/TWM2/Bosses/MajorInsignia.cs b/scripts/TWM2/Bosses/MajorInsignia.cs index 57e8a78..e06f186 100644 --- a/scripts/TWM2/Bosses/MajorInsignia.cs +++ b/scripts/TWM2/Bosses/MajorInsignia.cs @@ -1,5 +1,23 @@ -//Major Insignia -//Gravity Zombie Boss +//DATABLOCKS +datablock StaticShapeData(NoCollideBio) : StaticShapeDamageProfile { + className = "player"; + shapeFile = "bioderm_light.dts"; // dmiscf.dts, alternate + mass = 1; + elasticity = 0.1; + friction = 0.9; + collideable = 0; + isInvincible = true; +}; + +datablock StaticShapeData(NoCollideHum) : StaticShapeDamageProfile { + className = "player"; + shapeFile = "light_male.dts"; // dmiscf.dts, alternate + mass = 1; + elasticity = 0.1; + friction = 0.9; + collideable = 0; + isInvincible = true; +}; //Stops console spammage function NoCollideBio::shouldApplyImpulse(%targetObject) { @@ -9,6 +27,145 @@ function NoCollideHum::shouldApplyImpulse(%targetObject) { return false; } +datablock PlayerData(InsigniaZombieArmor) : LightMaleBiodermArmor { + maxDamage = 700.0; + minImpactSpeed = 50; + speedDamageScale = 0.015; + + damageScale[$DamageType::M1700] = 2.0; + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; + max[SmokeGrenade] = 0; + max[BeaconSmokeGrenade] = 0; + max[Blaster] = 0; + max[Plasma] = 0; + max[PlasmaAmmo] = 0; + max[Disc] = 0; + max[DiscAmmo] = 0; + max[SniperRifle] = 0; + max[GrenadeLauncher] = 0; + max[GrenadeLauncherAmmo] = 0; + max[Mortar] = 0; + max[MortarAmmo] = 0; + max[MissileLauncher] = 0; + max[MissileLauncherAmmo] = 0; + max[Chaingun] = 0; + max[ChaingunAmmo] = 0; + max[RepairGun] = 0; + max[CloakingPack] = 0; + max[SensorJammerPack] = 0; + max[EnergyPack] = 0; + max[RepairPack] = 0; + max[ShieldPack] = 0; + max[AmmoPack] = 0; + max[SatchelCharge] = 0; + max[MortarBarrelPack] = 0; + max[MissileBarrelPack] = 0; + max[AABarrelPack] = 0; + max[PlasmaBarrelPack] = 0; + max[ELFBarrelPack] = 0; + max[artillerybarrelpack] = 0; + max[InventoryDeployable] = 0; + max[MotionSensorDeployable] = 0; + max[PulseSensorDeployable] = 0; + max[TurretOutdoorDeployable] = 0; + max[TurretIndoorDeployable] = 0; + max[FlashGrenade] = 0; + max[ConcussionGrenade] = 0; + max[FlareGrenade] = 0; + max[TargetingLaser] = 0; + max[ELFGun] = 0; + max[ShockLance] = 0; + max[CameraGrenade] = 0; + max[Beacon] = 0; + max[flamerAmmoPack] = 0; + max[ParachutePack] = 0; + max[MedPack] = 0; + //Guns + max[ConstructionTool] = 0; + max[MergeTool] = 0; + max[NerfGun] = 0; + max[NerfBallLauncher] = 0; + max[NerfBallLauncherAmmo] = 0; + max[SuperChaingun] = 0; + max[SuperChaingunAmmo] = 0; + max[RPChaingun] = 0; + max[RPChaingunAmmo] = 0; + max[MGClip] = 0; + max[LSMG] = 0; + max[LSMGAmmo] = 0; + max[LSMGClip] = 0; + max[snipergun] = 0; + max[snipergunAmmo] = 0; + max[Bazooka] = 0; + max[BazookaAmmo] = 0; + max[nukeme] = 0; + max[nukemeAmmo] = 0; + max[MG42] = 0; + max[MG42Ammo] = 0; + max[SPistol] = 0; + max[Pistol] = 0; + max[PistolAmmo] = 0; + max[Pistolclip] = 0; + max[flamer] = 0; + max[flamerAmmo] = 0; + max[AALauncher] = 0; + max[AALauncherAmmo] = 0; + max[melee] = 0; + max[SOmelee] = 0; + max[KriegRifle] = 0; + max[KriegAmmo] = 0; + max[Rifleclip] = 0; + max[Shotgun] = 0; + max[ShotgunAmmo] = 0; + max[ShotgunClip] = 0; + max[RShotgun] = 0; + max[RShotgunAmmo] = 0; + max[RShotgunClip] = 0; + max[LMissileLauncher] = 0; + max[LMissileLauncherAmmo] = 0; + max[HRPChaingun] = 0; + max[RPGAmmo] = 0; + max[RPGItem] = 0; + //Building parts + max[spineDeployable] = 0; + max[mspineDeployable] = 0; + max[wWallDeployable] = 0; + max[floorDeployable] = 0; + max[WallDeployable] = 0; + max[DoorDeployable] = 0; + //Turrets + max[TurretLaserDeployable] = 0; + max[TurretMissileRackDeployable]= 0; + max[DiscTurretDeployable] = 0; + //Largepacks + max[EnergizerDeployable] = 0; + max[TreeDeployable] = 0; + max[CrateDeployable] = 0; + max[DecorationDeployable] = 0; + max[LogoProjectorDeployable] = 0; + max[LightDeployable] = 0; + max[TripwireDeployable] = 0; + max[TelePadPack] = 0; + max[TurretBasePack] = 0; + max[LargeInventoryDeployable] = 0; + max[GeneratorDeployable] = 0; + max[SolarPanelDeployable] = 0; + max[SwitchDeployable] = 0; + max[MediumSensorDeployable] = 0; + max[LargeSensorDeployable] = 0; + max[SpySatelliteDeployable] = 0; + //Misc + max[JumpadDeployable] = 0; + max[EscapePodDeployable] = 0; + max[ForceFieldDeployable] = 0; + max[GravityFieldDeployable] = 0; + max[VehiclePadPack] = 0; +}; + //CREATION function SpawnInsignia(%position) { %Zombie = new player(){ diff --git a/scripts/TWM2/Bosses/ShadeLord.cs b/scripts/TWM2/Bosses/ShadeLord.cs index 33118a3..b0445bb 100644 --- a/scripts/TWM2/Bosses/ShadeLord.cs +++ b/scripts/TWM2/Bosses/ShadeLord.cs @@ -1,4 +1,103 @@ //SHADE LORD +datablock ParticleData(ShadeSwordParticle) { + dragCoeffiecient = 0.0; + gravityCoefficient = -0.2; + inheritedVelFactor = 0.0; + + lifetimeMS = 800; + lifetimeVarianceMS = 500; + + useInvAlpha = false; + spinRandomMin = -160.0; + spinRandomMax = 160.0; + + animateTexture = true; + framesPerSec = 15; + + textureName = "special/cloudflash"; + + colors[0] = "46 46 46 1.0"; + colors[1] = "46 46 46 1.0"; + colors[2] = "46 46 46 1.0"; + + sizes[0] = 2.5; + sizes[1] = 2.7; + sizes[2] = 3.0; + + times[0] = 0.0; + times[1] = 0.7; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(ShadeSwordEmitter) { + ejectionPeriodMS = 10; + periodVarianceMS = 0; + + ejectionVelocity = 1.5; + velocityVariance = 0.3; + + thetaMin = 0.0; + thetaMax = 30.0; + + particles = "ShadeSwordParticle"; +}; + +datablock SeekerProjectileData(ShadeLordSword){ + casingShapeName = "weapon_missile_casement.dts"; + projectileShapeName = "weapon_missile_projectile.dts"; + hasDamageRadius = true; + indirectDamage = 0.8; + damageRadius = 8.0; + radiusDamageType = $DamageType::Missile; + kickBackStrength = 2000; + + explosion = "MissileExplosion"; + splash = MissileSplash; + velInheritFactor = 1.0; // to compensate for slow starting velocity, this value + // is cranked up to full so the missile doesn't start + // out behind the player when the player is moving + // very quickly - bramage + + delayEmitter = MissileFireEmitter; + puffEmitter = MissilePuffEmitter; + bubbleEmitter = GrenadeBubbleEmitter; + bubbleEmitTime = 1.0; + + exhaustEmitter = MissileLauncherExhaustEmitter; + exhaustTimeMs = 300; + exhaustNodeName = "muzzlePoint1"; + + lifetimeMS = 30000; + muzzleVelocity = 10.0; + maxVelocity = 250.0; + turningSpeed = 110.0; + acceleration = 450.0; + + proximityRadius = 3; + + terrainAvoidanceSpeed = 180; + terrainScanAhead = 25; + terrainHeightFail = 12; + terrainAvoidanceRadius = 100; + + flareDistance = 200; + flareAngle = 30; + + sound = MissileProjectileSound; + + hasLight = true; + lightRadius = 5.0; + lightColor = "0.2 0.05 0"; + + useFlechette = true; + flechetteDelayMs = 550; + casingDeb = FlechetteDebris; + + explodeOnWaterImpact = false; + + baseEmitter = ShadeSwordEmitter; +}; + function ShadeLordSword::OnExplode(%data, %proj, %pos, %mod) { %source = %proj.SourceObject; InitContainerRadiusSearch(%pos, 6, $TypeMasks::PlayerObjectType); @@ -35,7 +134,274 @@ function doReturnMissile(%ini, %src) { %p.sourceObject = %src; } +datablock ParticleData(ShadeStormParticle) { + dragCoefficient = 1.0; + gravityCoefficient = 0.00; + windcoefficient = 0.0; + inheritedVelFactor = 0.0; + constantAcceleration = 10.0; + lifetimeMS = 1000; + lifetimeVarianceMS = 100; + useInvAlpha = true; + spinRandomMin = -90.0; + spinRandomMax = 90.0; + textureName = "special/cloudFlash"; + + colors[0] = "46 46 46 0.5"; + colors[1] = "46 46 46 0.5"; + colors[2] = "46 46 46 0.0"; + sizes[0] = 500; + sizes[1] = 500; + sizes[2] = 500; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(ShadeStormEmitter) { + ejectionPeriodMS = 1; + periodVarianceMS = 0; + ejectionVelocity = 400.0; + velocityVariance = 150.0; + ejectionOffset = 0.0; + thetaMin = 85; + thetaMax = 85; + phiReferenceVel = 0; + phiVariance = 360; + overrideAdvances = false; + particles = "ShadeStormParticle"; +}; + +datablock ParticleData(dayCloakSmokeParticles) { + dragCoefficient = 50;/////////----------------------- + gravityCoefficient = 0.0; + inheritedVelFactor = 1.0; + constantAcceleration = 1.0; + lifetimeMS = 1000; + lifetimeVarianceMS = 0; + useInvAlpha = true; + spinRandomMin = -360.0; + spinRandomMax = 360.0; + textureName = "particleTest"; + colors[0] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[1] = "0.1 0.1 0.1 1.0";// //////////////////// + colors[2] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + colors[3] = "0.1 0.1 0.1 1.0";// \\\\\\\\\\\\\\\\\\\\ + sizes[0] = 350.0; + sizes[1] = 350.0; + sizes[2] = 350.0; + sizes[3] = 350.0; + times[0] = 0.0; + times[1] = 0.33; + times[2] = 0.66; + times[3] = 1.0; + mass = 0.4; + elasticity = 0.2; + friction = 1; + computeCRC = true; + haslight = true; + lightType = "PulsingLight"; + lightColor = "0.2 0.0 0.5 1.0"; + lightTime = "200"; + lightRadius = "2.0"; +}; + +datablock ParticleEmitterData(dayCloakEmitter) { + ejectionPeriodMS = 50; + periodVarianceMS = 0; + ejectionVelocity = 10.0; + velocityVariance = 0.0; + ejectionOffset = 2; + thetaMin = 0; + thetaMax = 180; + overrideAdvances = false; + particles = "dayCloakSmokeParticles"; +}; + // +datablock ParticleData(ShadeLordScreamParticle) { + dragCoefficient = 1.0; + gravityCoefficient = 0.00; + windcoefficient = 0.0; + inheritedVelFactor = 0.0; + constantAcceleration = 10.0; + lifetimeMS = 1000; + lifetimeVarianceMS = 100; + useInvAlpha = true; + spinRandomMin = -90.0; + spinRandomMax = 90.0; + textureName = "special/cloudFlash"; + + colors[0] = "156 0 0 0.5"; + colors[1] = "156 0 0 0.5"; + colors[2] = "156 0 0 0.0"; + sizes[0] = 500; + sizes[1] = 500; + sizes[2] = 2; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(ShadeLordScreamEmitter) { + ejectionPeriodMS = 1; + periodVarianceMS = 0; + ejectionVelocity = 400.0; + velocityVariance = 150.0; + ejectionOffset = 0.0; + thetaMin = 85; + thetaMax = 85; + phiReferenceVel = 0; + phiVariance = 360; + overrideAdvances = false; + particles = "ShadeLordScreamParticle"; +}; +// + +datablock PlayerData(ShadeLordArmor) : LightMaleHumanArmor { + boundingBox = "1.63 1.63 2.6"; + maxDamage = 900.0; + minImpactSpeed = 35; + shapeFile = "bioderm_heavy.dts"; + + debrisShapeName = "bio_player_debris.dts"; + + //Foot Prints + decalData = HeavyBiodermFootprint; + decalOffset = 0.4; + + waterBreathSound = WaterBreathBiodermSound; + + damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs + damageScale[$DamageType::Fire] = 3.0; + damageScale[$DamageType::Plasma] = 3.0; + damageScale[$DamageType::Burn] = 2.0; + + max[RepairKit] = 0; + max[Mine] = 0; + max[Grenade] = 0; + max[SmokeGrenade] = 0; + max[BeaconSmokeGrenade] = 0; + max[Blaster] = 0; + max[Plasma] = 0; + max[PlasmaAmmo] = 0; + max[Disc] = 0; + max[DiscAmmo] = 0; + max[SniperRifle] = 0; + max[GrenadeLauncher] = 0; + max[GrenadeLauncherAmmo] = 0; + max[Mortar] = 0; + max[MortarAmmo] = 0; + max[MissileLauncher] = 0; + max[MissileLauncherAmmo] = 0; + max[Chaingun] = 0; + max[ChaingunAmmo] = 0; + max[RepairGun] = 0; + max[CloakingPack] = 0; + max[SensorJammerPack] = 0; + max[EnergyPack] = 0; + max[RepairPack] = 0; + max[ShieldPack] = 0; + max[AmmoPack] = 0; + max[SatchelCharge] = 0; + max[MortarBarrelPack] = 0; + max[MissileBarrelPack] = 0; + max[AABarrelPack] = 0; + max[PlasmaBarrelPack] = 0; + max[ELFBarrelPack] = 0; + max[artillerybarrelpack] = 0; + max[MedPack] = 0; + max[InventoryDeployable] = 0; + max[MotionSensorDeployable] = 0; + max[PulseSensorDeployable] = 0; + max[TurretOutdoorDeployable] = 0; + max[TurretIndoorDeployable] = 0; + max[FlashGrenade] = 0; + max[ConcussionGrenade] = 0; + max[FlareGrenade] = 0; + max[TargetingLaser] = 0; + max[ELFGun] = 0; + max[ShockLance] = 0; + max[CameraGrenade] = 0; + max[Beacon] = 0; + max[flamerAmmoPack] = 0; + max[ParachutePack] = 0; + max[ConstructionTool] = 0; + max[MergeTool] = 0; + max[NerfGun] = 0; + max[NerfBallLauncher] = 0; + max[NerfBallLauncherAmmo] = 0; + max[SuperChaingun] = 0; + max[SuperChaingunAmmo] = 0; + max[RPChaingun] = 0; + max[RPChaingunAmmo] = 0; + max[MGClip] = 0; + max[LSMG] = 0; + max[LSMGAmmo] = 0; + max[LSMGClip] = 0; + max[snipergun] = 0; + max[snipergunAmmo] = 0; + max[Bazooka] = 0; + max[BazookaAmmo] = 0; + max[BunkerBuster] = 0; + max[MG42] = 0; + max[MG42Ammo] = 0; + max[SPistol] = 0; + max[Pistol] = 0; + max[PistolAmmo] = 0; + max[Pistolclip] = 0; + max[flamer] = 0; + max[flamerAmmo] = 0; + max[AALauncher] = 0; + max[AALauncherAmmo] = 0; + max[melee] = 0; + max[SOmelee] = 0; + max[KriegRifle] = 0; + max[KriegAmmo] = 0; + max[Rifleclip] = 0; + max[Shotgun] = 0; + max[ShotgunAmmo] = 0; + max[ShotgunClip] = 0; + max[RShotgun] = 0; + max[RShotgunAmmo] = 0; + max[RShotgunClip] = 0; + max[LMissileLauncher] = 0; + max[LMissileLauncherAmmo] = 0; + max[HRPChaingun] = 0; + max[RPGAmmo] = 0; + max[RPGItem] = 0; + max[spineDeployable] = 0; + max[mspineDeployable] = 0; + max[wWallDeployable] = 0; + max[floorDeployable] = 0; + max[WallDeployable] = 0; + max[DoorDeployable] = 0; + max[TurretLaserDeployable] = 0; + max[TurretMissileRackDeployable]= 0; + max[DiscTurretDeployable] = 0; + max[EnergizerDeployable] = 0; + max[TreeDeployable] = 0; + max[CrateDeployable] = 0; + max[DecorationDeployable] = 0; + max[LogoProjectorDeployable] = 0; + max[LightDeployable] = 0; + max[TripwireDeployable] = 0; + max[TelePadPack] = 0; + max[TurretBasePack] = 0; + max[LargeInventoryDeployable] = 0; + max[GeneratorDeployable] = 0; + max[SolarPanelDeployable] = 0; + max[SwitchDeployable] = 0; + max[MediumSensorDeployable] = 0; + max[LargeSensorDeployable] = 0; + max[SpySatelliteDeployable] = 0; + max[JumpadDeployable] = 0; + max[EscapePodDeployable] = 0; + max[ForceFieldDeployable] = 0; + max[GravityFieldDeployable] = 0; + max[VehiclePadPack] = 0; +}; + function SpawnShadeLord(%position) { %Boss = new player(){ Datablock = "ShadeLordArmor"; diff --git a/scripts/TWM2/Bosses/Stormrider.cs b/scripts/TWM2/Bosses/Stormrider.cs index 17bec57..ba636fb 100644 --- a/scripts/TWM2/Bosses/Stormrider.cs +++ b/scripts/TWM2/Bosses/Stormrider.cs @@ -1,42 +1,31 @@ -//Stormrider.cs -//Ported From TWM1 -//Code Updated By Phantom139 -// * 2-18-14: Did some housecleaning, harvested some unneeded functions here. - function UltrDroneBattle(%pos, %radius, %number, %teamlow, %teamhigh, %maxskill, %slth){ for(%i = 0; %i < %number; %i++){ - %startpos = vectorAdd(%pos,(getRandom(0, %radius) - (%radius / 2))@" "@(getRandom(0, %radius) - (%radius / 2))@" 0"); - %rotation = "0 0 1 "@getRandom(1,360); - if(%teamlow != %teamhigh) { - %team = getRandom(%teamlow, %teamhigh); - } - else { - %team = %teamlow; - } - StartUltrDrone(%startpos,%rotation,%team,getRandom(1,%maxskill), %slth); + %startpos = vectorAdd(%pos,(getRandom(0, %radius) - (%radius / 2))@" "@(getRandom(0, %radius) - (%radius / 2))@" 0"); + %rotation = "0 0 1 "@getRandom(1,360); + if(%teamlow != %teamhigh) + %team = getRandom(%teamlow,%teamhigh); + else + %team = %teamlow; + StartUltrDrone(%startpos,%rotation,%team,getRandom(1,%maxskill), %slth); } } //This sets up the drone and the functions needed to start the drone. -function StartUltrDrone(%pos, %rotation, %team, %skill, %slth) { - if(%team $= "") { - %team = 0; +function StartUltrDrone(%pos, %rotation, %team, %skill, %slth){ + if(%team $= "") + %team = 0; + if(%pos $= "") + %pos = "0 0 300"; + if(%rotation $= "") + %rotation = "1 0 0 0"; + if(%skill !$= "ace"){ + if(%skill $= "" || %skill < 1) + %skill = 10; + else if(%skill > 10) + %skill = 10; } - if(%pos $= "") { - %pos = "0 0 300"; - } - if(%rotation $= "") { - %rotation = "1 0 0 0"; - } - if(%skill !$= "ace") { - if(%skill $= "" || %skill < 1) { - %skill = 10; - } - else if(%skill > 10) { - %skill = 10; - } - } - %Drone = new FlyingVehicle() { + %Drone = new FlyingVehicle() + { dataBlock = StormSeigeDrone; position = %pos; rotation = %rotation; @@ -50,12 +39,12 @@ function StartUltrDrone(%pos, %rotation, %team, %skill, %slth) { %drone.dodgeGround = 0; if(%slth) { - %Drone.setCloaked(true); + %Drone.setCloaked(true); } if(%skill $= "ace"){ - %skill = 10; - %drone.isace = 1; + %skill = 10; + %drone.isace = 1; } %drone.skill = 0.2 + (%skill / 12.5); @@ -85,229 +74,241 @@ function StartStormrider(%position) { function UltraBossAbilities(%drone) { if(!isObject(%drone)) { - return; + return; } %drone.setCloaked(false); //disable cloak? %rand = getRandom(1,13); - +// %target = DroneFindNearestPilot(500,%drone); //this line for targeted abilities switch(%rand) { - - //1: Double Missile Strike: Targets Single Player with Two Missiles case 1: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - %SPos1 = vectorAdd(%drone.getPosition(),"3 0 0"); - %SPos2 = vectorAdd(%drone.getPosition(),"-3 0 0"); - %p1 = new SeekerProjectile() { - dataBlock = LordRogStiloutte; - initialDirection = "0 0 10"; - initialPosition = %SPos1; - sourceObject = %drone; - sourceSlot = 6; - }; - %p2 = new SeekerProjectile() { - dataBlock = LordRogStiloutte; - initialDirection = "0 0 10"; - initialPosition = %SPos1; - sourceObject = %drone; - sourceSlot = 6; - }; - MissionCleanup.add(%p1); - MissionCleanup.add(%p2); - schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p1); - schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p2); - MessageAll('MessageAll', "\c4Stormrider: Fire!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": No targets for me!"); - } - - //2: Quad Strike: Fire Four Missiles out in a + pattern which then aquire a single target. + %SPos1 = vectorAdd(%drone.getPosition(),"3 0 0"); + %SPos2 = vectorAdd(%drone.getPosition(),"-3 0 0"); + %p1 = new SeekerProjectile() + { + dataBlock = LordRogStiloutte; + initialDirection = "0 0 10"; + initialPosition = %SPos1; + sourceObject = %drone; + sourceSlot = 6; + }; + %p2 = new SeekerProjectile() + { + dataBlock = LordRogStiloutte; + initialDirection = "0 0 10"; + initialPosition = %SPos2; + sourceObject = %drone; + sourceSlot = 6; + }; + MissionCleanup.add(%p1); + MissionCleanup.add(%p2); + schedule(1000,0,"MissileDrop",%p1, %target.player); + schedule(1000,0,"MissileDrop",%p2, %target.player); + MessageAll('MessageAll', "\c4Stormrider: Fire!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, no targets for me!"); + } case 2: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - %SPos = vectorAdd(%drone.getPosition(),"0 0 3"); - %dirs = "5 0 0\t-5 0 0\t0 5 0\t0 -5 0"; - for(%i = 0; %i < getFieldCount(%dirs); %i++) { - %newMissile = new SeekerProjectile() { - dataBlock = ShoulderMissile; - initialDirection = getField(%dirs, %i); - initialPosition = %SPos; - sourceObject = %drone; - sourceSlot = 6; - }; - MissionCleanup.add(%newMissile); - schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %newMissile); - } - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Have fun with these "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Bah, no targets, no fun."); - } - - //3: IR Beam: A single enemy target gets locked on with a heat beam making missiles 100% accurate for a time period + %SPos = vectorAdd(%drone.getPosition(),"0 0 3"); + %p1 = new SeekerProjectile() + { + dataBlock = ShoulderMissile; + initialDirection = "5 0 0"; + initialPosition = %SPos; + sourceObject = %drone; + sourceSlot = 6; + }; + %p2 = new SeekerProjectile() + { + dataBlock = ShoulderMissile; + initialDirection = "-5 0 0"; + initialPosition = %SPos; + sourceObject = %drone; + sourceSlot = 6; + }; + %p3 = new SeekerProjectile() + { + dataBlock = ShoulderMissile; + initialDirection = "0 5 0"; + initialPosition = %SPos; + sourceObject = %drone; + sourceSlot = 6; + }; + %p4 = new SeekerProjectile() + { + dataBlock = ShoulderMissile; + initialDirection = "0 -5 0"; + initialPosition = %SPos; + sourceObject = %drone; + sourceSlot = 6; + }; + MissionCleanup.add(%p1); + MissionCleanup.add(%p2); + MissionCleanup.add(%p3); + MissionCleanup.add(%p4); + schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p1); + schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p2); + schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p3); + schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p4); + + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Have fun with these "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Bah, no targets, no fun."); + } case 3: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - HeatLoop(%target.player, 0); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Lets see what happens when missiles are completely precice on you, "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I guess it's time to start scanning."); - } - - //4: Auxilary Pod Swarm: Unleash a swarm of hybrid strike missiles on a single enemy target + HeatLoop(%target.player, 0); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Lets see what happens when missiles are completely precice on you, "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I guess it's time to start scanning."); + } case 4: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - FireanotherSidewinder(%drone, %target.player, 3); - schedule(700, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(1400, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(2100, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(2800, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(3500, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(4200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(4900, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - //Rapid Shot Missiles - schedule(5000, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(5200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(5400, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(5600, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(5800, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(6000, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(6200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(6400, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(6500, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Taste my fury "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Aww, My missiles were ready."); - } - - //5: Focused Missile Fire: Similar to APS, but more accurate with less shots near the end + FireanotherSidewinder(%drone, %target.player, 3); + schedule(700,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(1400,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(2100,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(2800,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(3500,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(4200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(4900,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + //Rapid Shot Missiles + schedule(5000,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(5200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(5400,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(5600,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(5800,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(6000,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(6200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(6400,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(6500,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Taste my fury "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Aww, My missiles were ready."); + } case 5: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - FireanotherSidewinder(%drone, %target.player, 3); - schedule(700, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(1400, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(2100, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(2800, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(3500, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(4200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(4900, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(5600, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(6300, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - schedule(7000, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); - // Quick Shots - schedule(8000, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(8100, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(8200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - schedule(8300, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I have missiles with your name on them "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Aww, My missile strike was ready."); - } - - //6: Clear Skies: Launch a wave on anti-missile flares blocking all missiles from striking Stormrider for a short time. + FireanotherSidewinder(%drone, %target.player, 3); + schedule(700,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(1400,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(2100,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(2800,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(3500,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(4200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(4900,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(5600,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(6300,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + schedule(7000,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 3); + // Quick Shots + schedule(8000,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(8100,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(8200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + schedule(8300,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I have missiles with your name on them "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Aww, My missile strike was ready."); + } case 6: - schedule(700, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(1400, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(2100, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(2800, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(3500, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(4200, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(4900, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(5600, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(6300, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(7000, 0, "WindshearAttack_FUNC", "Flare", %drone); - // Quick Shots - schedule(8000, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(8100, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(8200, 0, "WindshearAttack_FUNC", "Flare", %drone); - schedule(8300, 0, "WindshearAttack_FUNC", "Flare", %drone); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Hahaha, Your Missiles are worthless Now!"); - - //7: Anti-Ground Chaingun: Fire a rapid strike anti-matter chaingun which does heavy damage to hit targets + schedule(700,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(1400,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(2100,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(2800,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(3500,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(4200,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(4900,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(5600,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(6300,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(7000,0,"WindshearAttack_FUNC", "Flare", %drone); + // Quick Shots + schedule(8000,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(8100,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(8200,0,"WindshearAttack_FUNC", "Flare", %drone); + schedule(8300,0,"WindshearAttack_FUNC", "Flare", %drone); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Hahaha, Your Missiles are worthless Now!"); case 7: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - FireSniperShots(%drone, %target.player, 3); - for(%i = 0; %i < 700; %i++) { - %time = %i * 10; - schedule(%time, 0,"FireSniperShots",%drone, %target.player); - } - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Time to Use My CG, "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": We'll see who can withstand the CG... Oh wait, there's nobody there."); - } - - //8: Photon Seekers: Launch a wave of Photon Seekers to strike a single target + FireSniperShots(%drone, %target.player, 3); + for(%i = 0; %i < 700; %i++) { + %time = %i * 10; + schedule(%time, 0,"FireSniperShots",%drone, %target.player); + } + // Quick Shots + schedule(8000,0,"FireSniperShots",%drone, %target.player); + schedule(8100,0,"FireSniperShots",%drone, %target.player); + schedule(8200,0,"FireSniperShots",%drone, %target.player); + schedule(8300,0,"FireSniperShots",%drone, %target.player); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Time to Use My CG, "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, you fewls cant withstand this."); + } case 8: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - FireSeekerPhotons(%drone, %target.player); - schedule(1500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(3000, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(4500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(6000, 0, "FireSeekerPhotons", %drone, %target.player); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Here, "@getTaggedString(%target.name)@", Catch!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Close up the Seekers. No Targets To hit."); - } - - //9: Advanced Photon Wave: Launch an additional Photon Missile compared to #8 + FireSeekerPhotons(%drone,%target.player); + schedule(1500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(3000,0,"FireSeekerPhotons",%drone,%target.player); + schedule(4500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(6000,0,"FireSeekerPhotons",%drone,%target.player); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Here, "@getTaggedString(%target.name)@", Catch!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Close up the Seekers. No Targets To hit."); + } case 9: %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - FireSeekerPhotons(%drone,%target.player); - schedule(700, 0, "FireSeekerPhotons",%drone,%target.player); - schedule(1400, 0, "FireSeekerPhotons",%drone,%target.player); - schedule(2100, 0, "FireSeekerPhotons",%drone,%target.player); - schedule(2800, 0, "FireSeekerPhotons",%drone,%target.player); - schedule(3500, 0, "FireSeekerPhotons",%drone,%target.player); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Try these out for size, "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, No enemies in the area."); - } - - //10: Photon Storm: Launch Photon Missiles to the point of overheating the internal system. + FireSeekerPhotons(%drone,%target.player); + schedule(700,0,"FireSeekerPhotons",%drone,%target.player); + schedule(1400,0,"FireSeekerPhotons",%drone,%target.player); + schedule(2100,0,"FireSeekerPhotons",%drone,%target.player); + schedule(2800,0,"FireSeekerPhotons",%drone,%target.player); + schedule(3500,0,"FireSeekerPhotons",%drone,%target.player); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Try these out for size, "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, No enemies in the area."); + } case 10: - %target = DroneFindNearestPilot(2000, %drone); + %target = DroneFindNearestPilot(2000,%drone); if(%target.player) { - FireSeekerPhotons(%drone, %target.player); - schedule(500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(1000, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(1500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(2000, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(2500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(3000, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(3500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(4000, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(4500, 0, "FireSeekerPhotons", %drone, %target.player); - schedule(5000, 0, "FireSeekerPhotons", %drone, %target.player); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I have some fun plasma missiles for you, "@getTaggedString(%target.name)@"!"); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Meh, No targets for my plasma seekers."); - } - - //11: Tactical Camo: Engage an invisibility module to blend in with the sky. + FireSeekerPhotons(%drone,%target.player); + schedule(500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(1000,0,"FireSeekerPhotons",%drone,%target.player); + schedule(1500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(2000,0,"FireSeekerPhotons",%drone,%target.player); + schedule(2500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(3000,0,"FireSeekerPhotons",%drone,%target.player); + schedule(3500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(4000,0,"FireSeekerPhotons",%drone,%target.player); + schedule(4500,0,"FireSeekerPhotons",%drone,%target.player); + schedule(5000,0,"FireSeekerPhotons",%drone,%target.player); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I have some fun plasma missiles for you, "@getTaggedString(%target.name)@"!"); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Meh, No targets for my plasma seekers."); + } case 11: - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Engage Stealth!"); - %drone.setCloaked(true); - - //11: Wingmen: Call in 4 Harbinger Aerial Drones to engage air and ground targets. + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Engage Stealth!"); + %drone.setCloaked(true); case 12: - MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": My Buddies will handle You!"); - %SPos1 = vectorAdd(%drone.getPosition(), "15 0 0"); - %SPos2 = vectorAdd(%drone.getPosition(), "-15 0 0"); - %SPos3 = vectorAdd(%drone.getPosition(), "0 15 0"); - %SPos4 = vectorAdd(%drone.getPosition(), "0 -15 0"); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": My Buddies will handle You!"); + %SPos1 = vectorAdd(%drone.getPosition(),"15 0 0"); + %SPos2 = vectorAdd(%drone.getPosition(),"-15 0 0"); + %SPos3 = vectorAdd(%drone.getPosition(),"0 15 0"); + %SPos4 = vectorAdd(%drone.getPosition(),"0 -15 0"); %d2 = DroneBattle(%SPos1, 500, 1, 6, 6, 100, 0); //his Pal %d3 = DroneBattle(%SPos2, 500, 1, 6, 6, 100, 0); //his Other Pal %d4 = DroneBattle(%SPos3, 500, 1, 6, 6, 100, 0); //his Pal's Pal @@ -316,8 +317,6 @@ function UltraBossAbilities(%drone) { %d3.isUltrally = 1; %d4.isUltrally = 1; %d5.isUltrally = 1; - - //DE: Reinforcements: Call in support from Harbinger Drones default: %SPos1 = vectorAdd(%drone.getPosition(),"15 0 0"); %SPos2 = vectorAdd(%drone.getPosition(),"15 0 0"); @@ -355,21 +354,189 @@ sourceSlot = 6; } function FireSeekerPhotons(%drone,%target){ - if(!isObject(%drone) || !isObject(%target) || %target.getState() $= "dead") { - return; - } - - %proj = createSeekingProjectile(PhotonMissileProj, linearflareprojectile, vectorAdd(%drone.getPosition(), "0 0 5") - , "0 0 3", %drone, %target, 100); - - MissionCleanup.add(%proj); - %proj.PhotonMuzVec = %drone.getMuzzleVector(5); - schedule( 100,0, "PhotonShockwaveFunc" ,%drone,%Proj); +if(!isObject(%drone) || !isObject(%target) || %target.getState() $= "dead") { +return; } +%proj = new (linearflareprojectile)() { +dataBlock = PhotonMissileProj; +initialDirection = "0 0 3"; +initialPosition = vectorAdd(%drone.getPosition(), "0 0 5"); +sourceObject = %drone; +sourceSlot = 0; +}; + +MissionCleanup.add(%proj); +%proj.PhotonMuzVec = %drone.getMuzzleVector(5); +schedule( 100,0, "seekingprojs" , %drone, %Proj, %target); +schedule( 100,0, "PhotonShockwaveFunc" ,%drone,%Proj); +} + +//Seeker Plasma Stuff +//Credit To Abrikcham +//-abirikcham@yahoo.com +datablock ShockwaveData(FakePhotonMissileShockwave)//this is the shockwave trail effect +{ +width = 0.5; +numSegments = 30; +numVertSegments = 2; +velocity = 8; +verticalcurve = 0; +acceleration = -17.0; +lifetimeMS = 600; +height = 0.00001; +is2D = false; +texture[0] = "special/shockwave4"; +texture[1] = "special/gradient"; +texWrap = 10.0; +mapToTerrain = false; +orientToNormal = true; +renderBottom = true; +times[0] = 0.0; +times[1] = 0.5; +times[2] = 1.0; +colors[0] = "0 1 0 1"; +colors[1] = "0.0 1.1 0.0 0.60";//0.4 0.1 1.0 +colors[2] = "0.0 1.1 0.0 0.0"; +}; + +datablock AudioProfile(FakePhotonMissileShockwaveSound)//sound thing for shockwave +{ + filename = "fx/misc/gridjump.wav"; + description = AudioExplosion3d; + preload = true; +}; + +datablock ExplosionData(FakePhotonShockwaveExp)//dont touch thx +{ + soundProfile = FakePhotonMissileShockwaveSound; + faceViewer = false; + shockwave = FakePhotonMissileShockwave; + + shakeCamera = true; + camShakeFreq = "10.0 6.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 0.5; + camShakeRadius = 3.0; +}; + +datablock LinearProjectileData(FakePhotonShockwaveProj)//dont touch thx +{ + projectileShapeName = "turret_muzzlepoint.dts"; + scale = "0.1 0.1 0.1"; + faceViewer = true; + directDamage = 0; + hasDamageRadius = false; + indirectDamage = 0.1; + damageRadius = 10; + kickBackStrength = 1; + radiusDamageType = $DamageType::Photon; + explosion = "FakePhotonShockwaveExp"; + dryVelocity = 0.0001; + wetVelocity = 0.00001; + velInheritFactor = 0.0; + lifetimeMS = 0.00000001; + explodeOnDeath = true; + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = true; + deflectionOnWaterImpact = 0.0; +}; + +datablock ParticleData(PhotonMissileExpPart)//explosion particle stuff ... mitzi +{ + dragCoefficient = 2; + gravityCoefficient = 0.0; + inheritedVelFactor = 0.2; + constantAcceleration = 0.0; + lifetimeMS = 750; + lifetimeVarianceMS = 150; + textureName = "particleTest"; + colors[0] = "0 1 0 1.0"; + colors[1] = "0 1 0 0.0"; + sizes[0] = 3; + sizes[1] = 2; +}; + +datablock ParticleEmitterData(PhotonMissileExpEmit)//explosion particle stuff ... mitzi +{ + ejectionPeriodMS = 7; + periodVarianceMS = 0; + ejectionVelocity = 3; + velocityVariance = 1.0; + ejectionOffset = 0.0; + thetaMin = 0; + thetaMax = 60; + phiReferenceVel = 0; + phiVariance = 360; + overrideAdvances = false; + particles = "PhotonMissileExpPart"; +}; + +datablock ExplosionData(PhotonMissileExplosion)//main proj exp +{ + explosionShape = "disc_explosion.dts"; + soundProfile = UnderwaterGrenadeExplosionSound;//plasmaexpsound orig + + shakeCamera = true; + camShakeFreq = "8.0 9.0 7.0"; + camShakeAmp = "25.0 25.0 25.0"; + camShakeDuration = 1.3; + camShakeRadius = 25.0; + + particleEmitter = PhotonMissileExpEmit; + particleDensity = 150; + particleRadius = 3.5; + faceViewer = true; +}; + //********************************** //* Projectiles * //********************************** +datablock LinearFlareProjectileData(PhotonMissileProj) +{ + scale = "4 4 4";//6 + sound = PlasmaProjectileSound; + + faceViewer = true; + directDamage = 0.0; + hasDamageRadius = true; + indirectDamage = 1.0; + damageRadius = 10.0; + kickBackStrength = 4000; + radiusDamageType = $DamageType::Photon; //obviously change this + + explosion = "PhotonMissileExplosion"; + underwaterExplosion = "PhotonMissileExplosion"; + splash = BlasterSplash; + + dryVelocity = 200.0; + wetVelocity = 200.0; + velInheritFactor = 0.6; + fizzleTimeMS = 8000; + lifetimeMS = 8000; + explodeOnDeath = true; + + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = false; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = 15000; + + activateDelayMS = 0; + numFlares = 35; + flareColor = "0.0 1.1 0"; + flareModTexture = "flaremod"; + flareBaseTexture = "flarebase"; + + size[0] = 1; + size[1] = 10; + size[2] = 2; + + + hasLight = true; + lightRadius = 1.0; + lightColor = "0.6 1.1 0"; +}; + function PhotonMissileProj::onExplode(%data, %proj, %pos, %mod)// ok this is where everything is canceled... the scheds.. this is the buggy part { parent::onexplode(%data, %proj, %pos, %mod); @@ -377,3 +544,127 @@ cancel(%proj.seeksched); cancel(%proj.PhotonShockwaveSched); cancel(%proj.seekschedcheck); } + +function seekingprojcheck(%obj,%proj, %type) { + %searchmask = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType; + + if(%type $= "") { + InitContainerRadiusSearch(%proj.position, 100, %searchmask); + } + else { + InitContainerRadiusSearch(%proj.position, 9999, %searchmask); //For Stormrider + } + while ((%target = containerSearchNext())) + { + if(%target != %obj) + { + if(%target.team == %obj.team && !$TWM::TeamWars) + { + %proj.seekschedcheck = schedule( 50,0, "seekingprojcheck" ,%obj,%Proj,%type); + return; + } + %reptarg = %target; + seekingprojs(%obj,%proj,%reptarg); + return; + } + } +%proj.seekschedcheck = schedule( 50,0, "seekingprojcheck" ,%obj,%Proj,%type); +} + + +function seekingprojs(%obj,%Proj,%reptarg) +{ +%projpos = %proj.position; + +%projdir = %proj.initialdirection; + +%type = %reptarg.getClassName(); + +if(!isobject(%proj)) +{ +return; +} + + if(isobject(%proj)) + { + %proj.delete(); + } + + if(!isobject(%obj)) + { + return; + } + + if(!isobject(%reptarg)) + { + return; + } + + if(%type $= "Player") { + if(%reptarg.getState() $= "Dead") + { + return; + } + } + +//( ... )the projs now have a max turn angle like real missile ub3r l33t;;;; nm wtf afasdf +%test = getWord(%projdir, 0); +%test2 = getWord(%projdir, 1); +%test3 = getWord(%projdir, 2); + +%projdir = vectornormalize(vectorsub(%reptarg.position,%projpos)); +%testa = getWord(%projdir, 0); +%testa2 = getWord(%projdir, 1); +%testa3 = getWord(%projdir, 2); + +// now it's time for my mad math skills..... i used microsoft calculator to figure this one out =0... was a brainbuster for me to think of how this would work +%testthing = %test - %testa; //oh u can rename all this test stuff but make sure u get it right =/ dont break plz +%testfin = %testthing / 8; //!!!!!!!!!! OK HERE!!!! is where the max angle thing is... increase for lower turn angle and reduce for a higher turn angle +%testfinal = %testfin * -1; //^^^^^ *side note for the one above this* dont div by zero unless yer dumb (...) div by i think 1 if you want it to seek with a 360 max turn angle angle... kinda gay though if u do that +%testfinale = %testfinal + %test; + +%testthing2 = %test2 - %testa2; +%testfin2 = %testthing2 / 10; //change here too .. this is for the y axis btw it's best if u leave my setting of 10 on ... it's the most balanced well nm change it to what u want but you really should leave it around this number like 9ish +%testfinal2 = %testfin2 * -1; +%testfinale2 = %testfinal2 + %test2; + +%testthing3 = %test3 - %testa3; +%testfin3 = %testthing3 / 10; //z- axis this one is for i think.. mmm idea... you try playing with dif max angles for xyz for maybe like a sidewinder effect =? +%testfinal3 = %testfin3 * -1; +%testfinale3 = %testfinal3 + %test3; + +%haxordir = %testfinale SPC %testfinale2 SPC %testfinale3; //final dir.. ..... + +%proj = new (linearflareprojectile)() { +dataBlock = PhotonMissileProj; +initialDirection = %haxordir; +initialPosition = %projpos; +sourceslot = %obj; +}; +%proj.sourceobject = %obj; +MissionCleanup.add(%proj); + +%fake = new (linearprojectile)() { +dataBlock = "FakePhotonShockwaveProj"; +initialDirection = %haxordir; +initialPosition = %projpos; +sourceSlot = %obj; +}; +%fake.sourceobject = %obj; +MissionCleanup.add(%fake); + +%searchmask = $TypeMasks::ProjectileObjectType; + +InitContainerRadiusSearch(%projpos, 12, %searchmask); +while ((%target = containerSearchNext())) +{ + if(%target.getdatablock().getname() $= "FlareGrenadeProj") //btw u can add other projs that will cancel out seeking linear flare + { + %target.delete(); + return; + } +} + +%proj.seeksched = schedule( 80,0, "seekingprojs" ,%obj,%Proj,%reptarg); +} + diff --git a/scripts/TWM2/ExteriorFunctioning/PconFunctions.cs b/scripts/TWM2/ExteriorFunctioning/PconFunctions.cs index 459d69e..d9b3670 100644 --- a/scripts/TWM2/ExteriorFunctioning/PconFunctions.cs +++ b/scripts/TWM2/ExteriorFunctioning/PconFunctions.cs @@ -25,6 +25,100 @@ function ServerReturnDate() { // echo(%IntVal); return %IntVal; } + +function DownloadBanList() { + if($Host::UseGlobalBanList) { + $Phantom::BanCount = 0; + %server = "www.phantomdev.net:80"; + if (!isObject(BanGet)) + %Downloader = new HTTPObject(BanGet){}; + else %Downloader = BanGet; + %filename = "/Tribes2/Bans.txt"; + %Downloader.get(%server, %filename); + Error("SERVER: Downloading Global Ban List From PGD.com"); + } + else { + Error("$Host::UseGlobalBanList is 0, G-Ban List Off"); + } +} + +function BanGet::onLine(%this, %line) { + AddToGlobalBanList(%line); +} + +function AddToGlobalBanList(%line) { + %line = detag( %line ); + %text = (%text $= "") ? %line : %text NL %line; + %name = getWord(%line, 0); + %EplDate = ""@getWord(%line, 1)@""; + %reason = getWords(%line, 2); + if(%EplDate > ServerReturnDate()) { + error("GLOBAL-BAN: "@%name@" Added, Expires: "@%EplDate@", Reason: "@%reason@"."); + $Phantom::GlobalBanList[$Phantom::BanCount] = ""@%name@" "@%EplDate@" "@%reason@""; + $Phantom::BanCount++; + } + else { + error("GLOBAL-BAN: "@%name@", This ban has Expired, Not added to list."); + } +} + +function BanGet::onConnectFailed() { + echo("-- Could not connect to PGD."); + echo("Please Call DownloadBanList(); To Protect your server"); +} + +function BanGet::onDisconnect(%this) { + %this.delete(); +} + +function CheckBans(%client) { + for(%i= 0; %i < $Phantom::BanCount; %i++) { + %nametotest = getWord($Phantom::GlobalBanList[%i], 0); + %target = plnametocid(%nametotest); + if(%target != 0) { + %EplDate = getWord($Phantom::GlobalBanList[%i], 1); + if(%EplDate > ServerReturnDate()) { + %reason = getWords($Phantom::GlobalBanList[%i], 2); + banthesucker(%target, %reason, %EplDate); + } + else { + echo(""@getTaggedString(%client.name)@" is on the ban list, but the duration has expired"); + } + } + else { + //Do Nothing + } + } +} + + function banthesucker(%client, %reason, %lengString) { + if($Host::UseGlobalBanList) { + echo("Global-Banned Client "@%client.namebase@" Attempting to Connect"); + MessageAll('Message', "\c2"@%client.namebase@" is Banned Until "@%lengString@" - "@%reason@"."); + if(%lengString > 90000000) { + ban(%client); + %client.setDisconnectReason( "You are Perm. Banned From This Server, "@%reason@"" ); + $HostGamePlayerCount = ClientGroup.getCount(); + return; + } + ban(%client); + %client.setDisconnectReason( "You are G-Banned Until "@%lengString@", "@%reason@"" ); + $HostGamePlayerCount = ClientGroup.getCount(); + } + else { + echo("Global-Banned Client "@%client.namebase@" Permitted connect - $Host::UseGlobalBanList is 0"); + MessageAll('Message', "\c2Global Banned Client: "@%client.namebase@" Permitted Access, $Host::UseGlobalBanList is 0."); + } + } + +DownloadBanList(); //download the list +package ServerRunFunctioning { + function GameConnection::onConnect(%client, %name, %raceGender, %skin, %voice, %voicePitch) { + parent::onConnect(%client, %name, %raceGender, %skin, %voice, %voicePitch); + checkBans(%client); + } +}; +activatePackage(ServerRunFunctioning); ////////// function spawnprojectile(%proj,%type,%pos,%direction,%src) { diff --git a/scripts/TWM2/Missions/MissionCore.cs b/scripts/TWM2/Missions/MissionCore.cs index 3ca6765..42f06e5 100644 --- a/scripts/TWM2/Missions/MissionCore.cs +++ b/scripts/TWM2/Missions/MissionCore.cs @@ -187,8 +187,7 @@ function CreateTWM2Mission(%client, %mission) { //this group holds our mission aspects }; - echo("TWM2: Activating Mission Package: "@%mission); - activatePackage("TWM2Mission_"@%mission@""); + activatePackage("TWM2Mission_"@%missionname@""); %group.initiateSettings(); %group.schedule(%group.timeToBegin * 1000, "StartTWM2MissionTimer"); diff --git a/scripts/TWM2/Systems/AdvancedRankSystem.cs b/scripts/TWM2/Systems/AdvancedRankSystem.cs index f98ea76..e80351d 100644 --- a/scripts/TWM2/Systems/AdvancedRankSystem.cs +++ b/scripts/TWM2/Systems/AdvancedRankSystem.cs @@ -374,7 +374,7 @@ function GeneratePrestigeChallengeMenu(%client, %tag, %index) { %index++; } else { - messageClient( %client, 'SetLineHud', "", %tag, %index, "Phantom's Vengeance - Reach Officer Level 9."); + messageClient( %client, 'SetLineHud', "", %tag, %index, "Phantom's Vengeance - Reach The Final Officer Level(9)."); %index++; } // diff --git a/scripts/TWM2/Systems/BossSystem.cs b/scripts/TWM2/Systems/BossSystem.cs index 55b5c9a..c455401 100644 --- a/scripts/TWM2/Systems/BossSystem.cs +++ b/scripts/TWM2/Systems/BossSystem.cs @@ -161,8 +161,7 @@ function GameConnection::GiveBossAward(%client, %bossName) { %ratio = %damageCount / %maxHP; - //%award = mFloor(($TWM2::BossXPAward[%bossName] * %ratio) / %scriptController.bossDefeatCount[%bossName]); - %award = $TWM2::BossXPAward[%bossName] / %scriptController.bossDefeatCount[%bossName]; + %award = mFloor(($TWM2::BossXPAward[%bossName] * %ratio) / %scriptController.bossDefeatCount[%bossName]); GainExperience(%client, %award, ""@%bossName@" defeated, congratulations! "); CheckBossChallenge(%client, %bossName); } @@ -435,7 +434,6 @@ function GenerateBossChallengeMenu(%client, %tag, %index) { } //Load The Boss Files -exec("scripts/TWM2/Bosses/BossDatablocks.cs"); exec("scripts/TWM2/Bosses/LordYvex.cs"); exec("scripts/TWM2/Bosses/ColonelWindshear.cs"); exec("scripts/TWM2/Bosses/GhostOfLightning.cs"); diff --git a/scripts/TWM2/Systems/DChalg.cs b/scripts/TWM2/Systems/DChalg.cs index 124d6a8..48557a4 100644 --- a/scripts/TWM2/Systems/DChalg.cs +++ b/scripts/TWM2/Systems/DChalg.cs @@ -691,9 +691,6 @@ function loadChallengeData(%client) { //file update function updateChallengeFile(%client) { - if($Server::StopUpdates) { - return; - } if(!isSet(%client) || !ClientGroup.isMember(%client)) { return; } @@ -728,7 +725,7 @@ function updateChallengeFile(%client) { // echo("Daily Challenge File Expired for "@%client@", preparing new file."); // - %client.resetAttemps++; + %client.resetAtttempts++; if(%client.resetAttemps >= 3) { error("Client "@%client@" reset attempts > 3, disabling challenge interpreter"); %client.cannotReset = 1; diff --git a/scripts/TWM2/Systems/HarbingersWrath.cs b/scripts/TWM2/Systems/HarbingersWrath.cs index 3da5f16..5451d36 100644 --- a/scripts/TWM2/Systems/HarbingersWrath.cs +++ b/scripts/TWM2/Systems/HarbingersWrath.cs @@ -246,7 +246,7 @@ function GetNextGunshipPoint(%obj) { %zPosToGo = getWord(%groundPos, 2) + getWord(%tpos, 2); %posToGo = getWords(%posToGo1, 0, 1) SPC %zPosToGo; //End 2.7 modification - if($HarbinsWrath::PointVec[%obj.goPoint] $= "") { + if(%obj.GoPoint >= 4) { %obj.GoPoint = 0; } //echo("Go to "@%posToGo@""); diff --git a/scripts/TWM2/Systems/MainControl.cs b/scripts/TWM2/Systems/MainControl.cs index bce5ffb..0ac7cdd 100644 --- a/scripts/TWM2/Systems/MainControl.cs +++ b/scripts/TWM2/Systems/MainControl.cs @@ -1,5 +1,5 @@ //TWM2 Functions -$TWM2::Version = 3.9; +$TWM2::Version = 3.8; function FormatTWM2Time(%time) { %min = MFloor(%time / 60); @@ -620,9 +620,6 @@ $ProjectileSeek["GhostFlameboltMain", "CancelList"] = "FlareGrenadeProj"; $ProjectileSeek["RapierShieldForwardProjectile", "ProjectileControls"] = "8 10 10 1"; $ProjectileSeek["RapierShieldForwardProjectile", "CancelList"] = "FlareGrenadeProj"; -$ProjectileSeek["PhotonMissileProj", "ProjectileControls"] = "8 10 10 1"; -$ProjectileSeek["PhotonMissileProj", "CancelList"] = "FlareGrenadeProj"; - function createSeekingProjectile(%projectile, %pType, %iPos, %iDir, %source, %target, %seekActivation) { %proj = spawnprojectile(%projectile, %pTYpe, %iPos, %iDir, %source); schedule(%seekActivation, 0, projectileSeeking, %proj, %target); diff --git a/scripts/TWM2/Systems/NewsPanel.cs b/scripts/TWM2/Systems/NewsPanel.cs index 4627202..7c9eb62 100644 --- a/scripts/TWM2/Systems/NewsPanel.cs +++ b/scripts/TWM2/Systems/NewsPanel.cs @@ -1,10 +1,10 @@ function DownloadNewsPage() { $TWM::Ticks = 0; - %server = "www.forums.phantomdev.net:80"; // + %server = "www.public.phantomdev.net:80"; // if (!isObject(PageGrabber)) %Downloader = new HTTPObject(PageGrabber){}; else %Downloader = PageGrabber; - %filename = "/viewtopic.php?f=11&t=416"; //File Location + %filename = "/SMF/index.php/topic,422.0.html"; //File Location %Downloader.get(%server, %filename); } diff --git a/scripts/weapons/Construction/EditGun.cs b/scripts/weapons/Construction/EditGun.cs index 182b818..3c1996d 100644 --- a/scripts/weapons/Construction/EditGun.cs +++ b/scripts/weapons/Construction/EditGun.cs @@ -33,7 +33,50 @@ $EditTool::PadModes[18] = "DeployedCrate12"; $EditTool::PadModes[19] = "DeployedDecoration6"; $EditTool::PadModes[20] = "DeployedDecoration16"; -datablock ItemData(EditTool) { + +datablock LinearFlareProjectileData(EditorBolt) +{ + emitterDelay = -1; + directDamage = 0; + directDamageType = $DamageType::Default; + kickBackStrength = 0.0; + bubbleEmitTime = 1.0; + + sound = PlasmaProjectileSound; + velInheritFactor = 0.5; + + explosion = "BlasterExplosion"; + splash = BlasterSplash; + + grenadeElasticity = 0.998; + grenadeFriction = 0.0; + armingDelayMS = 500; + + muzzleVelocity = 100.0; + + drag = 0.05; + + gravityMod = 0.0; + + dryVelocity = 100.0; + wetVelocity = 80.0; + + reflectOnWaterImpactAngle = 0.0; + explodeOnWaterImpact = false; + deflectionOnWaterImpact = 0.0; + fizzleUnderwaterMS = 6000; + + lifetimeMS = 6000; + + scale = "1 1 1"; + numFlares = 48; + flareColor = "1 0 0"; + flareModTexture = "special/shrikeBoltCross"; + flareBaseTexture = "special/shrikeBolt"; +}; + +datablock ItemData(EditTool) +{ className = Weapon; catagory = "Spawn Items"; shapeFile = "weapon_disc.dts"; @@ -45,7 +88,8 @@ datablock ItemData(EditTool) { pickUpName = "a Editing Tool"; }; -datablock ShapeBaseImageData(EditGunImage) { +datablock ShapeBaseImageData(EditGunImage) +{ className = WeaponImage; shapeFile = "weapon_disc.dts"; item = EditTool; @@ -54,8 +98,9 @@ datablock ShapeBaseImageData(EditGunImage) { usesEnergy = true; minEnergy = 0.01; - //projectile = EditorBolt; - //projectileType = LinearFlareProjectile; + projectile = EditorBolt; + projectileType = LinearFlareProjectile; + stateName[0] = "Activate"; stateTransitionOnTimeout[0] = "ActivateReady"; @@ -100,37 +145,6 @@ datablock ShapeBaseImageData(EditGunImage) { stateTransitionOnTimeout[6] = "Ready"; }; -//Phantom139: I'll take a datablock over a function any-day... -function EditGunImage::onFire(%data, %obj, %slot) { - //RAYCAST - %vector = %obj.getMuzzleVector(%slot); - %mp = %obj.getMuzzlePoint(%slot); - %targetpos = vectoradd(%mp,vectorscale(%vector, 2500)); - %targ = containerraycast(%mp, %targetpos, $typemasks::staticshapeobjecttype, %obj); - %targetObject = getword(%targ, 0); - if(%targetObject == 0) { - BottomPrint(%obj.client, "No Object Found", 2, 2); - return; - } - if (!Deployables.isMember(%targetObject)) { - messageclient(%obj.client, 'MsgClient', "\c2TextureTool: Error, Map Object Selected."); - return; - } - //APPLY EDITS - switch$(%obj.EditPMode) { - case 0: - EToolswaping(%targetObject, %obj, 0, %obj.EditSMode); - case 1: - EToolswaping(%targetObject, %obj, 1, %obj.EditSMode); - case 2: - EToolTurrets(%targetObject, %obj, %obj.EditSMode); - case 3: - EToolCloakandFade(%targetObject, %obj, %obj.EditSMode); - case 4: - EToolDeleting(%targetObject, %obj, %obj.EditSMode); - } -} - function EditGunImage::onMount(%this, %obj, %slot) { Parent::onMount(%this, %obj, %slot); DispEditorToolInfo(%obj); @@ -143,58 +157,59 @@ function EditGunImage::onMount(%this, %obj, %slot) { %obj.UsingEditTool = true; } -function EditGunImage::onunmount(%this,%obj,%slot) { - Parent::onUnmount(%this, %obj, %slot); - %obj.UsingEditTool = false; +function EditGunImage::onunmount(%this,%obj,%slot) +{ +Parent::onUnmount(%this, %obj, %slot); +%obj.UsingEditTool = false; } function DispEditorToolInfo(%obj) { - switch(%obj.EditPMode) { - case 0: - %primary = "Pad Swapping"; - switch(%obj.EditSMode) { - case 0: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Blue Pad - [LSB] - MSB", 5, 3); - case 1: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: LSB - [MSB] - Walkway", 5, 3); - case 2: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: MSB - [Walkway] - Medium Floor ", 5, 3); - case 3: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Walkway - [Medium Floor] - Dark Pad", 5, 3); - case 4: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Medium Floor - [Dark Pad] - V-Pad", 5, 3); - case 5: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Dark Pad - [V-Pad] - C.1 Backpack", 5, 3); - case 6: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: V-Pad - [C.1 Backpack] - C.2 Small Containment", 5, 3); - case 7: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.1 Backpack - [C.2 Small Containment] - C.3 Large Containment", 5, 3); - case 8: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.2 Small Containment - [C.3 Large Containment] - C.4 Compressor", 5, 3); - case 9: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.3 Large Containment - [C.4 Compressor] - C.5 Tubes", 5, 3); - case 10: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.4 Compressor - [C.5 Tubes] - C.6 Quantium Bat.", 5, 3); - case 11: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.5 Tubes - [C.6 Quantium Bat.] - C.7 Proton Acc.", 5, 3); - case 12: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.6 Quantium Bat. - [C.7 Proton Acc.] - C.8 Cargo Crate", 5, 3); - case 13: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.7 Proton Acc. - [C.8 Cargo Crate] - C.9 Mag Cooler", 5, 3); - case 14: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.8 Cargo Crate - [C.9 Mag Cooler] - C.10 Recycle Unit", 5, 3); - case 15: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.9 Mag Cooler - [C.10 Recycle Unit] - C.11 Fuel Canister", 5, 3); - case 16: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.10 Recycle Unit - [C.11 Fuel Canister] - C.12 Wooden Box", 5, 3); - case 17: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.11 Fuel Canister - [C.12 Wooden Box] - C.13 Plasma Router", 5, 3); - case 18: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.12 Wooden Box - [C.13 Plasma Router] - Statue Base", 5, 3); - case 19: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.13 Plasma Router - [Statue Base] - Blue Pad", 5, 3); - case 20: - commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Statue Base - [Blue Pad] - LSB", 5, 3); +switch(%obj.EditPMode) { + case 0: + %primary = "Pad Swapping"; + switch(%obj.EditSMode) { + case 0: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Blue Pad - [LSB] - MSB", 5, 3); + case 1: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: LSB - [MSB] - Walkway", 5, 3); + case 2: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: MSB - [Walkway] - Medium Floor ", 5, 3); + case 3: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Walkway - [Medium Floor] - Dark Pad", 5, 3); + case 4: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Medium Floor - [Dark Pad] - V-Pad", 5, 3); + case 5: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Dark Pad - [V-Pad] - C.1 Backpack", 5, 3); + case 6: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: V-Pad - [C.1 Backpack] - C.2 Small Containment", 5, 3); + case 7: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.1 Backpack - [C.2 Small Containment] - C.3 Large Containment", 5, 3); + case 8: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.2 Small Containment - [C.3 Large Containment] - C.4 Compressor", 5, 3); + case 9: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.3 Large Containment - [C.4 Compressor] - C.5 Tubes", 5, 3); + case 10: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.4 Compressor - [C.5 Tubes] - C.6 Quantium Bat.", 5, 3); + case 11: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.5 Tubes - [C.6 Quantium Bat.] - C.7 Proton Acc.", 5, 3); + case 12: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.6 Quantium Bat. - [C.7 Proton Acc.] - C.8 Cargo Crate", 5, 3); + case 13: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.7 Proton Acc. - [C.8 Cargo Crate] - C.9 Mag Cooler", 5, 3); + case 14: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.8 Cargo Crate - [C.9 Mag Cooler] - C.10 Recycle Unit", 5, 3); + case 15: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.9 Mag Cooler - [C.10 Recycle Unit] - C.11 Fuel Canister", 5, 3); + case 16: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.10 Recycle Unit - [C.11 Fuel Canister] - C.12 Wooden Box", 5, 3); + case 17: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.11 Fuel Canister - [C.12 Wooden Box] - C.13 Plasma Router", 5, 3); + case 18: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.12 Wooden Box - [C.13 Plasma Router] - Statue Base", 5, 3); + case 19: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: C.13 Plasma Router - [Statue Base] - Blue Pad", 5, 3); + case 20: + commandToClient( %obj.client, 'BottomPrint', "[{Manipulator Tool}] - Phantom139 \n Mine: [Pad Swap] - FF Swap - Barrel Swap - Cloak/Fade - Delete Objects \n Grenade: Statue Base - [Blue Pad] - LSB", 5, 3); } case 1: %primary = "Force-Field Swapping"; @@ -278,44 +293,57 @@ function DispEditorToolInfo(%obj) { } function ChangeEditGunMode(%this, %data, %PriSec) { //This Is Easier To use - if(%PriSec == 1) { //Primary - if (!(getSimTime() > (%this.mineModeTime + 100))) { - return; +if(%PriSec == 1) { //Primary +if (!(getSimTime() > (%this.mineModeTime + 100))) +return; +%this.mineModeTime = getSimTime(); +%this.EditPMode++; +%this.EditSMode = 0; //Reset Secondary Mode TO Prevent Errors +if (%this.EditPMode > 4) { +%this.EditPMode = 0; +} +DispEditorToolInfo(%this); +return; +} +else { //Secondary +if (!(getSimTime() > (%this.grenadeModeTime + 100))) +return; +%this.grenadeModeTime = getSimTime(); +%this.EditSMode++; +//Check Primaries +if(%this.EditPMode == 0 && %this.EditSMode > 20) { +%this.EditSMode = 0; +} +else if(%this.EditPMode == 1 && %this.EditSMode > 20) { +%this.EditSMode = 0; +} +else if(%this.EditPMode == 2 && %this.EditSMode > 4) { +%this.EditSMode = 0; +} +else if(%this.EditPMode == 3 && %this.EditSMode > 3) { +%this.EditSMode = 0; +} +else if(%this.EditPMode == 4 && %this.EditSMode > 1) { +%this.EditSMode = 0; +} +DispEditorToolInfo(%this); +return; +} +} + +function EditorBolt::onCollision(%data,%projectile,%targetObject,%modifier,%position,%normal) { + switch$(%projectile.sourceObject.EditPMode) { + case 0: + EToolswaping(%targetObject,%projectile.sourceObject,0,%projectile.sourceObject.EditSMode); + case 1: + EToolswaping(%targetObject,%projectile.sourceObject,1,%projectile.sourceObject.EditSMode); + case 2: + EToolTurrets(%targetObject,%projectile.sourceObject,%projectile.sourceObject.EditSMode); + case 3: + EToolCloakandFade(%targetObject,%projectile.sourceObject,%projectile.sourceObject.EditSMode); + case 4: + EToolDeleting(%targetObject,%projectile.sourceObject,%projectile.sourceObject.EditSMode); } - %this.mineModeTime = getSimTime(); - %this.EditPMode++; - %this.EditSMode = 0; //Reset Secondary Mode TO Prevent Errors - if (%this.EditPMode > 4) { - %this.EditPMode = 0; - } - DispEditorToolInfo(%this); - return; - } - else { //Secondary - if (!(getSimTime() > (%this.grenadeModeTime + 100))) { - return; - } - %this.grenadeModeTime = getSimTime(); - %this.EditSMode++; - //Check Primaries - if(%this.EditPMode == 0 && %this.EditSMode > 20) { - %this.EditSMode = 0; - } - else if(%this.EditPMode == 1 && %this.EditSMode > 20) { - %this.EditSMode = 0; - } - else if(%this.EditPMode == 2 && %this.EditSMode > 4) { - %this.EditSMode = 0; - } - else if(%this.EditPMode == 3 && %this.EditSMode > 3) { - %this.EditSMode = 0; - } - else if(%this.EditPMode == 4 && %this.EditSMode > 1) { - %this.EditSMode = 0; - } - DispEditorToolInfo(%this); - return; - } } //Editor Tool Functioning @@ -323,42 +351,42 @@ function ChangeEditGunMode(%this, %data, %PriSec) { //This Is Easier To use // // function EToolDeleting(%tobj,%plyr,%Mode) { - %cl = %plyr.client; - if ( %tobj.ownerGUID != %cl.guid) { - if (!%cl.isadmin && !%cl.issuperadmin){ - if (%tobj.ownerGUID !$=""){ - messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, You Do Not Own This Piece."); - return; - } - } + %cl=%plyr.client; + if ( %tobj.ownerGUID != %cl.guid){ + if (!%cl.isadmin && !%cl.issuperadmin){ + if (%tobj.ownerGUID !$=""){ + messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, You Do Not Own This Piece."); + return; + } + } } if (%tobj.squaresize !$="") { - messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, Unknown Object Selected."); - return; + messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, Unknown Object Selected."); + return; } if (!Deployables.isMember(%tobj)) { - messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, Map Object Selected."); - return; + messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, Map Object Selected."); + return; } switch(%Mode) { - case 0: - messageclient(%cl, 'MsgClient', "\c2TextureTool: Deleting Object."); - %tobj.getDataBlock().disassemble(%plyr, %tobj); //this found in constructionTool.cs - case 1: - messageclient(%cl, 'MsgClient', "\c2TextureTool: Cascade Deleting Object (All Conective Objects)."); - cascade(%tobj,true); + case 0: + messageclient(%cl, 'MsgClient', "\c2TextureTool: Deleting Object."); + %tobj.getDataBlock().disassemble(%plyr, %tobj); //this found in constructionTool.cs + case 1: + messageclient(%cl, 'MsgClient', "\c2TextureTool: Cascade Deleting Object (All Conective Objects)."); + cascade(%tobj,true); } } // function EToolCloakandFade(%tobj,%plyr,%Mode) { - %cl = %plyr.client; - if ( %tobj.ownerGUID != %cl.guid) { - if (!%cl.isadmin && !%cl.issuperadmin){ - if (%tobj.ownerGUID !$=""){ - messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, You Do Not Own This Piece."); - return; - } - } + %cl=%plyr.client; + if ( %tobj.ownerGUID != %cl.guid){ + if (!%cl.isadmin && !%cl.issuperadmin){ + if (%tobj.ownerGUID !$=""){ + messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, You Do Not Own This Piece."); + return; + } + } } if (%tobj.squaresize !$="") { messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, Unknown Object Selected."); @@ -387,14 +415,14 @@ function EToolCloakandFade(%tobj,%plyr,%Mode) { } // function EToolTurrets(%tobj,%plyr,%Mode) { - %cl = %plyr.client; - if ( %tobj.ownerGUID != %cl.guid) { - if (!%cl.isadmin && !%cl.issuperadmin){ - if (%tobj.ownerGUID !$=""){ - messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, You Do Not Own This Piece."); - return; - } - } + %cl=%plyr.client; + if ( %tobj.ownerGUID != %cl.guid){ + if (!%cl.isadmin && !%cl.issuperadmin){ + if (%tobj.ownerGUID !$=""){ + messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, You Do Not Own This Piece."); + return; + } + } } if (%tobj.squaresize !$="") { messageclient(%cl, 'MsgClient', "\c2TextureTool: Error, Unknown Object Selected."); diff --git a/scripts/weapons/Melee/BOV.cs b/scripts/weapons/Melee/BOV.cs index 7fe754e..3649493 100644 --- a/scripts/weapons/Melee/BOV.cs +++ b/scripts/weapons/Melee/BOV.cs @@ -189,61 +189,63 @@ function BOVImage::onFire(%data, %obj, %node) { } function BOVhit::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) { - if(%targetObject.isBoss) { - %targetObject.playShieldEffect("1 1 1"); - MessageClient(%projectile.sourceObject.client, 'MsgDeflect', "The Boss Deflects The Swipe"); - return; - } - if(%targetObject.rapierShield) { - MessageClient(%projectile.sourceObject.client, 'MsgDeflect', "The Target Is Immortal."); - return; - } - %source = %projectile.SourceObject; - %hitObj = %targetObject; + if(%targetObject.isBoss) { + %targetObject.playShieldEffect("1 1 1"); + MessageClient(%projectile.sourceObject.client, 'MsgDeflect', "The Boss Deflects The Swipe"); + return; + } + if(%targetObject.rapierShield) { + MessageClient(%projectile.sourceObject.client, 'MsgDeflect', "The Target Is Immortal."); + return; + } + %source = %projectile.SourceObject; + %hitObj = %targetObject; - %muzzlePos = %source.getMuzzlePoint(0); - %muzzleVec = %source.getMuzzleVector(0); + %muzzlePos = %source.getMuzzlePoint(0); + %muzzleVec = %source.getMuzzleVector(0); - // extra damage for head shot or less for close range shots - if(!(%hitObj.getType() & ($TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType)) && (%hitObj.getDataBlock().getClassName() $= "PlayerData")) { - if(%hitObj.getDataBlock().getClassName() $= "PlayerData") { - // Now we see if we hit from behind... - %forwardVec = %hitobj.getForwardVector(); - %objDir2D = getWord(%forwardVec, 0) @ " " @ getWord(%forwardVec,1) @ " " @ "0.0"; - %objPos = %hitObj.getPosition(); - %dif = VectorSub(%objPos, %muzzlePos); - %dif = getWord(%dif, 0) @ " " @ getWord(%dif, 1) @ " 0"; - %dif = VectorNormalize(%dif); - %dot = VectorDot(%dif, %objDir2D); - // 120 Deg angle test... - // 1.05 == 60 degrees in radians - if (%dot >= mCos(1.05)) { - // Rear hit - if(%source.isAlive()) { + // extra damage for head shot or less for close range shots + if(!(%hitObj.getType() & ($TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType)) && + (%hitObj.getDataBlock().getClassName() $= "PlayerData")) { + + if(%hitObj.getDataBlock().getClassName() $= "PlayerData") { + // Now we see if we hit from behind... + %forwardVec = %hitobj.getForwardVector(); + %objDir2D = getWord(%forwardVec, 0) @ " " @ getWord(%forwardVec,1) @ " " @ "0.0"; + %objPos = %hitObj.getPosition(); + %dif = VectorSub(%objPos, %muzzlePos); + %dif = getWord(%dif, 0) @ " " @ getWord(%dif, 1) @ " 0"; + %dif = VectorNormalize(%dif); + %dot = VectorDot(%dif, %objDir2D); + + // 120 Deg angle test... + // 1.05 == 60 degrees in radians + if (%dot >= mCos(1.05)) { + // Rear hit %source.applyRepair("0.45"); //we get a bonus repair for rear + if(%source.team == %hitObj.team && !$TeamDamage) { + ServerPlay3d(BOVHitSound, %targetObject.getPosition()); + return; //stops shredding + } + %source.cannotuseBOV = 1; + if(!%hitObj.IsinvincibleC) { + DoBOVRearKill(%source, %hitObj, 0); + } + return; } - if(%source.team == %hitObj.team && !$TeamDamage) { - ServerPlay3d(BOVHitSound, %targetObject.getPosition()); - return; //stops shredding - } - %source.cannotuseBOV = 1; - if(!%hitObj.IsinvincibleC) { - DoBOVRearKill(%source, %hitObj, 0); - } - return; } - } - ServerPlay3d(BOVHitSound, %targetObject.getPosition()); - //The Blade Only Works On Players - %targetObject.damage(%projectile.sourceObject, %position, %data.directDamage, %data.directDamageType); - if(%source.isAlive()) { - %source.applyRepair("0.15"); //15% - } - if(%targetObject.client !$= "") { //a Player.. goodie - if(%targetObject.getState() $= "dead") { - MessageAll('MessageAll', "\c0"@%targetObject.client.namebase@" was stabbed by "@%source.client.namebase@"'s Sword."); - } - } + + ServerPlay3d(BOVHitSound, %targetObject.getPosition()); + //The Blade Only Works On Players + %targetObject.damage(%projectile.sourceObject, %position, %data.directDamage, %data.directDamageType); + if(isObject(%source) || %source.getState() !$= "dead") { + %source.applyRepair("0.15"); //15% + } + if(%targetObject.client !$= "") { //a Player.. goodie + if(%targetObject.getState() $= "dead") { + MessageAll('MessageAll', "\c0"@%targetObject.client.namebase@" was stabbed by "@%source.client.namebase@"'s Sword."); + } + } } } diff --git a/scripts/weapons/T2Guns/shockLance.cs b/scripts/weapons/T2Guns/shockLance.cs index b6afea2..244dff2 100644 --- a/scripts/weapons/T2Guns/shockLance.cs +++ b/scripts/weapons/T2Guns/shockLance.cs @@ -44,6 +44,110 @@ datablock AudioProfile(ShockLanceMissSound) //-------------------------------------------------------------------------- // Particle data //-------------------------------------------------------------------------- +datablock ParticleData(ShockParticle) +{ + dragCoeffiecient = 0.0; + gravityCoefficient = -0.0; + inheritedVelFactor = 0.0; + + lifetimeMS = 1000; + lifetimeVarianceMS = 0; + + textureName = "particleTest"; + + useInvAlpha = false; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + numParts = 50; + + animateTexture = true; + framesPerSec = 26; + + animTexName[00] = "special/Explosion/exp_0002"; + animTexName[01] = "special/Explosion/exp_0004"; + animTexName[02] = "special/Explosion/exp_0006"; + animTexName[03] = "special/Explosion/exp_0008"; + animTexName[04] = "special/Explosion/exp_0010"; + animTexName[05] = "special/Explosion/exp_0012"; + animTexName[06] = "special/Explosion/exp_0014"; + animTexName[07] = "special/Explosion/exp_0016"; + animTexName[08] = "special/Explosion/exp_0018"; + animTexName[09] = "special/Explosion/exp_0020"; + animTexName[10] = "special/Explosion/exp_0022"; + animTexName[11] = "special/Explosion/exp_0024"; + animTexName[12] = "special/Explosion/exp_0026"; + animTexName[13] = "special/Explosion/exp_0028"; + animTexName[14] = "special/Explosion/exp_0030"; + animTexName[15] = "special/Explosion/exp_0032"; + animTexName[16] = "special/Explosion/exp_0034"; + animTexName[17] = "special/Explosion/exp_0036"; + animTexName[18] = "special/Explosion/exp_0038"; + animTexName[19] = "special/Explosion/exp_0040"; + animTexName[20] = "special/Explosion/exp_0042"; + animTexName[21] = "special/Explosion/exp_0044"; + animTexName[22] = "special/Explosion/exp_0046"; + animTexName[23] = "special/Explosion/exp_0048"; + animTexName[24] = "special/Explosion/exp_0050"; + animTexName[25] = "special/Explosion/exp_0052"; + + + colors[0] = "0.5 0.5 1.0 1.0"; + colors[1] = "0.5 0.5 1.0 0.5"; + colors[2] = "0.25 0.25 1.0 0.0"; + sizes[0] = 0.5; + sizes[1] = 0.5; + sizes[2] = 0.5; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(ShockParticleEmitter) +{ + ejectionPeriodMS = 1; + periodVarianceMS = 0; + + ejectionVelocity = 0.25; + velocityVariance = 0.0; + + thetaMin = 0.0; + thetaMax = 30.0; + + particles = "ShockParticle"; +}; + +//-------------------------------------------------------------------------- +// Shockwave +//-------------------------------------------------------------------------- +datablock ShockwaveData( ShocklanceHit ) +{ + width = 0.5; + numSegments = 20; + numVertSegments = 1; + velocity = 0.25; + acceleration = 1.0; + lifetimeMS = 600; + height = 0.1; + verticalCurve = 0.5; + + mapToTerrain = false; + renderBottom = false; + orientToNormal = true; + + texture[0] = "special/shocklanceHit"; + texture[1] = "special/gradient"; + texWrap = 3.0; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; + + colors[0] = "1.0 1.0 1.0 1.0"; + colors[1] = "1.0 1.0 1.0 0.5"; + colors[2] = "1.0 1.0 1.0 0.0"; +}; + //-------------------------------------- // Projectile @@ -86,6 +190,43 @@ datablock ShockLanceProjectileData(BasicShocker) emitter[0] = ShockParticleEmitter; }; +datablock ShockLanceProjectileData(GoLShocker) { + directDamage = 0.45; + radiusDamageType = $DamageType::ShockLance; + kickBackStrength = 2500; + velInheritFactor = 0; + sound = ""; + + zapDuration = 1.0; + impulse = 1800; + boltLength = 50.0; + extension = 50.0; // script variable indicating distance you can shock people from + lightningFreq = 25.0; + lightningDensity = 3.0; + lightningAmp = 0.25; + lightningWidth = 0.05; + + shockwave = ShocklanceHit; + + boltSpeed[0] = 2.0; + boltSpeed[1] = -0.5; + + texWrap[0] = 1.5; + texWrap[1] = 1.5; + + startWidth[0] = 0.3; + endWidth[0] = 0.6; + startWidth[1] = 0.3; + endWidth[1] = 0.6; + + texture[0] = "special/shockLightning01"; + texture[1] = "special/shockLightning02"; + texture[2] = "special/shockLightning03"; + texture[3] = "special/ELFBeam"; + + emitter[0] = ShockParticleEmitter; +}; + datablock ShockLanceProjectileData(S3Shocker) { directDamage = 0.50; radiusDamageType = $DamageType::ShockLance; diff --git a/serverControl.cs b/serverControl.cs index c189688..9826507 100644 --- a/serverControl.cs +++ b/serverControl.cs @@ -5,6 +5,11 @@ $TWM2::DisabledMissionTypes = ""; //Horde\tHorde4 $ScoreHudInventory::Active = 0; //0 returns the inv. hud to the normal one +//PGD Connect has been removed from www.phantomdev.net. I will restore it if mod +// support returns to it's original status, for the time being, this GVar will +// disable the PGD Connect stuff, allowing the mod to function without it. +$TWM2::PGDConnectDisabled = 1; + //CHAT BOT //Now you can control 'Cynthia', or whatever you wish on naming it $ChatBot::Name = "Cynthia"; //The Name of the Bot