EQ2EMu/EQ2/source/WorldServer/Zone/mob_movement_manager.h
Image 56f4d39864 Speed/CPU improvements
Reverted movement manager to Entity, limited to just entity (NPC/Player)
spawn add timer moved to 1000 ms (or trigger on new spawn)
CombatProcess migrated to either movement check (100ms) or aggro check (every 2s) -- in other words not every 10ms.
Set a 1 ms sleep in the CombinePacketLoop
2020-05-12 00:49:13 -04:00

110 lines
3.1 KiB
C++

#pragma once
#include <memory>
#include "../Entity.h"
#include "../../common/Mutex.h"
class Mob;
class Client;
struct RotateCommand;
struct MovementCommand;
struct MobMovementEntry;
struct PlayerPositionUpdateServer_Struct;
enum ClientRange : int
{
ClientRangeNone = 0,
ClientRangeClose = 1,
ClientRangeMedium = 2,
ClientRangeCloseMedium = 3,
ClientRangeLong = 4,
ClientRangeCloseLong = 5,
ClientRangeMediumLong = 6,
ClientRangeAny = 7
};
enum MobMovementMode : int
{
MovementWalking = 0,
MovementRunning = 1
};
enum MobStuckBehavior : int
{
RunToTarget,
WarpToTarget,
TakeNoAction,
EvadeCombat,
MaxStuckBehavior
};
class MobMovementManager
{
public:
~MobMovementManager();
void Process();
void AddMob(Entity *mob);
void RemoveMob(Entity *mob);
void AddClient(Client *client);
void RemoveClient(Client *client);
void RotateTo(Entity *who, float to, MobMovementMode mob_movement_mode = MovementRunning);
void Teleport(Entity *who, float x, float y, float z, float heading);
void NavigateTo(Entity *who, float x, float y, float z, MobMovementMode mode = MovementRunning, bool overrideDistance=false);
void StopNavigation(Entity *who);
void DisruptNavigation(Entity* who);
/*
void SendCommandToClients(
Entity *mob,
float delta_x,
float delta_y,
float delta_z,
float delta_heading,
int anim,
ClientRange range,
Client* single_client = nullptr,
Client* ignore_client = nullptr
);*/
float FixHeading(float in);
void ClearStats();
static MobMovementManager &Get() {
static MobMovementManager inst;
return inst;
}
MobMovementManager();
bool IsRunningCommandProcess() {
bool isRunning = false;
MobListMutex.readlock();
isRunning = RunningCommandProcess;
MobListMutex.releasereadlock();
return isRunning;
}
bool SetCommandProcess(bool status) {
MobListMutex.writelock();
RunningCommandProcess = status;
MobListMutex.releasewritelock();
}
private:
MobMovementManager(const MobMovementManager&);
MobMovementManager& operator=(const MobMovementManager&);
void UpdatePath(Entity *who, float x, float y, float z, MobMovementMode mob_movement_mode);
void UpdatePathGround(Entity *who, float x, float y, float z, MobMovementMode mode);
void UpdatePathUnderwater(Entity *who, float x, float y, float z, MobMovementMode movement_mode);
void UpdatePathBoat(Entity *who, float x, float y, float z, MobMovementMode mode);
void PushTeleportTo(MobMovementEntry &ent, float x, float y, float z, float heading);
void PushMoveTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mob_movement_mode);
void PushSwimTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mob_movement_mode);
void PushRotateTo(MobMovementEntry &ent, Entity *who, float to, MobMovementMode mob_movement_mode);
void PushStopMoving(MobMovementEntry &mob_movement_entry);
void PushEvadeCombat(MobMovementEntry &mob_movement_entry);
void HandleStuckBehavior(Entity *who, float x, float y, float z, MobMovementMode mob_movement_mode);
struct Implementation;
std::unique_ptr<Implementation> _impl;
Mutex MobListMutex;
bool RunningCommandProcess;
};