diff --git a/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp b/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp index 390916885..11b612781 100644 --- a/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp +++ b/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp @@ -1085,7 +1085,7 @@ void CGameItem::resetEnchantment() _SapLoad = 0; _Enchantment.clear(); contReset( _Enchantment ); - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; if (getInventory() != NULL) getInventory()->onItemChanged(getInventorySlot(), INVENTORIES::TItemChangeFlags(INVENTORIES::itc_enchant)); @@ -1351,7 +1351,7 @@ void CGameItem::clear() _Destroyable = true; _Dropable = true; // _SlotImage = 0xFFFF; - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; // _Parent = NULL; _Inventory = NULL; _InventorySlot = INVENTORIES::INVALID_INVENTORY_SLOT; diff --git a/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.h b/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.h index 635fbf74c..7f28cfe62 100644 --- a/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.h +++ b/code/ryzom/server/src/entities_game_service/game_item_manager/game_item.h @@ -651,9 +651,9 @@ public : bool getStats(const std::string &stats, std::string &final ); /// accessors to the action latency end date - inline NLMISC::TGameCycle getLatencyEndDate(){ return _LatencyEndDate; } + inline double getLatencyEndDate(){ return _LatencyEndDate; } - inline void setLatencyEndDate( NLMISC::TGameCycle latencyEndDate ){ _LatencyEndDate = latencyEndDate; } + inline void setLatencyEndDate( double latencyEndDate ){ _LatencyEndDate = latencyEndDate; } /// set the max sap load craft parameter inline void setMaxSapLoad(float value) @@ -950,7 +950,7 @@ private: /// string associated with this item std::string _PhraseId; /// tick when the proc will be available again - NLMISC::TGameCycle _LatencyEndDate; + double _LatencyEndDate; /// image of the item in bag / equipment // uint16 _SlotImage; NLMISC::TGameCycle _TotalSaleCycle; diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_dynamic_effect.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_dynamic_effect.cpp index 4b16d63e1..ffd46e363 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_dynamic_effect.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_dynamic_effect.cpp @@ -88,7 +88,7 @@ void CCombatActionDynamicEffect::applyOnEntity( CEntityBase *entity, float succe TGameCycle endDate; if ( _UsePhraseLatencyAsDuration == true && _CombatPhrase != 0) { - endDate = _CombatPhrase->latencyEndDate(); + endDate = (TGameCycle) _CombatPhrase->latencyEndDate(); } else { diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_effect.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_effect.cpp index e08633ccb..5155c37b1 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_effect.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_action_simple_effect.cpp @@ -88,7 +88,7 @@ void CCombatActionSimpleEffect::applyOnEntity( CEntityBase *entity, float succes TGameCycle endDate; if ( _UsePhraseLatencyAsDuration == true && _CombatPhrase != 0) { - endDate = _CombatPhrase->latencyEndDate(); + endDate = (TGameCycle)_CombatPhrase->latencyEndDate(); } else { diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.cpp index f6c2cdb85..fa8bdb1ff 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.cpp @@ -130,7 +130,7 @@ CCombatWeapon::CCombatWeapon(CGameItemPtr itemPtr) // weapon hit rate is in hit/10s and we use ticks/hits.... if (itemPtr->hitRate() != 0) { - LatencyInTicks = uint16( (10.0f / itemPtr->hitRate()) / CTickEventHandler::getGameTimeStep()); + LatencyInTicks = (10.0 / itemPtr->hitRate() ) / CTickEventHandler::getGameTimeStep(); } Quality = (uint16)itemPtr->recommended(); @@ -297,7 +297,7 @@ void CCombatAttackerAI::initFromRowId( const TDataSetRow &rowId ) _RightHandWeapon.Damage = (float)form->getCreatureDamagePerHit() * BotDamageFactor; _RightHandWeapon.DmgType = DMGTYPE::SLASHING; - _RightHandWeapon.LatencyInTicks = (uint16)form->getAttackLatency(); + _RightHandWeapon.LatencyInTicks = (double)form->getAttackLatency(); _RightHandWeapon.Family = ITEMFAMILY::MELEE_WEAPON; _RightHandWeapon.Skill = BarehandCombatSkill; _RightHandWeapon.SabrinaCost = (uint16)_SkillValue; @@ -416,7 +416,7 @@ void CCombatAttackerNpc::initFromRowId( const TDataSetRow &rowId ) { // get speed, dmg type, skill and family _RightHandWeapon = CCombatWeapon(entity->getRightHandItem()); - _RightHandWeapon.LatencyInTicks = (uint16)form->getAttackLatency(); + _RightHandWeapon.LatencyInTicks = (double)form->getAttackLatency(); // check ammo if (entity->getAmmoItem() != NULL && entity->getAmmoItem()->getStaticForm() != NULL && entity->getAmmoItem()->getStaticForm()->Family == ITEMFAMILY::AMMO) @@ -426,7 +426,7 @@ void CCombatAttackerNpc::initFromRowId( const TDataSetRow &rowId ) } else { - _RightHandWeapon.LatencyInTicks = (uint16)form->getAttackLatency(); + _RightHandWeapon.LatencyInTicks = (double)form->getAttackLatency(); _RightHandWeapon.Family = ITEMFAMILY::MELEE_WEAPON; _RightHandWeapon.Skill = BarehandCombatSkill; _RightHandWeapon.DmgType = DMGTYPE::BLUNT; diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.h b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.h index e5e9baa82..02f0f39f8 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.h +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_attacker.h @@ -92,7 +92,7 @@ public: /************************************************************************/ /* do not forget to update the operator= if attributes change /************************************************************************/ - uint16 LatencyInTicks; + double LatencyInTicks; float Damage; uint16 Quality; DMGTYPE::EDamageType DmgType; @@ -111,7 +111,7 @@ public: private: void init() { - LatencyInTicks = 0; + LatencyInTicks = 0.0; Damage = 0; Quality = 0; DmgType = DMGTYPE::UNDEFINED; diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_phrase.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_phrase.cpp index 0e34f243f..6dfd7a6b2 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/combat_phrase.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/combat_phrase.cpp @@ -382,7 +382,7 @@ void CCombatPhrase::init() _CriticalHit = false; _ExecutionEndDate = 0; - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; _SabrinaCost = 0; _SabrinaRelativeCost = 1.0f; @@ -892,7 +892,7 @@ bool CCombatPhrase::evaluate() _NotEnoughStaminaMsg = false; _NotEnoughHpMsg = false; _DisengageOnEnd = false; - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; _ExecutionEndDate = 0; return true; @@ -1702,7 +1702,7 @@ bool CCombatPhrase::launch() { H_AUTO(CCombatPhrase_launch); - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; _ApplyDate = 0; if ( !_Attacker ) @@ -1843,14 +1843,14 @@ bool CCombatPhrase::launch() } // get weapon latency - float latency; + double latency; if(_LeftWeapon.LatencyInTicks != 0) { - latency = float(_HitRateModifier + std::max( MinTwoWeaponsLatency.get(), std::max(_RightWeapon.LatencyInTicks, _LeftWeapon.LatencyInTicks)) + _Ammo.LatencyInTicks); + latency = double(_HitRateModifier + std::max( double(MinTwoWeaponsLatency.get()), std::max(_RightWeapon.LatencyInTicks, _LeftWeapon.LatencyInTicks)) + _Ammo.LatencyInTicks); } else { - latency = float(_HitRateModifier + std::max(_RightWeapon.LatencyInTicks, _LeftWeapon.LatencyInTicks) + _Ammo.LatencyInTicks); + latency = double(_HitRateModifier + std::max(_RightWeapon.LatencyInTicks, _LeftWeapon.LatencyInTicks) + _Ammo.LatencyInTicks); } // check for madness effect @@ -2177,8 +2177,14 @@ bool CCombatPhrase::launch() // set latency end date const NLMISC::TGameCycle time = CTickEventHandler::getGameCycle(); - _LatencyEndDate = time + (NLMISC::TGameCycle)latency; - + if(_LatencyEndDate > 0) + { + _LatencyEndDate += latency; + } + else + { + _LatencyEndDate = (double)time + latency; + } // compute the apply date if (_Targets[0].Target!=NULL && actingEntity->getEntityRowId() == _Targets[0].Target->getEntityRowId()) { @@ -2322,8 +2328,8 @@ bool CCombatPhrase::launchAttack(CEntityBase * actingEntity, bool rightHand, boo // now we use the weapon speed factor as a divisor of wear per action // (a weapon twice as fast will wear twice as slow) nlassert(ReferenceWeaponLatencyForWear > 0); - const uint16 latency = (rightHand ? _RightWeapon.LatencyInTicks : _LeftWeapon.LatencyInTicks); - const float wearFactor = (float)latency / (float)ReferenceWeaponLatencyForWear; + const float latency = (rightHand ? _RightWeapon.LatencyInTicks : _LeftWeapon.LatencyInTicks); + const float wearFactor = latency / (float)ReferenceWeaponLatencyForWear; if (rightHand) { @@ -3365,7 +3371,7 @@ void CCombatPhrase::stop() CCharacter *character = PlayerManager.getChar(_Attacker->getEntityRowId()); if (character) { - character->dateOfNextAllowedAction( _LatencyEndDate ); + character->dateOfNextAllowedAction((NLMISC::TGameCycle)_LatencyEndDate ); } } diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/fg_prospection_phrase.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/fg_prospection_phrase.cpp index b45a6043d..e3a6969fd 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/fg_prospection_phrase.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/fg_prospection_phrase.cpp @@ -716,7 +716,7 @@ void CFgProspectionPhrase::apply() MBEHAV::CBehaviour behav = player->getBehaviour(); // keep arguments behav.Behaviour = MBEHAV::PROSPECTING_END; PHRASE_UTILITIES::sendUpdateBehaviour( _ActorRowId, behav ); - _LatencyEndDate = ForageSourceSpawnDelay.get(); // wait a short time before spawning the source(s) (to let animation/fx time) + _LatencyEndDate =(double)ForageSourceSpawnDelay.get(); // wait a short time before spawning the source(s) (to let animation/fx time) } diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/magic_phrase.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/magic_phrase.cpp index 16f77bc8b..8895f48b9 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/magic_phrase.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/magic_phrase.cpp @@ -1566,9 +1566,9 @@ bool CMagicPhrase::launch() // add post cast latency, only for non instant cast const NLMISC::TGameCycle time = CTickEventHandler::getGameCycle(); if (_DivineInterventionOccured||_ShootAgainOccured?_BaseCastingTime:_CastingTime) - _LatencyEndDate = time + PostCastLatency + _PostCastTime; + _LatencyEndDate = (double)time + PostCastLatency + _PostCastTime; else - _LatencyEndDate = 0 + _PostCastTime; + _LatencyEndDate = 0.0 + _PostCastTime; // compute the apply date if ( !_Targets.empty() && _ActorRowId != _Targets[0].getId()) @@ -1898,7 +1898,7 @@ void CMagicPhrase::enchantPhrase(CCharacter * user,float successFactor) _Targets.resize(1); // user->setActionFlag( RYZOMACTIONFLAGS::Attacks, true ); - _LatencyEndDate = 0;//time + _HitRateModifier + weapon.LatencyInTicks + ammo.SpeedInTicks ; + _LatencyEndDate = 0.0;//time + _HitRateModifier + weapon.LatencyInTicks + ammo.SpeedInTicks ; // _BeingProcessed = false; } // enchantPhrase // diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.cpp index 84e68dcd1..cf6581464 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.cpp @@ -456,7 +456,15 @@ void CPhraseManager::updatePhrases() } // update this phrase - updateEntityCurrentAction( (*it).first, entityPhrases); + CSPhrase::TPhraseState old_state; + do + { + old_state = phrase->state(); + updateEntityCurrentAction( (*it).first, entityPhrases); + phrase = entityPhrases.getCurrentAction(); + //Every time we get the next action, th phrase might be deleted (if the action is invalid or finished for non-cyclic actions like digging / crafting), always check ! + } + while(phrase != NULL && old_state != phrase->state()); // get next entity sentences ++it; @@ -466,7 +474,7 @@ void CPhraseManager::updatePhrases() sendEventReports(); // sendAIEvents(); -} +} // updatePhrases() //-------------------------------------------------------------- // updateEntityCurrentAction() @@ -703,7 +711,7 @@ afterPhraseProcessing: // go to next action for this entity entityPhrases.goToNextAction(); } -} // updatePhrases // +} // updateEntityCurrentAction // //----------------------------------------------- diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/s_phrase.h b/code/ryzom/server/src/entities_game_service/phrase_manager/s_phrase.h index 01cd8ec7c..3edff92ad 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/s_phrase.h +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/s_phrase.h @@ -56,7 +56,7 @@ public: _Idle = false; _ExecutionEndDate = 0; _ApplyDate = ~0; // ensure apply() never called before launch() - _LatencyEndDate = 0; // by default, time between apply() and end() is immediate + _LatencyEndDate = 0.0; // by default, time between apply() and end() is immediate _PhraseBookIndex = 0; _NextCounter = 0; _IsStatic = false; @@ -98,7 +98,7 @@ public: inline NLMISC::TGameCycle applyDate() const { return _ApplyDate; } /// get latency end date - inline NLMISC::TGameCycle latencyEndDate() const { return _LatencyEndDate; } + inline double latencyEndDate() const { return _LatencyEndDate; } /** * build the phrase from bricks, actor and main target @@ -207,7 +207,7 @@ protected: /// apply date NLMISC::TGameCycle _ApplyDate; /// latency end date - NLMISC::TGameCycle _LatencyEndDate; + double _LatencyEndDate; /// index in client phrase book (0 = not in the phrase book) uint16 _PhraseBookIndex; /// next counter diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/special_power_phrase.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/special_power_phrase.cpp index 84d4d31fb..7e24f427e 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/special_power_phrase.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/special_power_phrase.cpp @@ -758,7 +758,7 @@ bool CSpecialPowerPhrase::launch() //----------------------------------------------- void CSpecialPowerPhrase::apply() { - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; // TODO // apply effect diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/timed_action_phrase.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/timed_action_phrase.cpp index 1537a0ca4..8a1ba51fc 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/timed_action_phrase.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/timed_action_phrase.cpp @@ -279,7 +279,7 @@ void CTimedActionPhrase::apply() // keep a ptr on this to prevent it to be deleted when timed action is deconnection CSPhrasePtr selfPtr = this; - _LatencyEndDate = 0; + _LatencyEndDate = 0.0; CEntityBase *actor = CEntityBaseManager::getEntityBasePtr(_ActorRowId); if (!actor)