diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index 5385478..5876de0 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -17,6 +17,7 @@ Building::~Building() void Building::Initialize() { + Entity::Initialize(); RecalcSelfCollider(); } diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 2997c0d..ee5640a 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -18,6 +18,7 @@ Bullet::~Bullet() void Bullet::Initialize() { + Entity::Initialize(); RecalcSelfCollider(); } diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 56f5212..c0fd1e3 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -75,6 +75,7 @@ enum InventorySlot_e IS_FRAG = 5, IS_SMOKE = 6, IS_HEALTHKIT = 7, + IS_PAIN_KILLER = 8, IS_1XSCOPE = 12, IS_2XSCOPE = 13, diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index ee81e80..f63e218 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -2,12 +2,23 @@ #include "entity.h" #include "collider.h" +#include "room.h" + +Entity::Entity() +{ + +} Entity::~Entity() { ClearColliders(); } +void Entity::Initialize() +{ + xtimer_attacher.xtimer = &room->xtimer; +} + bool Entity::TestCollision(Entity* b) { for (auto& a_collider : colliders) { diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index b922147..617a5db 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -46,12 +46,13 @@ class Entity int updated_times = 0; std::list colliders; bool deleted = false; + a8::XTimerAttacher xtimer_attacher; Obstacle* last_collision_door = nullptr; - Entity() {}; + Entity(); virtual ~Entity(); - virtual void Initialize() {}; + virtual void Initialize(); virtual void Update(int delta_time) {}; virtual void FillMFObjectPart(cs::MFObjectPart* part_data) {}; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) {}; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 0e28a29..034d477 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -38,6 +38,7 @@ Human::~Human() void Human::Initialize() { + Entity::Initialize(); } float Human::GetSpeed() diff --git a/server/gameserver/loot.cc b/server/gameserver/loot.cc index 7e946db..d441972 100644 --- a/server/gameserver/loot.cc +++ b/server/gameserver/loot.cc @@ -4,6 +4,7 @@ #include "metamgr.h" #include "room.h" #include "collider.h" +#include "entity.h" Loot::Loot():Entity() { @@ -16,6 +17,7 @@ Loot::~Loot() void Loot::Initialize() { + Entity::Initialize(); RecalcSelfCollider(); } diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index c4fadf7..c9f6ebf 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -17,6 +17,7 @@ Obstacle::~Obstacle() void Obstacle::Initialize() { + Entity::Initialize(); health = meta->i->hp(); RecalcSelfCollider(); } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e897df4..88b4c79 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -27,6 +27,7 @@ Player::~Player() void Player::Initialize() { + Human::Initialize(); health = meta->i->health(); RecalcSelfCollider(); } @@ -200,6 +201,22 @@ void Player::UpdateAction() } } break; + case IS_PAIN_KILLER: + { + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(action_item_id); + if (item_meta){ + if (inventory[item_meta->i->_inventory_slot()] > 0) { + float old_health = health; + health += item_meta->i->heal(); + health = std::min(health, GetMaxHP()); + stats.heal_amount += health - old_health; + --inventory[item_meta->i->_inventory_slot()]; + need_sync_active_player = true; + SyncAroundPlayers(); + } + } + } + break; default: { } @@ -241,6 +258,19 @@ void Player::UpdateUseItemIdx() } } break; + case IS_PAIN_KILLER: + { + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(use_item_idx); + if (item_meta) { + StartAction( + AT_UseItem, + item_meta->i->use_time(), + use_item_idx, + 0 + ); + } + } + break; default: { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 3a60b70..f429f07 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -25,6 +25,12 @@ const int ANDROID_NUM = 0; const int ANDROID_NUM = 10; #endif +static long long RoomXGetTickCount(void* context) +{ + Room* room = (Room*)context; + return room->frame_no; +} + Room::~Room() { @@ -32,6 +38,8 @@ Room::~Room() void Room::Init() { + xtimer.Init(RoomXGetTickCount, this, 100, 100); + ShuaAndroid(); CreateThings(); stats_timer_ = a8::Timer::Instance()->AddRepeatTimer( @@ -61,6 +69,7 @@ void Room::Update(int delta_time) long long begin_tick = a8::XGetTickCount(); elapsed_time_ += delta_time; while (elapsed_time_ >= 50) { + xtimer.Update(); if (frame_no % 2 == 0) { ResetFrameData(); UpdateGas(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 3d0431b..d365f3f 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include "framedata.h" namespace MetaData @@ -31,6 +34,7 @@ public: bool game_over = false; long long game_over_frameno = 0; RoomProfile profile; + a8::XTimer xtimer; ~Room(); void Init(); @@ -83,7 +87,6 @@ private: void OutputDebugLog(); private: - a8::TimerAttacher timer_attacher_; timer_list* stats_timer_ = nullptr; int elapsed_time_ = 0; int alive_count_ = 0; diff --git a/server/gameserver/smoke.cc b/server/gameserver/smoke.cc index a4a3cd3..9c817a4 100644 --- a/server/gameserver/smoke.cc +++ b/server/gameserver/smoke.cc @@ -18,6 +18,7 @@ Smoke::~Smoke() void Smoke::Initialize() { + Entity::Initialize(); } void Smoke::Update(int delta_time)