📄 skillutil.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : SkillUtil.cpp// Written by : excel96// Description ://////////////////////////////////////////////////////////////////////////////#include "SkillUtil.h"#include "SkillInfo.h"#include "Player.h"#include "Monster.h"//#include "AttrBalanceInfo.h"#include "VampEXPInfo.h"#include "OustersEXPInfo.h"#include "SkillDomainInfoManager.h"#include "Party.h"#include "AlignmentManager.h"#include "ItemUtil.h"#include "ZoneUtil.h"#include "CreatureUtil.h"#include "Zone.h"#include "PrecedenceTable.h"#include "LogClient.h"#include "Thread.h"#include "HitRoll.h"#include "GamePlayer.h"#include "MasterLairInfoManager.h"#include "PacketUtil.h"#include "billing/BillingInfo.h"#include <stdio.h>#include <math.h>#include "ItemFactoryManager.h"#include "EventItemUtil.h"#include "EffectAuraShield.h"#include "EffectAlignmentRecovery.h"#include "EffectEnemyErase.h"#include "EffectPrecedence.h"#include "EffectRevealer.h"#include "EffectMephisto.h"#include "EffectHymn.h"#include "EffectGrandMasterSlayer.h"#include "EffectGrandMasterVampire.h"#include "EffectGrandMasterOusters.h"#include "EffectSharpShield.h"#include "EffectAirShield.h"#include "EffectArmageddon.h"#include "EffectSleep.h"#include "EffectRequital.h"#include "EffectHandsOfFire.h"#include "EffectWaterBarrier.h"#include "EffectIceOfSoulStone.h"#include "EffectBlockHead.h"#include "EffectDivineSpirits.h"#include "EffectRediance.h"#include "EffectExpansion.h"#include "EffectStoneSkin.h"#include "EffectFrozenArmor.h"#include "EffectIceFieldToCreature.h"#include "EffectExplosionWater.h"#include "EffectStriking.h"#include "VariableManager.h"#include "SkillPropertyManager.h"#include "PKZoneInfoManager.h"#include "SummonGroundElemental.h"#include "EventHeadCount.h"#include "mission/QuestManager.h"#include "mission/MonsterKillQuestStatus.h"#include "mission/EventQuestLootingManager.h"#include "Gpackets/GCLearnSkillReady.h"#include "Gpackets/GCRemoveFromGear.h"#include "Gpackets/GCStatusCurrentHP.h"#include "Gpackets/GCRemoveEffect.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCAddEffectToTile.h"#include "Gpackets/GCAddInjuriousCreature.h"#include "Gpackets/GCSkillFailed1.h"#include "Gpackets/GCSkillFailed2.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCOtherModifyInfo.h"#include "Gpackets/GCKickMessage.h"#include "Gpackets/GCSkillToObjectOK4.h"#include "Gpackets/GCSkillToObjectOK6.h"//////////////////////////////////////////////////////////////////////////////// data structure & helper functions//////////////////////////////////////////////////////////////////////////////typedef struct DomainStruct { int DomainType; int DomainLevel;} SDomain;class isBig{public: isBig () {}; bool operator () (const DomainStruct &t, const DomainStruct &b) { if (t.DomainLevel > b.DomainLevel) return true; else return false; }};voidcheckFreeLevelLimit( PlayerCreature* pPC ) throw (Error){ __BEGIN_TRY// static const char MsgLevelLimitOver[] = "公丰肺 荤侩且 荐 乐绰 饭骇 力茄俊 档崔秦辑"; // by sigi. 2002.11.19 // 蜡丰 荤侩磊啊 酒聪芭唱 // 公丰 荤侩扁埃捞 巢酒乐瘤 臼栏搁(趣篮 瓷仿摹 over) 楼弗促. // 局靛呼 呼傅 矫胶袍篮 荤侩窍瘤 臼绊 荤侩磊 力茄篮 窍绰 版快. by sigi. 2003.2.21#if defined(__PAY_SYSTEM_FREE_LIMIT__) if (!pPC->isPayPlayAvaiable()) { GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPC->getPlayer()); pGamePlayer->kickPlayer( 30, KICK_MESSAGE_EXPIRE_FREEPLAY ); //pGamePlayer->setPenaltyFlag(PENALTY_TYPE_KICKED);/* EventKick* pEventKick = new EventKick(pGamePlayer); pEventKick->setDeadline(30*10); pGamePlayer->addEvent(pEventKick); // 割 檬饶俊 漏赴促..绊 焊郴霖促. //pEventKick->setMessage( MsgLevelLimitOver ); //pEventKick->sendMessage(); // 割 檬饶俊 漏赴促..绊 焊郴霖促. GCKickMessage gcKickMessage; gcKickMessage.setType( KICK_MESSAGE_EXPIRE_FREEPLAY ); gcKickMessage.setSeconds( 30 ); pGamePlayer->sendPacket( &gcKickMessage );*/ }#endif __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 蜡丰拳粮 版氰摹 磺唱胶////////////////////////////////////////////////////////////////////////////////const uint g_pVariableManager->getPremiumExpBonusPercent() = 150;//////////////////////////////////////////////////////////////////////////////// 傍拜磊客 乔傍拜磊 荤捞狼 颇扼固磐甫 拌魂秦 弥辆 单固瘤甫 魂免茄促.//////////////////////////////////////////////////////////////////////////////Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature){ Assert(pCreature != NULL); Assert(pTargetCreature != NULL); Damage_t Damage = 0; bool bCriticalHit = false; try { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Assert(pSlayer != NULL); Damage = computeSlayerDamage(pSlayer, pTargetCreature, bCriticalHit); } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire *>(pCreature); Assert(pVampire != NULL); Damage = computeVampireDamage(pVampire, pTargetCreature, bCriticalHit); } else if ( pCreature->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature); Assert( pOusters != NULL); Damage = computeOustersDamage(pOusters, pTargetCreature, bCriticalHit); } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster *>(pCreature); Assert(pMonster != NULL); Damage = computeMonsterDamage(pMonster, pTargetCreature, bCriticalHit); } else { // NPC扼绰 富牢啊... return 0; } } catch (Throwable & t) { cerr << t.toString() << endl; } return Damage;}//////////////////////////////////////////////////////////////////////////////// 傍拜磊狼 鉴荐 单固瘤甫 拌魂茄促.//////////////////////////////////////////////////////////////////////////////Damage_t computePureDamage(Creature* pCreature){ Damage_t Damage = 0; if ( pCreature == NULL ) return Damage; if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Assert(pSlayer != NULL); Damage = computePureSlayerDamage(pSlayer); } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire *>(pCreature); Assert(pVampire != NULL); Damage = computePureVampireDamage(pVampire); } else if ( pCreature->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature); Assert(pOusters != NULL ); Damage = computePureOustersDamage(pOusters); } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster *>(pCreature); Assert(pMonster != NULL); Damage = computePureMonsterDamage(pMonster); } else { // NPC扼绰 富牢啊... return 0; } return Damage;}//////////////////////////////////////////////////////////////////////////////// 傍拜磊客 乔傍拜磊 荤捞狼 颇扼固磐甫 拌魂秦 弥辆 单固瘤甫 魂免茄促.// 困狼 窃荐客 鞍栏唱, 捞 窃荐甫 何甫 版快俊绰 郴何利栏肺 农府萍拿 // 洒飘客 包访等 何盒捞 贸府等促.//////////////////////////////////////////////////////////////////////////////Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature, int CriticalBonus, bool& bCritical){ Assert(pCreature != NULL); Assert(pTargetCreature != NULL); Damage_t Damage = 0; bool bCriticalHit = HitRoll::isCriticalHit(pCreature, CriticalBonus); try { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Assert(pSlayer != NULL); Damage = computeSlayerDamage(pSlayer, pTargetCreature, bCriticalHit); } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire *>(pCreature); Assert(pVampire != NULL); Damage = computeVampireDamage(pVampire, pTargetCreature, bCriticalHit); } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters *>(pCreature); Assert(pOusters != NULL); Damage = computeOustersDamage(pOusters, pTargetCreature, bCriticalHit); } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster *>(pCreature); Assert(pMonster != NULL); Damage = computeMonsterDamage(pMonster, pTargetCreature, bCriticalHit); } else { // NPC扼绰 富牢啊... return 0; } } catch (Throwable & t) { cerr << t.toString() << endl; } bCritical = bCriticalHit; // 农府萍拿 洒飘捞绊, 嘎绰 仇捞 阁胶磐扼搁 150%狼 单固瘤甫 林霸 等促. if (bCritical && pTargetCreature->isMonster()) { Damage = getPercentValue(Damage, 150); } return Damage;}//////////////////////////////////////////////////////////////////////////////// 盔贰 单固瘤俊辑 橇肺咆记阑 力寇茄 弥辆 单固瘤甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////double computeFinalDamage(Damage_t minDamage, Damage_t maxDamage, Damage_t realDamage, Protection_t Protection, bool bCritical){ // 农府萍拿 洒飘扼搁 橇肺咆记阑 绊妨窍瘤 臼绊, 单固瘤 弊措肺 甸绢埃促. if (bCritical) return realDamage; if ( Protection > 640 ) Protection = 640; Damage_t FinalDamage; FinalDamage = realDamage - ( realDamage * ( Protection / 8 ) ) / 100; //FinalDamage = realDamage - ( realDamage * ( Protection / 10 ) ) / 100; return max( 1, (int)FinalDamage );/* Damage_t avgDamage = (minDamage + maxDamage) >> 1; int DamageRatio = 100; if (Protection < avgDamage) { DamageRatio = 100; } else if (Protection < getPercentValue(avgDamage, 150)) { DamageRatio = 90; } else if (Protection < getPercentValue(avgDamage, 200)) { DamageRatio = 80; } else if (Protection < getPercentValue(avgDamage, 250)) { DamageRatio = 70; } else if (Protection < getPercentValue(avgDamage, 300)) { DamageRatio = 60; } else { DamageRatio = 50; } return max(1, getPercentValue(realDamage, DamageRatio));*/}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 傍拜磊客 乔傍拜磊 荤捞狼 单固瘤甫 拌魂茄促.//////////////////////////////////////////////////////////////////////////////Damage_t computeSlayerDamage(Slayer* pSlayer, Creature* pTargetCreature, bool bCritical){ Assert(pSlayer != NULL); Assert(pTargetCreature != NULL); Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); uint timeband = getZoneTimeband( pSlayer->getZone() ); double FinalDamage = 0; // 老窜 盖颊狼 单固瘤甫 罐酒柯促. Damage_t MinDamage = pSlayer->getDamage(ATTR_CURRENT); Damage_t MaxDamage = pSlayer->getDamage(ATTR_MAX); // 公扁甫 甸绊 乐促搁, min, max俊 公扁狼 min, max甫 拌魂秦 霖促. if (pItem != NULL && pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND)) { // 胶飘扼捞欧 单固瘤甫 拌魂窍绰 何盒阑 Slayer::initAllStat() 何盒栏肺 // 颗扁搁辑 弊镑俊辑 m_Damage[]甫 技泼秦 滚府扁 锭巩俊, 咯扁辑 歹且 // 鞘夸啊 绝绢脸促. -- 2002.01.17 辫己刮 //MinDamage += (pItem->getMinDamage() + pItem->getBonusDamage()); //MaxDamage += (pItem->getMaxDamage() + pItem->getBonusDamage()); MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } // 角力 罚待 单固瘤甫 拌魂茄促. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature); Assert(pTargetSlayer != NULL); Protection_t Protection = pTargetSlayer->getProtection(); FinalDamage = computeFinalDamage(MinDamage, MaxDamage, RealDamage, Protection, bCritical); } else if (pTargetCreature->isVampire())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -