Кто там редактор щупал?
Собрал первые три дллки. На всех остальных ловлю это:
void SBullet::Init(const Fvector& position,
const Fvector& direction,
float starting_speed,
float power,
float impulse,
u16 sender_id,
u16 sendersweapon_id,
ALife::EHitType e_hit_type,
float maximum_distance,
const CCartridge& cartridge,
bool SendHit,
CBulletManager* manager)
{
flags._storage = 0;
pos = position;
speed = max_speed = starting_speed * cartridge.m_kSpeed;
VERIFY (speed>0);
VERIFY(direction.magnitude()>0);
dir.normalize (direction);
hit_power = power * cartridge.m_kHit;
hit_impulse = impulse * cartridge.m_kImpulse;
max_dist = maximum_distance * cartridge.m_kDist;
fly_dist = 0;
parent_id = sender_id;
flags.allow_sendhit = SendHit;
weapon_id = sendersweapon_id;
hit_type = e_hit_type;
pierce = cartridge.m_kPierce;
ap = cartridge.m_kAP;
air_resistance = cartridge.m_kAirRes;
wallmark_size = cartridge.fWallmarkSize;
m_u8ColorID = cartridge.m_u8ColorID;
bullet_material_idx = cartridge.bullet_material_idx;
VERIFY (u16(-1)!=bullet_material_idx);
flags.allow_tracer = !!cartridge.m_flags.test(CCartridge::cfTracer);
flags.allow_ricochet = !!cartridge.m_flags.test(CCartridge::cfRicochet);
flags.explosive = !!cartridge.m_flags.test(CCartridge::cfExplosive);
flags.skipped_frame = 0;
targetID = 0;
//Новая баллистика!
u8 type = manager.m_type_ballistic
if (GameID()!=GAME_SINGLE || type==1){
air_resistance /= max_speed;
manager.m_type_ballistic = 1;
}else if(type==0)
air_resistance = manager.m_fAirResistanceK;
else
air_resistance *= 0.001f;
}
void CBulletManager::Load ()
{
m_fTracerWidth = pSettings->r_float(BULLET_MANAGER_SECTION, "tracer_width");
m_fTracerLengthMax = pSettings->r_float(BULLET_MANAGER_SECTION, "tracer_length_max");
m_fTracerLengthMin = pSettings->r_float(BULLET_MANAGER_SECTION, "tracer_length_min");
m_fGravityConst = pSettings->r_float(BULLET_MANAGER_SECTION, "gravity_const");
m_fAirResistanceK = pSettings->r_float(BULLET_MANAGER_SECTION, "air_resistance_k");
m_dwStepTime = pSettings->r_u32 (BULLET_MANAGER_SECTION, "time_step");
m_fMinBulletSpeed = pSettings->r_float(BULLET_MANAGER_SECTION, "min_bullet_speed");
m_fCollisionEnergyMin = pSettings->r_float(BULLET_MANAGER_SECTION, "collision_energy_min");
m_fCollisionEnergyMax = pSettings->r_float(BULLET_MANAGER_SECTION, "collision_energy_max");
m_fHPMaxDist = pSettings->r_float(BULLET_MANAGER_SECTION, "hit_probability_max_dist");
LPCSTR whine_sounds = pSettings->r_string(BULLET_MANAGER_SECTION, "whine_sounds");
int cnt = _GetItemCount(whine_sounds);
xr_string tmp;
for (int k=0; k<cnt; ++k){
m_WhineSounds.push_back (ref_sound());
m_WhineSounds.back().create(_GetItem(whine_sounds,k,tmp),st_Effect,sg_SourceType
);
}
LPCSTR explode_particles= pSettings->r_string(BULLET_MANAGER_SECTION, "explode_particles");
cnt = _GetItemCount(explode_particles);
for (int k=0; k<cnt; ++k)
m_ExplodeParticles.push_back (_GetItem(explode_particles,k,tmp));
m_type_ballistic = READ_IF_EXISTS(pSettings, r_u8, BULLET_MANAGER_SECTION, "type_ballistic", 0);
}
bool CBulletManager::CalcBullet(collide::rq_results& rq_storage, xr_vector<ISpatial*>& rq_spatial, SBullet* bullet, u32 delta_time)
{
float delta_time_sec = float(delta_time)/1000.f;
float range = bullet->speed*delta_time_sec;
float max_range = bullet->max_dist - bullet->fly_dist;
range = _min(range, max_range);
//запомнить текущую скорость пули, т.к. в
//RayQuery() она может поменяться из-за рикошетов
//и столкновений с объектами
Fvector cur_dir = bullet->dir;
bullet_test_callback_data bullet_data;
bullet_data.pBullet = bullet;
bullet_data.bStopTracing = true;
bullet->flags.ricochet_was = 0;
collide::ray_defs RD(bullet->pos, bullet->dir, range, CDB::OPT_CULL, collide::rqtBoth);
BOOL result = Level().ObjectSpace.RayQuery(rq_storage, RD, firetrace_callback, &bullet_data, test_callback, NULL);
if (result & bullet_data.bStopTracing) {
range = (rq_storage.r_begin()+rq_storage.r_count()-1)->range;
}
bullet->flags.skipped_frame = (Device.dwFrame >= bullet->frame_num);
if(!bullet->flags.ricochet_was) {
range = _max(EPS_L, range);
//изменить положение пули
bullet->pos.mad(bullet->pos, cur_dir, range);
bullet->fly_dist += range;
if(bullet->fly_dist>=bullet->max_dist)
return false;
//определим вылет за уровень
if(!Fbox4::point_in_box(m_BoundingVolume, bullet->pos))
return false;
//изменить скорость и направление ее полета и с учетом гравитации
float k_speed = bullet->air_resistance*delta_time_sec;
if (m_type_ballistic != 0)
k_speed *= bullet->speed;
bullet->dir.mul(bullet->speed*(1.0-k_speed)); //получим вектор скорости
bullet->dir.y -= m_fGravityConst*delta_time_sec;
bullet->speed = bullet->dir.magnitude();
bullet->dir.mul(1.0/bullet->speed); //в место normalize()
}
return (m_fMinBulletSpeed < bullet->speed);
}