diff --git a/server/gameserver/bornpoint.cc b/server/gameserver/bornpoint.cc
new file mode 100644
index 00000000..1a533daa
--- /dev/null
+++ b/server/gameserver/bornpoint.cc
@@ -0,0 +1,27 @@
+#include "precompile.h"
+
+#include "cs_proto.pb.h"
+
+#include "bornpoint.h"
+#include "metamgr.h"
+
+a8::Vec2 BornPoint::RandPoint() const
+{
+ a8::Vec2 born_point = a8::Vec2(thing_tpl->i->x(), thing_tpl->i->y());
+ MetaData::Player* hum_meta = MetaMgr::Instance()->GetPlayer(40002);
+ if (hum_meta) {
+ born_point.x -= thing_tpl->i->width() / 2;
+ born_point.y -= thing_tpl->i->height() / 2;
+ born_point.x += hum_meta->i->radius() / 2;
+ born_point.y += hum_meta->i->radius() / 2;
+ int rand_x = thing_tpl->i->width() - hum_meta->i->radius();
+ int rand_y = thing_tpl->i->height() - hum_meta->i->radius();
+ if (rand_x > 0) {
+ born_point.x += rand() % rand_x;
+ }
+ if (rand_y > 0) {
+ born_point.y += rand() % rand_y;
+ }
+ }
+ return born_point;
+}
diff --git a/server/gameserver/bornpoint.h b/server/gameserver/bornpoint.h
new file mode 100644
index 00000000..632d6421
--- /dev/null
+++ b/server/gameserver/bornpoint.h
@@ -0,0 +1,15 @@
+#pragma once
+
+namespace MetaData
+{
+ struct MapTplThing;
+}
+
+struct BornPoint
+{
+ MetaData::MapTplThing* thing_tpl = nullptr;
+ int player_num = 0;
+ int android_num = 0;
+
+ a8::Vec2 RandPoint() const;
+};
diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h
index b2800249..0b50c81a 100644
--- a/server/gameserver/buff.h
+++ b/server/gameserver/buff.h
@@ -1,6 +1,7 @@
#pragma once
#include "weakptr.h"
+#include "weapon.h"
namespace MetaData
{
diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h
index 58ee4d49..62312f61 100644
--- a/server/gameserver/creature.h
+++ b/server/gameserver/creature.h
@@ -4,9 +4,20 @@
#include "buff.h"
#include "trigger.h"
#include "ability.h"
+#include "weapon.h"
#include "cs_proto.pb.h"
+enum CreatureStatus
+{
+ CS_AlreadyLordMode = 1,
+ CS_Disable = 2,
+ CS_Collisioning = 3,
+ CS_DisableAttack = 8,
+ CS_End
+};
+
+
namespace MetaData
{
class Skill;
@@ -24,13 +35,26 @@ struct SkillCasterState
float caster_skill_param1 = 0.0f;
};
-enum CreatureStatus
+struct Inventory
{
- CS_AlreadyLordMode = 1,
- CS_Disable = 2,
- CS_Collisioning = 3,
- CS_DisableAttack = 8,
- CS_End
+ int slot = 0;
+ int num = 0;
+ int itemid = 0;
+};
+
+struct HumanAbility
+{
+ float hp = 0.0f;
+ float max_hp = 0.0f;
+ float hp_recover = 0.0f;
+ float atk = 0.0f;
+ float def = 0.0f;
+ float speed = 0.0f;
+
+ float shot_range = 0.0f;
+ float shot_speed = 0.0f;
+ float reload_speed = 0.0f;
+ float fire_rate = 0.0f;
};
struct xtimer_list;
diff --git a/server/gameserver/dummyentity.h b/server/gameserver/dummyentity.h
index b42d88ca..31d61cce 100644
--- a/server/gameserver/dummyentity.h
+++ b/server/gameserver/dummyentity.h
@@ -8,6 +8,7 @@ namespace metatable
}
class MapInstance;
+class MapService;
class DummyEntity : public Entity
{
public:
diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h
index f8e90c23..8b1021af 100644
--- a/server/gameserver/entity.h
+++ b/server/gameserver/entity.h
@@ -8,6 +8,14 @@ namespace cs
class MFObjectFull;
}
+#pragma pack(1)
+struct ObjectSyncFlags
+{
+ unsigned char flags = 0;
+ unsigned char last_sync_frameno = 0;
+};
+#pragma pack()
+
class Room;
class ColliderComponent;
class AabbCollider;
diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h
index b55192ca..c1eaf5ab 100644
--- a/server/gameserver/frameevent.h
+++ b/server/gameserver/frameevent.h
@@ -3,6 +3,11 @@
#include "cs_proto.pb.h"
#include "weakptr.h"
+namespace MetaData
+{
+ struct Equip;
+}
+
class Bullet;
class Human;
class Buff;
diff --git a/server/gameserver/gameserver.cbp b/server/gameserver/gameserver.cbp
new file mode 100644
index 00000000..8ad1e65c
--- /dev/null
+++ b/server/gameserver/gameserver.cbp
@@ -0,0 +1,844 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/server/gameserver/gameserver.layout b/server/gameserver/gameserver.layout
new file mode 100644
index 00000000..9a413dc0
--- /dev/null
+++ b/server/gameserver/gameserver.layout
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/server/gameserver/gasdata.cc b/server/gameserver/gasdata.cc
new file mode 100644
index 00000000..e69de29b
diff --git a/server/gameserver/gasdata.h b/server/gameserver/gasdata.h
new file mode 100644
index 00000000..cf48a3c6
--- /dev/null
+++ b/server/gameserver/gasdata.h
@@ -0,0 +1,29 @@
+#pragma once
+
+namespace MetaData
+{
+ struct Map;
+ struct SafeArea;
+ struct SafeAreaPos;
+ struct Equip;
+ struct EquipUpgrade;
+ struct MapTplThing;
+}
+
+struct GasData
+{
+ GasMode_e gas_mode = GasInactive;
+ a8::Vec2 pos_old;
+ a8::Vec2 pos_old_bk;
+ a8::Vec2 pre_pos_old;
+ a8::Vec2 pos_new;
+ float rad_old = 0.0f;
+ float rad_new = 0.0f;
+ float gas_progress = 0.0f;
+ long long gas_start_frameno = 0;
+ MetaData::SafeArea* old_area_meta = nullptr;
+ MetaData::SafeArea* new_area_meta = nullptr;
+ MetaData::SafeAreaPos* pos_list = nullptr;
+ bool is_last_gas = false;
+ int gas_count = 0;
+};
diff --git a/server/gameserver/human.h b/server/gameserver/human.h
index 0d2d210d..a3a97b38 100644
--- a/server/gameserver/human.h
+++ b/server/gameserver/human.h
@@ -2,6 +2,7 @@
#include "creature.h"
#include "GGListener.h"
+#include "skin.h"
namespace MetaData
{
@@ -22,6 +23,54 @@ struct PartObject
EntityWeakPtr object;
};
+struct KillInfo
+{
+ int killer_id = 0;
+ int killer_team_id = 0;
+ int weapon_id = 0;
+ std::string msg;
+};
+
+struct HumanBehavior
+{
+ long long curr_start_destory_box_frameno = 0;
+ int curr_destory_box_times = 0;
+ int total_destory_box_times = 0;
+};
+
+struct PlayerStats
+{
+ int kills = 0;
+ long long last_kill_frameno = 0;
+ int damage_amount_in = 0;
+ int damage_amount_out = 0;
+ int heal_amount = 0;
+ int rescue_member = 0;
+ int rescue_guild_member = 0;
+
+ int history_time_alive = 0;
+ int history_kills = 0;
+ int history_damage_amount = 0;
+ int history_heal_amount = 0;
+
+ int gold = 0;
+ int score = 0;
+ std::vector> items;
+ int pass_score = 0;
+ int rank_score = 0;
+
+ std::vector> extra_drop;
+
+ int killer_id = 0;
+ std::string killer_name;
+ int weapon_id = 0;
+
+ int rank = 0;
+ int skill_times = 0;
+
+ int dead_times = 0;
+};
+
struct xtimer_list;
class CircleCollider;
class AabbCollider;
@@ -100,7 +149,7 @@ class Human : public Creature
xtimer_list* downed_timer = nullptr;
std::set kill_humans;
- BornPoint* born_point = nullptr;
+ struct BornPoint* born_point = nullptr;
bool shot_start = false;
bool shot_hold = false;
diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc
index b6a5bf87..632f1f4e 100644
--- a/server/gameserver/mapinstance.cc
+++ b/server/gameserver/mapinstance.cc
@@ -12,6 +12,7 @@
#include "entityfactory.h"
#include "dummyentity.h"
#include "mapblock.h"
+#include "roommgr.h"
const int MAP_GRID_WIDTH = 64;
diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h
index 43095477..9a33b278 100644
--- a/server/gameserver/mapinstance.h
+++ b/server/gameserver/mapinstance.h
@@ -18,7 +18,7 @@ class MapService;
class GridService;
class Room;
class MapBlock;
-
+struct RoomInitInfo;
class MapInstance
{
public:
diff --git a/server/gameserver/mapmgr.cc b/server/gameserver/mapmgr.cc
index 9bf872aa..95eaa21b 100644
--- a/server/gameserver/mapmgr.cc
+++ b/server/gameserver/mapmgr.cc
@@ -5,6 +5,7 @@
#include "mapinstance.h"
#include "metamgr.h"
#include "cs_proto.pb.h"
+#include "roommgr.h"
void MapMgr::Init()
{
diff --git a/server/gameserver/mapmgr.h b/server/gameserver/mapmgr.h
index 6bc3fafd..6d1e2382 100644
--- a/server/gameserver/mapmgr.h
+++ b/server/gameserver/mapmgr.h
@@ -2,6 +2,7 @@
class MapInstance;
class Room;
+struct RoomInitInfo;
class MapMgr : public a8::Singleton
{
private:
diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h
index 7fae4945..b29bb9d9 100644
--- a/server/gameserver/obstacle.h
+++ b/server/gameserver/obstacle.h
@@ -21,6 +21,7 @@ class CircleCollider;
class AabbCollider;
class Bullet;
class RoomObstacle;
+class MapService;
class Obstacle : public Entity
{
public:
diff --git a/server/gameserver/room.h b/server/gameserver/room.h
index 5a57e034..ec49c4b2 100644
--- a/server/gameserver/room.h
+++ b/server/gameserver/room.h
@@ -6,6 +6,8 @@
#include "framemaker.h"
#include "gridservice.h"
#include "mapservice.h"
+#include "gasdata.h"
+#include "bornpoint.h"
namespace MetaData
{
@@ -38,6 +40,37 @@ class Car;
class Hero;
class Incubator;
class Team;
+class MapInstance;
+struct RoomInitInfo;
+struct ObstacleData
+{
+ int flags = 0;
+ float health = 0.0f;
+ bool dead = false;
+ long long dead_frameno = 0;
+ int team_id = 0;
+ int master_id = 0;
+
+ int door_open_times = 0;
+ DoorState_e door_state = DoorStateClose;
+ std::map>* interaction_humans = nullptr;
+};
+
+struct Plane
+{
+ a8::Vec2 start_point;
+ a8::Vec2 end_point;
+ a8::Vec2 dir;
+ a8::Vec2 curr_pos;
+};
+
+struct CarObject
+{
+ int car_id = 0;
+ a8::Vec2 pos;
+ bool taken = false;
+};
+
class Room
{
public:
diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h
index d928d3f6..b03c3d76 100644
--- a/server/gameserver/roommgr.h
+++ b/server/gameserver/roommgr.h
@@ -8,6 +8,44 @@ namespace cs
class CMReconnect;
}
+namespace MetaData
+{
+ struct Map;
+ struct MapTplThing;
+}
+
+class GridService;
+class MapService;
+class MapInstance;
+class Building;
+struct RoomInitInfo
+{
+ int room_idx = 0;
+ RoomMode_e room_mode = kChiJiMode;
+ long long room_uuid = 0;
+ RoomType_e room_type = RT_NewBrid;
+ int creator_game_times = 0;
+ int creator_register_time = 0;
+ int creator_proto_version = 0;
+ int creator_channel = 0;
+ bool force_entry_newbie_room = false;
+ int init_map_id = 0;
+
+ const MetaData::Map* map_meta = nullptr;
+ std::string map_tpl_name;
+ GridService* grid_service = nullptr;
+ MapService* map_service = nullptr;
+ MapInstance* map_instance = nullptr;
+ const std::vector* mini_room_spawn_points = nullptr;
+ const std::vector* normal_room_spawn_points = nullptr;
+ const std::vector* room_monster_spawn_points = nullptr;
+ const MetaData::MapTplThing* level0room_born_point_meta = nullptr;
+ const MetaData::MapTplThing* level1room_born_point_meta = nullptr;
+ const std::vector* loots = nullptr;
+ const std::vector* buildings = nullptr;
+ const std::vector* level0room_spec_things = nullptr;
+};
+
class Room;
class RoomMgr : public a8::Singleton
{
diff --git a/server/gameserver/skin.cc b/server/gameserver/skin.cc
new file mode 100644
index 00000000..81c1fe59
--- /dev/null
+++ b/server/gameserver/skin.cc
@@ -0,0 +1,10 @@
+#include "precompile.h"
+
+#include "cs_proto.pb.h"
+#include "skin.h"
+
+void Skin::ToPB(cs::MFSkin* pb_obj)
+{
+ pb_obj->set_skin_id(skin_id);
+ pb_obj->set_skin_lv(skin_lv);
+}
diff --git a/server/gameserver/skin.h b/server/gameserver/skin.h
new file mode 100644
index 00000000..cbcbb56c
--- /dev/null
+++ b/server/gameserver/skin.h
@@ -0,0 +1,10 @@
+#pragma once
+
+struct Skin
+{
+ int tank_uniid = 0;
+ int skin_id = 0;
+ int skin_lv = 0;
+
+ void ToPB(cs::MFSkin* pb_obj);
+};
diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h
index 99362964..5cd0e66e 100644
--- a/server/gameserver/trigger.h
+++ b/server/gameserver/trigger.h
@@ -3,6 +3,7 @@
namespace MetaData
{
struct Buff;
+ struct Equip;
};
class Weapon;
diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc
index 789966f3..bb1f5548 100644
--- a/server/gameserver/types.cc
+++ b/server/gameserver/types.cc
@@ -1,107 +1,3 @@
#include "precompile.h"
-
-#include "cs_proto.pb.h"
-
#include "metamgr.h"
-void Weapon::Clear()
-{
- weapon_id = 0;
- weapon_lv = 0;
- ammo = 0;
- meta = 0;
- bullet_meta = nullptr;
- upgrade_meta = nullptr;
-}
-
-void Weapon::ToPB(cs::MFWeapon* pb_obj)
-{
- pb_obj->set_weapon_id(weapon_id);
- pb_obj->set_weapon_lv(weapon_lv);
- pb_obj->set_ammo(ammo);
-}
-
-void Weapon::Recalc()
-{
- upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id);
- bullet_meta = MetaMgr::Instance()->GetEquip(meta->i->use_bullet());
-}
-
-int Weapon::GetClipVolume()
-{
- if (upgrade_meta) {
- return meta->i->clip_volume() +
- upgrade_meta->GetAttrValue(weapon_lv, kHAT_Volume);
- } else {
- return meta->i->clip_volume();
- }
-}
-
-float Weapon::GetAttrValue(HumanAttrType_e attr_type)
-{
- if (!meta) {
- return 0;
- }
- switch (attr_type) {
- case kHAT_Atk:
- {
- return meta->i->atk() +
- (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
- }
- break;
- case kHAT_FireRate:
- {
- return meta->i->fire_rate() -
- (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
- }
- break;
- case kHAT_Volume:
- {
- return meta->i->clip_volume() +
- (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
- }
- break;
- case kHAT_MaxHp:
- {
- return meta->i->max_hp() +
- (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
- }
- break;
- case kHAT_ReloadTime:
- {
- return meta->i->reload_time() -
- (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
- }
- break;
- default:
- return 0;
- }
-}
-
-void Skin::ToPB(cs::MFSkin* pb_obj)
-{
- pb_obj->set_skin_id(skin_id);
- pb_obj->set_skin_lv(skin_lv);
-}
-
-a8::Vec2 BornPoint::RandPoint() const
-{
- a8::Vec2 born_point = a8::Vec2(thing_tpl->i->x(), thing_tpl->i->y());
- MetaData::Player* hum_meta = MetaMgr::Instance()->GetPlayer(40002);
- if (hum_meta) {
- born_point.x -= thing_tpl->i->width() / 2;
- born_point.y -= thing_tpl->i->height() / 2;
- born_point.x += hum_meta->i->radius() / 2;
- born_point.y += hum_meta->i->radius() / 2;
- int rand_x = thing_tpl->i->width() - hum_meta->i->radius();
- int rand_y = thing_tpl->i->height() - hum_meta->i->radius();
- if (rand_x > 0) {
- born_point.x += rand() % rand_x;
- }
- if (rand_y > 0) {
- born_point.y += rand() % rand_y;
- }
- }
- return born_point;
-}
-
diff --git a/server/gameserver/types.h b/server/gameserver/types.h
index 2b23240e..6f70f09b 100644
--- a/server/gameserver/types.h
+++ b/server/gameserver/types.h
@@ -1,212 +1 @@
#pragma once
-
-namespace MetaData
-{
- struct Map;
- struct SafeArea;
- struct SafeAreaPos;
- struct Equip;
- struct EquipUpgrade;
- struct MapTplThing;
-}
-
-namespace cs
-{
- class MFWeapon;
- class MFSkin;
-}
-
-struct GasData
-{
- GasMode_e gas_mode = GasInactive;
- a8::Vec2 pos_old;
- a8::Vec2 pos_old_bk;
- a8::Vec2 pre_pos_old;
- a8::Vec2 pos_new;
- float rad_old = 0.0f;
- float rad_new = 0.0f;
- float gas_progress = 0.0f;
- long long gas_start_frameno = 0;
- MetaData::SafeArea* old_area_meta = nullptr;
- MetaData::SafeArea* new_area_meta = nullptr;
- MetaData::SafeAreaPos* pos_list = nullptr;
- bool is_last_gas = false;
- int gas_count = 0;
-};
-
-struct Weapon
-{
- int weapon_idx = 0;
- int weapon_id = 0;
- int weapon_lv = 0;
- int ammo = 0;
- MetaData::Equip* meta = nullptr;
- MetaData::Equip* bullet_meta = nullptr;
-
- void Clear();
- void ToPB(cs::MFWeapon* pb_obj);
- void Recalc();
- int GetClipVolume();
- float GetAttrValue(HumanAttrType_e attr_type);
- MetaData::EquipUpgrade* GetUpgradeMeta() { return upgrade_meta;}
-
-private:
- MetaData::EquipUpgrade* upgrade_meta = nullptr;
-};
-
-struct Skin
-{
- int tank_uniid = 0;
- int skin_id = 0;
- int skin_lv = 0;
-
- void ToPB(cs::MFSkin* pb_obj);
-};
-
-struct PlayerStats
-{
- int kills = 0;
- long long last_kill_frameno = 0;
- int damage_amount_in = 0;
- int damage_amount_out = 0;
- int heal_amount = 0;
- int rescue_member = 0;
- int rescue_guild_member = 0;
-
- int history_time_alive = 0;
- int history_kills = 0;
- int history_damage_amount = 0;
- int history_heal_amount = 0;
-
- int gold = 0;
- int score = 0;
- std::vector> items;
- int pass_score = 0;
- int rank_score = 0;
-
- std::vector> extra_drop;
-
- int killer_id = 0;
- std::string killer_name;
- int weapon_id = 0;
-
- int rank = 0;
- int skill_times = 0;
-
- int dead_times = 0;
-};
-
-struct CarObject
-{
- int car_id = 0;
- a8::Vec2 pos;
- bool taken = false;
-};
-
-struct BornPoint
-{
- MetaData::MapTplThing* thing_tpl = nullptr;
- int player_num = 0;
- int android_num = 0;
-
- a8::Vec2 RandPoint() const;
-};
-
-struct Plane
-{
- a8::Vec2 start_point;
- a8::Vec2 end_point;
- a8::Vec2 dir;
- a8::Vec2 curr_pos;
-};
-
-struct HumanAbility
-{
- float hp = 0.0f;
- float max_hp = 0.0f;
- float hp_recover = 0.0f;
- float atk = 0.0f;
- float def = 0.0f;
- float speed = 0.0f;
-
- float shot_range = 0.0f;
- float shot_speed = 0.0f;
- float reload_speed = 0.0f;
- float fire_rate = 0.0f;
-};
-
-struct HumanBehavior
-{
- long long curr_start_destory_box_frameno = 0;
- int curr_destory_box_times = 0;
- int total_destory_box_times = 0;
-};
-
-struct ObstacleData
-{
- int flags = 0;
- float health = 0.0f;
- bool dead = false;
- long long dead_frameno = 0;
- int team_id = 0;
- int master_id = 0;
-
- int door_open_times = 0;
- DoorState_e door_state = DoorStateClose;
- std::map>* interaction_humans = nullptr;
-};
-
-struct KillInfo
-{
- int killer_id = 0;
- int killer_team_id = 0;
- int weapon_id = 0;
- std::string msg;
-};
-
-struct Inventory
-{
- int slot = 0;
- int num = 0;
- int itemid = 0;
-};
-
-#pragma pack(1)
-struct ObjectSyncFlags
-{
- unsigned char flags = 0;
- unsigned char last_sync_frameno = 0;
-};
-#pragma pack()
-
-class GridService;
-class MapService;
-class MapInstance;
-class Building;
-struct RoomInitInfo
-{
- int room_idx = 0;
- RoomMode_e room_mode = kChiJiMode;
- long long room_uuid = 0;
- RoomType_e room_type = RT_NewBrid;
- int creator_game_times = 0;
- int creator_register_time = 0;
- int creator_proto_version = 0;
- int creator_channel = 0;
- bool force_entry_newbie_room = false;
- int init_map_id = 0;
-
- const MetaData::Map* map_meta = nullptr;
- std::string map_tpl_name;
- GridService* grid_service = nullptr;
- MapService* map_service = nullptr;
- MapInstance* map_instance = nullptr;
- const std::vector* mini_room_spawn_points = nullptr;
- const std::vector* normal_room_spawn_points = nullptr;
- const std::vector* room_monster_spawn_points = nullptr;
- const MetaData::MapTplThing* level0room_born_point_meta = nullptr;
- const MetaData::MapTplThing* level1room_born_point_meta = nullptr;
- const std::vector* loots = nullptr;
- const std::vector* buildings = nullptr;
- const std::vector* level0room_spec_things = nullptr;
-};
diff --git a/server/gameserver/weapon.cc b/server/gameserver/weapon.cc
new file mode 100644
index 00000000..e3618545
--- /dev/null
+++ b/server/gameserver/weapon.cc
@@ -0,0 +1,79 @@
+#include "precompile.h"
+
+#include "weapon.h"
+#include "cs_proto.pb.h"
+#include "metamgr.h"
+
+void Weapon::Clear()
+{
+ weapon_id = 0;
+ weapon_lv = 0;
+ ammo = 0;
+ meta = 0;
+ bullet_meta = nullptr;
+ upgrade_meta = nullptr;
+}
+
+void Weapon::ToPB(cs::MFWeapon* pb_obj)
+{
+ pb_obj->set_weapon_id(weapon_id);
+ pb_obj->set_weapon_lv(weapon_lv);
+ pb_obj->set_ammo(ammo);
+}
+
+void Weapon::Recalc()
+{
+ upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id);
+ bullet_meta = MetaMgr::Instance()->GetEquip(meta->i->use_bullet());
+}
+
+int Weapon::GetClipVolume()
+{
+ if (upgrade_meta) {
+ return meta->i->clip_volume() +
+ upgrade_meta->GetAttrValue(weapon_lv, kHAT_Volume);
+ } else {
+ return meta->i->clip_volume();
+ }
+}
+
+float Weapon::GetAttrValue(HumanAttrType_e attr_type)
+{
+ if (!meta) {
+ return 0;
+ }
+ switch (attr_type) {
+ case kHAT_Atk:
+ {
+ return meta->i->atk() +
+ (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
+ }
+ break;
+ case kHAT_FireRate:
+ {
+ return meta->i->fire_rate() -
+ (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
+ }
+ break;
+ case kHAT_Volume:
+ {
+ return meta->i->clip_volume() +
+ (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
+ }
+ break;
+ case kHAT_MaxHp:
+ {
+ return meta->i->max_hp() +
+ (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
+ }
+ break;
+ case kHAT_ReloadTime:
+ {
+ return meta->i->reload_time() -
+ (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0);
+ }
+ break;
+ default:
+ return 0;
+ }
+}
diff --git a/server/gameserver/weapon.h b/server/gameserver/weapon.h
new file mode 100644
index 00000000..bb4b2cb0
--- /dev/null
+++ b/server/gameserver/weapon.h
@@ -0,0 +1,33 @@
+#pragma once
+
+namespace cs
+{
+ class MFWeapon;
+ class MFSkin;
+}
+
+namespace MetaData
+{
+ struct Equip;
+ struct EquipUpgrade;
+}
+
+struct Weapon
+{
+ int weapon_idx = 0;
+ int weapon_id = 0;
+ int weapon_lv = 0;
+ int ammo = 0;
+ MetaData::Equip* meta = nullptr;
+ MetaData::Equip* bullet_meta = nullptr;
+
+ void Clear();
+ void ToPB(cs::MFWeapon* pb_obj);
+ void Recalc();
+ int GetClipVolume();
+ float GetAttrValue(HumanAttrType_e attr_type);
+ MetaData::EquipUpgrade* GetUpgradeMeta() { return upgrade_meta;}
+
+private:
+ MetaData::EquipUpgrade* upgrade_meta = nullptr;
+};
diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto
index c8c7f8cb..ea87e1b9 100755
--- a/server/tools/protobuild/cs_proto.proto
+++ b/server/tools/protobuild/cs_proto.proto
@@ -1154,6 +1154,7 @@ message SMGameOver
optional bool victory = 5; //是否胜利
optional int32 total_human_num = 12; //房间总人数
optional int32 alive_human_num = 13; //房间剩余存活人数
+ optional int32 watchable = 8; //是否可观战
repeated MFPlayerStats player_stats = 6; //玩家信息统计
optional string room_uuid = 7; //房间唯一id