mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 06:56:44 +00:00 
			
		
		
		
	[General] Implement ActorSpellsActive packet, part 2
Additions and removals of actors' active spells can now be saved to and loaded from the server.
This commit is contained in:
		
							parent
							
								
									ea6d5c68ae
								
							
						
					
					
						commit
						1eeee29d51
					
				
					 2 changed files with 253 additions and 0 deletions
				
			
		|  | @ -17,6 +17,7 @@ BaseActorList writeActorList; | |||
| 
 | ||||
| BaseActor tempActor; | ||||
| const BaseActor emptyActor = {}; | ||||
| std::vector<ESM::ActiveEffect> storedActorActiveEffects; | ||||
| 
 | ||||
| static std::string tempCellDescription; | ||||
| 
 | ||||
|  | @ -224,6 +225,56 @@ unsigned int ActorFunctions::GetActorDeathState(unsigned int index) noexcept | |||
|     return readActorList->baseActors.at(index).deathState; | ||||
| } | ||||
| 
 | ||||
| unsigned int ActorFunctions::GetActorSpellsActiveChangesSize(unsigned int actorIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.size(); | ||||
| } | ||||
| 
 | ||||
| unsigned int ActorFunctions::GetActorSpellsActiveChangesAction(unsigned int actorIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.action; | ||||
| } | ||||
| 
 | ||||
| const char* ActorFunctions::GetActorSpellsActiveId(unsigned int actorIndex, unsigned int spellIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).id.c_str(); | ||||
| } | ||||
| 
 | ||||
| const char* ActorFunctions::GetActorSpellsActiveDisplayName(unsigned int actorIndex, unsigned int spellIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mDisplayName.c_str(); | ||||
| } | ||||
| 
 | ||||
| unsigned int ActorFunctions::GetActorSpellsActiveEffectCount(unsigned int actorIndex, unsigned int spellIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.size(); | ||||
| } | ||||
| 
 | ||||
| unsigned int ActorFunctions::GetActorSpellsActiveEffectId(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mEffectId; | ||||
| } | ||||
| 
 | ||||
| int ActorFunctions::GetActorSpellsActiveEffectArg(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mArg; | ||||
| } | ||||
| 
 | ||||
| double ActorFunctions::GetActorSpellsActiveEffectMagnitude(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mMagnitude; | ||||
| } | ||||
| 
 | ||||
| double ActorFunctions::GetActorSpellsActiveEffectDuration(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mDuration; | ||||
| } | ||||
| 
 | ||||
| double ActorFunctions::GetActorSpellsActiveEffectTimeLeft(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mTimeLeft; | ||||
| } | ||||
| 
 | ||||
| bool ActorFunctions::DoesActorHavePosition(unsigned int index) noexcept | ||||
| { | ||||
|     return readActorList->baseActors.at(index).hasPositionData; | ||||
|  | @ -338,6 +389,11 @@ void ActorFunctions::SetActorDeathInstant(bool isInstant) noexcept | |||
|     tempActor.isInstantDeath = isInstant; | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::SetActorSpellsActiveAction(unsigned char action) noexcept | ||||
| { | ||||
|     tempActor.spellsActiveChanges.action = action; | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::SetActorAIAction(unsigned int action) noexcept | ||||
| { | ||||
|     tempActor.aiAction = action; | ||||
|  | @ -398,6 +454,30 @@ void ActorFunctions::UnequipActorItem(unsigned short slot) noexcept | |||
|     ActorFunctions::EquipActorItem(slot, "", 0, -1, -1); | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::AddActorSpellActive(const char* spellId, const char* displayName) noexcept | ||||
| { | ||||
|     mwmp::ActiveSpell spell; | ||||
|     spell.id = spellId; | ||||
|     spell.params.mDisplayName = displayName; | ||||
|     spell.params.mEffects = storedActorActiveEffects; | ||||
| 
 | ||||
|     tempActor.spellsActiveChanges.activeSpells.push_back(spell); | ||||
| 
 | ||||
|     storedActorActiveEffects.clear(); | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::AddActorSpellActiveEffect(int effectId, double magnitude, double duration, double timeLeft, int arg) noexcept | ||||
| { | ||||
|     ESM::ActiveEffect effect; | ||||
|     effect.mEffectId = effectId; | ||||
|     effect.mMagnitude = magnitude; | ||||
|     effect.mDuration = duration; | ||||
|     effect.mTimeLeft = timeLeft; | ||||
|     effect.mArg = arg; | ||||
| 
 | ||||
|     storedActorActiveEffects.push_back(effect); | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::AddActor() noexcept | ||||
| { | ||||
|     writeActorList.baseActors.push_back(tempActor); | ||||
|  | @ -486,6 +566,25 @@ void ActorFunctions::SendActorEquipment(bool sendToOtherVisitors, bool skipAttac | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::SendActorSpellsActiveChanges(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept | ||||
| { | ||||
|     mwmp::ActorPacket* actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_SPELLS_ACTIVE); | ||||
|     actorPacket->setActorList(&writeActorList); | ||||
| 
 | ||||
|     if (!skipAttachedPlayer) | ||||
|         actorPacket->Send(writeActorList.guid); | ||||
| 
 | ||||
|     if (sendToOtherVisitors) | ||||
|     { | ||||
|         Cell* serverCell = CellController::get()->getCell(&writeActorList.cell); | ||||
| 
 | ||||
|         if (serverCell != nullptr) | ||||
|         { | ||||
|             serverCell->sendToLoaded(actorPacket, &writeActorList); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void ActorFunctions::SendActorSpeech(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept | ||||
| { | ||||
|     mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_SPEECH); | ||||
|  |  | |||
|  | @ -48,6 +48,17 @@ | |||
|     {"GetActorKillerName",                     ActorFunctions::GetActorKillerName},\ | ||||
|     {"GetActorDeathState",                     ActorFunctions::GetActorDeathState},\ | ||||
|     \ | ||||
|     {"GetActorSpellsActiveChangesSize",        ActorFunctions::GetActorSpellsActiveChangesSize},\ | ||||
|     {"GetActorSpellsActiveChangesAction",      ActorFunctions::GetActorSpellsActiveChangesAction},\ | ||||
|     {"GetActorSpellsActiveId",                 ActorFunctions::GetActorSpellsActiveId},\ | ||||
|     {"GetActorSpellsActiveDisplayName",        ActorFunctions::GetActorSpellsActiveDisplayName},\ | ||||
|     {"GetActorSpellsActiveEffectCount",        ActorFunctions::GetActorSpellsActiveEffectCount},\ | ||||
|     {"GetActorSpellsActiveEffectId",           ActorFunctions::GetActorSpellsActiveEffectId},\ | ||||
|     {"GetActorSpellsActiveEffectArg",          ActorFunctions::GetActorSpellsActiveEffectArg},\ | ||||
|     {"GetActorSpellsActiveEffectMagnitude",    ActorFunctions::GetActorSpellsActiveEffectMagnitude},\ | ||||
|     {"GetActorSpellsActiveEffectDuration",     ActorFunctions::GetActorSpellsActiveEffectDuration},\ | ||||
|     {"GetActorSpellsActiveEffectTimeLeft",     ActorFunctions::GetActorSpellsActiveEffectTimeLeft},\ | ||||
|     \ | ||||
|     {"DoesActorHavePosition",                  ActorFunctions::DoesActorHavePosition},\ | ||||
|     {"DoesActorHaveStatsDynamic",              ActorFunctions::DoesActorHaveStatsDynamic},\ | ||||
|     \ | ||||
|  | @ -75,6 +86,7 @@ | |||
|     {"SetActorDeathState",                     ActorFunctions::SetActorDeathState},\ | ||||
|     {"SetActorDeathInstant",                   ActorFunctions::SetActorDeathInstant},\ | ||||
|     {"SetActorSound",                          ActorFunctions::SetActorSound},\ | ||||
|     {"SetActorSpellsActiveAction",             ActorFunctions::SetActorSpellsActiveAction},\ | ||||
|     \ | ||||
|     {"SetActorAIAction",                       ActorFunctions::SetActorAIAction},\ | ||||
|     {"SetActorAITargetToPlayer",               ActorFunctions::SetActorAITargetToPlayer},\ | ||||
|  | @ -87,6 +99,9 @@ | |||
|     {"EquipActorItem",                         ActorFunctions::EquipActorItem},\ | ||||
|     {"UnequipActorItem",                       ActorFunctions::UnequipActorItem},\ | ||||
|     \ | ||||
|     {"AddActorSpellActive",                    ActorFunctions::AddActorSpellActive},\ | ||||
|     {"AddActorSpellActiveEffect",              ActorFunctions::AddActorSpellActiveEffect},\ | ||||
|     \ | ||||
|     {"AddActor",                               ActorFunctions::AddActor},\ | ||||
|     \ | ||||
|     {"SendActorList",                          ActorFunctions::SendActorList},\ | ||||
|  | @ -94,6 +109,7 @@ | |||
|     {"SendActorPosition",                      ActorFunctions::SendActorPosition},\ | ||||
|     {"SendActorStatsDynamic",                  ActorFunctions::SendActorStatsDynamic},\ | ||||
|     {"SendActorEquipment",                     ActorFunctions::SendActorEquipment},\ | ||||
|     {"SendActorSpellsActiveChanges",           ActorFunctions::SendActorSpellsActiveChanges},\ | ||||
|     {"SendActorSpeech",                        ActorFunctions::SendActorSpeech},\ | ||||
|     {"SendActorDeath",                         ActorFunctions::SendActorDeath},\ | ||||
|     {"SendActorAI",                            ActorFunctions::SendActorAI},\ | ||||
|  | @ -414,6 +430,99 @@ public: | |||
|     */ | ||||
|     static unsigned int GetActorDeathState(unsigned int index) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the number of indexes in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \return The number of indexes for spells active changes. | ||||
|     */ | ||||
|     static unsigned int GetActorSpellsActiveChangesSize(unsigned int actorIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the action type used in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \return The action type (0 for SET, 1 for ADD, 2 for REMOVE). | ||||
|     */ | ||||
|     static unsigned int GetActorSpellsActiveChangesAction(unsigned int actorIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the spell id at a certain index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \return The spell id. | ||||
|     */ | ||||
|     static const char* GetActorSpellsActiveId(unsigned int actorIndex, unsigned int spellIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the spell display name at a certain index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \return The spell display name. | ||||
|     */ | ||||
|     static const char* GetActorSpellsActiveDisplayName(unsigned int actorIndex, unsigned int spellIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the number of effects at an index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \return The number of effects. | ||||
|     */ | ||||
|     static unsigned int GetActorSpellsActiveEffectCount(unsigned int actorIndex, unsigned int spellIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the id for an effect index at a spell index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \param effectIndex The index of the effect. | ||||
|     * \return The id of the effect. | ||||
|     */ | ||||
|     static unsigned int GetActorSpellsActiveEffectId(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the arg for an effect index at a spell index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \param effectIndex The index of the effect. | ||||
|     * \return The arg of the effect. | ||||
|     */ | ||||
|     static int GetActorSpellsActiveEffectArg(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the magnitude for an effect index at a spell index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \param effectIndex The index of the effect. | ||||
|     * \return The magnitude of the effect. | ||||
|     */ | ||||
|     static double GetActorSpellsActiveEffectMagnitude(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the duration for an effect index at a spell index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \param effectIndex The index of the effect. | ||||
|     * \return The duration of the effect. | ||||
|     */ | ||||
|     static double GetActorSpellsActiveEffectDuration(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Get the time left for an effect index at a spell index in an actor's latest spells active changes. | ||||
|     * | ||||
|     * \param actorIndex The index of the actor. | ||||
|     * \param spellIndex The index of the spell. | ||||
|     * \param effectIndex The index of the effect. | ||||
|     * \return The time left for the effect. | ||||
|     */ | ||||
|     static double GetActorSpellsActiveEffectTimeLeft(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Check whether there is any positional data for the actor at a certain index in | ||||
|     * the read actor list. | ||||
|  | @ -610,6 +719,15 @@ public: | |||
|     */ | ||||
|     static void SetActorDeathInstant(bool isInstant) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Set the action type in the spells active changes of the temporary actor | ||||
|     *        stored on the server. | ||||
|     * | ||||
|     * \param action The action (0 for SET, 1 for ADD, 2 for REMOVE). | ||||
|     * \return void | ||||
|     */ | ||||
|     static void SetActorSpellsActiveAction(unsigned char action) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Set the AI action of the temporary actor stored on the server. | ||||
|     * | ||||
|  | @ -693,6 +811,30 @@ public: | |||
|     */ | ||||
|     static void UnequipActorItem(unsigned short slot) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Add a new active spell to the spells active changes for the temporary actor stored, | ||||
|     *        on the server, using the temporary effect values stored so far. | ||||
|     * | ||||
|     * \param spellId The spellId of the spell. | ||||
|     * \param displayName The displayName of the spell. | ||||
|     * \return void | ||||
|     */ | ||||
|     static void AddActorSpellActive(const char* spellId, const char* displayName) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Add a new effect to the next active spell that will be added to the temporary actor | ||||
|     *        stored on the server. | ||||
|     * | ||||
|     * \param effectId The id of the effect. | ||||
|     * \param magnitude The magnitude of the effect. | ||||
|     * \param duration The duration of the effect. | ||||
|     * \param timeLeft The timeLeft for the effect. | ||||
|     * \param arg The arg of the effect when applicable, e.g. the skill used for Fortify Skill or the attribute | ||||
|     *            used for Fortify Attribute. | ||||
|     * \return void | ||||
|     */ | ||||
|     static void AddActorSpellActiveEffect(int effectId, double magnitude, double duration, double timeLeft, int arg) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Add a copy of the server's temporary actor to the server's temporary actor list. | ||||
|     * | ||||
|  | @ -760,6 +902,18 @@ public: | |||
|     */ | ||||
|     static void SendActorEquipment(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Send an ActorSpellsActive packet. | ||||
|     * | ||||
|     * \param sendToOtherVisitors Whether this packet should be sent to cell visitors other | ||||
|     *                            than the player attached to the packet (false by default). | ||||
|     * \param skipAttachedPlayer Whether the packet should skip being sent to the player attached | ||||
|     *                           to the packet (false by default). | ||||
|     * | ||||
|     * \return void | ||||
|     */ | ||||
|     static void SendActorSpellsActiveChanges(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; | ||||
| 
 | ||||
|     /**
 | ||||
|     * \brief Send an ActorSpeech packet. | ||||
|     * | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue