📄 skillutil.cpp
字号:
void computeCriticalBonus(Ousters* pOusters, SkillType_t skillType, Damage_t& Damage, bool& bCriticalHit){ switch ( skillType ) { case SKILL_KASAS_ARROW: case SKILL_BLAZE_BOLT: case SKILL_EARTHS_TEETH: case SKILL_HANDS_OF_NIZIE: case SKILL_STONE_AUGER: case SKILL_EMISSION_WATER: case SKILL_BEAT_HEAD: case SKILL_MAGNUM_SPEAR: case SKILL_FIRE_PIERCING: case SKILL_SUMMON_FIRE_ELEMENTAL: case SKILL_ICE_LANCE: case SKILL_EXPLOSION_WATER: case SKILL_METEOR_STORM: { OustersSkillSlot* pSkillSlot = pOusters->hasSkill( SKILL_CRITICAL_MAGIC ); if ( pSkillSlot == NULL ) return; SkillLevel_t level = pSkillSlot->getExpLevel(); int Ratio = 5 + ( level / 3 ); if ( (rand()%100) < Ratio ) { bCriticalHit = true; if ( level <= 15 ) { Damage += (Damage_t)(Damage * level / 19.5); } else { int bonus = (Damage_t)(Damage * ( 0.1 + ( level / 75.0 ) )); if ( level == 30 ) bonus = (Damage_t)(bonus * 1.1); Damage += bonus; } } } default: return; }}RankExp_t computeRankExp(int myLevel, int otherLevel) // by sigi. 2002.12.31{ RankExp_t rankExp = 0; if (myLevel!=0 && otherLevel!=0) { int checkValue = otherLevel * 100 / myLevel; if (checkValue > 120) { rankExp = (otherLevel-myLevel)*(otherLevel-myLevel)/10 + otherLevel*100/myLevel; } else { rankExp = otherLevel*100/myLevel - 10; } rankExp = max(0, (int)rankExp); // by sigi. 2002.12.31 rankExp = getPercentValue( rankExp, g_pVariableManager->getVariable( RANK_EXP_GAIN_PERCENT ) ); } rankExp = getPercentValue( rankExp, g_pVariableManager->getPremiumExpBonusPercent() ); return rankExp;}//////////////////////////////////////////////////////////////////////////////// Creature甫 磷看阑锭狼 瓤苞//// 磷篮 荤恩俊霸 KillCount甫 刘啊矫难霖促. --> 拌鞭 版氰摹// by sigi. 2002.8.31//////////////////////////////////////////////////////////////////////////////voidaffectKillCount(Creature* pAttacker, Creature* pDeadCreature){ // [贸府且 鞘夸 绝绰 版快] // 傍拜茄 荤恩捞 绝芭唱 // 磷篮局啊 绝芭唱 // 傍拜茄 荤恩捞 荤恩捞 酒聪芭唱 -_-; // 磷篮局啊 磷篮霸 酒聪搁 -_-; if (pAttacker==NULL || pDeadCreature==NULL || !pAttacker->isPC() || pDeadCreature->isAlive()) { return; }#ifdef __UNDERWORLD__ if ( pDeadCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); Assert( pMonster != NULL ); if ( pMonster->isUnderworld() ) { pMonster->setUnderworld(false); giveUnderworldGift(pAttacker); } }#endif if ( pDeadCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); if ( pMonster->getLastKiller() == 0 ) pMonster->setLastKiller( pAttacker->getObjectID() ); } int myLevel = 0; int otherLevel = 0; int bonusPercent = 100; if (pAttacker->isSlayer()) { // 浇饭捞绢啊 浇饭捞绢甫 磷牢 版快 if (pDeadCreature->isSlayer()) return; Slayer* pSlayer = dynamic_cast<Slayer*>(pAttacker); myLevel = pSlayer->getHighestSkillDomainLevel(); // 浇饭捞绢老 版快 公扁甫 甸绊 乐瘤 臼促搁 公矫茄促. if ( !pSlayer->isRealWearingEx( Slayer::WEAR_RIGHTHAND ) ) return; // 浇饭捞绢啊 轨颇捞绢甫 磷牢 版快 if (pDeadCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pDeadCreature); otherLevel = pVampire->getLevel(); bonusPercent = 150; } // 浇饭捞绢啊 酒快胶磐胶甫 磷牢 版快 else if (pDeadCreature->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pDeadCreature); otherLevel = pOusters->getLevel(); bonusPercent = 150; } // 浇饭捞绢啊 阁胶磐甫 磷牢 版快 else if (pDeadCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); // 付胶磐绰 MasterLairManager俊辑 贸府茄促. if (pMonster->isMaster()) { // last kill茄 荤恩篮 版氰摹 茄锅 歹 冈绰促. pSlayer->increaseRankExp( MASTER_KILL_RANK_EXP ); return; } otherLevel = pMonster->getLevel(); } else return; } else if (pAttacker->isVampire()) { // 轨颇捞绢啊 轨颇捞绢甫 磷牢 版快 if (pDeadCreature->isVampire()) return; Vampire* pVampire = dynamic_cast<Vampire*>(pAttacker); myLevel = pVampire->getLevel(); // 轨颇捞绢啊 浇饭捞绢甫 磷牢 版快 if (pDeadCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pDeadCreature); otherLevel = pSlayer->getHighestSkillDomainLevel(); bonusPercent = 150; } // 轨颇捞绢啊 酒快胶磐胶甫 磷牢 版快 else if (pDeadCreature->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pDeadCreature); otherLevel = pOusters->getLevel(); bonusPercent = 150; } // 轨颇捞绢啊 阁胶磐甫 磷牢 版快 else if (pDeadCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); // 付胶磐绰 MasterLairManager俊辑 贸府茄促. if (pMonster->isMaster()) { // last kill茄 荤恩篮 版氰摹 茄锅 歹 冈绰促. pVampire->increaseRankExp( MASTER_KILL_RANK_EXP ); return; } otherLevel = pMonster->getLevel(); } else return; } else if (pAttacker->isOusters()) { // 酒快胶磐胶啊 酒快胶磐胶甫 磷牢 版快 if (pDeadCreature->isOusters()) return; Ousters* pOusters = dynamic_cast<Ousters*>(pAttacker); myLevel = pOusters->getLevel(); // 酒快胶磐胶啊啊 浇饭捞绢甫 磷牢 版快 if (pDeadCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pDeadCreature); otherLevel = pSlayer->getHighestSkillDomainLevel(); bonusPercent = 150; } // 酒快胶磐令啊 轨颇捞绢甫 磷牢 版快 if (pDeadCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pDeadCreature); otherLevel = pVampire->getLevel(); bonusPercent = 150; } // 轨颇捞绢啊 阁胶磐甫 磷牢 版快 else if (pDeadCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); // 付胶磐绰 MasterLairManager俊辑 贸府茄促. if (pMonster->isMaster()) { // last kill茄 荤恩篮 版氰摹 茄锅 歹 冈绰促. pOusters->increaseRankExp( MASTER_KILL_RANK_EXP ); return; } otherLevel = pMonster->getLevel(); } else return; } else return; PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pAttacker); if ( pDeadCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); PrecedenceTable* pTable = pMonster->getPrecedenceTable(); // if ( pMonster->getLastKiller() == 0 )// pMonster->setLastKiller( pAttacker->getObjectID() ); if ( pTable != NULL && pTable->canGainRankExp( pPC ) ) { QuestManager* pQM = pPC->getQuestManager(); if ( pQM != NULL && pQM->killedMonster( pMonster ) ) { pPC->sendCurrentQuestInfo(); } if ( g_pEventQuestLootingManager->killed( pPC, pMonster ) ) pTable->setQuestHostName( pPC->getName() ); if ( pMonster->getQuestItem() == NULL && g_pVariableManager->isEventMoonCard() ) { Item* pItem = getCardItem( getCardKind( pPC, pMonster ) );// setItemGender( pItem, (pPC->getSex()==FEMALE)?GENDER_FEMALE:GENDER_MALE ); pMonster->setQuestItem( pItem ); } if ( pMonster->getQuestItem() == NULL && g_pVariableManager->isEventLuckyBag() ) { Item* pItem = getLuckyBagItem( getLuckyBagKind( pPC, pMonster ) ); pMonster->setQuestItem( pItem ); } if ( pMonster->getQuestItem() == NULL && g_pVariableManager->getVariable(CLOVER_EVENT)!=0 && canGiveEventItem(pPC, pMonster)) { int value = rand() % 100000; if ( value < g_pVariableManager->getVariable(CLOVER_RATIO) ) { Item* pItem = g_pItemFactoryManager->createItem( Item::ITEM_CLASS_MOON_CARD, 3, list<OptionType_t>() ); pMonster->setQuestItem( pItem ); } } if ( g_pVariableManager->getVariable(NETMARBLE_CARD_EVENT) != 0 && pMonster->getQuestItem() == NULL && g_pVariableManager->getVariable(NETMARBLE_CARD_RATIO) > (rand()%100000) && canGiveEventItem( pPC, pMonster ) ) { Item* pItem = g_pItemFactoryManager->createItem( Item::ITEM_CLASS_MOON_CARD, 2, list<OptionType_t>() ); pMonster->setQuestItem( pItem ); } if ( g_pVariableManager->isHeadCount() ) { GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pAttacker->getPlayer()); if ( pGamePlayer != NULL ) { EventHeadCount* pEvent = dynamic_cast<EventHeadCount*>(pGamePlayer->getEvent( Event::EVENT_CLASS_HEAD_COUNT )); if ( pEvent != NULL ) pEvent->cutHead(); } } if ( g_pVariableManager->getVariable(PET_FOOD_EVENT) != 0 && pMonster->getQuestItem() == NULL && g_pVariableManager->getVariable(PET_FOOD_RATIO) > rand()%100000 && canGiveEventItem( pPC, pMonster ) ) { bool isHigher = g_pVariableManager->getVariable(HIGHER_PET_FOOD_RATIO) > rand()%100; int itemClassSeed = rand()%100; int RacePetFoodRatio = g_pVariableManager->getVariable(RACE_PET_FOOD_RATIO); int RevivalSetRatio = g_pVariableManager->getVariable(REVIVAL_SET_RATIO); Item::ItemClass iClass = Item::ITEM_CLASS_PET_FOOD; ItemType_t itemType = 1; if ( itemClassSeed < RevivalSetRatio ) { iClass = Item::ITEM_CLASS_PET_ENCHANT_ITEM; itemType = 13; }// bool isRace = g_pVariableManager->getVariable(RACE_PET_FOOD_RATIO) > rand()%100; else if ( itemClassSeed - RevivalSetRatio < RacePetFoodRatio ) { switch ( pPC->getCreatureClass() ) { case Creature::CREATURE_CLASS_SLAYER: itemType = 6; break; case Creature::CREATURE_CLASS_VAMPIRE: itemType = 10; break; case Creature::CREATURE_CLASS_OUSTERS: itemType = 14; break; default: break; } } if ( iClass == Item::ITEM_CLASS_PET_FOOD && isHigher ) ++itemType;// cout << "脐澜侥捞亥飘:" << iClass << ", " << itemType << endl; Item* pItem = g_pItemFactoryManager->createItem( iClass, itemType, list<OptionType_t>() ); pMonster->setQuestItem( pItem ); } } } int PartyID = pPC->getPartyID(); if (PartyID != 0) { // 颇萍俊 啊涝登绢 乐促搁 肺拿 颇萍 概聪历甫 烹秦 // 林困狼 颇萍盔甸苞 版氰摹甫 傍蜡茄促. LocalPartyManager* pLPM = pPC->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->shareRankExp(PartyID, pAttacker, otherLevel); } else { // 颇萍俊 啊涝登绢乐瘤 臼促搁 去磊 棵扼埃促. RankExp_t rankExp = computeRankExp( myLevel, otherLevel ); if ( pDeadCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pDeadCreature); PrecedenceTable* pTable = pMonster->getPrecedenceTable(); if ( pTable != NULL && pTable->canGainRankExp( pPC ) ) { pPC->increaseRankExp( rankExp ); } } else { pPC->increaseRankExp( rankExp ); } }}HP_t setCounterDamage( Creature* pAttacker, Creature* pTarget, Damage_t counterDamage, bool& bBroadcastAttackerHP, bool& bSendAttackerHP){ HP_t Result2 = 0; // 救傈瘤措 眉农 // 2003.1.10 by bezz, Sequoia if ( pAttacker != NULL && checkZoneLevelToHitTarget(pAttacker) ) { if (pAttacker->isSlayer()) { Slayer* pSlayerAttacker = dynamic_cast<Slayer*>(pAttacker); Result2 = max(0, (int)pSlayerAttacker->getHP()-(int)counterDamage); pSlayerAttacker->setHP(Result2, ATTR_CURRENT); bBroadcastAttackerHP = true; bSendAttackerHP = true; } else if (pAttacker->isVampire())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -