Compare commits

..

6 Commits
dev ... master

Author SHA1 Message Date
aozhiwei
d94635c78c 修复点射问题 2020-11-30 13:46:58 +08:00
aozhiwei
a9e333e909 1 2020-09-18 12:07:49 +08:00
aozhiwei
c56c6427da 复活添加能量护盾 2020-09-16 14:23:01 +08:00
aozhiwei
2b58177482 1 2020-09-14 13:31:06 +08:00
aozhiwei
f07f400287 1 2020-08-11 16:25:36 +08:00
aozhiwei
c2eb1b4e40 1 2020-08-10 17:30:14 +08:00
29 changed files with 143 additions and 394 deletions

View File

@ -31,25 +31,25 @@ def getExeCmdLine(pid):
def stop(instance_id, node_id, times = 0):
if times > 2:
return
gameserver_ids = getRuningProgramPids('gameserver2001')
gameserver_ids = getRuningProgramPids('gameserver')
pids = gameserver_ids
for pid in pids:
exepath = getExePath(pid)
cmdline = getExeCmdLine(pid)
if cmdline.find("./gameserver2001\0-i\0%d\0-n\0%d\0" % (instance_id, node_id)) > -1:
if cmdline.find("./gameserver\0-i\0%d\0-n\0%d\0" % (instance_id, node_id)) > -1:
os.popen('kill -9 %d' % int(pid))
#endfor
gameserver_ids = getRuningProgramPids('gameserver2001')
gameserver_ids = getRuningProgramPids('gameserver')
pids = gameserver_ids
for pid in pids:
exepath = getExePath(pid)
cmdline = getExeCmdLine(pid)
if cmdline.find("./gameserver2001\0-i\0%d\0-n\0%d\0" % (instance_id, node_id)) > -1:
if cmdline.find("./gameserver\0-i\0%d\0-n\0%d\0" % (instance_id, node_id)) > -1:
time.sleep(1)
stop(instance_id, node_id, times + 1)
def listServer():
gameserver_ids = getRuningProgramPids('gameserver2001')
gameserver_ids = getRuningProgramPids('gameserver')
pids = gameserver_ids
for pid in pids:
exepath = getExePath(pid)
@ -63,7 +63,7 @@ def restartServer(str_instance_ids, str_node_id):
instance_id = int(instance_id)
stop(instance_id, node_id)
time.sleep(0.5)
print('gameserver2001 %d starting......' % instance_id)
print('gameserver %d starting......' % instance_id)
cmd = 'sh start_instance.sh %d %d' % (instance_id, node_id)
os.popen(cmd)
time.sleep(0.5)

View File

@ -1,5 +1,16 @@
#!/bin/bash
python manage.py restart $1 $2
source /etc/profile
source /root/.bash_profile
echo 'success'
pid=$(ps -ef|grep "gameserver2001 -n $2 -i $1"|grep -v grep|awk '{print $2}')
echo $pid
if [[ $pid != "" ]]
then
echo $pid|xargs kill -9
else
echo "pid 为空"
fi
nohup ./gameserver2001 -n $2 -i $1 >> gameserver2001$2_$1.out &

View File

@ -3,5 +3,5 @@
source /etc/profile
source /root/.bash_profile
nohup ./gameserver2001 -i $1 -n $2 >> gameserver$2_$1.out 2>&1 &
nohup ./gameserver -i $1 -n $2 -f1,2,3,4,6>> gameserver$2_$1.out 2>&1 &

View File

@ -90,9 +90,6 @@ void AndroidAI::ChangeToState(AndroidState_e to_state)
void AndroidAI::DoMove()
{
Human* hum = (Human*)owner;
if (hum->room->IsWaitingStart()) {
return;
}
if (a8::HasBitFlag(hum->status, HS_Fly)) {
return;
}
@ -121,9 +118,6 @@ void AndroidAI::DoAttack()
a8::HasBitFlag(hum->status, HS_Jump)) {
return;
}
if (hum->room->IsWaitingStart()) {
return;
}
if (hum->room->gas_data.gas_mode == GasInactive) {
return;
}

View File

@ -39,7 +39,7 @@ void Building::RecalcSelfCollider()
}
}
void Building::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
void Building::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Building);
cs::MFBuildingPart* p = part_data->mutable_union_obj_3();
@ -47,28 +47,10 @@ void Building::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
TypeConvert::ToPb(pos, p->mutable_pos());
}
void Building::FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data)
void Building::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(ET_Building);
if (IsClientCached(hum)) {
int object_flags = 0;
a8::SetBitFlag(object_flags, kOfReadCache);
full_data->set_obj_uniid(GetEntityUniId());
full_data->set_object_flags(object_flags);
return;
}
cs::MFBuildingFull* p = full_data->mutable_union_obj_3();
if (CanClientCache(hum)) {
int object_flags = 0;
a8::SetBitFlag(object_flags, kOfWriteCache);
#if 0
full_data->set_obj_uniid(GetEntityUniId());
#endif
full_data->set_object_flags(object_flags);
AddClientCache(hum);
}
p->set_obj_uniid(entity_uniid);
TypeConvert::ToPb(pos, p->mutable_pos());

View File

@ -22,7 +22,7 @@ class Building : public Entity
virtual ~Building() override;
virtual void Initialize() override;
void RecalcSelfCollider();
virtual void FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data) override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
virtual void GetAabbBox(AabbCollider& aabb_box) override;
};

View File

@ -179,17 +179,6 @@ enum MapObjectType_e
kMOT_SpawnPoint = 2
};
enum ObjectFlags_e
{
kOfWriteCache = 0,
kOfReadCache = 1,
};
enum ObjectSyncFlags_e
{
kOsfIsDead = 0,
};
const char* const PROJ_NAME_FMT = "game%d_gameserver";
const char* const PROJ_ROOT_FMT = "/data/logs/%s";
@ -230,5 +219,3 @@ const int MAX_ALL_HTTP_NUM = MAX_SYS_HTTP_NUM + MAX_USER_HTTP_NUM;
const int DEFAULT_BORN_POINT_X = 3000;
const int DEFAULT_BORN_POINT_Y = 3000;
const int FIXED_OBJECT_MAXID = 1024;
const int VIEW_RANGE = 512;

View File

@ -6,7 +6,6 @@
#include "building.h"
#include "human.h"
#include "app.h"
#include "obstacle.h"
Entity::Entity()
{
@ -110,50 +109,3 @@ void Entity::AddCollider(ColliderComponent* collider)
{
colliders.push_back(collider);
}
bool Entity::IsClientCached(Human* hum)
{
ObjectSyncFlags* sync_flags = hum->GetObjectSyncFlags(GetEntityUniId());
if (sync_flags) {
int flags = sync_flags->flags;
if (IsDead(hum->room)) {
if (a8::HasBitFlag(flags, kOsfIsDead)) {
return sync_flags->last_sync_frameno > 0;
} else {
return false;
}
} else {
if (!a8::HasBitFlag(flags, kOsfIsDead)) {
return sync_flags->last_sync_frameno > 0;
} else {
return false;
}
}
}
return false;
}
bool Entity::CanClientCache(Human* hum)
{
ObjectSyncFlags* sync_flags = hum->GetObjectSyncFlags(GetEntityUniId());
if (sync_flags && entity_type == ET_Obstacle) {
Obstacle* obstacle = (Obstacle*)this;
return !obstacle->is_door;
}
return sync_flags != nullptr;
}
void Entity::AddClientCache(Human* hum)
{
ObjectSyncFlags* sync_flags = hum->GetObjectSyncFlags(GetEntityUniId());
if (sync_flags) {
int flags = sync_flags->flags;
if (IsDead(hum->room)) {
a8::SetBitFlag(flags, kOsfIsDead);
} else {
a8::UnSetBitFlag(flags, kOsfIsDead);
}
sync_flags->flags = flags;
sync_flags->last_sync_frameno = hum->room->GetFrameNo();
}
}

View File

@ -8,7 +8,6 @@ namespace cs
class MFObjectFull;
}
class Human;
class Room;
class Obstacle;
class ColliderComponent;
@ -37,8 +36,8 @@ class Entity
virtual ~Entity();
virtual void Initialize();
virtual void Update(int delta_time) {};
virtual void FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data) {};
virtual void FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data) {};
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) {};
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) {};
virtual float GetSpeed() { return 1.0f;};
virtual void GetAabbBox(AabbCollider& aabb_box);
virtual void GetCircleBox(CircleCollider& circle_box);
@ -48,13 +47,6 @@ class Entity
void BroadcastFullState();
void BroadcastDeleteState();
void AddCollider(ColliderComponent* collider);
int GetEntityUniId() const { return entity_uniid; }
virtual bool IsDead(Room* room) { return dead;};
protected:
bool IsClientCached(Human* hum);
bool CanClientCache(Human* hum);
void AddClientCache(Human* hum);
private:
std::list<ColliderComponent*> colliders;

View File

@ -47,10 +47,8 @@ void FrameEvent::AddShot(Human* hum)
} else {
hum->curr_weapon->ToPB(p.mutable_weapon());
}
#if 0
p.set_offhand(true);
p.set_bullskin(10001);
#endif
}
{
int shot_idx = shots_.size() - 1;
@ -77,9 +75,7 @@ void FrameEvent::AddBullet(Human* hum, a8::Vec2 born_pos, a8::Vec2 dir, float fl
}
TypeConvert::ToPb(born_pos, p.mutable_pos());
TypeConvert::ToPb(dir, p.mutable_dir());
#if 0
p.set_bulletskin(10001);
#endif
if (hum->tank_weapon.meta) {
p.set_gun_id(hum->tank_weapon.meta->i->id());
p.set_gun_lv(hum->tank_weapon.weapon_lv);

View File

@ -21,7 +21,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
a8::HasBitFlag(((Human*)itr)->status, HS_Fly)) {
continue;
}
itr->FillMFObjectFull((Human*)hum, msg->add_full_objects());
itr->FillMFObjectFull(msg->add_full_objects());
}
for (auto& itr : hum->part_objects) {
Entity* entity = itr;
@ -35,10 +35,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
continue;
}
}
if (((Human*)hum)->pos.ManhattanDistance(entity->pos) > VIEW_RANGE + 200) {
continue;
}
entity->FillMFObjectPart((Human*)hum, msg->add_part_objects());
entity->FillMFObjectPart(msg->add_part_objects());
}
for (auto& itr : hum->del_objects) {
msg->add_del_objids(itr);
@ -154,10 +151,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
msg->set_gas_progress(room->gas_data.gas_progress);
TypeConvert::ToPb(room->gas_data.pos_old, msg->mutable_gas_pos_old());
}
if (room->GetFrameNo() - room->AliveCountChgFrameNo() <= 4 ||
room->GetFrameNo() - hum->join_frameno <= 2) {
msg->set_alive_count(room->AliveCount());
}
}
return msg;
}

View File

@ -32,7 +32,7 @@ void Hero::RecalcSelfCollider()
self_collider_->rad = master->GetRadius();
}
void Hero::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
void Hero::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(entity_type);
cs::MFHeroPart* p = part_data->mutable_union_obj_10();
@ -41,7 +41,7 @@ void Hero::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
TypeConvert::ToPb(attack_dir, p->mutable_dir());
}
void Hero::FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data)
void Hero::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(entity_type);
cs::MFHeroFull* p = full_data->mutable_union_obj_10();

View File

@ -26,8 +26,8 @@ class Hero : public Entity
virtual ~Hero() override;
virtual void Initialize() override;
void RecalcSelfCollider();
virtual void FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data) override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
private:
CircleCollider* self_collider_ = nullptr;

View File

@ -93,7 +93,7 @@ float Human::GetSpeed4()
return meta->i->move_speed4();
}
void Human::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
void Human::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Player);
cs::MFPlayerPart* p = part_data->mutable_union_obj_1();
@ -102,7 +102,7 @@ void Human::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
TypeConvert::ToPb(attack_dir, p->mutable_dir());
}
void Human::FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data)
void Human::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(ET_Player);
cs::MFPlayerFull* p = full_data->mutable_union_obj_1();
@ -238,25 +238,15 @@ void Human::FillMFTeamData(cs::MFTeamData* team_data)
room->frame_no - last_sync_teamdata_frameno_ > SERVER_FRAME_RATE * 2) {
#endif
last_sync_teamdata_frameno_ = room->frame_no;
team_data->set_player_id(entity_uniid);
if (room->gas_data.gas_mode == GasInactive) {
team_data->set_name(name);
}
if (room->gas_data.gas_mode != GasInactive &&
room->GetFrameNo() - room->GetBattleStartFrameNo() < 4) {
team_data->set_name(name);
team_data->set_disconnected(socket_handle == 0);
}
TypeConvert::ToPb(pos, team_data->mutable_pos());
TypeConvert::ToPb(attack_dir, team_data->mutable_dir());
team_data->set_health(health);
team_data->set_max_health(GetMaxHP());
team_data->set_disconnected(false);
team_data->set_dead(dead);
team_data->set_downed(downed);
#if 0
team_data->set_disconnected(false);
#endif
}
}
@ -1665,7 +1655,7 @@ void Human::SendUpdateMsg()
}
for (Entity* entity : view_objects) {
if (new_objects.find(entity) == new_objects.end()) {
entity->FillMFObjectFull(this, msg->add_full_objects());
entity->FillMFObjectFull(msg->add_full_objects());
}
}
refreshed_view = true;
@ -2517,12 +2507,3 @@ void Human::ResetTankSkin()
tank_oil_max = 0.0f;
RecalcSelfCollider();
}
ObjectSyncFlags* Human::GetObjectSyncFlags(int obj_uniid)
{
if ((size_t)obj_uniid < fixed_object_sync_flags_.size()) {
return &fixed_object_sync_flags_[obj_uniid];
} else {
return nullptr;
}
}

View File

@ -118,7 +118,7 @@ class Human : public Entity
std::set<Human*> kill_humans;
Human* last_tank_attacker = nullptr;
long long last_tank_attack_idx = 0;
BornPoint* born_point = nullptr;
const BornPoint* born_point = nullptr;
bool shot_start = false;
bool shot_hold = false;
@ -138,8 +138,8 @@ class Human : public Entity
virtual void Initialize() override;
virtual float GetSpeed() override;
virtual float GetSpeed4();
virtual void FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data) override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
virtual void GetAabbBox(AabbCollider& aabb_box);
void FillMFTeamData(cs::MFTeamData* team_data);
@ -218,7 +218,6 @@ class Human : public Entity
void OnDie();
void FreeDownedTimer();
void FreeReviveTimer();
ObjectSyncFlags* GetObjectSyncFlags(int obj_uniid);
protected:
void _UpdateMove(int speed);
@ -269,8 +268,6 @@ protected:
Human* follow_target_ = nullptr;
bool follow_synced_active_player = false;
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
private:
CircleCollider* self_collider_ = nullptr;
long long last_sync_gas_frameno = 0;

View File

@ -29,7 +29,7 @@ void Loot::RecalcSelfCollider()
{
}
void Loot::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
void Loot::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Loot);
cs::MFLootPart* p = part_data->mutable_union_obj_5();
@ -37,7 +37,7 @@ void Loot::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
TypeConvert::ToPb(pos, p->mutable_pos());
}
void Loot::FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data)
void Loot::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(ET_Loot);
cs::MFLootFull* p = full_data->mutable_union_obj_5();

View File

@ -26,6 +26,6 @@ class Loot : public Entity
virtual ~Loot() override;
virtual void Initialize() override;
void RecalcSelfCollider();
virtual void FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data) override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
};

View File

@ -49,6 +49,7 @@ public:
std::list<MetaData::KillPoint> killpoint_list;
std::list<metatable::Robot> robot_meta_list;
std::vector<MetaData::Robot> robot_list;
std::list<metatable::Text> text_meta_list;
std::map<std::string, MetaData::Parameter*> parameter_hash;
std::map<int, MetaData::Map*> gamemap_hash;
@ -72,6 +73,7 @@ public:
std::map<int, MetaData::EquipUpgrade*> equipupgrade_hash;
std::map<int, MetaData::Robot*> robot_hash;
std::map<int, std::vector<MetaData::AirLine*>> airline_hash;
std::map<std::string, std::string> text_hash;
void Load()
{
@ -115,6 +117,7 @@ public:
f8::ReadCsvMetaFile(res_path + "rankPoint@rankPoint.csv", rankpoint_meta_list);
f8::ReadCsvMetaFile(res_path + "equipUpgrade@equipUpgrade.csv", equipupgrade_meta_list);
f8::ReadCsvMetaFile(res_path + "robot@robot.csv", robot_meta_list);
f8::ReadCsvMetaFile(res_path + "text@text.csv", text_meta_list);
BindToMetaData();
#if 1
{
@ -129,6 +132,7 @@ public:
MetaMgr::Instance()->tank_damage_interval = MetaMgr::Instance()->GetSysParamAsFloat("tank_damage_interval", 1);
MetaMgr::Instance()->average_oil = MetaMgr::Instance()->GetSysParamAsInt("average_oil");
MetaMgr::Instance()->max_oil = MetaMgr::Instance()->GetSysParamAsInt("max_oil");
MetaMgr::Instance()->max_energy_shield = MetaMgr::Instance()->GetSysParamAsInt("max_energy_shield");
if (MetaMgr::Instance()->K < 0.01f) {
abort();
}
@ -310,6 +314,10 @@ private:
robot_hash[meta.id()] = &item;
}
for (auto& meta : text_meta_list) {
text_hash[meta.textid()] = meta.text();
}
}
private:
@ -496,3 +504,9 @@ MetaData::Robot* MetaMgr::GetRobot(int robot_id)
auto itr = loader_->robot_hash.find(robot_id);
return itr != loader_->robot_hash.end() ? itr->second : nullptr;
}
std::string MetaMgr::GetText(const std::string& textid, const std::string& def_text)
{
auto itr = loader_->text_hash.find(textid);
return itr != loader_->text_hash.end() ? itr->second : def_text;
}

View File

@ -42,6 +42,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
int GetKillPointParam2(int kill_num);
std::vector<MetaData::Robot>* GetRobotList();
MetaData::Robot* GetRobot(int robot_id);
std::string GetText(const std::string& textid, const std::string& def_text);
int gas_inactive_time = 10;
int jump_time = 10;
@ -54,6 +55,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
float tank_damage_interval = 0.0f;
float average_oil = 0.0f;
float max_oil = 0.0f;
int max_energy_shield = 100;
private:
MetaDataLoader* loader_ = nullptr;

View File

@ -93,7 +93,7 @@ void Obstacle::RecalcSelfCollider()
}
}
void Obstacle::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
void Obstacle::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Obstacle);
cs::MFObstaclePart* p = part_data->mutable_union_obj_2();
@ -102,28 +102,10 @@ void Obstacle::FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data)
p->set_scale(1.0f);
}
void Obstacle::FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data)
void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(ET_Obstacle);
if (IsClientCached(hum)) {
int object_flags = 0;
a8::SetBitFlag(object_flags, kOfReadCache);
full_data->set_obj_uniid(GetEntityUniId());
full_data->set_object_flags(object_flags);
return;
}
cs::MFObstacleFull* p = full_data->mutable_union_obj_2();
if (CanClientCache(hum)) {
int object_flags = 0;
a8::SetBitFlag(object_flags, kOfWriteCache);
#if 0
full_data->set_obj_uniid(GetEntityUniId());
#endif
full_data->set_object_flags(object_flags);
AddClientCache(hum);
}
p->set_obj_uniid(entity_uniid);
TypeConvert::ToPb(pos, p->mutable_pos());
p->set_scale(1.0f);

View File

@ -39,8 +39,8 @@ class Obstacle : public Entity
virtual ~Obstacle() override;
virtual void Initialize() override;
void RecalcSelfCollider();
virtual void FillMFObjectPart(Human* hum, cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(Human* hum, cs::MFObjectFull* full_data) override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
virtual void GetAabbBox(AabbCollider& aabb_box) override;
virtual void GetCircleBox(CircleCollider& circle_box) override;
void Explosion(Bullet* bullet);

View File

@ -31,7 +31,12 @@ void Player::Initialize()
{
Human::Initialize();
health = meta->i->health();
if (energy_shield) {
energy_shield = MetaMgr::Instance()->max_energy_shield;
max_energy_shield = energy_shield;
} else {
max_energy_shield = 0;
}
skin_meta = MetaMgr::Instance()->GetDress(SkinId());
if (skin_meta) {
skill_meta = MetaMgr::Instance()->GetSkill(skin_meta->i->skill_id());
@ -107,9 +112,7 @@ void Player::UpdateMove()
if (action_type == AT_Relive) {
CancelAction();
}
if (dead ||
room->IsWaitingStart() ||
a8::HasBitFlag(status, HS_Fly)) {
if (dead || a8::HasBitFlag(status, HS_Fly)) {
moving = false;
moved_frames = 0;
last_collision_door = nullptr;
@ -139,8 +142,6 @@ void Player::UpdateMove()
void Player::UpdateShot()
{
if (dead ||
downed ||
room->IsWaitingStart() ||
a8::HasBitFlag(status, HS_Fly) ||
a8::HasBitFlag(status, HS_Jump) ) {
shot_start = false;
@ -437,11 +438,7 @@ void Player::Shot()
AutoLoadingBullet();
}
last_shot_frameno_ = room->frame_no;
#if 1
room->frame_event.AddBulletNumChg(this);
#else
need_sync_active_player = true;
#endif
}
void Player::ProcInteraction()
@ -870,8 +867,13 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
if (moving) {
moved_frames = 0;
}
//前一个状态是纯点射
if (shot_start && !shot_hold) {
} else {
shot_start = msg.shot_start();
shot_hold = msg.shot_hold();
}
fly_distance = std::min(200.0f, msg.fly_distance());
if (!shot_hold) {
series_shot_frames = 0;
@ -922,6 +924,11 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
void Player::_CMReconnect(f8::MsgHdr& hdr, const cs::CMReconnect& msg)
{
int old_socket_handle = socket_handle;
if (socket_handle != 0) {
GGListener::Instance()->ForceCloseChildSocket(socket_handle);
PlayerMgr::Instance()->RemovePlayerBySocket(socket_handle);
}
socket_handle = hdr.socket_handle;
#if 0
TouchAllLayerHumanList
@ -938,6 +945,13 @@ void Player::_CMReconnect(f8::MsgHdr& hdr, const cs::CMReconnect& msg)
respmsg.set_errmsg("战斗重连成功");
SendNotifyMsg(respmsg);
PlayerMgr::Instance()->ReBindSocket(this);
a8::UdpLog::Instance()->Debug
("战斗服重连成功 %s %d %d",
{
account_id,
hdr.socket_handle,
old_socket_handle
});
}
void Player::UpdateDropWeapon()
@ -1119,6 +1133,8 @@ void Player::_CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg)
dead = false;
real_dead = false;
downed = false;
energy_shield = MetaMgr::Instance()->max_energy_shield;
max_energy_shield = energy_shield;
FreeDownedTimer();
health = GetMaxHP();
ResetTankSkin();

View File

@ -69,10 +69,6 @@ void Room::Init()
},
&xtimer_attacher.timer_list_);
}
if (current_teamid >= FIXED_OBJECT_MAXID) {
abort();
}
current_uniid = FIXED_OBJECT_MAXID + 1;
ShuaAndroid();
}
@ -190,7 +186,6 @@ void Room::AddPlayer(Player* hum)
accountid_hash_[hum->account_id] = hum;
human_hash_[hum->entity_uniid] = hum;
++alive_count_;
alive_count_chged_frameno_ = GetFrameNo();
++App::Instance()->perf.alive_count;
grid_service.AddHuman(hum);
hum->FindLocation();
@ -301,7 +296,6 @@ void Room::CreateAndroid(int robot_num)
moveable_hash_[hum->entity_uniid] = hum;
human_hash_[hum->entity_uniid] = hum;
++alive_count_;
alive_count_chged_frameno_ = GetFrameNo();
++App::Instance()->perf.alive_count;
grid_service.AddHuman(hum);
hum->FindLocation();
@ -663,7 +657,6 @@ void Room::OnHumanDie(Human* hum)
frame_event.AddExplosionEx(hum, 0, hum->pos, 1);
}
--alive_count_;
alive_count_chged_frameno_ = GetFrameNo();
--App::Instance()->perf.alive_count;
NotifyUiUpdate();
}
@ -754,18 +747,19 @@ bool Room::CanJoin(const std::string& accountid)
void Room::OnPlayerOffline(Player* hum)
{
if (GetOnlinePlayerNum() <= 0) {
xtimer.AddDeadLineTimer
xtimer.AddDeadLineTimerAndAttach
(
SERVER_FRAME_RATE * 40,
SERVER_FRAME_RATE * 15,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
if (room->GetOnlinePlayerNum() <= 0) {
if (room->GetOnlinePlayerNum() <= 0 && !room->added_to_over_room) {
RoomMgr::Instance()->AddOverRoom(room->room_uuid);
}
});
},
&xtimer_attacher.timer_list_);
}
}
@ -964,43 +958,19 @@ void Room::UpdateGasInactive()
{
if (frame_no - gas_data.gas_start_frameno >=
MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE) {
#if 1
gas_data.gas_mode = GasWaiting;
gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001);
gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002);
gas_data.gas_progress = gas_data.old_area_meta->i->rad();
gas_data.gas_start_frameno = frame_no;
gas_data.pos_old = a8::Vec2(map_meta->i->map_width() / 2.0f,
map_meta->i->map_height() / 2.0f);
gas_data.pos_old_bk = gas_data.pos_old;
{
bool gen_ok = GenSmallCircle(gas_data.pos_old,
gas_data.old_area_meta->i->rad(),
gas_data.new_area_meta->i->rad(),
gas_data.pos_new);
assert(gen_ok);
}
gas_data.rad_old = gas_data.old_area_meta->i->rad();
gas_data.rad_new = gas_data.new_area_meta->i->rad();
battle_start_frameno_ = frame_no;
#else
gas_data.gas_mode = GasJump;
gas_data.gas_start_frameno = frame_no;
#endif
if (human_hash_.size() < ROOM_MAX_PLAYER_NUM) {
CreateAndroid(ROOM_MAX_PLAYER_NUM - human_hash_.size());
}
NotifyUiUpdate();
}
CombineTeam();
NotifyGameStart();
ShuaPlane();
NotifyWxVoip();
InitAirDrop();
RoomMgr::Instance()->ActiveRoom(room_uuid);
#if 0
ShuaPlane();
int auto_jump_interval = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_interval");
auto_jump_timer_ = xtimer.AddRepeatTimerAndAttach
(SERVER_FRAME_RATE * auto_jump_interval,
auto_jump_timer_ = xtimer.AddRepeatTimerAndAttach(SERVER_FRAME_RATE * auto_jump_interval,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -1013,14 +983,12 @@ void Room::UpdateGasInactive()
jump_num = 1 + rand() % 2;
}
for (int i = 0; i < jump_num; ++i) {
room->TouchHumanList
(
room->TouchHumanList(
a8::XParams()
.SetSender(room),
[] (Human* hum, a8::XParams& param) -> bool
{
if (a8::HasBitFlag(hum->status, HS_Fly) &&
hum->entity_subtype != EST_Player) {
if (a8::HasBitFlag(hum->status, HS_Fly) && hum->entity_subtype != EST_Player) {
hum->DoJump();
return false;
}
@ -1029,7 +997,6 @@ void Room::UpdateGasInactive()
}
},
&xtimer_attacher.timer_list_);
#endif
}
}
@ -1441,7 +1408,6 @@ void Room::RandRemoveAndroid()
human_hash_.erase(hum->entity_uniid);
removed_robot_hash_[hum->entity_uniid] = hum;
--alive_count_;
alive_count_chged_frameno_ = GetFrameNo();
--App::Instance()->perf.alive_count;
for (auto& pair : human_hash_) {
pair.second->RemovePartObjects(hum);
@ -1585,117 +1551,6 @@ void Room::CreateMapSpawnPoint(MetaData::MapTplThing& thing_tpl)
born_point_hash_[AllocUniid()] = born_point;
}
void Room::SecondRandPoint()
{
for (auto& pair : accountid_hash_) {
Human* hum = pair.second;
hum->born_point = AllocBornPoint(hum);
}
CombineTeamBornPoint();
}
void Room::NotifyGameStart()
{
cs::SMGameStart msg;
for (auto& pair : accountid_hash_) {
pair.second->SendNotifyMsg(msg);
}
waiting_start_ = true;
xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * 2,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
room->waiting_start_ = false;
},
&xtimer_attacher.timer_list_);
xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * 1,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
room->SecondRandPoint();
},
&xtimer_attacher.timer_list_);
}
void Room::CombineTeamBornPoint()
{
for (auto& pair : team_hash_) {
Human* target = nullptr;
for (Human* hum : pair.second) {
if (!target) {
target = hum;
} else {
if (target->born_point) {
if (hum->born_point) {
DecBornPointHumanNum(hum->born_point, hum);
}
hum->born_point = target->born_point;
if (hum->born_point) {
IncBornPointHumanNum(hum->born_point, hum);
}
}
} //end if
if (!hum->born_point) {
hum->pos = a8::Vec2(DEFAULT_BORN_POINT_X + rand() % 100,
DEFAULT_BORN_POINT_Y + rand() % 200);
} else {
hum->pos = hum->born_point->RandPoint();
}
hum->FindLocation();
hum->RefreshView();
grid_service.MoveHuman(hum);
}
}
}
void Room::IncBornPointHumanNum(BornPoint* point, Human* hum)
{
switch (hum->entity_subtype) {
case EST_Player:
{
++point->player_num;
}
break;
case EST_Android:
{
++point->android_num;
}
break;
default:
{
}
break;
}
}
void Room::DecBornPointHumanNum(BornPoint* point, Human* hum)
{
switch (hum->entity_subtype) {
case EST_Player:
{
--point->player_num;
}
break;
case EST_Android:
{
--point->android_num;
}
break;
default:
{
}
break;
}
}
int Room::GetOnlinePlayerNum()
{
int num = 0;

View File

@ -49,6 +49,7 @@ public:
long long pending_request = 0;
long long last_debugout_tick = 0;
a8::Vec2 last_player_jump_pos;
bool added_to_over_room = false;
~Room();
void Init();
@ -56,13 +57,9 @@ public:
void Update(int delta_time);
int GetPlayerNum();
int AliveCount();
long long AliveCountChgFrameNo() { return alive_count_chged_frameno_; }
long long GetBattleStartFrameNo() { return battle_start_frameno_;}
Player* GetPlayerByAccountId(const std::string& accountid);
Player* GetPlayerByUniId(int uniid);
Entity* GetEntityByUniId(int uniid);
long long GetFrameNo() { return frame_no; }
bool IsWaitingStart() { return waiting_start_; }
void AddPlayer(Player* hum);
Human* FindEnemy(Human* hum);
@ -135,20 +132,13 @@ private:
BornPoint* AllocBornPoint(Human* hum);
void CreateMapObject(MetaData::MapTplThing& thing_tpl);
void CreateMapSpawnPoint(MetaData::MapTplThing& thing_tpl);
void SecondRandPoint();
void NotifyGameStart();
void CombineTeamBornPoint();
void IncBornPointHumanNum(BornPoint* point, Human* hum);
void DecBornPointHumanNum(BornPoint* point, Human* hum);
private:
int elapsed_time_ = 0;
int alive_count_ = 0;
long long alive_count_chged_frameno_ = 0;
MetaData::AirLine* airline_ = nullptr;
a8::XTimerAttacher xtimer_attacher;
xtimer_list* auto_jump_timer_ = nullptr;
bool waiting_start_ = false;
int current_teamid = 0;
int current_uniid = 0;

View File

@ -128,7 +128,7 @@ void RoomMgr::_CMReconnect(f8::MsgHdr& hdr, const cs::CMReconnect& msg)
.SetSender(socket_handle),
[] (const a8::XParams& param)
{
GGListener::Instance()->ForceCloseClient(param.sender);
GGListener::Instance()->ForceCloseChildSocket(param.sender);
}
);
};
@ -136,6 +136,11 @@ void RoomMgr::_CMReconnect(f8::MsgHdr& hdr, const cs::CMReconnect& msg)
Room* room = GetRoomByUuid(a8::XValue(msg.room_uuid()));
if (!room) {
send_reconnect_failed(hdr.socket_handle, 1, "房间已销毁");
a8::UdpLog::Instance()->Debug
("房间已销毁 %s",
{
msg.room_uuid()
});
return;
}
Player* hum = room->GetPlayerByAccountId(msg.account_id());
@ -190,6 +195,7 @@ void RoomMgr::AddOverRoom(long long room_uuid)
inactive_room_hash_.erase(room_uuid);
Room* room = GetRoomByUuid(room_uuid);
if (room) {
room->added_to_over_room = true;
room->game_over_tick = a8::XGetTickCount();
room->game_over_timer = a8::Timer::Instance()->AddRepeatTimer(500,
a8::XParams()

View File

@ -126,11 +126,3 @@ struct BornPoint
a8::Vec2 RandPoint() const;
};
#pragma pack(1)
struct ObjectSyncFlags
{
unsigned char flags = 0;
unsigned char last_sync_frameno = 0;
};
#pragma pack()

View File

@ -190,6 +190,12 @@ message KillPoint
optional int32 parameter2 = 3;
}
message Text
{
optional string textid = 1;
optional string text = 2;
}
//end
message DoorObjJson

@ -1 +1 @@
Subproject commit 645913c9d4cc7126475f110b3c7d55bc2f4bc5f0
Subproject commit cdb87a3e673aee3401b3e2ffce3ea1a1e6a603b0

@ -1 +1 @@
Subproject commit 6e1e84260c42c24a58fe98e25ea6ccd18331248d
Subproject commit eb455bb95f97dc506566c443be0c72960ceebabf