merge test
This commit is contained in:
commit
4737b5e3f4
9
README.md
Normal file
9
README.md
Normal file
@ -0,0 +1,9 @@
|
||||
* 击杀情况
|
||||
|
||||
1、自杀(击按钮)
|
||||
2、自杀(主动离开)
|
||||
3、子弹击杀
|
||||
4、毒圈
|
||||
5、爆炸
|
||||
6、buff
|
||||
|
@ -39,7 +39,7 @@ float Ability::GetAttrAbs(int attr_id)
|
||||
|
||||
float Ability::GetAttrRate(int attr_id)
|
||||
{
|
||||
float attr_rate_val = GetBuffAttrRate(attr_id);
|
||||
float attr_rate_val = GetBuffAttrRate(attr_id) / 100.0f;
|
||||
return attr_rate_val;
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@ struct xtimer_list;
|
||||
class Buff
|
||||
{
|
||||
public:
|
||||
int buff_uniid = 0;
|
||||
Creature* owner = nullptr;
|
||||
MetaData::Buff* meta = nullptr;
|
||||
MetaData::Skill* skill_meta = nullptr;
|
||||
|
@ -343,22 +343,37 @@ float Bullet::GetExplosionRange()
|
||||
|
||||
void Bullet::Check(float distance)
|
||||
{
|
||||
int c_hit_num = 0;
|
||||
int t_hit_num = 0;
|
||||
std::set<Entity*> objects;
|
||||
room->grid_service->TraverseCreatures
|
||||
(room->GetRoomIdx(),
|
||||
GetGridList(),
|
||||
[this, &objects] (Creature* c, bool& stop)
|
||||
[this, &objects, &c_hit_num] (Creature* c, bool& stop)
|
||||
{
|
||||
if (sender.Get()->IsProperTarget(c)) {
|
||||
if (gun_meta->i->ispenetrate() &&
|
||||
hit_objects_.find(c->GetUniId()) != hit_objects_.end()) {
|
||||
//穿人
|
||||
return;
|
||||
}
|
||||
AabbCollider aabb_box;
|
||||
c->GetHitAabbBox(aabb_box);
|
||||
if (c != sender.Get() && !c->dead && TestCollision(room, &aabb_box)) {
|
||||
if (meta->i->_inventory_slot() == IS_C4) {
|
||||
if (!c->IsHuman()) {
|
||||
objects.insert(c);
|
||||
if (gun_meta->i->ispenetrate()) {
|
||||
++c_hit_num;
|
||||
hit_objects_.insert(c->GetUniId());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
objects.insert(c);
|
||||
if (gun_meta->i->ispenetrate()) {
|
||||
++c_hit_num;
|
||||
hit_objects_.insert(c->GetUniId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -369,9 +384,18 @@ void Bullet::Check(float distance)
|
||||
for (ColliderComponent* collider : colliders) {
|
||||
if (collider->owner->IsEntityType(ET_Obstacle)) {
|
||||
Obstacle* obstacle = (Obstacle*)collider->owner;
|
||||
if (gun_meta->i->is_penetrate_thing() &&
|
||||
hit_objects_.find(obstacle->GetUniId()) != hit_objects_.end()) {
|
||||
//穿物件
|
||||
continue;
|
||||
}
|
||||
if (!obstacle->CanThroughable(this)) {
|
||||
if (TestCollision(room, collider)) {
|
||||
objects.insert(collider->owner);
|
||||
if (gun_meta->i->is_penetrate_thing()) {
|
||||
++t_hit_num;
|
||||
hit_objects_.insert(collider->owner->GetUniId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -390,8 +414,18 @@ void Bullet::Check(float distance)
|
||||
if (!objects.empty()) {
|
||||
OnHit(objects);
|
||||
}
|
||||
room->RemoveObjectLater(this);
|
||||
later_removed_ = true;
|
||||
bool need_remove = true;
|
||||
if (distance < bullet_range) {
|
||||
if (!gun_meta->i->is_penetrate_thing() && t_hit_num > 0 ||
|
||||
!gun_meta->i->ispenetrate() && c_hit_num > 0) {
|
||||
} else {
|
||||
need_remove = false;
|
||||
}
|
||||
}
|
||||
if (need_remove) {
|
||||
room->RemoveObjectLater(this);
|
||||
later_removed_ = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -66,6 +66,7 @@ private:
|
||||
bool later_removed_ = false;
|
||||
std::shared_ptr<Ability> ability_;
|
||||
bool is_curr_weapon = false;
|
||||
std::set<int> hit_objects_;
|
||||
|
||||
friend class EntityFactory;
|
||||
};
|
||||
|
@ -304,6 +304,14 @@ bool ColliderComponent::CalcSafePointEx(const a8::Vec2& a_pos, ColliderComponent
|
||||
return false;
|
||||
}
|
||||
|
||||
void AabbCollider::MoveCenter(float x, float y)
|
||||
{
|
||||
_min.x += x;
|
||||
_min.y += y;
|
||||
_max.x += x;
|
||||
_max.y += y;
|
||||
}
|
||||
|
||||
void DestoryCollider(ColliderComponent* collider)
|
||||
{
|
||||
switch (collider->type) {
|
||||
|
@ -32,6 +32,7 @@ public:
|
||||
a8::Vec2 _max;
|
||||
|
||||
AabbCollider() { type = CT_Aabb; };
|
||||
void MoveCenter(float x, float y);
|
||||
};
|
||||
|
||||
class CircleCollider : public ColliderComponent
|
||||
|
@ -111,6 +111,12 @@ enum InventorySlot_e
|
||||
IS_END
|
||||
};
|
||||
|
||||
enum SkillType_e
|
||||
{
|
||||
kActiveSkill = 1,
|
||||
kPassiveSkill = 2
|
||||
};
|
||||
|
||||
enum BuffTriggerType_e
|
||||
{
|
||||
kBTT_UseSkill = 1, //技能释放时触发
|
||||
|
@ -15,6 +15,7 @@ const int kInMountainTopBuffId = 7014;
|
||||
const int kDownBuffId = 7015;
|
||||
const int kPoisioningBuffId = 7016;
|
||||
const int kRescueBuffId = 7017;
|
||||
const int kVertigoBuffId = 7018;
|
||||
|
||||
enum BuffEffectType_e
|
||||
{
|
||||
|
@ -13,6 +13,84 @@
|
||||
#include "trigger.h"
|
||||
#include "car.h"
|
||||
|
||||
struct BulletInfo
|
||||
{
|
||||
CreatureWeakPtr c;
|
||||
MetaData::Equip* weapon_meta = nullptr;
|
||||
MetaData::EquipUpgrade* weapon_upgrade_meta = nullptr;
|
||||
MetaData::Equip* bullet_meta = nullptr;
|
||||
a8::Vec2 bullet_born_pos;
|
||||
a8::Vec2 bullet_dir;
|
||||
float fly_distance = 0;
|
||||
bool is_tank_skin = false;
|
||||
int weapon_lv = 0;
|
||||
int delay_time = 0;
|
||||
int invincible_buff_uniid = 0;
|
||||
};
|
||||
|
||||
static void InternalCreateBullet(BulletInfo& bullet_info)
|
||||
{
|
||||
if (!bullet_info.c.Get()) {
|
||||
return;
|
||||
}
|
||||
Creature* c = bullet_info.c.Get();
|
||||
if (c->dead) {
|
||||
return;
|
||||
}
|
||||
if (c->downed) {
|
||||
return;
|
||||
}
|
||||
if (bullet_info.delay_time <= 0) {
|
||||
int bullet_uniid = 0;
|
||||
if (c->room->BattleStarted() ||
|
||||
(c->room->GetGasData().gas_mode == GasJump &&
|
||||
!c->HasBuffEffect(kBET_Jump))) {
|
||||
bullet_uniid = c->room->CreateBullet
|
||||
(c,
|
||||
c->shot_passenger,
|
||||
bullet_info.weapon_meta,
|
||||
bullet_info.weapon_upgrade_meta,
|
||||
bullet_info.bullet_meta,
|
||||
bullet_info.bullet_born_pos,
|
||||
bullet_info.bullet_dir,
|
||||
bullet_info.fly_distance,
|
||||
bullet_info.is_tank_skin);
|
||||
}
|
||||
if (bullet_uniid == 0) {
|
||||
bullet_uniid = c->room->AllocUniid();
|
||||
}
|
||||
c->room->frame_event.AddBullet
|
||||
(bullet_uniid,
|
||||
c->GetWeakPtrRef(),
|
||||
bullet_info.weapon_meta,
|
||||
bullet_info.weapon_lv,
|
||||
bullet_info.bullet_born_pos,
|
||||
bullet_info.bullet_dir,
|
||||
bullet_info.fly_distance);
|
||||
} else {
|
||||
BulletInfo* info_copy = new BulletInfo();
|
||||
*info_copy = bullet_info;
|
||||
bullet_info.c.Get()->room->xtimer.AddDeadLineTimerAndAttach
|
||||
(
|
||||
bullet_info.delay_time / FRAME_RATE_MS,
|
||||
a8::XParams()
|
||||
.SetSender(info_copy),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
BulletInfo* info_copy = (BulletInfo*)param.sender.GetUserData();
|
||||
info_copy->delay_time = 0;
|
||||
InternalCreateBullet(*info_copy);
|
||||
},
|
||||
&bullet_info.c.Get()->xtimer_attacher.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
BulletInfo* info_copy = (BulletInfo*)param.sender.GetUserData();
|
||||
delete info_copy;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void InternalShot(Creature* c,
|
||||
MetaData::Equip* weapon_meta,
|
||||
MetaData::EquipUpgrade* weapon_upgrade_meta,
|
||||
@ -47,6 +125,14 @@ void InternalShot(Creature* c,
|
||||
if (skill_id == 0) {
|
||||
c->room->frame_event.AddShot(c->GetWeakPtrRef());
|
||||
}
|
||||
int invincible_buff_uniid = 0;
|
||||
if (weapon_meta->lock_time > 0) {
|
||||
int buff_uniid = c->TryAddBuff(c, kVertigoBuffId);
|
||||
Buff* buff = c->GetBuffByUniId(buff_uniid);
|
||||
if (buff && buff->remover_timer) {
|
||||
c->room->xtimer.ModifyTimer(buff->remover_timer, weapon_meta->lock_time / FRAME_RATE_MS);
|
||||
}
|
||||
}
|
||||
for (auto& tuple : weapon_meta->bullet_born_offset) {
|
||||
a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple));
|
||||
bullet_born_offset.Rotate(c->GetAttackDir().CalcAngle(a8::Vec2::UP));
|
||||
@ -60,31 +146,21 @@ void InternalShot(Creature* c,
|
||||
}
|
||||
}
|
||||
bullet_dir.Rotate(bullet_angle / 180.0f);
|
||||
int bullet_uniid = 0;
|
||||
if (c->room->BattleStarted() ||
|
||||
(c->room->GetGasData().gas_mode == GasJump &&
|
||||
!c->HasBuffEffect(kBET_Jump))) {
|
||||
bullet_uniid = c->room->CreateBullet
|
||||
(c,
|
||||
c->shot_passenger,
|
||||
weapon_meta,
|
||||
weapon_upgrade_meta,
|
||||
bullet_meta,
|
||||
bullet_born_pos,
|
||||
bullet_dir,
|
||||
fly_distance,
|
||||
is_tank_skin);
|
||||
{
|
||||
BulletInfo bullet_info;
|
||||
bullet_info.c = c->GetWeakPtrRef();
|
||||
bullet_info.weapon_meta = weapon_meta;
|
||||
bullet_info.weapon_upgrade_meta = weapon_upgrade_meta;
|
||||
bullet_info.bullet_meta = bullet_meta;
|
||||
bullet_info.bullet_born_pos = bullet_born_pos;
|
||||
bullet_info.bullet_dir = bullet_dir;
|
||||
bullet_info.fly_distance = fly_distance;
|
||||
bullet_info.is_tank_skin = is_tank_skin;
|
||||
bullet_info.weapon_lv = weapon_lv;
|
||||
bullet_info.delay_time = std::get<3>(tuple);
|
||||
bullet_info.invincible_buff_uniid = invincible_buff_uniid;
|
||||
InternalCreateBullet(bullet_info);
|
||||
}
|
||||
if (bullet_uniid == 0) {
|
||||
bullet_uniid = c->room->AllocUniid();
|
||||
}
|
||||
c->room->frame_event.AddBullet(bullet_uniid,
|
||||
c->GetWeakPtrRef(),
|
||||
weapon_meta,
|
||||
weapon_lv,
|
||||
bullet_born_pos,
|
||||
bullet_dir,
|
||||
fly_distance);
|
||||
}
|
||||
c->GetTrigger()->Shot(weapon_meta);
|
||||
if (weapon_meta->i->recoil_force() > 0.000001) {
|
||||
@ -170,6 +246,16 @@ Buff* Creature::GetBuffById(int buff_id)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Buff* Creature::GetBuffByUniId(int buff_uniid)
|
||||
{
|
||||
for (Buff& buff : buff_list_) {
|
||||
if (buff.buff_uniid == buff_uniid) {
|
||||
return &buff;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int Creature::GetBuffNum(int buff_id)
|
||||
{
|
||||
int num = 0;
|
||||
@ -181,14 +267,14 @@ int Creature::GetBuffNum(int buff_id)
|
||||
return num;
|
||||
}
|
||||
|
||||
void Creature::AddBuff(Creature* caster,
|
||||
int Creature::AddBuff(Creature* caster,
|
||||
MetaData::Buff* buff_meta,
|
||||
int skill_lv,
|
||||
MetaData::Skill* buff_skill_meta)
|
||||
{
|
||||
if (buff_meta->i->buff_interval() > 0) {
|
||||
if (buff_interval_hash_.find(buff_meta->i->buff_id()) != buff_interval_hash_.end()) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
buff_interval_hash_[buff_meta->i->buff_id()] = room->GetFrameNo();
|
||||
room->xtimer.AddDeadLineTimerAndAttach
|
||||
@ -206,14 +292,14 @@ void Creature::AddBuff(Creature* caster,
|
||||
}
|
||||
if (buff_meta->i->coexist_num() > 0){
|
||||
if (GetBuffNum(buff_meta->i->buff_id()) >= buff_meta->i->coexist_num()) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (IsImmuneBuffEffect(buff_meta->i->buff_effect())) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
if (buff_meta->i->depend_effect() != 0 && !HasBuffEffect(buff_meta->i->depend_effect())) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
if (!buff_meta->EffectCanStack()) {
|
||||
Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect());
|
||||
@ -224,7 +310,10 @@ void Creature::AddBuff(Creature* caster,
|
||||
if (buff_meta->i->buff_effect() == kBET_OnceChgAttr) {
|
||||
ProcOnceChgAttrBuff(buff_meta);
|
||||
}
|
||||
++buff_uniid_;
|
||||
int new_buff_uniid = buff_uniid_;
|
||||
Buff* buff = &a8::FastAppend(buff_list_);
|
||||
buff->buff_uniid = new_buff_uniid;
|
||||
buff->SetCaster(caster);
|
||||
buff->skill_lv = skill_lv;
|
||||
buff->owner = this;
|
||||
@ -274,6 +363,7 @@ void Creature::AddBuff(Creature* caster,
|
||||
}
|
||||
}
|
||||
}
|
||||
return new_buff_uniid;
|
||||
#ifdef DEBUG
|
||||
SendDebugMsg(a8::Format("添加buff_id:%d effect:%d %s params:%d,%d,%d,%d,%d",
|
||||
{
|
||||
@ -299,21 +389,22 @@ bool Creature::IsImmuneBuffEffect(int buff_effect)
|
||||
return false;
|
||||
}
|
||||
|
||||
void Creature::MustBeAddBuff(Creature* caster, int buff_id)
|
||||
int Creature::MustBeAddBuff(Creature* caster, int buff_id)
|
||||
{
|
||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||
if (!buff_meta) {
|
||||
abort();
|
||||
}
|
||||
AddBuff(caster, buff_meta, 1);
|
||||
return AddBuff(caster, buff_meta, 1);
|
||||
}
|
||||
|
||||
void Creature::TryAddBuff(Creature* caster, int buff_id)
|
||||
int Creature::TryAddBuff(Creature* caster, int buff_id)
|
||||
{
|
||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||
if (buff_meta) {
|
||||
AddBuff(caster, buff_meta, 1);
|
||||
return AddBuff(caster, buff_meta, 1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Creature::RemoveBuffById(int buff_id)
|
||||
@ -512,10 +603,12 @@ void Creature::AddPassiveSkill(int skill_id)
|
||||
skill->Initialzie();
|
||||
passive_skill_hash_[skill_meta->i->skill_id()] = skill;
|
||||
skill->AddPassiveSkillBuff();
|
||||
#if 0
|
||||
if (skill_meta->i->skill_cd() > 10000) {
|
||||
//永久被动被动技能
|
||||
skill->AddPassiveSkillBuff();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -1332,7 +1425,7 @@ void Creature::UpdatePoisoning()
|
||||
} else {
|
||||
dmg = room->GetGasData().old_area_meta->i->hurt();
|
||||
}
|
||||
dmg *= 1 - GetAbility()->GetAttrRate(kHAT_PoisoningReduction);
|
||||
dmg *= 1 + GetAbility()->GetAttrRate(kHAT_PoisoningReduction);
|
||||
dmg = std::max(10.0f, dmg);
|
||||
DecHP(dmg, VP_SafeArea, TEXT("battle_server_killer_gas", "毒圈"), VW_SafeArea);
|
||||
if (dead) {
|
||||
|
@ -92,14 +92,15 @@ class Creature : public MoveableEntity
|
||||
bool HasBuffEffect(int buff_effect_id);
|
||||
Buff* GetBuffByEffectId(int effect_id);
|
||||
Buff* GetBuffById(int buff_id);
|
||||
Buff* GetBuffByUniId(int buff_uniid);
|
||||
int GetBuffNum(int buff_id);
|
||||
void AddBuff(Creature* caster,
|
||||
int AddBuff(Creature* caster,
|
||||
MetaData::Buff* buff_meta,
|
||||
int skill_lv,
|
||||
MetaData::Skill* buff_skill_meta = nullptr);
|
||||
bool IsImmuneBuffEffect(int buff_effect);
|
||||
void MustBeAddBuff(Creature* caster, int buff_id);
|
||||
void TryAddBuff(Creature* caster, int buff_id);
|
||||
int MustBeAddBuff(Creature* caster, int buff_id);
|
||||
int TryAddBuff(Creature* caster, int buff_id);
|
||||
void RemoveBuffById(int buff_id);
|
||||
void ClearBuffById(int buff_id);
|
||||
void RecalcBuffAttr();
|
||||
@ -252,6 +253,7 @@ private:
|
||||
CreatureWeakPtrChunk weak_ptr_chunk_;
|
||||
HumanAbility ability;
|
||||
std::shared_ptr<Ability> ability_;
|
||||
int buff_uniid_ = 1000;
|
||||
std::array<list_head, kBET_End> buff_effect_ = {};
|
||||
std::array<list_head, kBET_End> depend_effect_ = {};
|
||||
std::array<list_head, kCondBuffEnd> cond_buffs_ = {};
|
||||
|
@ -258,9 +258,7 @@ void Human::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data
|
||||
p->set_revive_countdown(countdown);
|
||||
}
|
||||
}
|
||||
if (room->GetRoomMode() == kZombieMode) {
|
||||
p->set_charid(meta->i->id());
|
||||
}
|
||||
p->set_charid(meta->i->id());
|
||||
if (GetCar()) {
|
||||
p->set_car_uniid(GetCar()->car_uniid);
|
||||
p->set_car_seat(GetSeat());
|
||||
@ -357,11 +355,14 @@ void Human::GetAabbBox(AabbCollider& aabb_box)
|
||||
aabb_box._min.y = -GetCar()->meta->i->rad();
|
||||
aabb_box._max.x = GetCar()->meta->i->rad();
|
||||
aabb_box._max.y = GetCar()->meta->i->rad();
|
||||
aabb_box.MoveCenter(GetCar()->hero_meta_->i->move_offset_x(),
|
||||
GetCar()->hero_meta_->i->move_offset_y());
|
||||
} else {
|
||||
aabb_box._min.x = -meta->i->radius();
|
||||
aabb_box._min.y = -meta->i->radius();
|
||||
aabb_box._max.x = meta->i->radius();
|
||||
aabb_box._max.y = meta->i->radius();
|
||||
aabb_box.MoveCenter(meta->i->move_offset_x(), meta->i->move_offset_y());
|
||||
}
|
||||
}
|
||||
|
||||
@ -642,6 +643,8 @@ void Human::FillSMGameOver(cs::SMGameOver& msg)
|
||||
{
|
||||
if (this != member) {
|
||||
member->FillMFTeamData(msg.add_team_data(), true);
|
||||
cs::MFPlayerStats* p = msg.add_player_stats();
|
||||
member->FillMFPlayerStats(p);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
@ -3351,11 +3354,14 @@ void Human::GetHitAabbBox(AabbCollider& aabb_box)
|
||||
aabb_box._min.y = -GetCar()->meta->i->rad();
|
||||
aabb_box._max.x = GetCar()->meta->i->rad();
|
||||
aabb_box._max.y = GetCar()->meta->i->rad();
|
||||
aabb_box.MoveCenter(GetCar()->hero_meta_->i->hit_offset_x(),
|
||||
GetCar()->hero_meta_->i->hit_offset_y());
|
||||
} else {
|
||||
aabb_box._min.x = -GetHitRadius();
|
||||
aabb_box._min.y = -GetHitRadius();
|
||||
aabb_box._max.x = GetHitRadius();
|
||||
aabb_box._max.y = GetHitRadius();
|
||||
aabb_box.MoveCenter(meta->i->hit_offset_x(), meta->i->hit_offset_y());
|
||||
}
|
||||
}
|
||||
|
||||
@ -3533,11 +3539,6 @@ void Human::OnBulletHit(Bullet* bullet)
|
||||
finaly_dmg = std::max(finaly_dmg, 0.0f);
|
||||
#if 0
|
||||
sender->stats.damage_amount_out += finaly_dmg;
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if (App::Instance()->HasFlag(1) && IsPlayer()) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (bullet->meta->buff_meta) {
|
||||
MustBeAddBuff(this, bullet->meta->i->buffid());
|
||||
|
@ -189,12 +189,15 @@ namespace MetaData
|
||||
std::vector<std::string> strings2;
|
||||
a8::Split(str, strings2, ':');
|
||||
assert(strings2.size() >= 2);
|
||||
bullet_born_offset.push_back(std::make_tuple(
|
||||
a8::XValue(strings2[0]).GetDouble(),
|
||||
a8::XValue(strings2[1]).GetDouble(),
|
||||
strings2.size() > 2 ? a8::XValue(strings2[2]).GetDouble() : 0
|
||||
)
|
||||
);
|
||||
bullet_born_offset.push_back
|
||||
(std::make_tuple(
|
||||
a8::XValue(strings2[0]).GetDouble(),
|
||||
a8::XValue(strings2[1]).GetDouble(),
|
||||
strings2.size() > 2 ? a8::XValue(strings2[2]).GetDouble() : 0,
|
||||
strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0
|
||||
)
|
||||
);
|
||||
lock_time += strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0;
|
||||
}
|
||||
}
|
||||
{
|
||||
@ -749,15 +752,29 @@ namespace MetaData
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Skill::Init2()
|
||||
{
|
||||
int skill_id = i->skill_id();
|
||||
if (!(i->skill_type() == kActiveSkill || i->skill_type() == kPassiveSkill)) {
|
||||
abort();
|
||||
}
|
||||
#if 0
|
||||
if (!(i->use_method() == 1 || i->use_method() == 2 || i->use_method() == 3)) {
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
{
|
||||
for (int buff_id : buff_list) {
|
||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||
if (!buff_meta) {
|
||||
#if 1
|
||||
continue;
|
||||
#else
|
||||
abort();
|
||||
#endif
|
||||
}
|
||||
if (i->skill_type() == kPassiveSkill) {
|
||||
if (buff_meta->i->trigger_type() != kBTT_UseSkill) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
auto itr = trigger_type_buffs.find(buff_meta->i->trigger_type());
|
||||
if (itr != trigger_type_buffs.end()) {
|
||||
@ -939,11 +956,29 @@ namespace MetaData
|
||||
}
|
||||
}
|
||||
if (i->buff_effect() == kBET_CondAddBuff) {
|
||||
#if 0
|
||||
if (!IsValidCondBuff(int_param1)) {
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void Buff::Init2()
|
||||
{
|
||||
switch (i->buff_effect()) {
|
||||
case kBET_ChgAttr:
|
||||
{
|
||||
assert(int_param2 == 1 || int_param2 == 2);
|
||||
if (int_param2 == 2) {
|
||||
if (i->buff_param3().find('.') != std::string::npos) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,8 @@ namespace MetaData
|
||||
{
|
||||
const metatable::Equip* i = nullptr;
|
||||
|
||||
std::vector<std::tuple<float, float, float>> bullet_born_offset;
|
||||
int lock_time = 0;
|
||||
std::vector<std::tuple<float, float, float, int>> bullet_born_offset;
|
||||
std::vector<std::tuple<int, a8::Vec2>> shoot_offsets;
|
||||
std::array<int, IS_END> volume = {};
|
||||
int int_param1 = 0;
|
||||
@ -195,6 +196,7 @@ namespace MetaData
|
||||
const metatable::Buff* i = nullptr;
|
||||
|
||||
void Init();
|
||||
void Init2();
|
||||
bool EffectCanStack();
|
||||
bool IsImmuneBuffEffect(int buff_effect);
|
||||
bool Match(CondAddBuff_e cond, int val);
|
||||
@ -241,6 +243,7 @@ namespace MetaData
|
||||
const metatable::Skill* i = nullptr;
|
||||
|
||||
void Init();
|
||||
void Init2();
|
||||
|
||||
float value_up = 0.0f;
|
||||
std::set<int> buff_list;
|
||||
|
@ -445,6 +445,15 @@ private:
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
for (auto& skill : skill_list) {
|
||||
skill.Init2();
|
||||
}
|
||||
for (auto& buff : buff_list) {
|
||||
buff.Init2();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BindToMetaData()
|
||||
|
@ -3914,7 +3914,8 @@ void Room::AirRaid(int airraid_id)
|
||||
}
|
||||
a8::Vec2 dir = a8::Vec2::UP;
|
||||
dir.Rotate(a8::RandAngle());
|
||||
a8::Vec2 center = gas_data_.pos_new + dir * (100 + rand() % gas_data_.new_area_meta->i->rad());
|
||||
float rnd_rad = gas_data_.new_area_meta->i->rad() > 0 ? rand() % gas_data_.new_area_meta->i->rad() : 0;
|
||||
a8::Vec2 center = gas_data_.pos_new + dir * (100 + rnd_rad);
|
||||
{
|
||||
std::vector<Player*> humans;
|
||||
GetAlivePlayers(humans, GetRoomMaxPlayerNum());
|
||||
|
@ -165,7 +165,10 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg)
|
||||
hdr.socket_handle,
|
||||
msg
|
||||
);
|
||||
hum->meta = MetaMgr::Instance()->human_meta;
|
||||
hum->meta = MetaMgr::Instance()->GetPlayer(msg.hero_id());
|
||||
if (!hum->meta) {
|
||||
hum->meta = MetaMgr::Instance()->human_meta;
|
||||
}
|
||||
hum->room = room;
|
||||
room->AddPlayer(hum);
|
||||
hum->ProcPrepareItems(msg.prepare_items());
|
||||
|
@ -10,12 +10,6 @@ namespace cs
|
||||
class MFSkill;
|
||||
}
|
||||
|
||||
enum SkillType_e
|
||||
{
|
||||
kActiveSkill = 1,
|
||||
kPassiveSkill = 2
|
||||
};
|
||||
|
||||
struct xtimer_list;
|
||||
class Creature;
|
||||
class Skill
|
||||
|
@ -268,7 +268,6 @@ message MFPlayerFull
|
||||
|
||||
repeated MFAttrAddition attr_addition= 61; //属性加成
|
||||
|
||||
//一下字段只有僵尸模式才有效
|
||||
optional int32 charid = 44; //人物id
|
||||
optional float speed = 45; //速度
|
||||
|
||||
@ -902,6 +901,7 @@ message CMJoin
|
||||
optional int32 mapid = 53; //地图id 0:随机地图
|
||||
repeated MFPair skill_list = 54; //技能列表 key:技能id value:预留给之后扩展,目前传0就行
|
||||
optional string user_data = 60 [default = ""]; //用户自定义数据
|
||||
optional int32 hero_id = 61; //英雄id
|
||||
}
|
||||
|
||||
//断线重连
|
||||
|
@ -137,6 +137,8 @@ message Equip
|
||||
optional float average_oil = 58;
|
||||
optional float atk_mech = 59;
|
||||
optional int32 use_scene = 60;
|
||||
optional int32 ispenetrate = 61;
|
||||
optional int32 is_penetrate_thing = 62;
|
||||
|
||||
optional string inventory_slot = 31; //库存槽位
|
||||
optional int32 _inventory_slot = 32; //库存槽位
|
||||
@ -152,6 +154,8 @@ message EquipUpgrade
|
||||
message Player
|
||||
{
|
||||
optional int32 id = 1; //唯一id
|
||||
optional float move_offset_x = 40;
|
||||
optional float move_offset_y = 41;
|
||||
optional float radius = 2; //半径
|
||||
optional int32 health = 3; //初始血量
|
||||
optional int32 move_speed = 4; //移动速度
|
||||
@ -175,6 +179,8 @@ message Player
|
||||
optional int32 revive_time = 22;
|
||||
optional string name = 23;
|
||||
optional int32 normal_skill = 24;
|
||||
optional float hit_offset_x = 42;
|
||||
optional float hit_offset_y = 43;
|
||||
optional float hit_radius = 25;
|
||||
optional string ai_script = 26;
|
||||
optional string init_buffs = 27;
|
||||
|
Loading…
x
Reference in New Issue
Block a user