| 31 | namespace Star { |
| 32 | |
| 33 | Npc::Npc(NpcVariant const& npcVariant) |
| 34 | : m_humanoid(npcVariant.humanoidConfig) { |
| 35 | m_disableWornArmor.set(npcVariant.disableWornArmor); |
| 36 | |
| 37 | m_emoteState = HumanoidEmote::Idle; |
| 38 | m_chatMessageUpdated = false; |
| 39 | |
| 40 | m_statusText.set({}); |
| 41 | m_displayNametag.set(false); |
| 42 | |
| 43 | auto assets = Root::singleton().assets(); |
| 44 | |
| 45 | m_emoteCooldownTimer = GameTimer(assets->json("/npcs/npc.config:emoteCooldown").toFloat()); |
| 46 | m_danceCooldownTimer = GameTimer(0.0f); |
| 47 | m_blinkInterval = jsonToVec2F(assets->json("/npcs/npc.config:blinkInterval")); |
| 48 | |
| 49 | m_questIndicatorOffset = jsonToVec2F(assets->json("/quests/quests.config:defaultIndicatorOffset")); |
| 50 | |
| 51 | if (npcVariant.overrides) |
| 52 | m_clientEntityMode = ClientEntityModeNames.getLeft(npcVariant.overrides.getString("clientEntityMode", "ClientSlaveOnly")); |
| 53 | |
| 54 | m_isInteractive.set(false); |
| 55 | |
| 56 | m_shifting.set(false); |
| 57 | m_damageOnTouch.set(false); |
| 58 | |
| 59 | m_dropPools.set(npcVariant.dropPools); |
| 60 | m_npcVariant = npcVariant; |
| 61 | |
| 62 | setTeam(EntityDamageTeam(m_npcVariant.damageTeamType, m_npcVariant.damageTeam)); |
| 63 | |
| 64 | m_scriptComponent.setScripts(m_npcVariant.scripts); |
| 65 | m_scriptComponent.setUpdateDelta(m_npcVariant.initialScriptDelta); |
| 66 | auto movementParameters = ActorMovementParameters(m_npcVariant.movementParameters); |
| 67 | if (!movementParameters.physicsEffectCategories) |
| 68 | movementParameters.physicsEffectCategories = StringSet({"npc"}); |
| 69 | m_movementController = make_shared<ActorMovementController>(movementParameters); |
| 70 | m_humanoid.setIdentity(m_npcVariant.humanoidIdentity); |
| 71 | m_deathParticleBurst.set(m_humanoid.defaultDeathParticles()); |
| 72 | |
| 73 | m_statusController = make_shared<StatusController>(m_npcVariant.statusControllerSettings); |
| 74 | m_statusController->setPersistentEffects("innate", m_npcVariant.innateStatusEffects); |
| 75 | auto speciesDefinition = Root::singleton().speciesDatabase()->species(species()); |
| 76 | m_statusController->setPersistentEffects("species", speciesDefinition->statusEffects()); |
| 77 | m_statusController->setStatusProperty("species", species()); |
| 78 | if (!m_statusController->statusProperty("effectDirectives")) |
| 79 | m_statusController->setStatusProperty("effectDirectives", speciesDefinition->effectDirectives()); |
| 80 | |
| 81 | m_songbook = make_shared<Songbook>(species()); |
| 82 | |
| 83 | m_effectEmitter = make_shared<EffectEmitter>(); |
| 84 | |
| 85 | m_hitDamageNotificationLimiter = 0; |
| 86 | m_hitDamageNotificationLimit = assets->json("/npcs/npc.config:hitDamageNotificationLimit").toInt(); |
| 87 | |
| 88 | m_blinkCooldownTimer = GameTimer(); |
| 89 | |
| 90 | m_armor = make_shared<ArmorWearer>(); |
nothing calls this directly
no test coverage detected