weapon.h
来自「这是整套横扫千军3D版游戏的源码」· C头文件 代码 · 共 155 行
H
155 行
#ifndef WEAPON_H
#define WEAPON_H
// Weapon.h: interface for the CWeapon class.
//
//////////////////////////////////////////////////////////////////////
#include "Object.h"
#include "Sim/Misc/DamageArray.h"
#include <list>
class CUnit;
class CWeaponProjectile;
struct WeaponDef;
class UnitDefWeapon;
enum TargetType {
Target_None,
Target_Unit,
Target_Pos,
Target_Intercept
};
class CWeapon : public CObject
{
CR_DECLARE(CWeapon);
public:
CWeapon(CUnit* owner);
virtual ~CWeapon();
virtual void Init(void);
void SetWeaponNum(int);
void DependentDied(CObject* o);
virtual bool TryTarget(const float3 &pos,bool userTarget,CUnit* unit);
bool TryTarget(CUnit* unit, bool userTarget);
bool TryTargetRotate(CUnit* unit, bool userTarget);
bool TryTargetRotate(float3 pos, bool userTarget);
bool TryTargetHeading(short heading, float3 pos, bool userTarget, CUnit* unit = 0);
bool CobBlockShot(const CUnit* unit);
float TargetWeight(const CUnit* unit) const;
void SlowUpdate(bool noAutoTargetOverride);
virtual void SlowUpdate();
virtual void Update();
virtual float GetRange2D(float yDiff) const;
void HoldFire();
virtual bool AttackUnit(CUnit* unit, bool userTarget);
virtual bool AttackGround(float3 pos, bool userTarget);
void AimReady(int value);
bool ShouldCheckForNewTarget() const;
virtual void Fire(){}; //should be implemented by subclasses
void ScriptReady(void);
CUnit* owner;
const WeaponDef *weaponDef;
std::string modelDispList;
int weaponNum; //the weapons order among the owner weapons
bool haveUserTarget;
float areaOfEffect;
float3 relWeaponPos; //weaponpos relative to the unit
float3 weaponPos; //absolute weapon pos
float3 relWeaponMuzzlePos; //position of the firepoint
float3 weaponMuzzlePos;
float3 weaponDir;
float muzzleFlareSize; //size of muzzle flare if drawn
int useWeaponPosForAim; //sometimes weapon pos is better to use than aimpos
bool hasCloseTarget; //might need to update weapon pos more often when enemy is near
int reloadTime; //time between succesive fires in ticks
int reloadStatus; //next tick the weapon can fire again
float range;
float heightMod; //how much extra range the weapon gain per height difference
float projectileSpeed;
float accuracy; //inaccuracy of whole salvo
float sprayangle; //inaccuracy of individual shots inside salvo
int salvoDelay; //delay between shots in a salvo
int salvoSize; //number of shots in a salvo
int nextSalvo; //when the next shot in the current salvo will fire
int salvoLeft; //number of shots left in current salvo
float3 salvoError; //error vector for the whole salvo
TargetType targetType; //indicated if we have a target and what type
CUnit* targetUnit; //the targeted unit if targettype=unit
float3 targetPos; //the position of the target (even if targettype=unit)
int lastTargetRetry; //when we last recalculated target selection
float predict; //how long time we predict it take for a projectile to reach target
float predictSpeedMod; //how the weapon predicts the speed of the units goes -> 1 when experience increases
float metalFireCost;
float energyFireCost; //part of unit supply used to fire a salvo (transformed by unitloader)
int fireSoundId;
float fireSoundVolume;
bool cobHasBlockShot; //set when the script has a BlockShot() function for this weapon
bool hasTargetWeight; //set when there's a TargetWeight() function for this weapon
bool angleGood; //set when script indicated ready to fire
bool avoidTarget; //set when the script wants the weapon to pick a new target, reset once one has been chosen
bool subClassReady; //set to false if the subclassed weapon cant fire for some reason
bool onlyForward; //can only fire in the forward direction of the unit (for aircrafts mostly?)
float maxAngleDif; //max dotproduct between wanted and actual angle to fire
float3 wantedDir; //the angle we want to aim in,set by the weapon subclass
float3 lastRequestedDir; //last angle we called the script with
int lastRequest; //when the last script call was done
unsigned int badTargetCategory; //targets in this category get a lot lower targetting priority
unsigned int onlyTargetCategory; //only targets in this category can be targeted (default 0xffffffff)
std::list<CWeaponProjectile*> incoming; //nukes that are on the way to our area
CWeaponProjectile* interceptTarget; //nuke that we currently targets
float buildPercent; //how far we have come on building current missile if stockpiling
int numStockpiled; //how many missiles we have stockpiled
int numStockpileQued; //how many weapons the user have added to our que
void CheckIntercept(void);
float3 errorVector;
float3 errorVectorAdd;
int lastErrorVectorUpdate;
CWeapon* slavedTo; //use this weapon to choose target
float3 mainDir; //main aim dir of weapon
float maxMainDirAngleDif; //how far away from main aim dir the weapon can aim at something (as an acos value)
bool avoidFriendly; //if true tried to avoid friendly Units when aiming.
bool avoidFeature; //if true try to avoid Features while aiming.
float targetBorder; // if nonzero, targetting units will TryTarget at the edge of collision sphere (radius*tag value, [-1;1]) instead of its centre
float cylinderTargetting; //if greater than 0, range will be checked in a cylinder (height=range*cylinderTargetting) instead of a sphere
float minIntensity; // for beamlasers - always hit with some minimum intensity (a damage coeffcient normally dependent on distance). do not confuse with intensity tag, it's completely unrelated.
float heightBoostFactor; //controls cannon range height boost. default: -1 -- automatically calculate a more or less sane value
unsigned int collisionFlags;
float fuelUsage;
};
#endif /* WEAPON_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?