|
|
Модератор форума: staford11 |
Форум CMaNGOS Патчи / Моды / Фиксы CMaNGOS [Моды в ядро] *По просьбе NameNot* (Дополняем в теме то что не добавил я.) |
[Моды в ядро] *По просьбе NameNot* |
Так-как надоело что создают одни и тежи темы. В поисках патчей эта тема была последней каплей: http://wowjp.net/forum/106-50676-1
Модератор попросил создать отдельную тему с теми патчами которые "Наиболее часто ищут" - в общем дополните тему тем чем не заполнил я. Выкладывайте Фан патчи которые не компилятся сразу с открытых исходников, а приходится набирать отдельно. (Люди просто напросто отказываются юзать поиск). Внимание! Смотрим обязательно 8 пост прежде чем добавить ПАТЧ в тему. *Победные медальки за БГ* Code ITEM_AV_MARK_OF_HONOR = 20560, ITEM_WS_MARK_OF_HONOR = 20558, ITEM_AB_MARK_OF_HONOR = 20559, ITEM_EY_MARK_OF_HONOR = 29024, ITEM_SA_MARK_OF_HONOR = 42425 }; enum BattleGroundMarksCount { ITEM_WINNER_COUNT = 3, ITEM_LOSER_COUNT = 1 }; Тут вы указываете ID медалек, которые получают игроки за то или иное БГ, а так же их кол-во для победивших и проигравших.[/cut] *Reset hp/mana/spells* Описание: Восстановление хп/маны и перезарядка магий при начале дуэли. [cut]Открываем фаил -> src/game/DuelHandler.cpp находим в нем: Code plTarget->duel->startTimer = now; и добавляем после: Code // reset cooldowns and HP/Mana pl->SetHealth(pl->GetMaxHealth()); plTarget->SetHealth(plTarget->GetMaxHealth()); if (pl->getPowerType() == POWER_MANA) pl->SetPower(POWER_MANA, pl->GetMaxPower(POWER_MANA)); if (plTarget->getPowerType() == POWER_MANA) plTarget->SetPower(POWER_MANA, plTarget->GetMaxPower(POWER_MANA)); //only for cooldowns which < 15 min if (!pl->GetMap()->IsDungeon()) { pl->RemoveArenaSpellCooldowns(); plTarget->RemoveArenaSpellCooldowns(); } Code diff --git a/src/game/DuelHandler.cpp b/src/game/DuelHandler.cpp index 15cbf8c..616ca27 100644 --- a/src/game/DuelHandler.cpp +++ b/src/game/DuelHandler.cpp @@ -51,6 +51,15 @@ pl->duel->startTimer = now; plTarget->duel->startTimer = now; + // reset cooldowns and HP/Mana + pl->SetHealth(pl->GetMaxHealth()); + plTarget->SetHealth(plTarget->GetMaxHealth()); + + if (pl->getPowerType() == POWER_MANA) pl->SetPower(POWER_MANA, pl->GetMaxPower(POWER_MANA)); + if (plTarget->getPowerType() == POWER_MANA) plTarget->SetPower(POWER_MANA, plTarget->GetMaxPower(POWER_MANA)); + //only for cooldowns which < 15 min + if (!pl->GetMap()->IsDungeon()) { pl->RemoveArenaSpellCooldowns(); plTarget->RemoveArenaSpellCooldowns(); } + pl->SendDuelCountdown(3000); plTarget->SendDuelCountdown(3000); } *Флай маунты в Азероте* Описание: Дает возможность летать/передвигаться на флай маунтах в азероте. Внимание! Не тестировал. [cut] Code diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index f94b221..2b97e43 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4210,7 +4210,7 @@ uint8 Spell::CanCast(bool strict) if(m_caster->GetTypeId()==TYPEID_PLAYER) { u int 32 v_map = GetVirtualMapForMapAndZone(m_caster->GetMapId(), m_caster->GetZoneId()); - if( !((Player*)m_caster)->isGameMaster() && v_map != 530 && !(v_map == 571 && ((Player*)m_caster)->HasSpell(54197))) + if( !((Player*)m_caster)->isGameMaster() && v_map != 530 && v_map != 580 && v_map != 571) return SPELL_FAILED_NOT_HERE; } Суть заключается в том, чтобы при проверке зоны 530(Азерот) можно было использовать спел 54197. Работоспособность патча я не проверял, возможно работает. Также, можно просто попробовать вставить в src/game/Spell.cpp строчку: Code GetVirtualMapForMapAndZone(m_caster->GetMapId(),m_caster->GetZoneId()) != 530) Вот выписки из spell.cpp, связанные с маунтом. Code case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED: case SPELL_AURA_FLY: { // not allow cast fly spells at old maps by players (all spells is self target) if(m_caster->GetTypeId()==TYPEID_PLAYER) { i f( !((Player*)m_caster)->IsAllowUseFlyMountsHere() ) return SPELL_FAILED_NOT_HERE; }
Code case SPELL_AURA_MOUNTED: { if (m_caster->IsInWater()) return SPELL_FAILED_ONLY_ABOVEWATER; if (m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->GetTransport()) return SPELL_FAILED_NO_MOUNTS_ALLOWED; // Ignore map check if spell have AreaId. AreaId already checked and this prevent special mount spells if (m_caster->GetTypeId()==TYPEID_PLAYER && !sMapStore.LookupEntry(m_caster->GetMapId())->IsMountAllowed() && !m_IsTriggeredSpell && !m_spellInfo->AreaGroupId) return SPELL_FAILED_NO_MOUNTS_ALLOWED;
Code // zone check if(uint8 res= GetSpellAllowedInLocationError(m_spellInfo,m_caster->GetMapId(),m_caster->GetZoneId(),m_caster->GetAreaId())) r e tu rn res; // not let players cast spells at mount (and let do it to creatures) if( m_caster->IsMounted() && m_caster->GetTypeId()==TYPEID_PLAYER && !m_IsTriggeredSpell && !IsPassiveSpell(m_spellInfo->Id) && !(m_spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_MOUNTED) ) { if(m_caster->isInFlight()) r eturn SPELL_FAILED_NOT_FLYING; else return SPELL_FAILED_NOT_MOUNTED; } Что хочу добавить от себя: Дождитесь катаклизма.[/cut] *PvP Token System* Описание: За убийство в PvP Зонах будет выдаваться игроку поощрение, в виде Badge of Justice/либо то что выберете вы, кол-во предметов/и в каких PvP Зонах, Всего их 4: на аренах(включая гурубаши) на бг, на бг и на аренах и везде. [cut] Code diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index 0bb942e..339b5a1 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -1375,3 +1375,33 @@ Ra.IP = 0.0.0.0 Ra.Port = 3443 Ra.MinLevel = 3 Ra.Secure = 1 + +########################################################################################################### ## ## ## ## # + # PvP Token System +# +# PvPToken.Enable +# Enable/disable PvP Token system. +# Default: 1 (enabled) +# 0 (disabled) +# +# PvPToken.ItemID +# The item ID of the token that players will receive after killing an enemy. +# Default: 29434 (Badge of Justice) +# +# PvPToken.ItemCount +# The count amount of the ItemID +# Default: 1 +# +# PvPToken.MapRestriction +# The type of maps where players can receive the token +# Default: 4 - all maps +# 3 - battlegrounds only +# 2 - FFA areas only (both instanced and world arenas) +# 1 - battlegrounds and FFA areas only +# +####################################################################################################### ## ## ## ## ## ## + + PvPToken .Enable = 0 +PvPToken.ItemID = 29434 +PvPToken.ItemCount = 1 +PvPToken.MapRestriction = 4 diff --git a/src/game/Language.h b/src/game/Language.h index 823d6d5..938755b 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -848,7 +848,7 @@ enum MangosStrings // 10000-10999 // Use for custom patches 11000-11999 - + LANG_YOU_RECEIVE_TOKEN = 11050, // NOT RESERVED IDS 12000-1999999999 // `db_script_string` table index 2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID) // For other tables maybe 2000010000-2147483647 (max index) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 65c6ac0..34535df 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -21017,6 +21017,35 @@ void Player::ResummonPetTemporaryUnSummonedIfAny() m_temporaryUnsummonedPetNumber = 0; } +void Player::ReceiveToken() +{ + if(!sWorld.getConfig(CONFIG_PVP_TOKEN_ENABLE)) + return; + + uint8 MapRestriction = sWorld.getConfig(CONFIG_PVP_TOKEN_RESTRICTION); + + if( MapRestriction == 1 && !InBattleGround() && !HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) || + MapRestriction == 2 && !HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) || + MapRestriction == 3 && !InBattleGround()) + return; + + uint32 itemID = sWorld.getConfig(CONFIG_PVP_TOKEN_ITEMID); + uint32 itemCount = sWorld.getConfig(CONFIG_PVP_TOKEN_ITEMCOUNT); + + ItemPosCountVec dest; + uint8 msg = CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, itemID, itemCount); + if( msg != EQUIP_ERR_OK ) // convert to possible store amount + { + SendEquipError( msg, NULL, NULL ); + return; + } + + Item* item = StoreNewItem( dest, itemID, true, Item::GenerateItemRandomPropertyId(itemID)); + SendNewItem(item,itemCount,true,false); + + ChatHandler(this).PSendSysMessage(LANG_YOU_RECEIVE_TOKEN); +} + bool Player::canSeeSpellClickOn(Creature const *c) const { if(!c->HasFlag(UNIT_NPC_FLAGS,UNIT_NPC_FLAG_SPELLCLICK)) d iff --git a/src/game/Player.h b/src/game/Player.h index a1ea792..158da81 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1950,7 +1950,9 @@ class MANGOS_DLL_SPEC Player : public Unit void ModifyHonorPoints( int32 value ); void ModifyArenaPoints( int32 value ); uint32 GetMaxPersonalArenaRatingRequirement(); - + + void ReceiveToken(); + //End of PvP System void SetDrunkValue(uint16 newDrunkValue, uint32 itemid=0); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 06d1533..98af84b 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -580,6 +580,11 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa player->RewardPlayerAndGroupAtKill(pVictim); player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0); + // PvP Token + int8 leveldiff = player->getLevel() - pVictim->getLevel(); + if(!pVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT) && leveldiff < 10) + player->ReceiveToken(); + WorldPacket data(SMSG_PARTYKILLLOG, (8+8)); //send event PARTY_KILL data << uint64(player->GetGUID()); //player with killing blow data << uint64(pVictim->GetGUID()); //victim diff --git a/src/game/World.cpp b/src/game/World.cpp index 3361b5e..c9a4ffb 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -954,6 +954,15 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_THREAT_RADIUS] = sConfig.GetIntDefault("ThreatRadius", 100); + /* PvP Token System */ + m_configs[CONFIG_PVP_TOKEN_ENABLE] = sConfig.GetBoolDefault("PvPToken.Enable", true); + m_configs[CONFIG_PVP_TOKEN_ITEMID] = sConfig.GetIntDefault("PvPToken.ItemID", 29434); + m_configs[CONFIG_PVP_TOKEN_ITEMCOUNT] = sConfig.GetIntDefault("PvPToken.ItemCount", 1); + m_configs[CONFIG_PVP_TOKEN_RESTRICTION] = sConfig.GetIntDefault("PvPToken.MapRestriction", 4); + + if(m_configs[CONFIG_PVP_TOKEN_ITEMCOUNT] <= 0) + m_configs[CONFIG_PVP_TOKEN_ENABLE] = 0; + // always use declined names in the russian client m_configs[CONFIG_DECLINED_NAMES_USED] = (m_configs[CONFIG_REALM_ZONE] == REALM_ZONE_RUSSIAN) ? true : sConfig.GetBoolDefault("DeclinedNames", false); diff --git a/src/game/World.h b/src/game/World.h index 977a440..f67cd72 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -199,6 +199,10 @@ enum WorldConfigs CONFIG_LISTEN_RANGE_SAY, CONFIG_LISTEN_RANGE_TEXTEMOTE, C O NFIG_L ISTEN_ RANGE_ YELL, + C ONF IG_PVP_TOKEN_E NABLE, + CONFIG_PVP_TOKEN_ITEMID, + CONFIG_PVP_TOKEN_ITEMCOUNT, + CONFIG_PVP_TOKEN_RESTRI C TION, CONFIG_SKILL_MILLING, CONFIG_BATTLEGROUND_CAST_DESERTER, C O NFIG_B ATTLEG ROUND_ QUEUE_ ANNOUN CER_EN ABLE, - - 1.6.3 .3 *Патч на команду .server info* Описание: Убираем версии ядра/базы/скриптов, оставляем статистику: Аптайм/Онлайн/ Внимание! Также можно модифицировать под себя, читаем 2 пост от Rescript [cut] Code --- a/src/game/Level0.cpp Sat Dec 26 05:42:54 2009 +++ b/src/game/Level0.cpp Sat Dec 26 05:46:24 2009 @@ -91,16 +91,6 @@ uint32 maxQueuedClientsNum = sWorld.GetMaxQueuedSessionCount(); std::string str = secsToTimeString(sWorld.GetUptime()); - char const* full; - if(m_session) - full = _FULLVERSION(REVISION_DATE,REVISION_TIME,REVISION_NR,"|cffffffff|Hurl:" REVISION_ID "|h" REVISION_ID "|h|r"); - else - full = _FULLVERSION(REVISION_DATE,REVISION_TIME,REVISION_NR,REVISION_ID); - - SendSysMessage(full); - PSendSysMessage(LANG_USING_SCRIPT_LIB,sWorld.GetScriptsVersion()); - PSendSysMessage(LANG_USING_WORLD_DB,sWorld.GetDBVersion()); - PSendSysMessage(LANG_USING_EVENT_AI,sWorld.GetCreatureEventAIVersion()); PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); PSendSysMessage(LANG_UPTIME, str.c_str()); *История арены* Code diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index f30d223..d66bc45 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -827,6 +827,9 @@ void BattleGround::EndBattleGround(uint32 winner) // this way all arena team members will get notified, not only the ones who participated in this match winner_arena_team->NotifyStatsChanged(); loser_arena_team->NotifyStatsChanged(); + CharacterDatabase.BeginTransaction(); + CharacterDatabase.PExecute("INSERT INTO arena_team_history (winner_team, winner_rating, loser_team, loser_rating, type, map) VALUES ('%u', '%u', '%u', '%u', '%u', '%u')", winner_arena_team->GetId(), winner_arena_team->GetRating(), loser_arena_team->GetId(), loser_arena_team->GetRating(), winner_arena_team->GetType(), GetMapId()); + CharacterDatabase.CommitTransaction(); } if (winmsg_id) sql Code DROP TABLE IF EXISTS `arena_team_history`; CREATE TABLE `arena_team_history` ( `id` int(11) NOT NULL auto_increment COMMENT 'Identifier', `winner_team` int(10) unsigned NOT NULL default '0', `winner_rating` int(10) unsigned NOT NULL default '0', `loser_team` int(10) unsigned NOT NULL default '0', `loser_rating` int(10) unsigned NOT NULL default '0', `change` int(10) unsigned NOT NULL default '0', `type` int(2) unsigned NOT NULL default '0', `map` int(10) unsigned NOT NULL default '0', `play_time` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1669 DEFAULT CHARSET=utf8; [/cut] [notice]Итак, т.к. форум редко обновляется по сравнению с другими связи с тем, что лишь единицы шарят в c++ , то решил дополнить тему, кому мало патчев... Русскоязычные форумы: Нерусские форумы:
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. ©
|
"*Патч на команду .server info*"
можно модифицировать под себя
Code --- a/src/game/Level0.cpp Sat Dec 26 05:42:54 2009 +++ b/src/game/Level0.cpp Sat Dec 26 05:46:24 2009 @@ -91,16 +91,6 @@ uint32 maxQueuedClientsNum = sWorld.GetMaxQueuedSessionCount(); std::string str = secsToTimeString(sWorld.GetUptime()); - char const* full; - if(m_session) - full = _FULLVERSION(REVISION_DATE,REVISION_TIME,REVISION_NR,"|cffffffff|Hurl:" REVISION_ID "|h" REVISION_ID "|h|r"); - else - full = _FULLVERSION(REVISION_DATE,REVISION_TIME,REVISION_NR,REVISION_ID); - - SendSysMessage(full); - PSendSysMessage(LANG_USING_SCRIPT_LIB,sWorld.GetScriptsVersion()); - PSendSysMessage(LANG_USING_WORLD_DB,sWorld.GetDBVersion()); - PSendSysMessage(LANG_USING_EVENT_AI,sWorld.GetCreatureEventAIVersion()); + PSendSysMessage("Core: XXX\n DB: XXX\n Scripts: xxxx\n"); \\ Можно ставить так же \t для списка PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); PSendSysMessage(LANG_UPTIME, str.c_str()); |
Code PVP RANK / TITLE SYSTEM diff -r 4d80ec444ac3 src/game/Player.cpp --- a/src/game/Player.cpp Tue Jan 13 21:04:10 2009 +0100 +++ b/src/game/Player.cpp Wed Jan 14 00:18:55 2009 -0500 @@ -6069,6 +6069,7 @@ uint64 victim_guid = 0; uint32 victim_rank = 0; + uint32 rank_diff = 0; time_t now = time(NULL); // need call before fields update to have chance move yesterday data to appropriate fields before today data change. @@ -6104,21 +6105,50 @@ // [15..28] Horde honor titles and player name // [29..38] Other title and player name // [39+] Nothing - uint32 victim_title = pVictim->GetUInt32Value(PLAYER_CHOSEN_TITLE); - // Get Killer titles, CharTitlesEntry::bit_index + // PLAYER__FIELD_KNOWN_TITLES describe which titles player can use, + // so we must find biggest pvp title , even for killer to find extra honor value + uint32 vtitle = pVictim->GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES); + uint32 victim_title = 0; + uint32 ktitle = GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES); + uint32 killer_title = 0; + if(PLAYER_TITLE_MASK_ALL_PVP & ktitle) + { + for(int i = ((GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++) + { + if(ktitle & (1<<i)) + killer_title = i; + } + } + if(PLAYER_TITLE_MASK_ALL_PVP & vtitle) + { + for(int i = ((pVictim->GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((pVictim->GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++) + { + if(vtitle & (1<<i)) + victim_title = i; + } + } + // Get Killer titles, CharTitlesEntry::bit_index // Ranks: // title[1..14] -> rank[5..18] // title[15..28] -> rank[5..18] // title[other] -> 0 if (victim_title == 0) victim_guid = 0; // Don't show HK: <rank> message, only log. - else if (victim_title < 15) + else if (victim_title < HKRANKMAX) victim_rank = victim_title + 4; - else if (victim_title < 29) - victim_rank = victim_title - 14 + 4; + else if (victim_title < (2*HKRANKMAX-1)) + victim_rank = victim_title - (HKRANKMAX-1) + 4; else victim_guid = 0; // Don't show HK: <rank> message, only log. - } + + // now find rank difference + if (killer_title == 0 && victim_rank>4) + rank_diff = victim_rank - 4; + else if (killer_title < HKRANKMAX) + rank_diff = (victim_rank>(killer_title + 4))? (victim_rank - (killer_title + 4)) : 0; + else if (killer_title < (2*HKRANKMAX-1)) + rank_diff = (victim_rank>(killer_title - (HKRANKMAX-1) +4))? (victim_rank - (killer_title - (HKRANKMAX-1) + 4)) : 0; + } if(k_level <= 5) k_grey = 0; @@ -6136,11 +6166,13 @@ honor = ((f * diff_level * (190 + v_rank*10))/6); honor *= ((float)k_level) / 70.0f; //factor of dependence on levels of the killer + honor *= 1 + sWorld.getRate(RATE_PVP_RANK_EXTRA_HONOR)*(((float)rank_diff) / 10.0f); // count the number of playerkills in one day ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true); // and those in a lifetime ApplyModUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 1, true); + UpdateKnownTitles(); } else { @@ -6219,6 +6251,30 @@ } return true; +} + +void Player::UpdateKnownTitles() +{ + uint32 new_title = 0; + uint32 honor_kills = GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS); + uint32 old_title = GetUInt32Value(PLAYER_CHOSEN_TITLE); + RemoveFlag64(PLAYER__FIELD_KNOWN_TITLES,PLAYER_TITLE_MASK_ALL_PVP); + if(honor_kills < 0) + return; + bool max_rank = ((honor_kills >= sWorld.pvp_ranks[HKRANKMAX-1]) ? true : false); + for(int i = HKRANK01; i != HKRANKMAX; ++i) + { + if(honor_kills < sWorld.pvp_ranks[i] || (max_rank)) + { + new_title = ((max_rank) ? (HKRANKMAX-1) : (i-1)); + if(new_title > 0) + new_title += ((GetTeam() == ALLIANCE) ? 0 : (HKRANKMAX-1)); + break; + } + } + SetFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << new_title); + if(old_title > 0 && old_title < (2*HKRANKMAX-1) && new_title > old_title) + SetUInt32Value(PLAYER_CHOSEN_TITLE,new_title); } void Player::ModifyHonorPoints( int32 value ) diff -r 4d80ec444ac3 src/game/Player.h --- a/src/game/Player.h Tue Jan 13 21:04:10 2009 +0100 +++ b/src/game/Player.h Wed Jan 14 00:18:55 2009 -0500 @@ -394,6 +394,27 @@ PLAYER_FLAGS_UNK4 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) PLAYER_UNK = 0x00040000, // 2.0.8... }; + +#define PLAYER_TITLE_MASK_ALLIANCE_PVP \ + ( PLAYER_TITLE_PRIVATE | PLAYER_TITLE_CORPORAL | \ + PLAYER_TITLE_SERGEANT_A | PLAYER_TITLE_MASTER_SERGEANT | \ + PLAYER_TITLE_SERGEANT_MAJOR | PLAYER_TITLE_KNIGHT | \ + PLAYER_TITLE_KNIGHT_LIEUTENANT | PLAYER_TITLE_KNIGHT_CAPTAIN | \ + PLAYER_TITLE_KNIGHT_CHAMPION | PLAYER_TITLE_LIEUTENANT_COMMANDER | \ + PLAYER_TITLE_COMMANDER | PLAYER_TITLE_MARSHAL | \ + PLAYER_TITLE_FIELD_MARSHAL | PLAYER_TITLE_GRAND_MARSHAL ) + +#define PLAYER_TITLE_MASK_HORDE_PVP \ + ( PLAYER_TITLE_SCOUT | PLAYER_TITLE_GRUNT | \ + PLAYER_TITLE_SERGEANT_H | PLAYER_TITLE_SENIOR_SERGEANT | \ + PLAYER_TITLE_FIRST_SERGEANT | PLAYER_TITLE_STONE_GUARD | \ + PLAYER_TITLE_BLOOD_GUARD | PLAYER_TITLE_LEGIONNAIRE | \ + PLAYER_TITLE_CENTURION | PLAYER_TITLE_CHAMPION | \ + PLAYER_TITLE_LIEUTENANT_GENERAL | PLAYER_TITLE_GENERAL | \ + PLAYER_TITLE_WARLORD | PLAYER_TITLE_HIGH_WARLORD ) + +#define PLAYER_TITLE_MASK_ALL_PVP \ + ( PLAYER_TITLE_MASK_ALLIANCE_PVP | PLAYER_TITLE_MASK_HORDE_PVP ) // used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1) // can't use enum for uint64 values @@ -1745,6 +1766,7 @@ void ModifyHonorPoints( int32 value ); void ModifyArenaPoints( int32 value ); uint32 GetMaxPersonalArenaRatingRequirement(); + void UpdateKnownTitles(); //End of PvP System diff -r 4d80ec444ac3 src/game/World.cpp --- a/src/game/World.cpp Tue Jan 13 21:04:10 2009 +0100 +++ b/src/game/World.cpp Wed Jan 14 00:18:55 2009 -0500 @@ -714,6 +714,19 @@ sLog.outError("StartArenaPoints (%i) must be in range 0..MaxArenaPoints(%u). Set to %u.", m_configs[CONFIG_START_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS]); m_configs[CONFIG_START_ARENA_POINTS] = m_configs[CONFIG_MAX_ARENA_POINTS]; + } + + rate_values[RATE_PVP_RANK_EXTRA_HONOR] = sConfig.GetFloatDefault("PvPRank.Rate.ExtraHonor", 1); + std::string s_pvp_ranks = sConfig.GetStringDefault("PvPRank.HKPerRank", "10,50,100,200,450,750,1300,2000,3500,6000,9500,15000,21000,30000"); + char *c_pvp_ranks = const_cast<char*>(s_pvp_ranks.c_str()); + for (int i = 0; i !=HKRANKMAX; i++) + { + if(i==0) + pvp_ranks[0] = 0; + else if(i==1) + pvp_ranks[1] = atoi(strtok (c_pvp_ranks, ",")); + else + pvp_ranks[i] = atoi(strtok (NULL, ",")); } m_configs[CONFIG_ALL_TAXI_PATHS] = sConfig.GetBoolDefault("AllFlightPaths", false); diff -r 4d80ec444ac3 src/game/World.h --- a/src/game/World.h Tue Jan 13 21:04:10 2009 +0100 +++ b/src/game/World.h Wed Jan 14 00:18:55 2009 -0500 @@ -261,7 +261,28 @@ RATE_DURABILITY_LOSS_PARRY, RATE_DURABILITY_LOSS_ABSORB, RATE_DURABILITY_LOSS_BLOCK, + RATE_PVP_RANK_EXTRA_HONOR, MAX_RATES +}; + +enum HonorKillPvPRank +{ + HKRANK00, + HKRANK01, + HKRANK02, + HKRANK03, + HKRANK04, + HKRANK05, + HKRANK06, + HKRANK07, + HKRANK08, + HKRANK09, + HKRANK10, + HKRANK11, + HKRANK12, + HKRANK13, + HKRANK14, + HKRANKMAX }; /// Type of server @@ -439,6 +460,8 @@ void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0); void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0); void SendServerMessage(uint32 type, const char *text = "", Player* player = NULL); + + uint32 pvp_ranks[HKRANKMAX]; /// Are we in the middle of a shutdown? bool IsShutdowning() const { return m_ShutdownTimer > 0; } Не помню под какой, в моём совсем другой переделанный стоит. Ещё можно анлогично арену намутить
Сообщение # 3 написано 14.04.2010 в 17:12
|
[notice]Теперь добавить патчи ваши в 1 пост не смогу *Не хватает символов*. Старайтесь оформить как я вот вам в коде мануал, переписывайте под себя
Code [color=00ff00]*Победные медальки за БГ*[/color] [color=red]Описание:[/color] [color=yellow]Выбираем за какое БГ что будет даваться/их кол-во.[/color] [cut]В исходниках находим файл BattleGround.h Открываем его и ищем строчки: [code] ITEM_AV_MARK_OF_HONOR = 20560, И.Т.Д Аналогично в КОД добавляем патч/sql[/notice]
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. ©
|
[SD2 Script] Buffer NPC
[cut] [notice][SD2 Script] Buffer NPC[/notice][/cut] Насчет TeleGuy. Помоему он для 3.1.3/цлк итд вроде нету. Но всеже. [notice]Она компилируется с ScriptDev2. #include "precompiled.h" long long int money; int costo; [cut] bool GossipHello_teleguy(Player *player, Creature *_Creature) { if ( player->GetTeam() == ALLIANCE ) { player->ADD_GOSSIP_ITEM( 5, "Darnassus. 5 Silver" , GOSSIP_SENDER_MAIN, 1203); player->ADD_GOSSIP_ITEM( 5, "Exodar. 5 Silver" , GOSSIP_SENDER_MAIN, 1216); player->ADD_GOSSIP_ITEM( 5, "Stormwind. 5 Silver" , GOSSIP_SENDER_MAIN, 1206); player->ADD_GOSSIP_ITEM( 5, "Ironforge. 5 Silver" , GOSSIP_SENDER_MAIN, 1224); player->ADD_GOSSIP_ITEM( 5, "Gnomeregan. 5 Silver" , GOSSIP_SENDER_MAIN, 1222); player->ADD_GOSSIP_ITEM( 5, "Shattrath City. 5 Silver" , GOSSIP_SENDER_MAIN, 1287); player->ADD_GOSSIP_ITEM( 5, "Dalaran. 5 Silver" , GOSSIP_SENDER_MAIN, 1205); player->ADD_GOSSIP_ITEM( 5, "Isle Of Quel'Danas. 5 Silver" , GOSSIP_SENDER_MAIN, 1288); player->ADD_GOSSIP_ITEM( 7, "[Instances] ->" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "[Instances WotLK] ->" , GOSSIP_SENDER_MAIN, 5554); } else { player->ADD_GOSSIP_ITEM( 5, "Orgrimmar. 5 Silver" , GOSSIP_SENDER_MAIN, 1215); player->ADD_GOSSIP_ITEM( 5, "Silvermoon. 5 Silver" , GOSSIP_SENDER_MAIN, 1217); player->ADD_GOSSIP_ITEM( 5, "Undercity. 5 Silver" , GOSSIP_SENDER_MAIN, 1213); player->ADD_GOSSIP_ITEM( 5, "Thunder Bluff. 5 Silver" , GOSSIP_SENDER_MAIN, 1225); player->ADD_GOSSIP_ITEM( 5, "Gnomeregan. 5 Silver" , GOSSIP_SENDER_MAIN, 1222); player->ADD_GOSSIP_ITEM( 5, "Shattrath City. 5 Silver" , GOSSIP_SENDER_MAIN, 1287); player->ADD_GOSSIP_ITEM( 5, "Dalaran. 5 Silver" , GOSSIP_SENDER_MAIN, 1205); player->ADD_GOSSIP_ITEM( 5, "Isle Of Quel'Danas. 5 Silver" , GOSSIP_SENDER_MAIN, 1288); player->ADD_GOSSIP_ITEM( 7, "[Instances] ->" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "[Instances WotLK] ->" , GOSSIP_SENDER_MAIN, 5554); } player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); void SendDefaultMenu_teleguy(Player *player, Creature *_Creature, uint32 action ) if( player->getLevel() < 8 ) money = player-> GetMoney(); if (money < costo ) switch(action) case 5553: //Instances 60-70 player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); break; case 5554: //Instances 75-80 NORTHREND player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); break; case 5552: //Back To Main Menu } else { player->ADD_GOSSIP_ITEM( 5, "Orgrimmar. 5 Silver" , GOSSIP_SENDER_MAIN, 1215); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); break; case 1203: // Teleport to Darnassus // Teleport to Stormwind // Teleport to Dalaran // Teleport to Undercity break; // Teleport to Orgrimmar // Teleport to Exodar // Teleport to Silvermoon break; case 1222://teleport player to Gnomeregan break; // Teleport to Ironforge break; // Teleport to Thunder Bluff break; case 1248://teleport player to Ragefire Chasm if( player->getLevel() >= 8) break; case 1249://teleport player to the Wailing Caverns if (player->getLevel() >= 10) { break; case 1250://teleport player to the Deadmines if (player->getLevel() >= 10) { break; case 1251://teleport player to Shadowfang Keep if (player->getLevel() >= 15) { break; case 1252://teleport player to Blackfathom Deeps if (player->getLevel() >= 15) { break; case 1253://teleport player to the Stockade if (player->getLevel() >= 20) { break; case 1254://teleport player to Razorfen Kraul if (player->getLevel() >= 24) { break; case 1255://teleport player to Gnomeregan if (player->getLevel() >= 20) { } else { break; case 1256://teleport player to Razorfen Downs if (player->getLevel() >= 25) { break; case 1257://teleport player to the Scarlet Monastery if (player->getLevel() >= 25) { break; case 1258://teleport player to Uldaman if (player->getLevel() >= 35) { break; case 1259://teleport player to Zul'Farrak if (player->getLevel() >= 35) { break; case 1260://teleport player to Maraudon if (player->getLevel() >= 40) { break; case 1261://teleport player to the Sunken Temple if (player->getLevel() >= 45) { break; case 1262://teleport player to Blackrock Depths if (player->getLevel() >= 45) { break; case 1263://teleport player to Dire Maul if (player->getLevel() >= 50) { break; case 1264://teleport player to Blackrock Spire if (player->getLevel() >= 50) { break; case 1265://teleport player to Stratholme if (player->getLevel() >= 50) { break; case 1266://teleport player to Scholomance if (player->getLevel() >= 50) { break; case 1287:// Shattrath City if( player->getLevel() >= 58) break; case 1288://teleport player to Isle Of Quel'Danas if (player->getLevel() >= 65) { break; case 4007:// Karazhan if (player->getLevel() >= 70) { break; case 4008:// Gruul's Lair if (player->getLevel() >= 65) { break; case 4009:// Hellfire Citadel case 4010:// Coilfang Reservoir case 4011:// Tempest Keep if (player->getLevel() >= 70) { break; case 4012:// Caverns of Time if (player->getLevel() >= 66) { break; case 4016:// Zul'Aman if (player->getLevel() >= 70) { break; case 4013:// Black Temple if (player->getLevel() >= 70) { break; case 4017:// magistrate if (player->getLevel() >= 70) { break; case 4018:// sunwell if (player->getLevel() >= 70) { break; case 4019:// Utgarde Keep if (player->getLevel() >= 80) { break; case 4020:// The Nexus if (player->getLevel() >= 80) { break; case 4021:// Azjol-Nerub if (player->getLevel() >= 80) { break; case 4022:// Ahn'kahet: The Old Kingdom if (player->getLevel() >= 80) { break; case 4023:// Drak'Tharon Keep if (player->getLevel() >= 80) { break; case 4024:// The Violet Hold if (player->getLevel() >= 80) { break; case 4025:// Gun' Drak if (player->getLevel() >= 80) { break; case 4026:// Utgarde Pinnacle if (player->getLevel() >= 80) { break; case 4027:// Ulduar if (player->getLevel() >= 80) { break; case 4028:// The Obsidian Sanctum if (player->getLevel() >= 80) { break; case 4029:// Naxxramas if (player->getLevel() >= 80) { break; } } bool GossipSelect_teleguy(Player *player, Creature *_Creature, uint32 sender, uint32 action ) void AddSC_teleguy() newscript = new Script; P.S: Выкладывал много раз Rescript
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. ©
Сообщение # 5 написано 16.04.2010 в 17:59
|
Pro[100]Hens,
Quote (Pro|100|Hens) В исходниках находим файл BattleGround.h Открываем его и ищем строчки: Code ITEM_AV_MARK_OF_HONOR = 20560, ITEM_WS_MARK_OF_HONOR = 20558, ITEM_AB_MARK_OF_HONOR = 20559, ITEM_EY_MARK_OF_HONOR = 29024, ITEM_SA_MARK_OF_HONOR = 42425 }; enum BattleGroundMarksCount Проблемка... у меня таких строк в этом файле нету..... но есть такие Code enum BattleGroundMarks { SPELL_WS_MARK_LOSER = 24950, // not create marks now SPELL_WS_MARK_WINNER = 24951, // not create marks now SPELL_AB_MARK_LOSER = 24952, // not create marks now SPELL_AB_MARK_WINNER = 24953, // not create marks now SPELL_AV_MARK_LOSER = 24954, // not create marks now SPELL_AV_MARK_WINNER = 24955, // not create marks now SPELL_WG_MARK_VICTORY = 24955, // honor + mark SPELL_WG_MARK_DEFEAT = 58494, // honor + mark }; enum BattleGroundMarksCount { ITEM_WINNER_COUNT = 3, ITEM_LOSER_COUNT = 1 }; В них нужно правлять? REVISION_NR "10065" Добавлено (17.06.2010, 12:40) Добавлено (17.06.2010, 12:46)
Сообщение # 6 написано 17.06.2010 в 12:46
|
lokok,
Code diff --git a/src/game/DuelHandler.cpp b/src/game/DuelHandler.cpp index 15cbf8c..616ca27 100644 --- a/src/game/DuelHandler.cpp +++ b/src/game/DuelHandler.cpp @@ -51,6 +51,15 @@ pl->duel->startTimer = now; plTarget->duel->startTimer = now; + // reset cooldowns and HP/Mana + pl->SetHealth(pl->GetMaxHealth()); + plTarget->SetHealth(plTarget->GetMaxHealth()); + + if (pl->getPowerType() == POWER_MANA) pl->SetPower(POWER_MANA, pl->GetMaxPower(POWER_MANA)); + if (plTarget->getPowerType() == POWER_MANA) plTarget->SetPower(POWER_MANA, plTarget->GetMaxPower(POWER_MANA)); + //only for cooldowns which < 15 min + if (!pl->GetMap()->IsDungeon()) { pl->RemoveArenaSpellCooldowns(); plTarget->RemoveArenaSpellCooldowns(); } + pl->SendDuelCountdown(3000); plTarget->SendDuelCountdown(3000); } это версия патча для гита а это если руками Открываем фаил -> src/game/DuelHandler.cpp находим в нем: Code plTarget->duel->startTimer = now; и добавляем после: Code // reset cooldowns and HP/Mana pl->SetHealth(pl->GetMaxHealth()); plTarget->SetHealth(plTarget->GetMaxHealth()); if (pl->getPowerType() == POWER_MANA) pl->SetPower(POWER_MANA, pl->GetMaxPower(POWER_MANA)); if (plTarget->getPowerType() == POWER_MANA) plTarget->SetPower(POWER_MANA, plTarget->GetMaxPower(POWER_MANA)); //only for cooldowns which < 15 min if (!pl->GetMap()->IsDungeon()) { pl->RemoveArenaSpellCooldowns(); plTarget->RemoveArenaSpellCooldowns(); } Все работает. |
Quote (bondiano) и ещё можно патч переделать под себя чтоб на тя ауру вешало =) Смысл?
Сообщение # 9 написано 09.01.2011 в 00:20
|
поставил дополнительную проверку на игрока и опонента в бою, чтобы небыло багоюза (помнится ставил старый мод и игроки в пвп юзали к друг другу дуель через макрос, и почти постоянно были с полным хп)
Code diff --git a/src/game/DuelHandler.cpp b/src/game/DuelHandler.cpp index 15cbf8c..616ca27 100644 --- a/src/game/DuelHandler.cpp +++ b/src/game/DuelHandler.cpp @@ -46,4 +46,21 @@ void WorldSession::HandleDuelAcceptedOpcode(WorldPacket& recvPacket) pl->duel->startTimer = now; plTarget->duel->startTimer = now; + // New!!! reset cooldowns and HP/Mana + if (!pl->isInCombat() || !plTarget->isInCombat()) + { + pl->SetHealth(pl->GetMaxHealth()); + plTarget->SetHealth(plTarget->GetMaxHealth()); + if (pl->getPowerType() == POWER_MANA) + pl->SetPower(POWER_MANA, pl->GetMaxPower(POWER_MANA)); + if (plTarget->getPowerType() == POWER_MANA) + plTarget->SetPower(POWER_MANA, plTarget->GetMaxPower(POWER_MANA)); + + if (!pl->GetMap()->IsDungeon()) + { + pl->RemoveArenaSpellCooldowns(); + plTarget->RemoveArenaSpellCooldowns(); + } + } + pl->SendDuelCountdown(3000);
Сообщение # 10 написано 29.01.2011 в 14:05
|
Popandri, если перепишешь то пойдет. Может быть...
Сообщение # 12 написано 11.02.2012 в 15:57
|
| |||
| |||