Files
TankiOnline2.0DemoClient/src/alternativa/tanks/game/weapons/EnergyShotWeaponComponent.as
2025-01-29 18:28:12 +00:00

300 lines
10 KiB
ActionScript

package alternativa.tanks.game.weapons
{
import alternativa.tanks.game.EntityComponent;
import alternativa.tanks.game.GameKernel;
import alternativa.tanks.game.GameEvents;
import package_115.class_26;
import package_42.name_184;
import package_42.name_477;
import package_45.name_182;
import package_46.name_194;
import package_71.name_252;
import package_75.class_15;
import package_75.name_236;
import package_76.name_256;
import package_79.name_622;
import package_86.name_257;
import package_86.name_540;
import package_90.name_273;
import package_92.name_271;
public class EnergyShotWeaponComponent extends EntityComponent implements IBasicWeapon, IWeapon, name_477
{
private static const COLLISION_MASK:int = name_257.STATIC | name_257.WEAPON;
private static var rayHit:name_273 = new name_273();
private static var filter:name_540 = new name_540();
private static var barrelOrigin:name_194 = new name_194();
private static var muzzlePosition:name_194 = new name_194();
private static var gunDirection:name_194 = new name_194();
private static var gunElevationAxis:name_194 = new name_194();
private static var shotDirection:name_194 = new name_194();
private static var recoilForceVector:name_194 = new name_194();
private var energyCapacity:Number;
private var energyPerShot:Number;
private var energyRechargeRate:Number;
private var reloadTime:int;
private var recoilForce:Number;
private var targetingSystem:name_622;
private var ammunition:IEnergyAmmunition;
private var callback:IEnergyShotWeaponCallback;
private var isActive:Boolean;
private var var_439:Boolean;
private var var_438:Boolean;
private var var_441:Boolean;
private var var_440:name_184;
private var gameKernel:GameKernel;
private var baseTime:int;
private var var_446:int;
private var var_445:class_15;
private var chassisComponent:name_236;
private var var_447:class_26;
private var var_448:int;
private var maxRange:Number;
private var barrelIndex:int;
public function EnergyShotWeaponComponent(energyCapacity:Number, energyPerShot:Number, energyRechargeRate:Number, reloadTime:int, recoilForce:Number, maxRange:Number, targetingSystem:name_622, callback:IEnergyShotWeaponCallback, isActive:Boolean)
{
super();
this.energyCapacity = energyCapacity;
this.energyPerShot = energyPerShot;
this.energyRechargeRate = energyRechargeRate;
this.reloadTime = reloadTime;
this.recoilForce = recoilForce;
this.maxRange = maxRange;
this.targetingSystem = targetingSystem;
this.callback = callback;
this.isActive = isActive;
}
public function method_383(callback:IEnergyShotWeaponCallback) : void
{
this.callback = callback;
}
public function method_528(targetingSystem:name_622) : void
{
this.targetingSystem = targetingSystem;
}
override public function initComponent() : void
{
this.var_445 = class_15(entity.getComponentStrict(class_15));
this.chassisComponent = name_236(entity.getComponentStrict(name_236));
this.var_447 = class_26(entity.getComponentStrict(class_26));
this.ammunition = IEnergyAmmunition(entity.getComponentStrict(IEnergyAmmunition));
if(this.isActive)
{
entity.addEventHandler(name_252.SET_ACTIVE_STATE,this.setActiveState);
entity.addEventHandler(name_252.SET_ACTIVATING_STATE,this.setInactiveState);
entity.addEventHandler(name_252.SET_DEAD_STATE,this.setInactiveState);
entity.addEventHandler(name_252.SET_RESPAWN_STATE,this.setInactiveState);
entity.addEventHandler(GameEvents.BATTLE_FINISHED,this.setInactiveState);
}
}
override public function addToGame(gameKernel:GameKernel) : void
{
this.gameKernel = gameKernel;
this.var_440 = gameKernel.getLogicSystem2();
}
override public function removeFromGame(gameKernel:GameKernel) : void
{
this.var_440 = null;
this.gameKernel = null;
}
public function method_394() : void
{
if(!this.var_438)
{
this.var_438 = true;
if(this.var_439)
{
this.enableLogic();
}
}
}
public function method_393() : void
{
if(this.var_438)
{
this.var_438 = false;
this.disableLogic();
}
}
public function method_395() : void
{
this.runLogic();
}
public function method_396() : Number
{
return this.getCurrentEnergy(name_182.time,this.baseTime) / this.energyCapacity;
}
public function runLogic() : void
{
var barrelLength:Number = NaN;
var shotId:int = 0;
var shooterBody:name_271 = null;
var collisionDetector:name_256 = null;
var shotType:EnergyShotType = null;
var round:IGenericRound = null;
var now:int = name_182.time;
var currentEnergy:Number = this.getCurrentEnergy(now,this.baseTime);
if(now >= this.var_446 && currentEnergy >= this.energyPerShot)
{
this.var_446 = now + this.reloadTime;
this.baseTime = now - 1000 * (currentEnergy - this.energyPerShot) / this.energyRechargeRate;
this.var_445.getGunData(this.barrelIndex,barrelOrigin,gunDirection,gunElevationAxis);
barrelLength = Number(this.var_445.getBarrelLength(this.barrelIndex));
muzzlePosition.copy(barrelOrigin).method_362(barrelLength,gunDirection);
shotId = this.var_448++;
shooterBody = this.chassisComponent.getBody();
collisionDetector = this.gameKernel.method_112().name_246().collisionDetector;
filter.body = shooterBody;
if(collisionDetector.raycast(barrelOrigin,gunDirection,COLLISION_MASK,barrelLength + 0.01,filter,rayHit))
{
shotType = EnergyShotType.CLOSE_SHOT;
shotDirection.copy(gunDirection);
}
else
{
shotType = EnergyShotType.NORMAL_SHOT;
this.targetingSystem.name_624(shooterBody,muzzlePosition,gunDirection,gunElevationAxis,this.maxRange,shotDirection);
}
filter.body = null;
this.doShowShotEffects(shotType,this.barrelIndex,barrelOrigin,muzzlePosition,gunDirection,gunElevationAxis);
if(this.callback != null)
{
this.callback.name_623(shotId,shotType,shotDirection,this.barrelIndex);
}
round = this.ammunition.getRound(shotType,this.maxRange);
round.method_372(this.gameKernel,shotId,shooterBody,barrelOrigin,barrelLength,shotDirection,muzzlePosition);
this.barrelIndex = (this.barrelIndex + 1) % this.var_445.getBarrelCount();
}
}
public function method_372(shotId:int, shotType:EnergyShotType, shotDirection:name_194, barrelIndex:int) : void
{
var shooterBody:name_271 = this.chassisComponent.getBody();
var barrelLength:Number = Number(this.var_445.getBarrelLength(barrelIndex));
this.var_445.getGunData(barrelIndex,barrelOrigin,gunDirection,gunElevationAxis);
muzzlePosition.copy(barrelOrigin).method_362(barrelLength,gunDirection);
this.doShowShotEffects(shotType,barrelIndex,barrelOrigin,muzzlePosition,gunDirection,gunElevationAxis);
var round:IGenericRound = this.ammunition.getRound(shotType,this.maxRange);
round.method_372(this.gameKernel,shotId,shooterBody,barrelOrigin,barrelLength,shotDirection,muzzlePosition);
}
public function get name_308() : Boolean
{
return this.var_439;
}
public function set name_308(value:Boolean) : void
{
if(this.var_439 != value)
{
this.var_439 = value;
if(this.var_439)
{
if(this.var_438)
{
this.enableLogic();
}
}
else
{
this.disableLogic();
}
}
}
private function doShowShotEffects(shotType:EnergyShotType, barrelIndex:int, barrelOrigin:name_194, muzzlePosition:name_194, gunDirection:name_194, gunElevationAxis:name_194) : void
{
recoilForceVector.copy(gunDirection).scale(-this.recoilForce);
this.chassisComponent.getBody().name_525(barrelOrigin,recoilForceVector);
if(shotType == EnergyShotType.NORMAL_SHOT)
{
this.var_447.method_411(barrelIndex,barrelOrigin,muzzlePosition,gunDirection,gunElevationAxis);
}
}
private function setActiveState(eventType:String, eventData:*) : void
{
this.name_308 = true;
}
private function setInactiveState(eventType:String, eventData:*) : void
{
this.name_308 = false;
}
private function enableLogic() : void
{
if(!this.var_441)
{
this.var_441 = true;
this.var_440.addLogicUnit(this);
}
}
private function disableLogic() : void
{
if(this.var_441)
{
this.var_441 = false;
this.var_440.removeLogicUnit(this);
}
}
private function getCurrentEnergy(time:int, baseTime:int) : Number
{
var energy:Number = 0.001 * (time - baseTime) * this.energyRechargeRate;
if(energy < 0)
{
return 0;
}
if(energy > this.energyCapacity)
{
return this.energyCapacity;
}
return energy;
}
}
}