From 1020c758b9153bf8b6a2c1d994c680bd43a7cdee Mon Sep 17 00:00:00 2001 From: Guillaume Dupuy Date: Sat, 15 Oct 2016 19:04:22 +0200 Subject: [PATCH] Uses float to calculate latency for sabrina phrases --- .../game_item_manager/game_item.cpp | 4 +-- .../game_item_manager/game_item.h | 6 ++--- .../combat_action_simple_dynamic_effect.cpp | 2 +- .../combat_action_simple_effect.cpp | 2 +- .../phrase_manager/combat_attacker.cpp | 8 +++--- .../phrase_manager/combat_attacker.h | 4 +-- .../phrase_manager/combat_phrase.cpp | 25 ++++++++++++------- .../phrase_manager/fg_prospection_phrase.cpp | 2 +- .../phrase_manager/magic_phrase.cpp | 6 ++--- .../phrase_manager/s_phrase.h | 6 ++--- .../phrase_manager/special_power_phrase.cpp | 2 +- .../phrase_manager/timed_action_phrase.cpp | 2 +- 12 files changed, 38 insertions(+), 31 deletions(-) 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..a8b60a174 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.0f; 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.0f; // _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..0c1a03b15 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 float getLatencyEndDate(){ return _LatencyEndDate; } - inline void setLatencyEndDate( NLMISC::TGameCycle latencyEndDate ){ _LatencyEndDate = latencyEndDate; } + inline void setLatencyEndDate( float 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; + float _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 9ec8462d1..48537e6c3 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 @@ -131,7 +131,7 @@ CCombatWeapon::CCombatWeapon(CGameItemPtr itemPtr) if (itemPtr->hitRate() != 0) { //getGameTimeStep() is actually a double and hitRate() a float, so the precision difference will make a cast of the result fail (for example, with hitRate() == 10.0f, the cast will give a value of 9 and not 10 - LatencyInTicks = uint16 ( (10.0f / uint16(itemPtr->hitRate()) ) / float(CTickEventHandler::getGameTimeStep()) ); + LatencyInTicks = (10.0f / itemPtr->hitRate() ) / float(CTickEventHandler::getGameTimeStep()); } Quality = (uint16)itemPtr->recommended(); @@ -298,7 +298,7 @@ void CCombatAttackerAI::initFromRowId( const TDataSetRow &rowId ) _RightHandWeapon.Damage = (float)form->getCreatureDamagePerHit() * BotDamageFactor; _RightHandWeapon.DmgType = DMGTYPE::SLASHING; - _RightHandWeapon.LatencyInTicks = (uint16)form->getAttackLatency(); + _RightHandWeapon.LatencyInTicks = (float)form->getAttackLatency(); _RightHandWeapon.Family = ITEMFAMILY::MELEE_WEAPON; _RightHandWeapon.Skill = BarehandCombatSkill; _RightHandWeapon.SabrinaCost = (uint16)_SkillValue; @@ -417,7 +417,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 = (float)form->getAttackLatency(); // check ammo if (entity->getAmmoItem() != NULL && entity->getAmmoItem()->getStaticForm() != NULL && entity->getAmmoItem()->getStaticForm()->Family == ITEMFAMILY::AMMO) @@ -427,7 +427,7 @@ void CCombatAttackerNpc::initFromRowId( const TDataSetRow &rowId ) } else { - _RightHandWeapon.LatencyInTicks = (uint16)form->getAttackLatency(); + _RightHandWeapon.LatencyInTicks = (float)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..dbee38a93 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; + float LatencyInTicks; float Damage; uint16 Quality; DMGTYPE::EDamageType DmgType; @@ -111,7 +111,7 @@ public: private: void init() { - LatencyInTicks = 0; + LatencyInTicks = 0.0f; 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..136c9d6c4 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.0f; _SabrinaCost = 0; _SabrinaRelativeCost = 1.0f; @@ -892,7 +892,7 @@ bool CCombatPhrase::evaluate() _NotEnoughStaminaMsg = false; _NotEnoughHpMsg = false; _DisengageOnEnd = false; - _LatencyEndDate = 0; + _LatencyEndDate = 0.0f; _ExecutionEndDate = 0; return true; @@ -1702,7 +1702,7 @@ bool CCombatPhrase::launch() { H_AUTO(CCombatPhrase_launch); - _LatencyEndDate = 0; + _LatencyEndDate = 0.0f; _ApplyDate = 0; if ( !_Attacker ) @@ -1846,7 +1846,7 @@ bool CCombatPhrase::launch() float latency; if(_LeftWeapon.LatencyInTicks != 0) { - latency = float(_HitRateModifier + std::max( MinTwoWeaponsLatency.get(), std::max(_RightWeapon.LatencyInTicks, _LeftWeapon.LatencyInTicks)) + _Ammo.LatencyInTicks); + latency = float(_HitRateModifier + std::max( float(MinTwoWeaponsLatency.get()), std::max(_RightWeapon.LatencyInTicks, _LeftWeapon.LatencyInTicks)) + _Ammo.LatencyInTicks); } else { @@ -2177,8 +2177,15 @@ 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 = (float)time + latency; + } + nlwarning("_LatencyEndDate : %f, latency: %f", _LatencyEndDate, latency); // compute the apply date if (_Targets[0].Target!=NULL && actingEntity->getEntityRowId() == _Targets[0].Target->getEntityRowId()) { @@ -2322,8 +2329,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 +3372,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..1d3822878 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 =(float)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..9166263d8 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 = (float)time + PostCastLatency + _PostCastTime; else - _LatencyEndDate = 0 + _PostCastTime; + _LatencyEndDate = 0.0f + _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.0f;//time + _HitRateModifier + weapon.LatencyInTicks + ammo.SpeedInTicks ; // _BeingProcessed = false; } // enchantPhrase // 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..da496f33a 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.0f; // 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 float 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; + float _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..4bf951737 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.0f; // 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..16177ff8a 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.0f; CEntityBase *actor = CEntityBaseManager::getEntityBasePtr(_ActorRowId); if (!actor)