From ec82170d04b009ffc219d0731a961e4cdc287f00 Mon Sep 17 00:00:00 2001 From: loop <126372784+tribes2@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:17:58 +0100 Subject: [PATCH] delete disused methods from SSTP, implement the basics of SSAT --- scripts/SkillSectorAimTrainer.cs | 61 ++++++++++++++++++- scripts/SkillSectorTeleporter.cs | 101 +------------------------------ 2 files changed, 61 insertions(+), 101 deletions(-) diff --git a/scripts/SkillSectorAimTrainer.cs b/scripts/SkillSectorAimTrainer.cs index 9446f09..ecf124d 100644 --- a/scripts/SkillSectorAimTrainer.cs +++ b/scripts/SkillSectorAimTrainer.cs @@ -1,3 +1,5 @@ +$AimTrainDuration = 60; + datablock PlayerData(DermDummy) : LightMaleBiodermArmor { canObserve = false; groundImpactMinSpeed = 0.01; @@ -10,11 +12,65 @@ function resetDummyPosition(%this) { %this.setvelocity("0 0 0"); } + +function atsessionEnd(%player) { + echo("session ended"); + %player.aim_training = 0; + %msg = "\c2AimTrain complete!\nScore: " @ %player.atscore; + messageClient(%player.client, 'MsgAimTrainFinish', %msg); + CenterPrint(%player.client, %msg, 3.5, 3); +} + +function atsessionCountdown(%player, %count) { + messageClient(%player.client, 'MsgAimTrainCountdown', '\c2AimTrain session ends in %1 second(s).~wfx/misc/hunters_%1.wav', %count); +} + +function atsessionCheck(%player) { + if (isObject(%player.client)) { + if (%player.aim_training) { + echo("aim training already active for player " @ %player); + } else { + messageClient(%player.client, 'MsgAimTrainStart', '\c2AimTrain start! You have %1 seconds.', $AimTrainDuration); + echo("starting aim training for player " @ %player); + %player.aim_training = 1; + %player.atscore = 0.0; + for (%i = 1; %i < 6; %i += 1) { + schedule(($AimTrainDuration-%i)*1000, 0, "atsessionCountdown", %player, %i); + } + schedule($AimTrainDuration*1000, 0, "atsessionEnd", %player); + } + } +} + +// $DamageType::Default= 0; $DamageType::Blaster= 1; $DamageType::Plasma= 2; $DamageType::Bullet= 3; $DamageType::Disc= 4; $DamageType::Grenade= 5; $DamageType::Laser= 6; $DamageType::ELF= 7; $DamageType::Mortar= 8; $DamageType::Missile= 9; $DamageType::ShockLance= 10; $DamageType::Mine= 11; $DamageType::Explosion= 12; $DamageType::Impact= 13; // Object to object collisions $DamageType::Ground= 14; // Object to ground collisions $DamageType::Turret= 15; +function calcScore(%targetObject, %sourceObject, %damageType, %damage, %position) { + %score = %damage * 100; + %directHitOnly = !$AimTrainLowDummies.isMember(%targetObject); + switch$(%damageType) { + case $DamageType::Disc: + if (%damage != 0.5 && %directHitOnly) { + echo("Indirect hit, doesn't count"); + return 0; + } + } + %sourceObject.atscore += %score; + BottomPrint(%sourceObject.client, "DMG: " @ %damage @ " TYPE: " @ %damageType @ " SCORE: " @ %score @ " DHO " @ %directHitOnly, 2, 3); +} + function DermDummy::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType) { if (%sourceObject == 0) { + // Fall damage return; } echo("Damage object received: " @ %targetObject @ " from " @ %sourceObject); + + // find out if the player is already in a score session + atsessionCheck(%sourceObject); + + // how much damage was received? + calcScore(%targetObject, %sourceObject, %damageType, %amount, %position); + + // Reset training dummy cancel(%targetObject.resetter); // Avoid double resets // 750 allows for the original splash damage to decay // 500 results in a double reset because the dummy is hit by the original explosion twice @@ -29,8 +85,10 @@ function DermDummy::damageObject(%data, %targetObject, %sourceObject, %position, // echo("wtf is this then: " @ %this @ " tgt " @ %sourceObject); // } - function findAndReplacePlaceholders() { + // This is not re-entrant safe, don't call it more than once! + $AimTrainLowDummies = new SimSet(); + MissionCleanup.add($AimTrainLowDummies); // Replace placeholders in the aim training system %trash = new SimSet(); for (%i = 0; %i < AimTrainLow.getCount(); %i += 1) { @@ -42,6 +100,7 @@ function findAndReplacePlaceholders() { datablock = "DermDummy"; }; AimTrainLow.add(%replace); + $AimTrainLowDummies.add(%replace); %replace.setName(%obj.getName()); %replace.setTransform(%trans); %replace.original_transform = %trans; diff --git a/scripts/SkillSectorTeleporter.cs b/scripts/SkillSectorTeleporter.cs index 4fdadd2..ae2831c 100644 --- a/scripts/SkillSectorTeleporter.cs +++ b/scripts/SkillSectorTeleporter.cs @@ -67,58 +67,6 @@ function BankTeleporter::teleportOut(%data, %obj, %player) { %data.schedule(1000, "teleportIn", %player); } -// function BankTeleporter::onCollision(%data, %obj, %col) -// { -// if(%col.getDataBlock().className !$= "Armor" || %col.getState() $= "Dead" || %col.teleporting) { -// return; -// } - -// if(isObject(%col)) { -// if(%obj.team == %col.client.team) { -// if(!%obj.isDisabled()) { -// if(%obj.isPowered()) { -// if(isObject(%obj.MPB) && %obj.MPB.fullyDeployed) -// { -// if(%obj.disabled == 0) -// { -// %col.lastWeapon = ( %col.getMountedImage($WeaponSlot) == 0 ) ? "" : %col.getMountedImage($WeaponSlot).item; -// %col.unmountImage($WeaponSlot); -// %pos = %obj.position; -// %col.setvelocity("0 0 0"); -// %col.setMoveState(true); -// %rot = getWords(%col.getTransform(), 3, 6); -// %col.setTransform(getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2) + 0.6 @ " " @ %rot); -// %col.teleporting = 1; -// %col.startFade( 1000, 0, true ); -// %col.playAudio($PlaySound, StationVehicleAcitvateSound); - -// %obj.disabled = 1; // Disable the teleporter to more then one person at a time for a time. -// %obj.setThreadDir($ActivateThread, TRUE); -// %obj.playThread($ActivateThread, "activate"); - -// %data.sparkEmitter(%obj); -// %data.schedule(2000, "teleportout", %obj, %col); -// %data.schedule(4000, "teleportingDone", %obj, %col); -// } -// else -// messageClient(%col.client, 'MsgTeleportRecharging', '\c2Teleporter is recharging please stand by. ~wfx/powered/nexus_deny.wav'); -// } -// else -// MessageClient(%col.client, "MsgNoMPB", 'MPB is not deployed.'); -// } -// else -// messageClient(%col.client, 'MsgStationNoPower', '\c2Teleporter is not powered.'); -// } -// else -// messageClient(%col.client, 'MsgStationDisabled', '\c2Teleporter is disabled.'); -// } -// else -// messageClient(%col.client, 'MsgStationDenied', '\c2Access Denied -- Wrong team.~wfx/powered/station_denied.wav'); -// } -// else -// return; -// } - function BankTeleporter::teleportIn(%data, %player) { messageClient(%collider.client, 'MsgTeleportStart', '\c2Teleport to '@ %data.destination @' complete! ~wfx/powered/nexus_idle.wav'); %data.sparkEmitter(%player); // z0dd - ZOD, 4/24/02. teleport sparkles @@ -171,53 +119,6 @@ function BankTeleporter::teleportingDone(%data, %obj, %player) if(%player.inv[%player.lastWeapon]) %player.use(%player.lastWeapon); else - %player.selectWeaponSlot( 0 ); + %player.selectWeaponSlot(0); } } - -//------------------------------------------------------------------------------------------ -// Gets called from function MobileBaseVehicle::vehicleDeploy(%data, %obj, %player, %force). -// Passes this information to the MPBTeleporter::teleportOut function. -//------------------------------------------------------------------------------------------ - -function checkSpawnPos(%MPB, %radius) -{ - for(%y = -1; %y < 1; %y += 0.25) - { - %xCount=0; - for(%x = -1; %x < 1; %x += 0.25) - { - $MPBSpawnPos[(%yCount * 8) + %xCount] = %x @ " " @ %y; - %xCount++; - } - %yCount++; - } - %count = -1; - - for(%x = 0; %x < 64; %x++) - { - %pPos = getWords(%MPB.getTransform(), 0, 2); - %pPosX = getWord(%pPos, 0); - %pPosY = getWord(%pPos, 1); - %pPosZ = getWord(%pPos, 2); - - %posX = %pPosX + ( getWord($MPBSpawnPos[%x],0) * %radius); - %posY = %pPosY + (getWord($MPBSpawnPos[%x],1) * %radius); - - %terrHeight = getTerrainHeight(%posX @ " " @ %posY); - - if(mAbs(%terrHeight - %pPosZ) < %radius ) - { - %mask = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType | - $TypeMasks::StaticShapeObjectType | $TypeMasks::StaticTSObjectType | - $TypeMasks::ForceFieldObjectType | $TypeMasks::ItemObjectType | - $TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType | - $TypeMasks::InteriorObjectType; - - InitContainerRadiusSearch(%posX @ " " @ %posY @ " " @ %terrHeight, 2, %mask); - if(ContainerSearchNext() == 0) - %MPB.spawnPos[%count++] = %posX @ " " @ %posY @ " " @ %terrHeight; - } - } - %MPB.spawnPosCount = %count; -}