mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-12-30 08:22:37 +00:00
Merge branch 'main' into slash-command-refactor
This commit is contained in:
@@ -731,15 +731,21 @@ void Entity::Initialize() {
|
||||
// if we have a moving platform path, then we need a moving platform component
|
||||
if (path->pathType == PathType::MovingPlatform) {
|
||||
AddComponent<MovingPlatformComponent>(pathName);
|
||||
// else if we are a movement path
|
||||
} /*else if (path->pathType == PathType::Movement) {
|
||||
auto movementAIcomp = GetComponent<MovementAIComponent>();
|
||||
if (movementAIcomp){
|
||||
// TODO: set path in existing movementAIComp
|
||||
} else if (path->pathType == PathType::Movement) {
|
||||
auto movementAIcomponent = GetComponent<MovementAIComponent>();
|
||||
if (movementAIcomponent && combatAiId == 0) {
|
||||
movementAIcomponent->SetPath(pathName);
|
||||
} else {
|
||||
// TODO: create movementAIcomp and set path
|
||||
MovementAIInfo moveInfo = MovementAIInfo();
|
||||
moveInfo.movementType = "";
|
||||
moveInfo.wanderChance = 0;
|
||||
moveInfo.wanderRadius = 16;
|
||||
moveInfo.wanderSpeed = 2.5f;
|
||||
moveInfo.wanderDelayMax = 5;
|
||||
moveInfo.wanderDelayMin = 2;
|
||||
AddComponent<MovementAIComponent>(moveInfo);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
} else {
|
||||
// else we still need to setup moving platform if it has a moving platform comp but no path
|
||||
int32_t movingPlatformComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::MOVING_PLATFORM, -1);
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include "eCharacterCreationResponse.h"
|
||||
#include "eRenameResponse.h"
|
||||
#include "eConnectionType.h"
|
||||
#include "eChatInternalMessageType.h"
|
||||
#include "eChatMessageType.h"
|
||||
#include "BitStreamUtils.h"
|
||||
#include "CheatDetection.h"
|
||||
|
||||
@@ -422,7 +422,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet)
|
||||
Database::Get()->DeleteCharacter(charID);
|
||||
|
||||
CBITSTREAM;
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION);
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::UNEXPECTED_DISCONNECT);
|
||||
bitStream.Write(objectID);
|
||||
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
||||
|
||||
|
||||
@@ -222,7 +222,7 @@ void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet
|
||||
if (healthDamageDealt >= 1) {
|
||||
successState = eBasicAttackSuccessTypes::SUCCESS;
|
||||
} else if (armorDamageDealt >= 1) {
|
||||
successState = this->m_OnFailArmor->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY ? eBasicAttackSuccessTypes::FAILIMMUNE : eBasicAttackSuccessTypes::FAILARMOR;
|
||||
successState = this->m_OnFailArmor->m_templateId == BehaviorTemplate::EMPTY ? eBasicAttackSuccessTypes::FAILIMMUNE : eBasicAttackSuccessTypes::FAILARMOR;
|
||||
}
|
||||
|
||||
bitStream.Write(armorDamageDealt);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "CDActivitiesTable.h"
|
||||
#include "Game.h"
|
||||
#include "Logger.h"
|
||||
#include "BehaviorTemplates.h"
|
||||
#include "BehaviorTemplate.h"
|
||||
#include "BehaviorBranchContext.h"
|
||||
#include <unordered_map>
|
||||
|
||||
@@ -110,176 +110,176 @@ Behavior* Behavior::CreateBehavior(const uint32_t behaviorId) {
|
||||
Behavior* behavior = nullptr;
|
||||
|
||||
switch (templateId) {
|
||||
case BehaviorTemplates::BEHAVIOR_EMPTY: break;
|
||||
case BehaviorTemplates::BEHAVIOR_BASIC_ATTACK:
|
||||
case BehaviorTemplate::EMPTY: break;
|
||||
case BehaviorTemplate::BASIC_ATTACK:
|
||||
behavior = new BasicAttackBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_TAC_ARC:
|
||||
case BehaviorTemplate::TAC_ARC:
|
||||
behavior = new TacArcBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_AND:
|
||||
case BehaviorTemplate::AND:
|
||||
behavior = new AndBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_PROJECTILE_ATTACK:
|
||||
case BehaviorTemplate::PROJECTILE_ATTACK:
|
||||
behavior = new ProjectileAttackBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_HEAL:
|
||||
case BehaviorTemplate::HEAL:
|
||||
behavior = new HealBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_MOVEMENT_SWITCH:
|
||||
case BehaviorTemplate::MOVEMENT_SWITCH:
|
||||
behavior = new MovementSwitchBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_AREA_OF_EFFECT:
|
||||
case BehaviorTemplate::AREA_OF_EFFECT:
|
||||
behavior = new AreaOfEffectBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_PLAY_EFFECT:
|
||||
case BehaviorTemplate::PLAY_EFFECT:
|
||||
behavior = new PlayEffectBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_IMMUNITY:
|
||||
case BehaviorTemplate::IMMUNITY:
|
||||
behavior = new ImmunityBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_DAMAGE_BUFF: break;
|
||||
case BehaviorTemplates::BEHAVIOR_DAMAGE_ABSORBTION:
|
||||
case BehaviorTemplate::DAMAGE_BUFF: break;
|
||||
case BehaviorTemplate::DAMAGE_ABSORBTION:
|
||||
behavior = new DamageAbsorptionBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_OVER_TIME:
|
||||
case BehaviorTemplate::OVER_TIME:
|
||||
behavior = new OverTimeBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_IMAGINATION:
|
||||
case BehaviorTemplate::IMAGINATION:
|
||||
behavior = new ImaginationBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_TARGET_CASTER:
|
||||
case BehaviorTemplate::TARGET_CASTER:
|
||||
behavior = new TargetCasterBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_STUN:
|
||||
case BehaviorTemplate::STUN:
|
||||
behavior = new StunBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_DURATION:
|
||||
case BehaviorTemplate::DURATION:
|
||||
behavior = new DurationBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_KNOCKBACK:
|
||||
case BehaviorTemplate::KNOCKBACK:
|
||||
behavior = new KnockbackBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_ATTACK_DELAY:
|
||||
case BehaviorTemplate::ATTACK_DELAY:
|
||||
behavior = new AttackDelayBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_CAR_BOOST:
|
||||
case BehaviorTemplate::CAR_BOOST:
|
||||
behavior = new CarBoostBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_FALL_SPEED:
|
||||
case BehaviorTemplate::FALL_SPEED:
|
||||
behavior = new FallSpeedBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SHIELD: break;
|
||||
case BehaviorTemplates::BEHAVIOR_REPAIR_ARMOR:
|
||||
case BehaviorTemplate::SHIELD: break;
|
||||
case BehaviorTemplate::REPAIR_ARMOR:
|
||||
behavior = new RepairBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SPEED:
|
||||
case BehaviorTemplate::SPEED:
|
||||
behavior = new SpeedBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_DARK_INSPIRATION:
|
||||
case BehaviorTemplate::DARK_INSPIRATION:
|
||||
behavior = new DarkInspirationBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_LOOT_BUFF:
|
||||
case BehaviorTemplate::LOOT_BUFF:
|
||||
behavior = new LootBuffBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_VENTURE_VISION:
|
||||
case BehaviorTemplate::VENTURE_VISION:
|
||||
behavior = new VentureVisionBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SPAWN_OBJECT:
|
||||
case BehaviorTemplate::SPAWN_OBJECT:
|
||||
behavior = new SpawnBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_LAY_BRICK: break;
|
||||
case BehaviorTemplates::BEHAVIOR_SWITCH:
|
||||
case BehaviorTemplate::LAY_BRICK: break;
|
||||
case BehaviorTemplate::SWITCH:
|
||||
behavior = new SwitchBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_BUFF:
|
||||
case BehaviorTemplate::BUFF:
|
||||
behavior = new BuffBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_JETPACK:
|
||||
case BehaviorTemplate::JETPACK:
|
||||
behavior = new JetPackBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SKILL_EVENT:
|
||||
case BehaviorTemplate::SKILL_EVENT:
|
||||
behavior = new SkillEventBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_CONSUME_ITEM:
|
||||
case BehaviorTemplate::CONSUME_ITEM:
|
||||
behavior = new ConsumeItemBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SKILL_CAST_FAILED:
|
||||
case BehaviorTemplate::SKILL_CAST_FAILED:
|
||||
behavior = new SkillCastFailedBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_IMITATION_SKUNK_STINK: break;
|
||||
case BehaviorTemplates::BEHAVIOR_CHANGE_IDLE_FLAGS:
|
||||
case BehaviorTemplate::IMITATION_SKUNK_STINK: break;
|
||||
case BehaviorTemplate::CHANGE_IDLE_FLAGS:
|
||||
behavior = new ChangeIdleFlagsBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_APPLY_BUFF:
|
||||
case BehaviorTemplate::APPLY_BUFF:
|
||||
behavior = new ApplyBuffBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_CHAIN:
|
||||
case BehaviorTemplate::CHAIN:
|
||||
behavior = new ChainBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_CHANGE_ORIENTATION:
|
||||
case BehaviorTemplate::CHANGE_ORIENTATION:
|
||||
behavior = new ChangeOrientationBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_FORCE_MOVEMENT:
|
||||
case BehaviorTemplate::FORCE_MOVEMENT:
|
||||
behavior = new ForceMovementBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_INTERRUPT:
|
||||
case BehaviorTemplate::INTERRUPT:
|
||||
behavior = new InterruptBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_ALTER_COOLDOWN: break;
|
||||
case BehaviorTemplates::BEHAVIOR_CHARGE_UP:
|
||||
case BehaviorTemplate::ALTER_COOLDOWN: break;
|
||||
case BehaviorTemplate::CHARGE_UP:
|
||||
behavior = new ChargeUpBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SWITCH_MULTIPLE:
|
||||
case BehaviorTemplate::SWITCH_MULTIPLE:
|
||||
behavior = new SwitchMultipleBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_START:
|
||||
case BehaviorTemplate::START:
|
||||
behavior = new StartBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_END:
|
||||
case BehaviorTemplate::END:
|
||||
behavior = new EndBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_ALTER_CHAIN_DELAY: break;
|
||||
case BehaviorTemplates::BEHAVIOR_CAMERA: break;
|
||||
case BehaviorTemplates::BEHAVIOR_REMOVE_BUFF:
|
||||
case BehaviorTemplate::ALTER_CHAIN_DELAY: break;
|
||||
case BehaviorTemplate::CAMERA: break;
|
||||
case BehaviorTemplate::REMOVE_BUFF:
|
||||
behavior = new RemoveBuffBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_GRAB: break;
|
||||
case BehaviorTemplates::BEHAVIOR_MODULAR_BUILD: break;
|
||||
case BehaviorTemplates::BEHAVIOR_NPC_COMBAT_SKILL:
|
||||
case BehaviorTemplate::GRAB: break;
|
||||
case BehaviorTemplate::MODULAR_BUILD: break;
|
||||
case BehaviorTemplate::NPC_COMBAT_SKILL:
|
||||
behavior = new NpcCombatSkillBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_BLOCK:
|
||||
case BehaviorTemplate::BLOCK:
|
||||
behavior = new BlockBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_VERIFY:
|
||||
case BehaviorTemplate::VERIFY:
|
||||
behavior = new VerifyBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_TAUNT:
|
||||
case BehaviorTemplate::TAUNT:
|
||||
behavior = new TauntBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_AIR_MOVEMENT:
|
||||
case BehaviorTemplate::AIR_MOVEMENT:
|
||||
behavior = new AirMovementBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_SPAWN_QUICKBUILD:
|
||||
case BehaviorTemplate::SPAWN_QUICKBUILD:
|
||||
behavior = new SpawnBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_PULL_TO_POINT:
|
||||
case BehaviorTemplate::PULL_TO_POINT:
|
||||
behavior = new PullToPointBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_PROPERTY_ROTATE: break;
|
||||
case BehaviorTemplates::BEHAVIOR_DAMAGE_REDUCTION:
|
||||
case BehaviorTemplate::PROPERTY_ROTATE: break;
|
||||
case BehaviorTemplate::DAMAGE_REDUCTION:
|
||||
behavior = new DamageReductionBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_PROPERTY_TELEPORT:
|
||||
case BehaviorTemplate::PROPERTY_TELEPORT:
|
||||
behavior = new PropertyTeleportBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_PROPERTY_CLEAR_TARGET:
|
||||
case BehaviorTemplate::PROPERTY_CLEAR_TARGET:
|
||||
behavior = new ClearTargetBehavior(behaviorId);
|
||||
break;
|
||||
case BehaviorTemplates::BEHAVIOR_TAKE_PICTURE: break;
|
||||
case BehaviorTemplates::BEHAVIOR_MOUNT: break;
|
||||
case BehaviorTemplates::BEHAVIOR_SKILL_SET: break;
|
||||
case BehaviorTemplate::TAKE_PICTURE: break;
|
||||
case BehaviorTemplate::MOUNT: break;
|
||||
case BehaviorTemplate::SKILL_SET: break;
|
||||
default:
|
||||
//LOG("Failed to load behavior with invalid template id (%i)!", templateId);
|
||||
break;
|
||||
@@ -296,19 +296,19 @@ Behavior* Behavior::CreateBehavior(const uint32_t behaviorId) {
|
||||
return behavior;
|
||||
}
|
||||
|
||||
BehaviorTemplates Behavior::GetBehaviorTemplate(const uint32_t behaviorId) {
|
||||
BehaviorTemplate Behavior::GetBehaviorTemplate(const uint32_t behaviorId) {
|
||||
auto behaviorTemplateTable = CDClientManager::GetTable<CDBehaviorTemplateTable>();
|
||||
|
||||
BehaviorTemplates templateID = BehaviorTemplates::BEHAVIOR_EMPTY;
|
||||
BehaviorTemplate templateID = BehaviorTemplate::EMPTY;
|
||||
// Find behavior template by its behavior id. Default to 0.
|
||||
if (behaviorTemplateTable) {
|
||||
auto templateEntry = behaviorTemplateTable->GetByBehaviorID(behaviorId);
|
||||
if (templateEntry.behaviorID == behaviorId) {
|
||||
templateID = static_cast<BehaviorTemplates>(templateEntry.templateID);
|
||||
templateID = static_cast<BehaviorTemplate>(templateEntry.templateID);
|
||||
}
|
||||
}
|
||||
|
||||
if (templateID == BehaviorTemplates::BEHAVIOR_EMPTY && behaviorId != 0) {
|
||||
if (templateID == BehaviorTemplate::EMPTY && behaviorId != 0) {
|
||||
LOG("Failed to load behavior template with id (%i)!", behaviorId);
|
||||
}
|
||||
|
||||
@@ -419,7 +419,7 @@ Behavior::Behavior(const uint32_t behaviorId) {
|
||||
|
||||
if (behaviorId == 0) {
|
||||
this->m_effectId = 0;
|
||||
this->m_templateId = BehaviorTemplates::BEHAVIOR_EMPTY;
|
||||
this->m_templateId = BehaviorTemplate::EMPTY;
|
||||
}
|
||||
|
||||
// Make sure we do not proceed if we are trying to load an invalid behavior
|
||||
@@ -427,12 +427,12 @@ Behavior::Behavior(const uint32_t behaviorId) {
|
||||
LOG("Failed to load behavior with id (%i)!", behaviorId);
|
||||
|
||||
this->m_effectId = 0;
|
||||
this->m_templateId = BehaviorTemplates::BEHAVIOR_EMPTY;
|
||||
this->m_templateId = BehaviorTemplate::EMPTY;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this->m_templateId = static_cast<BehaviorTemplates>(templateInDatabase.templateID);
|
||||
this->m_templateId = static_cast<BehaviorTemplate>(templateInDatabase.templateID);
|
||||
|
||||
this->m_effectId = templateInDatabase.effectID;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <unordered_map>
|
||||
|
||||
#include "BitStream.h"
|
||||
#include "BehaviorTemplates.h"
|
||||
#include "BehaviorTemplate.h"
|
||||
#include "dCommonVars.h"
|
||||
|
||||
struct BehaviorContext;
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
|
||||
static Behavior* CreateBehavior(uint32_t behaviorId);
|
||||
|
||||
static BehaviorTemplates GetBehaviorTemplate(uint32_t behaviorId);
|
||||
static BehaviorTemplate GetBehaviorTemplate(uint32_t behaviorId);
|
||||
|
||||
/*
|
||||
* Utilities
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
*/
|
||||
|
||||
uint32_t m_behaviorId;
|
||||
BehaviorTemplates m_templateId;
|
||||
BehaviorTemplate m_templateId;
|
||||
uint32_t m_effectId;
|
||||
std::string m_effectHandle;
|
||||
std::unordered_map<std::string, std::string> m_effectNames;
|
||||
|
||||
70
dGame/dBehaviors/BehaviorTemplate.h
Normal file
70
dGame/dBehaviors/BehaviorTemplate.h
Normal file
@@ -0,0 +1,70 @@
|
||||
#pragma once
|
||||
|
||||
enum class BehaviorTemplate : unsigned int {
|
||||
EMPTY, // Not a real behavior, indicates invalid behaviors
|
||||
BASIC_ATTACK,
|
||||
TAC_ARC,
|
||||
AND,
|
||||
PROJECTILE_ATTACK,
|
||||
HEAL,
|
||||
MOVEMENT_SWITCH,
|
||||
AREA_OF_EFFECT,
|
||||
PLAY_EFFECT,
|
||||
IMMUNITY,
|
||||
DAMAGE_BUFF,
|
||||
DAMAGE_ABSORBTION,
|
||||
OVER_TIME,
|
||||
IMAGINATION,
|
||||
TARGET_CASTER,
|
||||
STUN,
|
||||
DURATION,
|
||||
KNOCKBACK,
|
||||
ATTACK_DELAY,
|
||||
CAR_BOOST,
|
||||
FALL_SPEED,
|
||||
SHIELD,
|
||||
REPAIR_ARMOR,
|
||||
SPEED,
|
||||
DARK_INSPIRATION,
|
||||
LOOT_BUFF,
|
||||
VENTURE_VISION,
|
||||
SPAWN_OBJECT,
|
||||
LAY_BRICK,
|
||||
SWITCH,
|
||||
BUFF,
|
||||
JETPACK,
|
||||
SKILL_EVENT,
|
||||
CONSUME_ITEM,
|
||||
SKILL_CAST_FAILED,
|
||||
IMITATION_SKUNK_STINK,
|
||||
CHANGE_IDLE_FLAGS,
|
||||
APPLY_BUFF,
|
||||
CHAIN,
|
||||
CHANGE_ORIENTATION,
|
||||
FORCE_MOVEMENT,
|
||||
INTERRUPT,
|
||||
ALTER_COOLDOWN,
|
||||
CHARGE_UP,
|
||||
SWITCH_MULTIPLE,
|
||||
START,
|
||||
END,
|
||||
ALTER_CHAIN_DELAY,
|
||||
CAMERA,
|
||||
REMOVE_BUFF,
|
||||
GRAB,
|
||||
MODULAR_BUILD,
|
||||
NPC_COMBAT_SKILL,
|
||||
BLOCK,
|
||||
VERIFY,
|
||||
TAUNT,
|
||||
AIR_MOVEMENT,
|
||||
SPAWN_QUICKBUILD,
|
||||
PULL_TO_POINT,
|
||||
PROPERTY_ROTATE,
|
||||
DAMAGE_REDUCTION,
|
||||
PROPERTY_TELEPORT,
|
||||
PROPERTY_CLEAR_TARGET,
|
||||
TAKE_PICTURE,
|
||||
MOUNT,
|
||||
SKILL_SET
|
||||
};
|
||||
@@ -1 +0,0 @@
|
||||
#include "BehaviorTemplates.h"
|
||||
@@ -1,70 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
enum class BehaviorTemplates : unsigned int {
|
||||
BEHAVIOR_EMPTY, // Not a real behavior, indicates invalid behaviors
|
||||
BEHAVIOR_BASIC_ATTACK,
|
||||
BEHAVIOR_TAC_ARC,
|
||||
BEHAVIOR_AND,
|
||||
BEHAVIOR_PROJECTILE_ATTACK,
|
||||
BEHAVIOR_HEAL,
|
||||
BEHAVIOR_MOVEMENT_SWITCH,
|
||||
BEHAVIOR_AREA_OF_EFFECT,
|
||||
BEHAVIOR_PLAY_EFFECT,
|
||||
BEHAVIOR_IMMUNITY,
|
||||
BEHAVIOR_DAMAGE_BUFF,
|
||||
BEHAVIOR_DAMAGE_ABSORBTION,
|
||||
BEHAVIOR_OVER_TIME,
|
||||
BEHAVIOR_IMAGINATION,
|
||||
BEHAVIOR_TARGET_CASTER,
|
||||
BEHAVIOR_STUN,
|
||||
BEHAVIOR_DURATION,
|
||||
BEHAVIOR_KNOCKBACK,
|
||||
BEHAVIOR_ATTACK_DELAY,
|
||||
BEHAVIOR_CAR_BOOST,
|
||||
BEHAVIOR_FALL_SPEED,
|
||||
BEHAVIOR_SHIELD,
|
||||
BEHAVIOR_REPAIR_ARMOR,
|
||||
BEHAVIOR_SPEED,
|
||||
BEHAVIOR_DARK_INSPIRATION,
|
||||
BEHAVIOR_LOOT_BUFF,
|
||||
BEHAVIOR_VENTURE_VISION,
|
||||
BEHAVIOR_SPAWN_OBJECT,
|
||||
BEHAVIOR_LAY_BRICK,
|
||||
BEHAVIOR_SWITCH,
|
||||
BEHAVIOR_BUFF,
|
||||
BEHAVIOR_JETPACK,
|
||||
BEHAVIOR_SKILL_EVENT,
|
||||
BEHAVIOR_CONSUME_ITEM,
|
||||
BEHAVIOR_SKILL_CAST_FAILED,
|
||||
BEHAVIOR_IMITATION_SKUNK_STINK,
|
||||
BEHAVIOR_CHANGE_IDLE_FLAGS,
|
||||
BEHAVIOR_APPLY_BUFF,
|
||||
BEHAVIOR_CHAIN,
|
||||
BEHAVIOR_CHANGE_ORIENTATION,
|
||||
BEHAVIOR_FORCE_MOVEMENT,
|
||||
BEHAVIOR_INTERRUPT,
|
||||
BEHAVIOR_ALTER_COOLDOWN,
|
||||
BEHAVIOR_CHARGE_UP,
|
||||
BEHAVIOR_SWITCH_MULTIPLE,
|
||||
BEHAVIOR_START,
|
||||
BEHAVIOR_END,
|
||||
BEHAVIOR_ALTER_CHAIN_DELAY,
|
||||
BEHAVIOR_CAMERA,
|
||||
BEHAVIOR_REMOVE_BUFF,
|
||||
BEHAVIOR_GRAB,
|
||||
BEHAVIOR_MODULAR_BUILD,
|
||||
BEHAVIOR_NPC_COMBAT_SKILL,
|
||||
BEHAVIOR_BLOCK,
|
||||
BEHAVIOR_VERIFY,
|
||||
BEHAVIOR_TAUNT,
|
||||
BEHAVIOR_AIR_MOVEMENT,
|
||||
BEHAVIOR_SPAWN_QUICKBUILD,
|
||||
BEHAVIOR_PULL_TO_POINT,
|
||||
BEHAVIOR_PROPERTY_ROTATE,
|
||||
BEHAVIOR_DAMAGE_REDUCTION,
|
||||
BEHAVIOR_PROPERTY_TELEPORT,
|
||||
BEHAVIOR_PROPERTY_CLEAR_TARGET,
|
||||
BEHAVIOR_TAKE_PICTURE,
|
||||
BEHAVIOR_MOUNT,
|
||||
BEHAVIOR_SKILL_SET
|
||||
};
|
||||
@@ -7,7 +7,6 @@ set(DGAME_DBEHAVIORS_SOURCES "AirMovementBehavior.cpp"
|
||||
"Behavior.cpp"
|
||||
"BehaviorBranchContext.cpp"
|
||||
"BehaviorContext.cpp"
|
||||
"BehaviorTemplates.cpp"
|
||||
"BlockBehavior.cpp"
|
||||
"BuffBehavior.cpp"
|
||||
"CarBoostBehavior.cpp"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "Logger.h"
|
||||
|
||||
void ForceMovementBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||
if (this->m_hitAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY && this->m_hitEnemyAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY && this->m_hitFactionAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY) {
|
||||
if (this->m_hitAction->m_templateId == BehaviorTemplate::EMPTY && this->m_hitEnemyAction->m_templateId == BehaviorTemplate::EMPTY && this->m_hitFactionAction->m_templateId == BehaviorTemplate::EMPTY) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ void ForceMovementBehavior::Sync(BehaviorContext* context, RakNet::BitStream& bi
|
||||
}
|
||||
|
||||
void ForceMovementBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||
if (this->m_hitAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY && this->m_hitEnemyAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY && this->m_hitFactionAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY) {
|
||||
if (this->m_hitAction->m_templateId == BehaviorTemplate::EMPTY && this->m_hitEnemyAction->m_templateId == BehaviorTemplate::EMPTY && this->m_hitFactionAction->m_templateId == BehaviorTemplate::EMPTY) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,36 +8,50 @@
|
||||
|
||||
|
||||
void InterruptBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||
if (branch.target != context->originator) {
|
||||
bool unknown = false;
|
||||
LWOOBJID usedTarget = m_target ? branch.target : context->originator;
|
||||
|
||||
if (!bitStream.Read(unknown)) {
|
||||
LOG("Unable to read unknown1 from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
if (usedTarget != context->originator) {
|
||||
bool isTargetImmuneStuns = false;
|
||||
if (!bitStream.Read(isTargetImmuneStuns)) {
|
||||
LOG("Unable to read isTargetImmune from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
return;
|
||||
};
|
||||
|
||||
if (unknown) return;
|
||||
if (isTargetImmuneStuns) return;
|
||||
}
|
||||
|
||||
if (!this->m_interruptBlock) {
|
||||
bool unknown = false;
|
||||
|
||||
if (!bitStream.Read(unknown)) {
|
||||
LOG("Unable to read unknown2 from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
bool isBlockingInterrupts = false;
|
||||
if (!bitStream.Read(isBlockingInterrupts)) {
|
||||
LOG("Unable to read isBlockingInterrupts from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
return;
|
||||
};
|
||||
|
||||
if (unknown) return;
|
||||
if (isBlockingInterrupts) return;
|
||||
}
|
||||
|
||||
if (this->m_target) // Guess...
|
||||
{
|
||||
bool unknown = false;
|
||||
bool hasInterruptedStatusEffects = false;
|
||||
if (!bitStream.Read(hasInterruptedStatusEffects)) {
|
||||
LOG("Unable to read hasInterruptedStatusEffects from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
return;
|
||||
};
|
||||
|
||||
if (!bitStream.Read(unknown)) {
|
||||
LOG("Unable to read unknown3 from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
return;
|
||||
};
|
||||
if (hasInterruptedStatusEffects) {
|
||||
bool hasMoreInterruptedStatusEffects = false;
|
||||
int32_t loopLimit = 0;
|
||||
while (bitStream.Read(hasMoreInterruptedStatusEffects) && hasMoreInterruptedStatusEffects) {
|
||||
int32_t statusEffectID = 0;
|
||||
bitStream.Read(statusEffectID);
|
||||
// nothing happens with this data yes. I have no idea why or what it was used for, but the client literally just reads it and does nothing with it.
|
||||
// 0x004faca4 for a reference. it also has a hard loop limit of 100 soo,
|
||||
loopLimit++;
|
||||
if (loopLimit > 100) {
|
||||
// if this is hit you have a problem
|
||||
LOG("Loop limit reached for interrupted status effects, aborting Handle due to bad bitstream! %i", bitStream.GetNumberOfUnreadBits());
|
||||
break;
|
||||
}
|
||||
LOG_DEBUG("Interrupted status effect ID: %i", statusEffectID);
|
||||
}
|
||||
}
|
||||
|
||||
if (branch.target == context->originator) return;
|
||||
@@ -55,7 +69,8 @@ void InterruptBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitS
|
||||
|
||||
|
||||
void InterruptBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||
if (branch.target != context->originator) {
|
||||
LWOOBJID usedTarget = m_target ? branch.target : context->originator;
|
||||
if (usedTarget != context->originator) {
|
||||
bitStream.Write(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
void MovementSwitchBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||
uint32_t movementType{};
|
||||
if (!bitStream.Read(movementType)) {
|
||||
if (this->m_groundAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY &&
|
||||
this->m_jumpAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY &&
|
||||
this->m_fallingAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY &&
|
||||
this->m_doubleJumpAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY &&
|
||||
this->m_airAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY &&
|
||||
this->m_jetpackAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY &&
|
||||
this->m_movingAction->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY) {
|
||||
if (this->m_groundAction->m_templateId == BehaviorTemplate::EMPTY &&
|
||||
this->m_jumpAction->m_templateId == BehaviorTemplate::EMPTY &&
|
||||
this->m_fallingAction->m_templateId == BehaviorTemplate::EMPTY &&
|
||||
this->m_doubleJumpAction->m_templateId == BehaviorTemplate::EMPTY &&
|
||||
this->m_airAction->m_templateId == BehaviorTemplate::EMPTY &&
|
||||
this->m_jetpackAction->m_templateId == BehaviorTemplate::EMPTY &&
|
||||
this->m_movingAction->m_templateId == BehaviorTemplate::EMPTY) {
|
||||
return;
|
||||
}
|
||||
LOG("Unable to read movementType from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
|
||||
@@ -47,7 +47,7 @@ void MovementSwitchBehavior::Handle(BehaviorContext* context, RakNet::BitStream&
|
||||
Behavior* MovementSwitchBehavior::LoadMovementType(std::string movementType) {
|
||||
float actionValue = GetFloat(movementType, -1.0f);
|
||||
auto loadedBehavior = GetAction(actionValue != -1.0f ? actionValue : 0.0f);
|
||||
if (actionValue == -1.0f && loadedBehavior->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY) {
|
||||
if (actionValue == -1.0f && loadedBehavior->m_templateId == BehaviorTemplate::EMPTY) {
|
||||
loadedBehavior = this->m_groundAction;
|
||||
}
|
||||
return loadedBehavior;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "eMissionTaskType.h"
|
||||
#include "eMatchUpdate.h"
|
||||
#include "eConnectionType.h"
|
||||
#include "eChatInternalMessageType.h"
|
||||
#include "eChatMessageType.h"
|
||||
|
||||
#include "CDCurrencyTableTable.h"
|
||||
#include "CDActivityRewardsTable.h"
|
||||
@@ -501,7 +501,7 @@ void ActivityInstance::StartZone() {
|
||||
// only make a team if we have more than one participant
|
||||
if (participants.size() > 1) {
|
||||
CBITSTREAM;
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::CREATE_TEAM);
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::CREATE_TEAM);
|
||||
|
||||
bitStream.Write(leader->GetObjectID());
|
||||
bitStream.Write(m_Participants.size());
|
||||
|
||||
@@ -50,9 +50,44 @@ MovementAIComponent::MovementAIComponent(Entity* parent, MovementAIInfo info) :
|
||||
m_CurrentSpeed = 0;
|
||||
m_MaxSpeed = 0;
|
||||
m_LockRotation = false;
|
||||
m_Path = nullptr;
|
||||
m_SourcePosition = m_Parent->GetPosition();
|
||||
m_Paused = false;
|
||||
m_SavedVelocity = NiPoint3Constant::ZERO;
|
||||
|
||||
if (!m_Parent->GetComponent<BaseCombatAIComponent>()) SetPath(m_Parent->GetVarAsString(u"attached_path"));
|
||||
}
|
||||
|
||||
void MovementAIComponent::SetPath(const std::string pathName) {
|
||||
m_Path = Game::zoneManager->GetZone()->GetPath(pathName);
|
||||
if (!pathName.empty()) LOG("WARNING: %s path %s", m_Path ? "Found" : "Failed to find", pathName.c_str());
|
||||
if (!m_Path) return;
|
||||
SetMaxSpeed(1);
|
||||
SetCurrentSpeed(m_BaseSpeed);
|
||||
SetPath(m_Path->pathWaypoints);
|
||||
}
|
||||
|
||||
void MovementAIComponent::Pause() {
|
||||
if (m_Paused) return;
|
||||
m_Paused = true;
|
||||
SetPosition(ApproximateLocation());
|
||||
m_SavedVelocity = GetVelocity();
|
||||
SetVelocity(NiPoint3Constant::ZERO);
|
||||
Game::entityManager->SerializeEntity(m_Parent);
|
||||
}
|
||||
|
||||
void MovementAIComponent::Resume() {
|
||||
if (!m_Paused) return;
|
||||
m_Paused = false;
|
||||
SetVelocity(m_SavedVelocity);
|
||||
m_SavedVelocity = NiPoint3Constant::ZERO;
|
||||
SetRotation(NiQuaternion::LookAt(m_Parent->GetPosition(), m_NextWaypoint));
|
||||
Game::entityManager->SerializeEntity(m_Parent);
|
||||
}
|
||||
|
||||
void MovementAIComponent::Update(const float deltaTime) {
|
||||
if (m_Paused) return;
|
||||
|
||||
if (m_PullingToPoint) {
|
||||
const auto source = GetCurrentWaypoint();
|
||||
|
||||
@@ -81,27 +116,24 @@ void MovementAIComponent::Update(const float deltaTime) {
|
||||
}
|
||||
|
||||
m_TimeTravelled += deltaTime;
|
||||
|
||||
SetPosition(ApproximateLocation());
|
||||
|
||||
if (m_TimeTravelled < m_TimeToTravel) return;
|
||||
m_TimeTravelled = 0.0f;
|
||||
|
||||
const auto source = GetCurrentWaypoint();
|
||||
|
||||
SetPosition(source);
|
||||
|
||||
NiPoint3 velocity = NiPoint3Constant::ZERO;
|
||||
m_SourcePosition = source;
|
||||
|
||||
if (m_Acceleration > 0 && m_BaseSpeed > 0 && AdvanceWaypointIndex()) // Do we have another waypoint to seek?
|
||||
{
|
||||
m_NextWaypoint = GetCurrentWaypoint();
|
||||
|
||||
if (m_NextWaypoint == source) {
|
||||
m_TimeToTravel = 0.0f;
|
||||
} else {
|
||||
if (m_CurrentSpeed < m_MaxSpeed) {
|
||||
m_CurrentSpeed += m_Acceleration;
|
||||
}
|
||||
|
||||
m_CurrentSpeed = std::min(m_CurrentSpeed, m_MaxSpeed);
|
||||
m_CurrentSpeed = std::min(m_CurrentSpeed + m_Acceleration, m_MaxSpeed);
|
||||
|
||||
const auto speed = m_CurrentSpeed * m_BaseSpeed; // scale speed based on base speed
|
||||
|
||||
@@ -110,7 +142,7 @@ void MovementAIComponent::Update(const float deltaTime) {
|
||||
// Normalize the vector
|
||||
const auto length = delta.Length();
|
||||
if (length > 0.0f) {
|
||||
velocity = (delta / length) * speed;
|
||||
SetVelocity((delta / length) * speed);
|
||||
}
|
||||
|
||||
// Calclute the time it will take to reach the next waypoint with the current speed
|
||||
@@ -122,17 +154,27 @@ void MovementAIComponent::Update(const float deltaTime) {
|
||||
} else {
|
||||
// Check if there are more waypoints in the queue, if so set our next destination to the next waypoint
|
||||
if (m_CurrentPath.empty()) {
|
||||
Stop();
|
||||
|
||||
return;
|
||||
if (m_Path) {
|
||||
if (m_Path->pathBehavior == PathBehavior::Loop) {
|
||||
SetPath(m_Path->pathWaypoints);
|
||||
} else if (m_Path->pathBehavior == PathBehavior::Bounce) {
|
||||
std::vector<PathWaypoint> waypoints = m_Path->pathWaypoints;
|
||||
std::reverse(waypoints.begin(), waypoints.end());
|
||||
SetPath(waypoints);
|
||||
} else if (m_Path->pathBehavior == PathBehavior::Once) {
|
||||
Stop();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
Stop();
|
||||
return;
|
||||
}
|
||||
}
|
||||
SetDestination(m_CurrentPath.top());
|
||||
SetDestination(m_CurrentPath.top().position);
|
||||
|
||||
m_CurrentPath.pop();
|
||||
}
|
||||
|
||||
SetVelocity(velocity);
|
||||
|
||||
Game::entityManager->SerializeEntity(m_Parent);
|
||||
}
|
||||
|
||||
@@ -155,7 +197,7 @@ NiPoint3 MovementAIComponent::GetCurrentWaypoint() const {
|
||||
}
|
||||
|
||||
NiPoint3 MovementAIComponent::ApproximateLocation() const {
|
||||
auto source = m_Parent->GetPosition();
|
||||
auto source = m_SourcePosition;
|
||||
|
||||
if (AtFinalWaypoint()) return source;
|
||||
|
||||
@@ -221,13 +263,13 @@ void MovementAIComponent::PullToPoint(const NiPoint3& point) {
|
||||
m_PullPoint = point;
|
||||
}
|
||||
|
||||
void MovementAIComponent::SetPath(std::vector<NiPoint3> path) {
|
||||
void MovementAIComponent::SetPath(std::vector<PathWaypoint> path) {
|
||||
if (path.empty()) return;
|
||||
std::for_each(path.rbegin(), path.rend() - 1, [this](const NiPoint3& point) {
|
||||
std::for_each(path.rbegin(), path.rend() - 1, [this](const PathWaypoint& point) {
|
||||
this->m_CurrentPath.push(point);
|
||||
});
|
||||
|
||||
SetDestination(path.front());
|
||||
SetDestination(path.front().position);
|
||||
}
|
||||
|
||||
float MovementAIComponent::GetBaseSpeed(LOT lot) {
|
||||
@@ -272,6 +314,23 @@ void MovementAIComponent::SetRotation(const NiQuaternion& value) {
|
||||
if (!m_LockRotation) m_Parent->SetRotation(value);
|
||||
}
|
||||
|
||||
NiPoint3 MovementAIComponent::GetVelocity() const {
|
||||
auto* controllablePhysicsComponent = m_Parent->GetComponent<ControllablePhysicsComponent>();
|
||||
|
||||
if (controllablePhysicsComponent != nullptr) {
|
||||
return controllablePhysicsComponent->GetVelocity();
|
||||
}
|
||||
|
||||
auto* simplePhysicsComponent = m_Parent->GetComponent<SimplePhysicsComponent>();
|
||||
|
||||
if (simplePhysicsComponent != nullptr) {
|
||||
return simplePhysicsComponent->GetVelocity();
|
||||
}
|
||||
|
||||
return NiPoint3Constant::ZERO;
|
||||
|
||||
}
|
||||
|
||||
void MovementAIComponent::SetVelocity(const NiPoint3& value) {
|
||||
auto* controllablePhysicsComponent = m_Parent->GetComponent<ControllablePhysicsComponent>();
|
||||
|
||||
@@ -288,7 +347,7 @@ void MovementAIComponent::SetVelocity(const NiPoint3& value) {
|
||||
}
|
||||
}
|
||||
|
||||
void MovementAIComponent::SetDestination(const NiPoint3& destination) {
|
||||
void MovementAIComponent::SetDestination(const NiPoint3 destination) {
|
||||
if (m_PullingToPoint) return;
|
||||
|
||||
const auto location = ApproximateLocation();
|
||||
@@ -297,6 +356,8 @@ void MovementAIComponent::SetDestination(const NiPoint3& destination) {
|
||||
SetPosition(location);
|
||||
}
|
||||
|
||||
m_SourcePosition = location;
|
||||
|
||||
std::vector<NiPoint3> computedPath;
|
||||
if (dpWorld::IsLoaded()) {
|
||||
computedPath = dpWorld::GetNavMesh()->GetPath(m_Parent->GetPosition(), destination, m_Info.wanderSpeed);
|
||||
|
||||
@@ -14,11 +14,14 @@
|
||||
#include "Logger.h"
|
||||
#include "Component.h"
|
||||
#include "eReplicaComponentType.h"
|
||||
#include "Zone.h"
|
||||
#include <vector>
|
||||
|
||||
class ControllablePhysicsComponent;
|
||||
class BaseCombatAIComponent;
|
||||
|
||||
struct Path;
|
||||
|
||||
/**
|
||||
* Information that describes the different variables used to make an entity move around
|
||||
*/
|
||||
@@ -61,6 +64,8 @@ public:
|
||||
|
||||
MovementAIComponent(Entity* parentEntity, MovementAIInfo info);
|
||||
|
||||
void SetPath(const std::string pathName);
|
||||
|
||||
void Update(float deltaTime) override;
|
||||
|
||||
/**
|
||||
@@ -73,7 +78,7 @@ public:
|
||||
* Set a destination point for the entity to move towards
|
||||
* @param value the destination point to move towards
|
||||
*/
|
||||
void SetDestination(const NiPoint3& value);
|
||||
void SetDestination(const NiPoint3 value);
|
||||
|
||||
/**
|
||||
* Returns the current rotation this entity is moving towards
|
||||
@@ -189,7 +194,13 @@ public:
|
||||
* Sets a path to follow for the AI
|
||||
* @param path the path to follow
|
||||
*/
|
||||
void SetPath(std::vector<NiPoint3> path);
|
||||
void SetPath(std::vector<PathWaypoint> path);
|
||||
|
||||
void Pause();
|
||||
|
||||
void Resume();
|
||||
|
||||
NiPoint3 GetVelocity() const;
|
||||
|
||||
/**
|
||||
* Returns the base speed from the DB for a given LOT
|
||||
@@ -301,7 +312,15 @@ private:
|
||||
/**
|
||||
* The path from the current position to the destination.
|
||||
*/
|
||||
std::stack<NiPoint3> m_CurrentPath;
|
||||
std::stack<PathWaypoint> m_CurrentPath;
|
||||
|
||||
const Path* m_Path = nullptr;
|
||||
|
||||
NiPoint3 m_SourcePosition;
|
||||
|
||||
bool m_Paused;
|
||||
|
||||
NiPoint3 m_SavedVelocity;
|
||||
};
|
||||
|
||||
#endif // MOVEMENTAICOMPONENT_H
|
||||
|
||||
@@ -64,6 +64,7 @@ void ProximityMonitorComponent::Update(float deltaTime) {
|
||||
for (const auto& prox : m_ProximitiesData) {
|
||||
if (!prox.second) continue;
|
||||
|
||||
prox.second->SetPosition(m_Parent->GetPosition());
|
||||
//Process enter events
|
||||
for (auto* en : prox.second->GetNewObjects()) {
|
||||
m_Parent->OnCollisionProximity(en->GetObjectID(), prox.first, "ENTER");
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
#include "RenderComponent.h"
|
||||
#include "eControlScheme.h"
|
||||
#include "eConnectionType.h"
|
||||
#include "eChatInternalMessageType.h"
|
||||
#include "eChatMessageType.h"
|
||||
#include "eMasterMessageType.h"
|
||||
#include "PlayerManager.h"
|
||||
|
||||
@@ -2118,7 +2118,7 @@ namespace GreaterThanZeroCommands {
|
||||
|
||||
//Notify chat about it
|
||||
CBITSTREAM;
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE);
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GM_MUTE);
|
||||
|
||||
bitStream.Write(characterId);
|
||||
bitStream.Write(expire);
|
||||
@@ -2220,7 +2220,7 @@ void SlashCommandHandler::SendAnnouncement(const std::string& title, const std::
|
||||
|
||||
//Notify chat about it
|
||||
CBITSTREAM;
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ANNOUNCEMENT);
|
||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GM_ANNOUNCE);
|
||||
|
||||
bitStream.Write<uint32_t>(title.size());
|
||||
for (auto character : title) {
|
||||
|
||||
Reference in New Issue
Block a user